diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index bb0f99442b..c05a5d2af5 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -261,10 +261,7 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | PR-1475 | 6de5c321beac55860cc4b6fc7d26ef5a7e088f38 | PR #1475 ingestion behavioral extraction | PASS after current-main reconciliation; extracted decisions preserve entrypoint behavior and replace the matching source-grep assertion with executable coverage | focused Vitest 3 files, 27 tests passed; typecheck passed; outstanding-issues and branch-review-ledger guards passed; provider-backed ingestion not run | | 2026-07-30 | PR-1458 | 8c1975b178c67e4c54acffc395d85e38c43d39f5 | PR #1458 superseded root-gate reconciliation | PASS: retained only unique documentation corrections after PR #1480 landed the stronger tracked-root gate; archived resolved shared-hook issue #143 | docs index and links passed; outstanding-issues and branch-review-ledger guards passed; diff check passed | | 2026-07-30 | PR-1448 | 8ece7f345e93170c6bd242701eaff05f5504d98b | PR #1448 authenticated live workflow | PASS after review repair: protected-main-only checkout, explicit bounded mutations, scoped secrets, and static dispatch confirmation; no live provider workflow dispatched | GitHub Actions and PR-policy guards passed; focused Vitest 3 passed; docs links and scripts, issue and ledger guards, Prettier and diff checks passed | -| 2026-07-30 | claude/capture-session-followups | bbc5d4625adcbdc32aee2f9b4fb4b0d4365d0e99 | outstanding-issues capture: unreadable CI token, at-risk worktree work, unpushed hook fix | PR #1490 opened. Ledger-only: adds #149 (PAT lacks Checks: Read so no PR verdict is readable; the working status endpoint returns total:0 rather than erroring), #150 (four already-merged worktrees hold uncommitted work existing in no branch or PR, largest +395/-200 over 19 files incl CI config), #151 (the #143 pre-commit fail-open d2fd16d54 lives only on a never-pushed branch, 17 behind main, conflicting on the file main's docs:update generator now owns). Also records that PR #1458 is superseded by #1480 and should be closed after owner confirmation | check:outstanding-issues 149 rows 60 open unique ids next-id=152; docs:check-links 1415 refs resolve; docs:check-index 49 roots/modules/routes; prettier clean | | 2026-07-30 | codex/outstanding-deletion-guard | da1bed4bcb05f2b975823c76bab0913278cfaea6 | issue 148 deletion guard | approved: no P0-P2 findings; base comparison is fail-closed in CI and preserves archive moves | verify:cheap; deletion self-test; unreadable-base proof; CI scope; GitHub Actions pin guard | -| 2026-07-30 | claude/capture-session-followups | a026c0bfe70f0e9fe290abbdd3660f4c458e4115 | PR #1490 #143/#151/#149 reconciliation | corrected archived #143 fail-open claim; #151 owns remaining half; #149 separates Checks:Read from missing-gh; merged main #1491 | check:outstanding-issues; docs:check-links | -| 2026-07-30 | claude/capture-session-followups | f18dc1fb25f4687006be897f2c11a4bb1f583f41 | PR #1490 #143/#151/#149 reconciliation | reconciled after parallel remote main-sync; #143 corrected; #151 owns fail-open; #149 separates Checks vs missing-gh | check:outstanding-issues; docs:check-links | | 2026-07-30 | codex/sync-ci-anti-churn | 4f99c6d6dbcd4d2c16d5ec58183003c64d989ac8 | issue 145 anti-churn guidance | approved: guidance now covers both pushes and sync mutations without weakening cancellation | check:outstanding-issues; prettier AGENTS; diff check | | 2026-07-30 | PR-1492 | a50640970a4e4197c64fba7239aeae073445fed9 | PR #1492 branch-sync churn review | FIXED P2: exact-head queued or in-progress workflows now block automated branch updates; Run PR guidance matches the executable guard | focused Vitest 1 file, 8 tests passed; Prettier passed; sync dry-run passed on 19 open PRs; diff check passed; no provider-backed application checks run | | 2026-07-30 | codex/ingestion-fixes-current-main-20260731 | fe68a0a817213ef33ddeee35b45034656986d089 | ingestion fixes replacement release readiness | ready after fixing unreachable partial-batch handling and invalid recovery owner lookup | 4 focused files 183 tests passed; typecheck passed; production-readiness READY; git diff --check passed | @@ -272,14 +269,18 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | PR-1494 | 807a3a09f5afc12e8db4f9158abe09d9c7b336c9 | PR #1494 pre-commit fail-open review | FIXED P2: legacy worktrees may skip a genuinely absent generator, while a staged deletion or rename now fails closed | docs-inventory Vitest 5 passed; shell syntax passed; Prettier test check passed; diff check passed | | 2026-07-30 | claude/x3-rag-coverage-gate-qx9j7d (PR #1463, squashed as dba7356f) | dba7356fc8dc926d951d6de6f019d5b8e000be21 | X3/#101 per-request hydration extraction from rag.ts into rag-hydration.ts | clean and landed — byte-identical move verified against pre-merge main, rag.ts 4780->4543, budget ratcheted to 4543, no back-edge (cluster referenced zero rag.ts-local symbols), both public re-exports preserved; squash captured 100% of branch content | typecheck, lint, check:knip, check:maintainability-budgets 4543/4543, focused vitest 83/83 incl rag-query-concurrency, eval:rag:offline 572/572 36 golden, format:check, verify:cheap, verify:pr-local build+bundle-scan, post-merge content verification on main | | 2026-07-30 | dba7356fc8dc926d951d6de6f019d5b8e000be21 | dba7356fc8dc926d951d6de6f019d5b8e000be21 | X3 hydration unit: per-request hydration extraction from rag.ts into rag-hydration.ts (PR #1463) | clean and landed — byte-identical move verified against pre-merge main, rag.ts 4780->4543, budget ratcheted to 4543, no back-edge, both public re-exports preserved. Supersedes the earlier row for this HEAD, which was keyed only to the slash-form branch token and so returned NOT REVIEWED on a landed-SHA lookup; it also mislabelled the unit as #101, which is the unrelated open canary-gated retrieval-parallelisation recommendation | typecheck, lint, check:knip, check:maintainability-budgets 4543/4543, focused vitest 83/83, eval:rag:offline 572/572 36 golden, format:check, verify:cheap 442 files 4625 passed, verify:pr-local, post-merge content verification on main | -| 2026-07-30 | claude/capture-session-followups | 4a041fcd2ac8f12e4ebb0ab68e0151722db65bcf | PR #1490 main sync + #151 close | merged origin/main (clean tree; GitHub DIRTY was ledger-driver staleness); archived #151 via #1494; #143 fully resolved; review threads already addressed | check:outstanding-issues; docs:check-links; merge-tree clean | -| 2026-07-30 | claude/capture-session-followups | adc4e2e86edce33849ec9c8080b8f0be86155734 | PR #1490 main sync after #1496 id collision | merged c8e53d57; kept main #149/#150; archived #151 via #1494; renumbered this PR's open rows to #152/#153; #143 fully resolved | check:outstanding-issues; docs:check-links; merge-tree clean | -| 2026-07-30 | PR-1433 | e7a8102620b5b4847894b3df21f438304ea581bd | PR #1433 document result cards and action menu final review | fixed clipped menu, clipboard fallback focus loss, and inherited action typography; no remaining findings | DOM Vitest 4/4; focused Chromium 1/1; typecheck, Prettier, and diff checks pass | | 2026-07-30 | PR #1474 | 098186866932394d2cc17983e566ae6c44b063b4 | PR #1474 full diff vs origin/main | approved | verify:cheap; eval:rag:offline; live canary 30578169116 -> 30579534353 | | 2026-07-30 | codex/coverage-scope-policy | 94f97cdb1d0543724de408f19e79d64e61c8b31a | issue 139 coverage scope policy | approved: workflow coverage breadth is deliberate and test-pinned; docs-like skills remain static-only | check:ci-scope; check:gate-manifest; check:outstanding-issues; prettier; diff check | | 2026-07-30 | codex/coverage-scope-policy | 4da2a003bc2254507662d1b8b6e9768e94371abd | issue 139 coverage scope policy post-sync | approved: late main sync preserves deliberate workflow coverage and static-only skill policy | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | | 2026-07-30 | codex/archive-completed-ci-tasks | 5c902f422ceee78ef68132900fda734c1d5bc1f8 | archive issues 133 and 135 | approved: both rows were already resolved on current main and focused guards prove their contracts | check:ci-scope; check:outstanding-issues; check:branch-review-ledger; diff check | | 2026-07-30 | codex/next-local-task | 3e6d6d69c15fc056773657e15879ba2283fa2899 | archive issues 129 and 132 | approved: documented constraints satisfy both explicit outcomes without overstating client-side enforcement | guard:push:self-test; focused vitest 24/24; check:github-actions; check:outstanding-issues; diff check | +| 2026-07-30 | claude/issues-133-evidence | 6bac6311e1642ceeb0d78896ace11f4d17ace1f7 | docs/outstanding-issues.md: open #151 (residual id-allocation hazard after #133's resolution) | Recorded. #133 resolved conflict frequency (#1444 driver, #1479 Prettier exclusion) but not read-modify-write id allocation; PR #1451 renumbered one row five times, and GitHub Update-branch produced duplicate #141 rows with a stale marker. PR #1506 | check:outstanding-issues exit 0 (149 rows, 51 open, 98 archived, unique ids, next-id=152, no ids deleted from base); pre-push Prettier guard passed on pushed commit, not bypassed; file is .prettierignore-excluded per #1479 | +| 2026-07-30 | claude/capture-session-followups | bbc5d4625adcbdc32aee2f9b4fb4b0d4365d0e99 | outstanding-issues capture: unreadable CI token, at-risk worktree work, unpushed hook fix | PR #1490 opened. Ledger-only: adds #149 (PAT lacks Checks: Read so no PR verdict is readable; the working status endpoint returns total:0 rather than erroring), #150 (four already-merged worktrees hold uncommitted work existing in no branch or PR, largest +395/-200 over 19 files incl CI config), #151 (the #143 pre-commit fail-open d2fd16d54 lives only on a never-pushed branch, 17 behind main, conflicting on the file main's docs:update generator now owns). Also records that PR #1458 is superseded by #1480 and should be closed after owner confirmation | check:outstanding-issues 149 rows 60 open unique ids next-id=152; docs:check-links 1415 refs resolve; docs:check-index 49 roots/modules/routes; prettier clean | +| 2026-07-30 | claude/capture-session-followups | a026c0bfe70f0e9fe290abbdd3660f4c458e4115 | PR #1490 #143/#151/#149 reconciliation | corrected archived #143 fail-open claim; #151 owns remaining half; #149 separates Checks:Read from missing-gh; merged main #1491 | check:outstanding-issues; docs:check-links | +| 2026-07-30 | claude/capture-session-followups | f18dc1fb25f4687006be897f2c11a4bb1f583f41 | PR #1490 #143/#151/#149 reconciliation | reconciled after parallel remote main-sync; #143 corrected; #151 owns fail-open; #149 separates Checks vs missing-gh | check:outstanding-issues; docs:check-links | +| 2026-07-30 | claude/capture-session-followups | 4a041fcd2ac8f12e4ebb0ab68e0151722db65bcf | PR #1490 main sync + #151 close | merged origin/main (clean tree; GitHub DIRTY was ledger-driver staleness); archived #151 via #1494; #143 fully resolved; review threads already addressed | check:outstanding-issues; docs:check-links; merge-tree clean | +| 2026-07-30 | claude/capture-session-followups | adc4e2e86edce33849ec9c8080b8f0be86155734 | PR #1490 main sync after #1496 id collision | merged c8e53d57; kept main #149/#150; archived #151 via #1494; renumbered this PR's open rows to #152/#153; #143 fully resolved | check:outstanding-issues; docs:check-links; merge-tree clean | +| 2026-07-30 | PR-1433 | e7a8102620b5b4847894b3df21f438304ea581bd | PR #1433 document result cards and action menu final review | fixed clipped menu, clipboard fallback focus loss, and inherited action typography; no remaining findings | DOM Vitest 4/4; focused Chromium 1/1; typecheck, Prettier, and diff checks pass | | 2026-07-30 | claude/design-visual-baselines | b57432facb7ded1e9605d1076e0d8c9d661efa2c | open PR changed-scope review | APPROVE after fix: platform-scoped baseline guidance matches the candidate-path and AWAITING_BASELINE adoption contract. | Prettier PASS; docs:check-links PASS; check:ci-scope PASS; review thread resolved; exact-head visual CI required | | 2026-07-30 | pr/1431 | 74e10087eb20a81279fb56d18f28a2475d895fab | docs: visual baseline platform layout | approved; candidate adoption and Linux baseline guidance match implementation | runtime/install parity; ledger; CI scope; docs inventory/links; Prettier; diff-check | | 2026-07-30 | pr/1431 | b4848aa92e890193a4a41744b611746673f3b058 | docs: visual baseline platform layout | approved after remote-head reconciliation; guidance unchanged | ledger; CI scope; docs inventory/links; Prettier; diff-check | @@ -326,10 +327,11 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | codex/computed-style-assertions | 1f431caa8d80660b8f6d90f557e4b8ea5d82560c | post-sync archive completed rendered-style contract task #094 | APPROVED — no findings after exact current-main sync; archive move and prior review record only. | check:outstanding-issues PASS (151 rows; 44 open, 107 archived); branch-review-ledger PASS (254 live, 1206 archived); git diff --check PASS; merge-tree 9ab802e9ec73132e4a7231b9060bf95be090b9d2 | | 2026-07-30 | codex/computed-style-assertions | a8ee3315f2c9959025b7d652c0b7ea45432ca6be | post-#121 sync archive rendered-style task #094 | APPROVED — no findings; #121 main merge preserved and #094 remains the only issue-state change. | outstanding-issues PASS (151 rows; 43 open, 108 archived); branch-review-ledger PASS (261 live, 1206 archived); diff check PASS; merge-tree 2c567bcbb60f5d3f36eb18b6f7d7f6ee2a7a788b | | 2026-07-30 | codex/computed-style-assertions | a18085a15339f280fff76cad15fafcf1a80084fe | post-#1490 sync archive rendered-style task #094 | APPROVED — no findings; current-main issue additions are preserved and #094 is the sole state change. | outstanding-issues PASS (151 rows; 43 open, 108 archived); branch-review-ledger PASS (271 live, 1206 archived); diff check PASS; merge-tree ab18c4319fcca6c915d340bdea286481caa8ea43 | +| 2026-07-31 | claude/issues-133-evidence | 5bb1bc8d8b1d3ba8aebdce5c348887c596f6b8e6 | docs/outstanding-issues.md: re-land #154 (id-allocation hazard) and #155 (--med-accent-soft) after PR #1506 closed unmerged | Recorded. Branch synced to origin/main; main had since taken #151 so the hazard row moved to #154 and --med-accent-soft landed as #155 (its fifth renumber) - both self-demonstrating the row's own claim. PR #1506 to be reopened by the user. | check:outstanding-issues exit 0 (153 rows, 45 open, 108 archived, unique ids, next-id=156, no ids deleted from base); verified zero origin/main ids lost after taking main's table as canonical; pre-push guard passed on pushed commit | | 2026-07-31 | claude/root-dir-coverage-gate-v2 | 398660144d93aeefc2e5649c156948a68925cb64 | docs:check-index repo-root coverage, stale script counts, ledger correction | MERGED as PR #1458 (squash 907fd9f4a). Root-directory coverage pass for docs:check-index, red-then-green proven (flagged .cursor/.design-sync/.vscode, then 49 entries vs 31). Main landed an equivalent pass independently in #1480, so the two overlapped; no duplication reached main. Row not recorded at the time - appended retrospectively | verify:cheap exit 0, 435 test files / 4574 tests pass; codebase-index-coverage 10/10 incl 4 new root cases; eslint clean; docs gates green; prettier clean | | 2026-07-31 | claude/pre-commit-fail-open | 7b96a09b8500adc917cf5549b1c61142b2244b39 | pre-commit hook fail-open when the inventory script is absent | MERGED as PR #1494 (squash 387c3b653). Resolves ledger #153: core.hooksPath is absolute to the primary checkout, so the hook ran in worktrees lacking scripts/update-docs-inventory.mjs and aborted with MODULE_NOT_FOUND. Guard drops the inventory task and re-checks the all-tasks-empty exit; grep carries \|\| true because set -e treats a fully-filtering grep as failure | isolated-repo probe with the script genuinely absent: prints skipping inventory sync, commit succeeds; sh -n clean; no-op when the script is present; prettier does not parse shell so format:check skips it | | 2026-07-31 | claude/ledger-relanding | 30ec06964e4235d9f0b4bb782f357e6b4fb59430 | re-land the three session findings lost when PR #1490 was closed | MERGED as PR #1508 (squash 7b551abc4). Ledger-only: #151 corrects the claim that CI is unreadable (PAT has Actions:read though not Checks:read), #152 re-lands the at-risk worktree inventory with the four preservation snapshots, #153 archives the hook fix. Verified landed by content on main, not by PR state or row id | CI, PR Policy, PR mergeability, SAST, Secret Scan all completed/success via the Actions API; check:outstanding-issues 151 rows 45 open unique ids next-id=154; docs:check-links 1414 refs; prettier clean | -| 2026-07-31 | claude/ci-testing-review-2l8klp | fa304a5332443f544a676bdf35d813797154f87c | PR #1466 reopen-prep | READY: main merged (clean), phoneContract sibling arm fixed+pinned, Codex Cloud origin inspect uses configured URL (insteadOf-safe), prior Codex/Copilot/CodeRabbit threads resolved, no cursor[bot] Bugbot findings, PR left CLOSED | verify:cheap PASS (444 files / 4652 passed, 4 skipped); prettier --check . PASS; check:ci-scope PASS; verify-phone-chrome+codex-cloud-setup+test-runner-safety+playwright-project-isolation 59/59; merge-tree clean before merge; Bugbot none | +| 2026-07-31 | claude/issues-133-evidence | 37f71f02f731175e4fed500f95529c3ef9eb568f | PR #1506 reopen prep: sync main, renumber hazard to #155, supersede #112 residual | READY — conflict cleared vs origin/main; main #154 preserved; hazard=#155 with archived #112 residual cross-link; med-accent=#156; false #155 evidence clause removed; Codex P2 addressed; Bugbot P1/P2 fixed; PR left CLOSED | check:outstanding-issues 154 rows/46 open next-id=157; check:branch-review-ledger 277 live; merge-tree clean da0c63d0; format no-op | | 2026-07-30 | PR-1490 | 0a44df55532fcea3cf3b8cad28526ff8805d803b | PR #1490 consolidated session follow-ups | reviewed; consolidated accurate provider-token, preserved-worktree, install-parity, CodeRabbit, hook, and physical-device findings; resolved concurrent documentation conflict without lost rows | check:outstanding-issues pass; check:branch-review-ledger pass; docs:check-links pass; git diff --check pass | | 2026-07-30 | PR-1492 | 4fdc4ba99f94a369702c747b104fa4eaf48cb53e | PR #1492 exact-head branch-sync anti-churn review | approved after P2 repair; current helper fails closed on Actions lookup errors and defers only behind branches with queued or running exact-head CI; operator guidance and tests match | focused Vitest 9 tests passed on reviewed implementation; hosted static checks passed; exact-head coverage in progress at review; merge-tree audit clean | | 2026-07-30 | PR-1495 | 99c62cf3bd6f2a47d13b6602d54de1f8f73123e1 | PR #1495 hydration documentation correction | approved after correcting unrelated issue #101 label and appending a resolvable landed-SHA hydration review record; content consolidated into PR #1490 | outstanding-issues and ledger guards previously passed; documentation-only diff reviewed; no provider checks required | @@ -337,7 +339,6 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | PR-1431 | 4f54d7e73061b737fd07a726b223adc662cc2776 | PR #1431 visual baseline seed guidance | approved after correcting candidate-copy and AWAITING_BASELINE instructions; unique README content consolidated into PR #1490 to avoid ledger churn | docs links passed; Prettier passed; documentation-only diff reviewed | | 2026-07-30 | PR-1451 | a8e6a419f2ef73a5406e7b69ab4e260157d6f907 | PR #1451 token-reference repair | approved after retaining #1480's stronger production accent role; unique mockup token, design-sync triage, and dead-token finding consolidated into PR #1490 without ledger churn | design-token contract 31 tests passed; outstanding-issues guard passed; Prettier and diff checks passed | | 2026-07-30 | PR-1498 | 42b10ff54977d5835e31201f4dbd36cf9636fc07 | PR #1498 advisory UI issue closure | approved; current-main scope classifier and gate manifest satisfy issue #137, and the documentation-only archive move is consolidated into PR #1490 | CI-scope, gate-manifest, outstanding-issues and diff checks passed | -| 2026-07-30 | claude/issues-133-evidence | 6bac6311e1642ceeb0d78896ace11f4d17ace1f7 | docs/outstanding-issues.md: open #151 (residual id-allocation hazard after #133's resolution) | Recorded. #133 resolved conflict frequency (#1444 driver, #1479 Prettier exclusion) but not read-modify-write id allocation; PR #1451 renumbered one row five times, and GitHub Update-branch produced duplicate #141 rows with a stale marker. PR #1506 | check:outstanding-issues exit 0 (149 rows, 51 open, 98 archived, unique ids, next-id=152, no ids deleted from base); pre-push Prettier guard passed on pushed commit, not bypassed; file is .prettierignore-excluded per #1479 | | 2026-07-30 | PR-1490 | 6662711234f97281dd3d0811059a068202fb1274 | PR #1490 consolidated final current-main review | APPROVE; preserved current-main canonical #151-#153 rows, retained unique #154-#156 findings, folded #1509 style-contract closure, and kept the richer #098 refutation evidence; no remaining P0-P2 findings. | installed-lock parity PASS; tsc --noEmit PASS; single-file ESLint PASS; issue/ledger/docs/format/diff guards PASS; focused Vitest coordinator-blocked | | 2026-07-30 | PR-1509 | 0644f709803c928fb78ced75b504a45c08be0dab | Replacement consolidation after PR #1490 concurrent merge | APPROVE; main's canonical #151-#153 and #143 records retained, unique #154-#156 follow-ups and #094 closure preserved, mockup token repairs unchanged; no remaining P0-P2 findings. | installed-lock parity, tsc, ESLint, issue/ledger/docs/format/diff guards PASS; focused design-token Vitest coordinator-blocked | | 2026-07-30 | PR-1509 | a78c0cf89f323e12cb6ffa4721f54b5cf70cba21 | consolidated remaining reviewed session follow-ups | no actionable findings; preserved all reviewed consolidation content after concurrent head reconciliation | outstanding-issues, branch-review-ledger, design-system-contract, docs links/scripts/index, changed-format, diff-check, typecheck, focused eslint | @@ -346,10 +347,10 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-31 | PR-1510 | eed59358ffdb588c3015ef317de4587d14ea00cf | PR #1510 reopen-ready evidence correction | FIXED: removed false #098 canary attribution; NOTES #154->#157 and restored 7/4/3 token accounting; mockup tokens unchanged | check:outstanding-issues PASS; check:branch-review-ledger PASS; check:design-system-contract PASS; format:changed PASS; canary ancestry vs origin/main/work verified | | 2026-07-31 | PR-1510 | 61d25fd7727c2345fabb9631d604b1632bc0df6d | post-1513 concurrency-note reconciliation | no actionable findings; preserved main 155, renumbered withdrawn guard to 158, and advanced next-id to 159 | outstanding-issues, branch-review-ledger, design-system-contract, changed-format, diff-check | | 2026-07-31 | PR-1510 | 2e8821c77fcadaa283d8a0033b1a6af815458d79 | PR #1510 CodeRabbit + evidence reopen-ready | FIXED: CodeRabbit computed-value-time wording, unique #033 queue order, deduped #098 Done block; prior false canary attribution already corrected | check:outstanding-issues PASS; format:changed PASS; contains origin/main | -| 2026-07-31 | claude/search-results-mockups-iz7owo (PR #1514) | 1daa6b3d7979f2aed8e50b8a4661690bde5c1073 | closed-PR reopen prep | Synced origin/main (behind 68, merge-tree clean, no conflicts). No unresolved Codex/Bugbot/Copilot/human threads. Tip review: no P0-P2 (phone forms presentation only; clinicalRisk false, not RAG). Pathway guard narrowed intentionally; page-level exact guard intact. Ready for reopen; leave CLOSED. Fresh mergeability/CI count only after reopen. | ledger:lookup NOT REVIEWED; git fetch origin/main; merge-tree clean; git merge origin/main; gh reviewThreads=0; classifyPullRequestFiles clinicalRisk=false ragRanking=false; tip-vs-base review (no local suites; closed-PR CI treated stale; no provider-backed checks) | | 2026-07-31 | cursor/ci-followups-093-138-1bf5 | 299698480cb120483ea16895b9265ad2abf5d595 | closed-PR reopen prep | ready-for-reopen; merge-clean vs origin/main after resolving outstanding-issues; no open review threads; no P0-P2 findings; PR left CLOSED | check:outstanding-issues,check:ci-triage,check:github-actions,merge-tree-clean | | 2026-07-30 | codex/moderate-batch-20260730 | 1addcece5a2b7122c5898584830109f617421a3a | document accordion, auth-safe catalogue refetch, comparison contract, operator preflight | P1 late identity response race fixed; no remaining findings | verify:cheap static through owner-scope; lint; typecheck; full Vitest; Chromium UI; production-readiness | | 2026-07-31 | codex/moderate-batch-20260730 | d582c49fe3a2f01bad179d06f84484754b639458 | PR #1485 accordion/catalogues | APPROVE after Bugbot/CodeRabbit triage; fixed differential LRU soft-success on Retry and credential/error pulses; no open review threads; merge-tree clean vs main | vitest catalog DOM 12/12; check:outstanding-issues; merge-tree clean; Bugbot: no cursor[bot] threads; CodeRabbit threads resolved | +| 2026-07-31 | claude/ci-testing-review-2l8klp | fa304a5332443f544a676bdf35d813797154f87c | PR #1466 reopen-prep | READY: main merged (clean), phoneContract sibling arm fixed+pinned, Codex Cloud origin inspect uses configured URL (insteadOf-safe), prior Codex/Copilot/CodeRabbit threads resolved, no cursor[bot] Bugbot findings, PR left CLOSED | verify:cheap PASS (444 files / 4652 passed, 4 skipped); prettier --check . PASS; check:ci-scope PASS; verify-phone-chrome+codex-cloud-setup+test-runner-safety+playwright-project-isolation 59/59; merge-tree clean before merge; Bugbot none | | 2026-07-31 | PR-1485 | f4f42fbc5b4a73d0037c8c275a358d265727e0fc | post-review document accordion and catalogue sync | APPROVE; post-review changes limited to differential refetch memoization and current-main sync; no remaining findings | installed-lock parity; focused catalogue/document suites 3 files 19 tests PASS; typecheck PASS; issue and review-ledger guards PASS; zero unresolved threads | | 2026-07-31 | PR-1515 | 239a2ce6d708f8e1a6ac891c997baefec67cd9ab | PR #1515 CI triage and visible Playwright roots | No high-confidence defects; default-enabled trusted CI triage and visible-owner Playwright helper reviewed | check:installed-lock-parity; check:ci-triage; check:github-actions; check:outstanding-issues; check:branch-review-ledger; typecheck | | 2026-07-30 | codex/repair-pr1416 | 9f5c32270ecc2d606c3a483ddfbeebe3081d3b5d | branch-cleanup | exact merged PR #1416 head; inactive clean worktree archived in verified batch1 bundle | GitHub merged exact head, clean status, no Git operation, no open PR claim, bundle verify ok SHA256 18D9CFFD334278987D8FCCBED5F34125148BFF98C83D39287268103A5326BD2A | @@ -500,3 +501,4 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-31 | origin/claude/outstanding-issues-triage-24c8ow | d3c2a17a848be5458664355de4fd41d0933d2705 | branch-cleanup | safe remote delete: merged PR #1428 content and post-merge #122 disposition are superseded by later current-main issue records; archived batch19 | PR #1428 merged; post-merge tail inspection; current issue-row comparison; no local worktree; exact ls-remote SHA match; bundle verify | | 2026-07-31 | PR-1518 | 2fb0996e0208d3da04f941fdc1c1b4ab14d440d6 | PR #1518 archive validated issue 146 and add duplicated-list finding | APPROVE after current-main conflict repair; stale unvalidated claim corrected and unique issue 159 preserved | check:outstanding-issues PASS 157 rows 44 open 113 archived next-id 160; check:branch-review-ledger PASS; installed-lock parity PASS; diff check PASS | | 2026-07-31 | PR-1520 | 6e6998464a6996a66fdaaadcd482388e39af611e | PR #1520 branch and worktree reconciliation records | APPROVE; 146 historical cleanup dispositions retained as ledger-only evidence with no repository mutation | check:branch-review-ledger PASS 444 live 1206 archived; diff check PASS; current-main merge clean | +| 2026-07-31 | claude/search-results-mockups-iz7owo (PR #1514) | 1daa6b3d7979f2aed8e50b8a4661690bde5c1073 | closed-PR reopen prep | Synced origin/main (behind 68, merge-tree clean, no conflicts). No unresolved Codex/Bugbot/Copilot/human threads. Tip review: no P0-P2 (phone forms presentation only; clinicalRisk false, not RAG). Pathway guard narrowed intentionally; page-level exact guard intact. Ready for reopen; leave CLOSED. Fresh mergeability/CI count only after reopen. | ledger:lookup NOT REVIEWED; git fetch origin/main; merge-tree clean; git merge origin/main; gh reviewThreads=0; classifyPullRequestFiles clinicalRisk=false ragRanking=false; tip-vs-base review (no local suites; closed-PR CI treated stale; no provider-backed checks) | diff --git a/docs/outstanding-issues.md b/docs/outstanding-issues.md index 0541d50bfa..c47d3b5862 100644 --- a/docs/outstanding-issues.md +++ b/docs/outstanding-issues.md @@ -79,7 +79,7 @@ removed after current-main verification; it is not missing recommended work. | 31 | `#099` | A3 | Specialist — answer path | After `#098` | Half a day per sub-item | Remaining fixed per-request round trips: the 8 `setCachedSearch` deferrals (abort semantics + mutation window), the anonymous subject+global limiter pair (needs a new atomic RPC first), and proxy→route identity duplication. Stop before hand-authoring locking SQL. | | 32 | `#103` | A3 | Operator — Supabase schema | Same window as `#102` | 30–60 minutes | Confirm whether the wide `document_table_facts` trigram index from `20260714190000` exists live, then either mirror it into `schema.sql` (retained) or drop it via a forward migration (redundant). **Not the allowlist** — it suppresses live-vs-`schema.sql` findings only and cannot make the migration chain and the mirror agree. Stop: do not drop it without live scan evidence. | - + ## Open items @@ -135,10 +135,11 @@ removed after current-main verification; it is not missing recommended work. | #151 | P3 | issue | `gh pr checks` cannot read CI, but the Actions API can | **Outcome:** nobody concludes CI is unverifiable when it is merely reached through a different endpoint. **Detail:** the session `gh` credential is a fine-grained PAT with **Actions: read** but **not Checks: read**. `gh pr checks` fails per context with `Resource not accessible by personal access token` and `GET /repos/:o/:r/commits/:sha/check-runs` returns 403, so the obvious routes look like a hard wall. `GET .../commits/:sha/status` succeeds but returns `total: 0`, because this repo reports through Actions rather than legacy commit statuses — a silent empty result that reads like an absence of checks instead of an absence of permission. **The working route** is `gh api "repos/BigSimmo/Database/actions/runs?head_sha="` with a jq filter over `.workflow_runs[]`, which returned CI, PR Policy, PR mergeability, SAST and Secret Scan all `completed/success` for PR #1490. **Cost of not knowing this:** two PRs were handed off as green-locally-but-unverifiable and armed for auto-merge instead of merged; #1490 was then closed unmerged and its unique content lost (re-landed as #152). Separately, `scripts/guard-push.mjs` logs `auto-merge: gh not available` only when the CLI cannot execute; that is a distinct #132 prerequisite, not a Checks-permission symptom. **Next:** either add Checks: read to the PAT so `gh pr checks` works, or document the Actions query as the supported way to read CI here. **Stop:** do not report CI as unreadable without trying the Actions endpoint. | session 2026-07-30; PRs #1490, #1494 | 2026-07-30 | | #152 | P2 | issue | Uncommitted work sits in worktrees whose branches are already merged | **Outcome:** work that exists in no branch and no PR is either committed or knowingly discarded, not lost to a disk reclaim. **Inventory 2026-07-30**, all from worktrees whose pre-snapshot branch tips were fully merged into `origin/main`, so the uncommitted changes existed nowhere else: `codex/reconcile-immediate-20260730` — 21 files, +395/-200 across 19 tracked, including `.github/workflows/ci.yml`, `package.json` and `docs/scripts-index.md`; `codex/document-results-mockup-20260730` — 8 files (+13/-3 tracked) plus an untracked `document-search-results/page.tsx` under `src/app/mockups/` (named without a full path here because it does not resolve in this repo); `codex/chat-ledger-triage-d344` — `docs/outstanding-issues.md` +59/-61; `claude/section-spy-browser-coverage` — `tests/ui-smoke.spec.ts` +51. A fifth (`claude/frosty-mayer-2c6167`) self-resolved to clean during the session. **Preserved 2026-07-30, not reviewed:** each was committed on its own branch as an unpushed `wip: preserve uncommitted work before worktree cleanup` snapshot, so the work now survives a worktree reclaim — `codex/reconcile-immediate-20260730` `748ef018f`, `codex/document-results-mockup-20260730` `5dbd9f965`, `codex/chat-ledger-triage-d344` `b7eae51a4`, `claude/section-spy-browser-coverage` `d949859c3`. All four worktrees are now clean. None is pushed and none is reviewed or verified; the snapshots exist to stop silent loss, not to endorse the content. First captured in PR #1490, which was closed unmerged; re-landed on `main` by PR #1508. **Next:** per snapshot, review and either promote it to a real branch/PR or `git reset --hard HEAD~1` to drop it. Do not bulk-delete worktrees without this check — it is why only one of the two "safe" candidates was removed in the 2026-07-30 cleanup. | session 2026-07-30 worktree cleanup; PR #1490 (closed); PR #1508 | 2026-07-30 | | #154 | P3 | rec | Row ids are not stable identifiers for "did my change land" | **Outcome:** an agent confirms work reached `main` by content, never by id, title or PR state. **Detail:** three separate checks gave false answers during the 2026-07-30 session. (1) Grepping row **titles** reported rows missing that were present — a concurrent session had reworded them. (2) Grepping row **ids** reported rows present that were absent — `main`'s `#149`/`#150` were unrelated rows (installed-lock parity, CodeRabbit budget) that took those ids during a parallel renumber, because ids are allocated by read-modify-write against a marker and two branches can allocate the same number. (3) `gh pr view` reported `state=MERGED` for a PR whose branch head was not an ancestor of `main` — normal for squash merges, and separately a PR showed `MERGED` while its content genuinely had not landed yet at the ref that had been fetched. A fourth variant: `git show :` silently mangles under MSYS, so a grep over its empty output returns 0 and reads as absence. **What works:** resolve the blob (`git ls-tree `) and `git cat-file -p` it, then grep for **distinctive prose** from the change. **Cost:** PR #1490 was believed landed, was closed unmerged, and took the only record of four preservation snapshots with it; it had to be reconstructed as #152. **Next:** consider a short note in `AGENTS.md` next to the existing squash-verification guidance. **Stop:** never report work as landed on the strength of an id match, a title match, or a PR state field. | session 2026-07-30; PRs #1490, #1508 | 2026-07-31 | -| #157 | P3 | issue | `--med-accent-soft` is dead plumbing | **Outcome:** the medication accent trio has no unused member, or its presence is deliberate and recorded. **Detail:** `medicationAccentStyle()` sets `--med-accent-soft`, but no repository consumer reads it; the other two runtime-set medication accent properties are consumed. It was retained because the nearby comment documents the trio as a contract. **Next:** either consume it for the intended section wash or remove the declaration after confirming that contract. **Stop:** do not delete it as a drive-by change. | PR #1451 design-sync token triage | 2026-07-30 | -| #156 | P3 | issue | Outstanding-issues ids are still allocated read-modify-write, and Update-branch corrupts the merge | **Outcome:** two branches cannot silently claim the same outstanding-issues id, and no merge path can commit a file where they have. **Detail:** `#133` fixed the two causes of *conflict frequency* — `#1444` removed `merge=union` and `#1479` excluded the ledger from Prettier so a maximum-width row stops re-padding the whole table. Neither touches **id allocation**, which is still read-modify-write against the `issues:next-id` marker, so two branches open at the same time still pick the same number. Measured on PR #1451 (2026-07-30): one P3 row was renumbered `#135` -> `#141` -> `#145` -> `#147` -> `#149` across four sync cycles, because `main` had taken each id in turn — every renumber was manual. The sharper finding is the resolution path: the GitHub **Update branch** button pushed a sync to that PR head (`df3f3aeed`) whose auto-merge produced **two rows numbered `#141` and two `next-id` markers**, leaving the marker at `142` — below `main`'s highest id, so the next allocation would have reused a live number. `git merge` reported success; only `npm run check:outstanding-issues` caught it. That guard runs in `verify:cheap` and `static-pr`, so such a head cannot merge — but the corruption is produced by a one-click path that runs no guard, and the cost lands on whoever notices. A second session on the same branch later dropped an entire appended evidence block while resolving this file, which the guard cannot detect at all: it validates ids and structure, not whether a merge kept both sides' prose. **Next:** cheapest first — document that Update branch must not be used on PRs touching this file (prefer `npm run sync:pr-branches:apply`, which the repo already prefers for other reasons), then consider allocating ids from a source that cannot collide (per-row files, or a date-plus-slug id) so concurrent branches never contend. **Stop:** do not reintroduce a merge driver here — `#133` settled that; this is about allocation and about merges that silently drop rows, not about the driver. | PR #1451 sync cycles; `df3f3aeed`; session 2026-07-30 | 2026-07-31 | +| #157 | P3 | issue | `--med-accent-soft` is dead plumbing | **Outcome:** the medication accent trio has no unused member, or its presence is deliberate and recorded. **Detail:** `medicationAccentStyle()` at `src/components/clinical-dashboard/medication-record-page.tsx:92` sets `--med-accent-soft` via `color-mix`, but nothing in the repo reads it — `--med-accent` and `--med-accent-border` are both consumed (lines 396/398/407/447). Found while triaging the design-sync `[TOKENS_MISSING]` report that produced `#141`; left in place rather than deleted because it plausibly mirrors the `--clinical-accent-soft` idiom at line 82 as deliberate headroom, and the comment block at lines 84-87 documents the trio as a contract. Verified 2026-07-30 by computed style that the other two members do render: all four consuming sites paint `rgb(225,29,72)` on `/medications/acamprosate` in light and dark. **Next:** either consume it for the section wash or drop the declaration — a two-line change either way. **Stop:** do not delete it as a drive-by inside an unrelated change; confirm the intent first, since the documented contract is the reason it survived the `#141` pass. | Design-sync `[TOKENS_MISSING]` triage, session 2026-07-30 | 2026-07-31 | +| #156 | P3 | issue | Outstanding-issues ids are still allocated read-modify-write, and Update-branch corrupts the merge | **Outcome:** two branches cannot silently claim the same outstanding-issues id, and no merge path can commit a file where they have. **Detail:** Residual of archived `#112` (gate landed; underlying read-modify-write race explicitly left open) plus post-`#133` evidence. `#133` fixed the two causes of *conflict frequency* — `#1444` removed `merge=union` and `#1479` excluded the ledger from Prettier so a maximum-width row stops re-padding the whole table. Neither touches **id allocation**, which is still read-modify-write against the `issues:next-id` marker, so two branches open at the same time still pick the same number. Measured on PR #1451 (2026-07-30): one P3 row was renumbered `#135` -> `#141` -> `#145` -> `#147` -> `#149` across four sync cycles, because `main` had taken each id in turn — every renumber was manual. This capture itself demonstrates the same hazard: first written as `#151` on PR #1506, then `#154` / `#155` after earlier main syncs, then `#156` here because `main` had already taken `#154` and `#155` for unrelated rows. Both renumbers happened *after* `#133` was closed, which is the point: the fixes in `#1444` and `#1479` were real, but they were fixes to conflict frequency, and allocation was never the same problem. The sharper finding is the resolution path: the GitHub **Update branch** button pushed a sync to that PR head (`df3f3aeed`) whose auto-merge produced **two rows numbered `#141` and two `next-id` markers**, leaving the marker at `142` — below `main`'s highest id, so the next allocation would have reused a live number. `git merge` reported success; only `npm run check:outstanding-issues` caught it. That guard runs in `verify:cheap` and `static-pr`, so such a head cannot merge — but the corruption is produced by a one-click path that runs no guard, and the cost lands on whoever notices. A second session on the same branch later dropped an entire appended evidence block while resolving this file, which the guard cannot detect at all: it validates ids and structure, not whether a merge kept both sides' prose. **Next:** cheapest first — document that Update branch must not be used on PRs touching this file (prefer `npm run sync:pr-branches:apply`, which the repo already prefers for other reasons), then consider allocating ids from a source that cannot collide (per-row files, or a date-plus-slug id) so concurrent branches never contend. **Stop:** do not reintroduce a merge driver here — `#133` settled that; this is about allocation and about merges that silently drop rows, not about the driver. Do not reopen archived `#112` — keep the gate outcome there and track the residual race here. | PR #1451 sync cycles; `df3f3aeed`; archived `#112`; session 2026-07-30; PR #1506 | 2026-07-31 | | #155 | P2 | rec | Several agent sessions edit the same branch and ledger concurrently | **Outcome:** concurrent sessions stop silently undoing each other on shared `claude/*` branches and on this file. **Observed across one task on 2026-07-30/31:** (a) PR #1490 was **closed unmerged by another actor while auto-merge was armed**, and because arming had been treated as "done", the only record of four preservation snapshots went with it and had to be reconstructed as #152. (b) Three branches (`claude/organize-local-worktree-d22bc3`, `claude/root-dir-coverage-gate-v2`, `claude/capture-session-followups`) received pushes from a Cursor Agent and a Codex session mid-task, producing repeated non-fast-forward rejections; one rejection was masked because the push was piped to `tail`, so the reported exit code was `tail`'s and the push looked successful. (c) `scripts/guard-push.mjs` correctly refused a push with `Pushing now races the squash-merge and can orphan this commit`, requiring disarm to push then re-arm. (d) Ledger ids were renumbered underneath in-flight work (#135 to #141 to #144), which is the mechanism behind #154. **Next:** for a green ledger-only PR prefer merging it immediately over arming auto-merge; confirm a push landed with `git ls-remote` rather than the command's exit code; expect ids and row wording to move between reading and writing. **Stop:** do not treat auto-merge as completion, and do not assume a branch you pushed an hour ago still has your commit at its tip. | session 2026-07-30/31; PRs #1490, #1508, #1511 | 2026-07-31 | | #159 | P2 | rec | Lists naming test files are duplicated, and the stale copy fails by running nothing | **Outcome:** no gate, plan or config names a set of test files in a second place without being derived from the filesystem or asserted against it. **Detail:** four instances found on 2026-07-30, each failing the same way — not red, but silently running nothing: (1) `mockupPatterns` in `scripts/ci-change-scope.mjs` matched `-mockups.tsx` only, missing eight singular `-mockup.tsx` components and three of the five `@mockup` specs, so the advisory lane never started for them (PR #1453); (2) `scripts/phone-chrome-plan.mjs` grepped four ownership journeys out of a filename they had moved out of, selecting zero tests; (3) nothing under `tests/helpers/**` was in `uiPatterns`, so editing a shared Playwright fixture reported `ui_changed=false` and `Production UI` skipped entirely — `zero-touch.ts` alone backs six required specs, and this one predated the PR that found it; (4) a helper-only change ran four grepped cases in one of that helper's three consumers (Codex, PR #1466). Each is now guarded individually — `assertMockupSpecParity`, `tests/playwright-project-isolation.test.ts`, and the consumer-list parity test in `tests/verify-phone-chrome.test.ts` — but the general rule is enforced nowhere, so a fifth instance is a matter of time. **Next:** decide whether one gate can assert the class (any array or regex naming `tests/` paths is checked against `readdirSync`), or whether per-site guards are the honest ceiling. **Stop:** do not treat "CI would still have caught it" as a defence — in (3) CI did not, and in (2) and (4) the local gate the repo tells you to run reported green. | PR #1453; PR #1466; session 2026-07-30 | 2026-07-30 | +| #161 | P3 | issue | Two mockup hover tokens are still undefined after `#141` closed | **Outcome:** every `var(--token)` in the repo either resolves or is knowingly exempt, with no unowned exceptions. **Detail:** `#141` closed on the production defect (`--clinical-accent-strong`, now defined in `globals.css` for light, dark and forced-colors), but two of the three genuinely-undefined references it listed are still undefined on `main`: `--primary-hover` and `--success-hover`, referenced at `src/components/favourites-page-mockups/favourites-library-redesign-page.tsx:203` and `:217`, with zero `--name:` definitions anywhere in the stylesheet. Confirmed against `origin/main` on 2026-07-31. Both declarations are therefore dropped at CSS parse time and those hover states silently do nothing. Impact is genuinely low — `*-mockups` is design scratch, 404s in production, and is exempt from the wiring and reachability gates — and `.design-sync/NOTES.md` already calls them lowest priority. This row exists because that note is prose in a tooling file, not a tracked item: with `#141` archived, nothing in this ledger owned them. **Next:** two-line fix when someone is next in that file — `--primary-hover` maps cleanly to `--primary-strong` (the existing `bg-[color:var(--primary)]` + `hover:bg-[color:var(--primary-strong)]` pattern in `badge.tsx:14`); `--success-hover` has no token to map to, since the success triad is text/bg/border with no darker step, so use a utility such as `hover:brightness-110` rather than inventing `--success-strong` for scratch. **Stop:** do not add a `--success-strong` token to `@theme` solely for a mockup, and do not treat this as production-urgent — it is a tidy-up, not a defect users can reach. | `#141` residue; verified against `origin/main` 2026-07-31 | 2026-07-31 | ## Resolved / archive @@ -195,7 +196,7 @@ Move resolved rows here with the resolution date and a one-line outcome. Keep th | #089 | issue | Branch-review-ledger hygiene deferred from PR #1275 | Closed by the 2026-07-28 hygiene pass. The MD056 cell-count and duplicate-row findings dispositioned as "belongs in a dedicated main ledger hygiene pass" on PR #1275 are fixed: 140 mojibake lines restored byte-exact from git history, 6 residual separators repaired, 46 exact duplicates removed, 21 wrong-width rows normalised, and 4 heading+bullet records converted to table rows — 1067 records, all six cells. Root cause closed too: `npm run ledger:lookup` / `ledger:append` (`scripts/branch-review-ledger.mjs`) replace hand-written rows, and `check:branch-review-ledger` now fails on mojibake, cell width, heading records, impossible dates, table gaps, and (from 2026-07-29) unresolvable HEADs and near-duplicates. | 2026-07-28 | | #097 | issue | Gitleaks reports a false red when the PR head moves mid-run | RESOLVED 2026-07-30: Secret Scan checks out the event head SHA and runs `scripts/run-gitleaks-pinned.mjs` against the immutable event base..head range (no mid-run PR commits API re-query). | 2026-07-30 | | #111 | issue | `ui-overlap` phone-inset case still flakes under load | RESOLVED 2026-07-29 (PR #1391). The inset measurement now retries inside `expect(async () => …).toPass({ timeout: 15_000 })` (`ui-overlap.spec.ts:159`) — the same retry-the-measurement shape PR #1375 applied to the eight overlap cases. The 2px symmetry tolerance and the assertions themselves are byte-for-byte unchanged, so a genuinely asymmetric header still fails once the retry budget is spent; only a transient mid-remount sample settles. Full spec green across 4 consecutive runs (14 passed each). Do not relax the tolerance if this recurs — the assertion is the point; make the measurement robust instead. Source: PR #1375 flake triage; session 2026-07-29 | 2026-07-29 | -| #112 | issue | `issues:next-id` has no concurrency protection | RESOLVED 2026-07-30. `npm run check:outstanding-issues` now gates this file, in `verify:cheap` and in the `static-pr` CI job (the gate-manifest check refuses a local gate that CI does not run). It fails on a duplicate id, an id present in both tables, a marker at or below the highest id, a malformed row, and a missing heading or marker — so every shape the 2026-07-29 triple collision took is now a red gate rather than a silent row loss. Verified by replaying that collision against the real file: two rows claiming `#110` produced "#110 appears 2 times (lines 151, 164)", and a lost marker bump produced "issues:next-id=113 is not above the highest id #114". The checker honours `\|` escapes — its first run against the live file flagged row #042, which is correctly escaped, and a gate with false positives is a gate people switch off. NOT fixed: the underlying race. Ids are still allocated by read-modify-write with no lock, and this file still has no `merge=union` driver; what changed is that a collision can no longer land silently. Source: session 2026-07-29 PR sweep; PR #1391 conflict resolution; `.gitattributes` | 2026-07-30 | +| #112 | issue | `issues:next-id` has no concurrency protection | RESOLVED 2026-07-30. `npm run check:outstanding-issues` now gates this file, in `verify:cheap` and in the `static-pr` CI job (the gate-manifest check refuses a local gate that CI does not run). It fails on a duplicate id, an id present in both tables, a marker at or below the highest id, a malformed row, and a missing heading or marker — so every shape the 2026-07-29 triple collision took is now a red gate rather than a silent row loss. Verified by replaying that collision against the real file: two rows claiming `#110` produced "#110 appears 2 times (lines 151, 164)", and a lost marker bump produced "issues:next-id=113 is not above the highest id #114". The checker honours `\|` escapes — its first run against the live file flagged row #042, which is correctly escaped, and a gate with false positives is a gate people switch off. NOT fixed: the underlying race. Ids are still allocated by read-modify-write with no lock, and this file still has no `merge=union` driver; what changed is that a collision can no longer land silently. Residual tracked as open `#156` (do not reopen this archive row). Source: session 2026-07-29 PR sweep; PR #1391 conflict resolution; `.gitattributes` | 2026-07-30 | | #113 | issue | `ModeNav` clips its labels at every phone width on `main` | RESOLVED 2026-07-30 (PR #1405, landed on `main` as `020c1260`). The two lower density bands used `grid-auto-columns: 1fr`, so the widest slot set every slot's width and the label's `truncate` hid the shortfall — nothing overflowed and nothing failed, the word was simply gone. `display: flex` at every band removes the mode rather than retuning it; thresholds went `16/26/34rem` -> `22/33/42rem` against remeasured intrinsic widths (471px for four labels, not the 394px originally budgeted). `tests/ui-mode-nav-density.spec.ts` asserts at both band boundaries and one pixel either side, registered in BOTH Playwright allowlists. **Carry-forward:** the ~8% threshold headroom is not padding — a measured-plus-one-pixel attempt (21/31rem) passed locally and failed CI by exactly 1px, because the variable face rasterises wider on `ubuntu-24.04`. A threshold calibrated to one machine's font metrics is calibrated to nothing. | 2026-07-30 | | #114 | issue | The live Web-Vitals instrument cannot measure its own noise | RESOLVED 2026-07-30 (PR #1407, landed as `a73db460`). Each route/strategy cell is measured `SAMPLES` times (default 3), the MEDIAN is graded, and a cell whose samples straddle a threshold is reported as incomplete evidence rather than resolved either way — so #017's "evidence is too noisy" stop rule can finally fire. Mid-run Chrome drift disqualifies the verdict. **Second defect found in review and fixed in the same PR:** `samples` is a free-text `workflow_dispatch` input, so `samples=1` reached the grader as a valid integer and reproduced the exact single-run matrix this work removes — verified against the pre-fix logic, it reported 0 breaches, 0 incomplete and printed the bold "Every mobile route is within" verdict. Now refused in three places (`main()` before reading any report, `renderTable`'s disqualifier list, and the workflow before spending a live measurement pass). | 2026-07-30 | | #120 | issue | `verify:phone-chrome` exits 0 while reporting failed browser tests | RESOLVED 2026-07-30 — **closed as not reproducible, not as fixed.** The premise is contradicted by a reproduction of its own failure condition. **Evidence, `main` at `fcd9041`:** the container ships Chromium build `1194` while the repo wants `1234`, so `npm run verify:phone-chrome -- --files src/components/clinical-dashboard/mobile-composer-reserve.ts` reproduced the identical shape — the same `13 failed`, every one at `browserType.launch: Executable doesn't exist at /opt/pw-browsers/chromium_headless_shell-1234/…` — and the captured status was **`OVERALL_EXIT=1`**, not 0. The gate stopped at the `focused-browser` stage and never reached `full-ui`, which is correct; the three stages ahead of it were genuinely green (`Test Files 9 passed (9)`, `Tests 105 passed (105)`). **The code path agrees:** status propagates at `scripts/verify-phone-chrome.mjs:72-73` and `scripts/run-playwright.mjs:271-273`, and `childProcessExitCode` returns `1` when `status` is not an integer, so a launch error cannot read as 0. Neither file, nor `scripts/child-process-result.mjs`, has changed since `7581cfc`, which predates this row — so "fixed in the meantime" is ruled out and the original exit-0 reading is what is in doubt. **Leading hypothesis, explicitly unverified:** the 0 was read through a pipe, since `npm run verify:phone-chrome` piped to `tail` reports `tail`'s status rather than the gate's. The original command line was not recorded, so this cannot be confirmed. **Not covered by this reproduction:** the zero-selected-test case (a `--grep` matching nothing) was never exercised — only the launch-failure case this row describes. **If it recurs:** capture the exact command line and `echo $?` with no pipe before re-filing. | 2026-07-30 |