Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"version": 2,
"id": "35ca1ac6-1c59-4ef5-b19e-b047796dba90",
"createdOn": "2026-08-18",
"action": "add",
"payload": {
"pri": "P2",
"type": "issue",
"summary": "The in-flight-CI guard closed as #145 does not cover merge-main syncs made outside sync:pr-branches — PR #2149 lost 8 of 9 CI cycles to self-inflicted cancellation",
"detail": "#145 'Branch syncs could repeatedly cancel healthy in-flight CI' is recorded RESOLVED 2026-07-30 on the basis that the operator helper queries Actions for the current head and skips update-branch while the required workflow is queued or in progress. That guard lives in scripts/sync-pr-branches; it does not constrain a plain 'git merge origin/main' + push, nor GitHub's Update branch button, and PR #2149 shows the uncovered path is the one actually used. Between 18:51 and 20:16 on 2026-08-18, PR #2149 received SEVEN 'Merge branch main into claude/diagnostic-criteria-duplication-udg99e' commits (18:51, 19:03, 19:18, 19:37, 19:42, 19:54, 20:16) and two more by 21:37, each a new head that restarted CI and killed the run in flight via cancel-in-progress. Across nine cycles the aggregate went red eight times as 'CANCELLED with no failing job' and never once for a genuine failure of the diff. The cancellations widened as the interval tightened: cycle 2 lost only lighthouse-budget, cycle 3 only production-ui, cycle 4 lost coverage + production-ui-critical + production-ui + lighthouse-budget, and the 20:18 cycle lost all ten jobs including 'changes' itself, whose *_CHANGED outputs were empty because scope detection never completed. Real cost: the one genuine signal in 3.5 hours — a Production UI failure in tests/ui-forms-section-nav.spec.ts — had its re-run cancelled and its next cycle cancelled, so the PR merged with that question permanently unanswered (see sibling record). Note #095 behaved exactly as designed throughout: the aggregate correctly distinguished cancellation from failure and correctly stayed red, since a cancelled job verifies nothing. The defect is upstream of the aggregate. Next: decide whether the in-flight check should move from the operator helper to a place every sync path passes through — candidate options are (a) extend .githooks/pre-push / scripts/guard-push.mjs to warn or block when pushing a merge-only commit to a PR branch whose required CI is queued or in progress, (b) document the Update-branch button as prohibited for any PR with CI in flight rather than only for ledger-touching PRs as AGENTS.md currently states, or (c) accept it and reduce sync frequency. Stop rule: do not disable cancel-in-progress for pull requests to fix this — it is deliberate for PRs, is pinned by tests/ci-cache-safety.test.ts, and its base-branch exemption exists for a separate reason.",
"source": "PR #2149 commit list and runs 32173376307 / 32173687350 / 32174490902 / 32181371909 / 32185492075 / 32188061671; session 2026-08-18",
"issueUlid": "01M0BFHSA2HSSHRGH346NRVYJY"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"version": 2,
"id": "3fdf9173-da22-4d0c-aed6-51966f091f43",
"createdOn": "2026-08-18",
"action": "add",
"payload": {
"pri": "P2",
"type": "issue",
"summary": "tests/ui-forms-section-nav.spec.ts 'expands information previews into one continuous answer' failed on PR #2149 and was never reproduced — CI's path-scoped UI jobs can hide a forms regression on main",
"detail": "On PR #2149 (a DSM-only, two-file change) Production UI shard 3 failed 166 passed / 1 failed on tests/ui-forms-section-nav.spec.ts:53 'expands information previews into one continuous answer'. The assertion is 'await expect(trigger.getByText(preview)).toHaveCount(0)' at line 65: after clicking the 'Does not authorise' trigger on the form detail route, the preview text 'Psychiatric treatment or detention beyond the linked authority.' must leave the trigger and appear in the panel. It stayed in the trigger. NOT a timing race: the locator polled 24 times over the full 10s timeout and resolved to 1 element every time, so it was a stable wrong state, not a slow transition. NOT attributable to #2149: that PR changed exactly src/components/dsm/dsm-diagnosis-page.tsx and one ledger record, zero forms files; the behaviour lives in src/components/forms/form-detail-page.tsx which shares nothing with the DSM page. NOT a known flake: the identity is absent from tests/flake-ledger.json. NOT explained by recent forms history: the only recent main commit touching forms is 495e097 (#2139), which edited forms-home-page.tsx only (caveat-footer removal), a different component from the form detail page under test. Reproduction was never obtained: the job was re-run once and that re-run was cancelled, and the following full cycle was cancelled too, both by the merge-main sync loop described in the sibling record. #2149 then merged with the question open. The reason this can hide: CI UI jobs are path-scoped, so a docs-only push to main SKIPS Production UI entirely — verified in main run 32183858120 where 'Production UI', 'Production UI critical', 'Build' and 'Lighthouse budget' all report conclusion 'skipped'. The repo's own CI-triage bot nevertheless cited that run as 'Compared with main CI run #12334 (success)', which is an aggregate-level comparison that never exercised this test and must not be read as a green baseline. Given main's docs-heavy traffic, a genuine forms regression could sit on main unexercised. Next: run the single spec against current main to settle it — 'npx playwright test tests/ui-forms-section-nav.spec.ts --project=chromium' after 'npm run ensure' — then either fix form-detail-page.tsx so the preview moves out of the trigger on expand, or, if it passes repeatedly, add the identity to tests/flake-ledger.json under the documented three-reproductions-on-one-SHA rule. Stop rule: do not quarantine on a single observation, and do not weaken the assertion to green it. Note this could not be reproduced locally in the Claude web container because Playwright pins chromium revision 1234 while the image ships 1194 (see #255); forcing a mismatched browser path is disallowed.",
"source": "PR #2149 run 32185492075 job 95868823944 (Production UI (3)); main comparison run 32183858120; session 2026-08-18",
"issueUlid": "01M0BFH5685DYBQQRVNX40SM75"
}
}
Loading