perf(ci): make docs.yml skip runs it doesn't need and cost less when it does - #367
Merged
Merged
Conversation
Measured baseline 276 s per push, on every push to main. Spec is revision 3: adversarial review (codex gpt-5.6-terra, xhigh) cut the content-keyed screenshot cache -- 7 hits per 200 pushes, ~2.2 percentage points, carrying the whole staleness surface -- and surfaced a live bug where a silently skipped test republishes a five-month-old screenshot. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PohiEWFT9CkCK4XNuhm9fR
… non-destructive Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PohiEWFT9CkCK4XNuhm9fR
test 02 writes import-menu.png inside a conditional; if its selector stops matching, the test passes without writing the file and CI publishes the stale committed copy -- currently a March 2026 image showing v0.30.0. Adds an explicit manifest of the 23 screenshots and asserts it.
Measured over 200 first-parent pushes to main: 64 changed nothing the published site depends on, yet each cost a full 276 s rebuild and redeploy. Also adds timeout-minutes to both jobs (spec item 4.5).
Each removed waitForTimeout sat immediately beside a real Playwright wait that already guaranteed the same condition. The 33 'replaceable' sleeps are deliberately left alone: the suite is one unbroken causal chain and rewriting them risks flake in the only pipeline that publishes the docs.
The screenshot suite drives Electron directly via _electron.launch and never opens a Playwright browser, so the browser download and its cache are dead weight. Whether Playwright's --with-deps system libraries are still needed for Electron under xvfb is being verified in CI. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PohiEWFT9CkCK4XNuhm9fR
libsqlite3-dev and build-essential exist to compile the native SQLite module; the ABI-keyed cache means that rarely happens. Ordering is load-bearing: the step must sit after the cache restore so it can read cache-hit, and before npm ci, whose postinstall may compile. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PohiEWFT9CkCK4XNuhm9fR
…anch - paths filter: add resources/** (gene_reference.db reaches the renderer via PanelFilterSection inside FilterDrawer, which is on-screen in two captured screenshots; harmless today, closed permanently) - apt gate: correct the comment's premise -- rebuild-native.mjs can purge a bad restore and compile while cache-hit is still 'true' - screenshot manifest: replace a stale line number with a name anchor - spec: record that build.yml already proves Electron runs under xvfb with no playwright install, so Phase 2a is a confirmation not an experiment Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PohiEWFT9CkCK4XNuhm9fR
Build-job step time 234 s -> 172 s (-26.5%) on run 31120283316. Playwright browser install and apt both confirmed removable; screenshots generate with no Playwright browser present. Cold native-cache path and the Pages deploy remain unverified -- GitHub Actions and Pages were both in major_outage. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PohiEWFT9CkCK4XNuhm9fR
berntpopp
had a problem deploying
to
github-pages
August 7, 2026 06:15 — with
GitHub Actions
Failure
This branch had an error being deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements
.planning/specs/2026-08-06-docs-workflow-performance.md.docs.ymlran on every push tomainat a measured 276 s and had never been optimised.What changed
pathsfilter — 64 of the last 200 first-parent pushes tomainchanged nothing the published site depends on. Workflow-level rather thanbuild.yml's job-leveldorny/paths-filter: that file's pending-required-check hazard doesn't apply here (nopull_requesttrigger, not a required check), and a workflow-level skip costs 0 s where a job-level one still spins a runner.test('02 - import menu')writes its PNG inside a conditional; if that selector stopped matching, the test passed without writing the file andUpload screenshotspublished the stale committed copy while CI stayed green. The suite now declares all 23 screenshots and fails if any wasn't written. BecauseUpload screenshotshas noif: always(), that failure now blocks publication entirely._electron.launchand never opens a Playwright browser.libsqlite3-dev/build-essentialexist only to compile the native SQLite module.timeout-minuteson both jobs (spec item 4.5 of the build-CI-performance spec, applied to the workflow being touched).Measured
Run
31120283316vs baseline31109514729. Full data:.planning/artifacts/perf/build/docs-yml-before-after.md.Artifact inspected, not just exit-code checked: 34 PNGs, none blank, footer reads the current
v0.70.5, highlight boxes correctly aligned.What is NOT proven
Stated plainly because the numbers above are easy to over-read:
Generate screenshots' −11 s, only ~4.8 s is the deterministic sleep removal; the rest is variance.waiting; GitHub Pages has been inmajor_outage.pathsfilter's skip behaviour has never been observed —workflow_dispatchbypasses path filters, so 64/200 is derived from git history.Design decision recorded
An earlier revision added a content-keyed screenshot cache. It was cut after adversarial review (codex
gpt-5.6-terra, xhigh): measured over 200 pushes it would hit 7 times — ~2.2 percentage points — while carrying the entire staleness surface, and the review found two CRITICAL holes in it. Because the app version must stay current andAppFooter.vue:9renders it in every screenshot, every release bump legitimately changes all 23 images, which is what destroys the cache's value. Full record in the spec's "Adversarial review record". It is deferred behind the manifest validation this PR adds, which is its prerequisite.Overlap with tracked work
Two items of
.planning/specs/2026-08-05-build-ci-performance.md: item 4.5 (timeout-minutes) and item 4.10 (Playwright browser caching, which this PR removes fromdocs.yml).🤖 Generated with Claude Code
https://claude.ai/code/session_01PohiEWFT9CkCK4XNuhm9fR