diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 233c0552ec..3293b44bc9 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -1322,7 +1322,7 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie | 2026-07-30 | claude/test-coverage-analysis-2vcd8a | 4f498b66a56b2a7eddde6c841a79621f23b59cc7 | PR #1398 babysit | BLOCKER CLEARED: CONFLICTING due to docs/outstanding-issues.md vs main (#115 band-adoption follow-up). Kept main #115 + next-id=116; preserved PR #109 single-branch/refspec update. Prior tip had no GitHub CI suite (only PR Policy/CircleCI) — push retriggered full CI. 0 review threads; 0 Bugbot findings. | verify:cheap PASS (432 files, 4467 passed \| 4 skipped); repo-hygiene 38/38; sweep:branch-ledger --no-fetch exit 0; format:changed PASS; Bugbot none; hosted CI re-triggered on tip | | 2026-07-30 | PR #1394 / `claude/top-search-design-mockups-w53znc` | `0d47141fc030684299dcb265e3d853c93b9e2a91` | CI/review closeout — merged | MERGED as squash `0d47141f`. Prior tip `4a001efa` had required CI green after prettier fix `61314887` (Static PR/CircleCI red on `#096` padding) and main sync. Layout/`/tools` false-positive fixed; `#115` deferred; review threads resolved. Post-merge ledger-only follow-up. | hosted Static/Unit/PR-required/CircleCI pass on pre-merge tip; vitest adoption 6/6; typecheck; Bugbot no open P0/P1; merge-tree clean | | 2026-07-30 | cursor/pr-1394-ledger-closeout-c2bf | f734dc4d4c8b19d5fec43bbd388c2a421e47668a | PR #1399 babysit / CI+Bugbot closeout | MERGE-READY. No failing CI, no unresolved review threads, merge-tree clean vs origin/main, Bugbot no bugs. Docs-only ledger append for merged #1394; no code fix required. | hosted PR required SUCCESS; Static PR SUCCESS (lint/typecheck/format/ledger); CircleCI verify SUCCESS; local check:branch-review-ledger PASS; prettier PASS; lint PASS; Bugbot pr-bugbot no findings | -| 2026-07-30 | claude/design-computed-style-proof | 228ffc8583dc0579cfba033bcbe0e7ef18be0317 | #094 computed-style proof: unlayered-cascade check in check-design-system-contract.mjs plus ui-smoke computed-style assertions for the accent rail, forced-colors thickness and 44px tap targets; records ledger #116 worktree-deregistration git redirection and #117 issues:next-id collisions | PR #1415 opened; auto-merge off | verify:pr-local 432/432 files 4460 tests; new Playwright case 1 passed; both gates negative-tested red on the injected @layer regression then reverted clean | +| 2026-07-30 | claude/design-computed-style-proof | 228ffc8583dc0579cfba033bcbe0e7ef18be0317 | #094 computed-style proof: unlayered-cascade check in check-design-system-contract.mjs plus ui-smoke computed-style assertions for the accent rail, forced-colors thickness and 44px tap targets; records ledger #123 worktree-deregistration git redirection and #124 issues:next-id collisions | PR #1415 opened; auto-merge off | verify:pr-local 432/432 files 4460 tests; new Playwright case 1 passed; both gates negative-tested red on the injected @layer regression then reverted clean | | 2026-07-30 | PR #1396 / claude/latency-findings-impl-s8g01v | 6f75bba54684c104a9bd70b36c401f04ca4c57b5 | Babysit: sync main after Claude pre-paint fix | Synced origin/main (ledger-only #1399). MERGEABLE; merge-tree clean. Claude tip added pre-hydration overlay reserve fix. No unresolved threads. Bugbot still empty on prior tips. Contract 28/28. | header-scroll-hide-contract 28/28; merge-tree clean; prior verify:cheap/typecheck/lint retained | | 2026-07-30 | claude/test-coverage-analysis-2vcd8a | d5842e62238237ff5c47da0b32ef8d9f12819714 | PR #1398 babysit | COMPLETE for tip: cleared main conflict; fixed Codex P2 (reject refs/*→origin/* nesting); prior Codex P2 (destination check) already fixed in de594186 and resolved; 0 unresolved threads; merge-tree clean. Hosted CI re-running. | repo-hygiene 40/40; verify:cheap earlier PASS on pre-tip; format:changed PASS; Bugbot none; Codex P2 resolved | | 2026-07-30 | PR #1396 / claude/latency-findings-impl-s8g01v | 9d03b84f1a32a056f74727b4e6bdd5558c346bf0 | Babysit: resolve outstanding-issues after #1402/#1398 | FIXED CONFLICTING: took main open-table (widened cols + #109 refspec) and kept #116/#117 phone-chrome gaps (next-id=118). MERGEABLE expected. Codex P1s already fixed on tip and threads resolved. No Bugbot findings. | merge-tree clean; contract 28/28 earlier; verify:cheap on prior tip | diff --git a/docs/outstanding-issues.md b/docs/outstanding-issues.md index 02d8501703..2131eb7312 100644 --- a/docs/outstanding-issues.md +++ b/docs/outstanding-issues.md @@ -157,7 +157,7 @@ removed after current-main verification; it is not missing recommended work. | #121 | P3 | issue | Container Playwright browser build lags the pinned client | **Outcome:** browser gates run in remote sessions without hand-patching. **Evidence 2026-07-30:** the repo's Playwright client resolves headless-shell build `1234`; the container image provides `1194` at `/opt/pw-browsers`, so every browser test fails at launch. Worked around in-session by symlinking `chromium_headless_shell-1234/chrome-headless-shell-linux64/chrome-headless-shell` to the `1194` `headless_shell` binary plus its sibling resources — container-local, nothing committed, and it disappears with the session. `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1` means the mismatch cannot self-heal. **Next:** decide whether the image pins the browser build or the repo pins a client matching the image; until then any remote session claiming browser proof must state which it used. | `docs/testing.md`; container `/opt/pw-browsers` | 2026-07-30 | | #122 | P2 | issue | `ci/circleci: verify` fails on every branch and its log needs operator access | **Outcome:** the CircleCI status is trustworthy signal again, or it stops reporting. **Evidence 2026-07-30:** `ci/circleci: verify` was `failure` on every open PR sampled — #1396, #1407, #1405, and #1400, which is a **docs-only** `AGENTS.md` change — plus #1403's head. It is sharply bounded in time: #1393's head **passed** at build 638 (03:57), and builds 645 (04:09) onward all failed. The job's entire contents were mirrored locally on PR #1396's exact tip and every part is green — `format:check` clean, `lint` exit 0, `typecheck` exit 0, `npm run test` `432 passed (432)` / `4473 passed \| 4 skipped`, and the PyMuPDF-gated `tests/pdf-extractor.test.ts` (the repo's only `process.env.CI`-gated tests) `6 passed (6)` under a locally built `PyMuPDF==1.28.0` venv with `PYTHON_BIN` set exactly as `.circleci/config.yml` does. So the failure is in the job's **environment**, not repo code. Around 40 builds fired in ~40 minutes across 8 open PRs in that window, so credit/quota exhaustion is the leading hypothesis — **explicitly unverified**: the CircleCI project is private and no CircleCI token is available to any agent session, and `api/v1.1/project/gh/BigSimmo/Database/` returns `Build not found` unauthenticated. **Next:** an operator opens one failing build and reads the failing step; if it is quota, either raise it or remove the CircleCI status so it stops masking real reds. **Stop:** do not chase this from a PR branch — it is not branch-specific, and no agent can read the log. Do not go looking for a CircleCI token. | `.circleci/config.yml`; PR #1396 session 2026-07-30 | 2026-07-30 | | #123 | P2 | issue | A deregistered worktree silently redirects git at the shared primary checkout | **Outcome:** losing a worktree cannot put destructive commands on someone else's tree. **Detail:** on 2026-07-30 an in-flight session's worktree (`railway-token-secrets-setup-638ad6`) left `git worktree list` while its directory still existed but held no checkout. Every subsequent `git` call from that cwd resolved _upward_ to `C:/Dev/Apps/Database`, which was on another session's branch with 11 modified and 2 untracked files. A `git reset --hard origin/main` was issued from there; the primary reflog shows it did not land, so nothing was lost, but the same sequence would have destroyed that work. `git status` gave the only hint — paths printed as `../../../src/...`. **Next:** before any mutating git command, assert the cwd is still a registered worktree (compare `git rev-parse --show-toplevel` against the expected path, or check `git worktree list`), and treat a `../../` prefix in `git status` as fail-closed. The #077 primary-checkout write lease guards deliberate concurrent writes, not this accidental redirection. **Stop:** never run `reset --hard`, `clean -fd`, or a branch switch without that assertion. | session 2026-07-30; primary reflog vs worktree list | 2026-07-30 | -| #124 | P3 | issue | `issues:next-id` collides when agents work the same hour | **Outcome:** two sessions cannot mint the same ledger ID. **Detail:** a single task allocated `#096`/`#097`, found both taken by a Cursor Agent, moved to `#098`/`#099`, found those taken too, then `#108`/`#109`, and a later reconciliation renumbered them again to `#110`/`#111` — three collisions in ~24 hours. It resolved correctly each time only because the file carries a `union` merge driver and a human/agent fixed the numbering by hand, i.e. manual repair is absorbing a structural race. **Next:** either derive the ID from something non-colliding (date + short SHA, or the PR number) or have the append helper claim the marker and fail loudly on mismatch instead of trusting a read. **Stop:** do not reuse or renumber an ID that is already published in a commit message, PR body, or another row's cross-reference. | session 2026-07-29/30 across PRs #1375 and #1391 | 2026-07-30 | +| #124 | P3 | issue | `issues:next-id` collides when agents work concurrently | **Outcome:** two sessions cannot mint the same ledger ID. **Detail:** a single task allocated `#096`/`#097`, found both taken by a Cursor Agent, moved to `#098`/`#099`, found those taken too, then `#108`/`#109`, and a later reconciliation renumbered them again to `#110`/`#111` — three collisions in ~24 hours. It resolved correctly each time only because the file carries a `union` merge driver and a human/agent fixed the numbering by hand, i.e. manual repair is absorbing a structural race. **Next:** either derive the ID from something non-colliding (date + short SHA, or the PR number) or have the append helper claim the marker and fail loudly on mismatch instead of trusting a read. **Stop:** do not reuse or renumber an ID that is already published in a commit message, PR body, or another row's cross-reference. | session 2026-07-29/30 across PRs #1375 and #1391 | 2026-07-30 | ## Resolved / archive diff --git a/scripts/check-design-system-contract.mjs b/scripts/check-design-system-contract.mjs index 80625c8924..adcc6f975e 100644 --- a/scripts/check-design-system-contract.mjs +++ b/scripts/check-design-system-contract.mjs @@ -244,18 +244,19 @@ for (const selector of UNLAYERED_EFFECT_SELECTORS) { // Allow leading indentation: a nested rule is still *found*, so the failure // below reports the real problem (wrong layer) instead of "missing", and a // purely cosmetic re-indent cannot masquerade as a deleted rule. - const pattern = new RegExp(`^[ \\t]*${selector.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*\\{`, "m"); - const match = pattern.exec(globals); - assert(Boolean(match), `${selector} base rule is missing from globals.css`); - if (!match) continue; - const enclosing = enclosingAtRules(globals, match.index); - const layers = enclosing.filter((atRule) => atRule.startsWith("@layer")); - assert( - layers.length === 0, - `${selector} must stay UNLAYERED — it is inside "${layers.join(" > ")}" (full ancestry: ` + - `${enclosing.join(" > ") || "top level"}), where Tailwind's utilities layer outranks it ` + - `regardless of specificity and its declared effect becomes inert`, - ); + const pattern = new RegExp(`^[ \\t]*${selector.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*\\{`, "gm"); + const matches = [...globals.matchAll(pattern)]; + assert(matches.length > 0, `${selector} base rule is missing from globals.css`); + for (const match of matches) { + const enclosing = enclosingAtRules(globals, match.index); + const layers = enclosing.filter((atRule) => atRule.startsWith("@layer")); + assert( + layers.length === 0, + `${selector} must stay UNLAYERED — it is inside "${layers.join(" > ")}" (full ancestry: ` + + `${enclosing.join(" > ") || "top level"}), where Tailwind's utilities layer outranks it ` + + `regardless of specificity and its declared effect becomes inert`, + ); + } } const primitives = textAt("src/components/ui-primitives.tsx"); assert(