Task for a local Claude Code session on the Windows workstation. Everything here is blocked by the cloud container specifically, not by approval or cost. Written 2026-08-22 from a web session; main at dea32b8d. Every claim below was verified in that session unless it says otherwise.
Work A1 → A4 in order. Part B is out of scope for this issue.
Context — what just landed, so it isn't redone
Ledger is current as of dea32b8d. Pending inbox is zero.
A1 — Recover or discard the two commits that exist only on the workstation
Why local-only: these objects are not on origin and are unreachable from any container. Verified: git cat-file -t 970d28d25 → Not a valid object name; git ls-remote --heads origin claude/phone-dictionary-header-9180ee returns nothing.
Per the original Dictionary task brief: 970d28d25 fixes the mockup's fit-measurement code to probe intrinsic width; e8e7371b5 merges origin/main. Branch claude/phone-dictionary-header-9180ee.
git log --oneline -5 claude/phone-dictionary-header-9180ee
git show --stat 970d28d25
Then either cherry-pick onto a fresh branch off origin/main and open a PR — mockups are exempt from the wiring and reachability gates but are still typechecked and still weighed by check:bundle-budget against the mockups baseline, so run npm run verify:pr-local — or state explicitly that it no longer applies and delete the branch. Do not silently drop it; this is the last unresolved item from that task brief.
Related and still open: the Codex review comment on #2241 (comment_id=3831169288) that 970d28d25 was written to address.
A2 — Run the browser gates no cloud session has been able to run
Why local-only: the container has Chromium 1194 while Playwright 1.62.1 pins 1234, and the network policy blocks cdn.playwright.dev, so npx playwright install chromium returns 403. Verified this session:
Playwright browser revision check FAILED (not-installed): Playwright expects chromium
revision 1234, but no matching install was found at /opt/pw-browsers
(found instead: chromium-1194)
#2253 therefore shipped without the full Chromium gate. Two suites ran through the config's documented PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH escape hatch against the mismatched revision (ui-dictionary 7 passed, ui-mode-nav-density 48 passed) and CI Production UI passed — but verify:ui in full and verify:phone-chrome have never run against the merged Dictionary work.
npm ci --include=dev
npm run check:installed-lock-parity
npm run check:playwright-browser-revision # must report OK before the rest means anything
npm run ensure # use the URL it prints; never assume localhost:3000
npm run verify:phone-chrome
npm run verify:ui
Report the decisive "N passed" line, not the exit code. verify:ui exits 75 with a DATABASE_HEAVY_RUN_ADMISSION_BUSY marker under lock contention — that is "blocked, retry", not "red" — and exit 0 alone is not proof.
Measurement trap #XPY409: .phone-sticky-header-stack is position: fixed and mounts collapsed. Wait ~1200–1400 ms for settled height before measuring or screenshotting phone chrome.
A failure here is a real regression in merged work. Fix it with the smallest change and open a PR; do not weaken the test. In particular do not drop production tap targets from min-h-12 to min-h-11 — that reintroduces a known ui-smoke flake and is forbidden in AGENTS.md.
A3 — Delete the four dead reconcile branches
Why it matters: they blocked ledger reconciliation for five days and will block the next one identically. assertSafeRemoteReconciliation refuses to start while a branch whose name indicates an in-flight reconcile exists on origin (#EH9VA6).
Already established in #2268 — no need to re-derive. For each of the four, every docs/outstanding-issues-inbox request UUID on the branch is already on main, in either the pending or applied/ directory, so nothing queued is lost. Their only content absent from main was two branch-review records, rescued in #2268. The remaining branch-only files are five sources main deleted deliberately in #2211 (use-upload-desktop-layout.ts, service-group-nav.tsx, therapy-compass/icons.tsx, two upload tests). None had an open PR as of 2026-08-22.
git fetch --prune origin
forbin claude/issues-reconcile-2026-08-19 \
claude/ledger-reconcile-2026-08-21 \
claude/ledger-reconcile-issues-c1trbj \
claude/rag-r0-reconcile-inbox;do
gh pr list --head "$b" --state open # must be empty for eachdoneforbin claude/issues-reconcile-2026-08-19 \
claude/ledger-reconcile-2026-08-21 \
claude/ledger-reconcile-issues-c1trbj \
claude/rag-r0-reconcile-inbox;do
git push origin --delete "$b"done
npm run issues:reconcile -- --dry-run # must NOT print the unmerged-branch refusal
Deletion is irreversible. If any of the four has grown an open PR since 2026-08-22, stop and report instead of deleting.
A4 — Reclaim the Dev Drive (#6GW95D, P3)
The ledger's own update is the point: the scope is far wider than .claude/worktrees. An accidental npx vitest run from C:/Users/joshs enumerated 253 copies of just two test files across the home directory — 253 separate checkouts of this repository across at least six roots (.codex/worktrees, .gemini/antigravity/worktrees, .copilot/repos/copilot-worktrees, .local/share/opencode/worktree, Documents/Codex/..., and more). The capacity emergency is resolved; the inventory and safe orphan cleanup are not.
Inventory first, delete second. Only remove a checkout with no unpushed commits and no uncommitted changes. Read docs/branch-cleanup-guide.md first. Treat any checkout you cannot prove is clean as one to keep.
Part B — explicitly NOT this session
Each is possible on the workstation but is its own piece of work with its own approval. Tracked already in docs/outstanding-issues.md; listed here only so the boundary is unambiguous.
| Item | Why it is separate |
|---|
#1YPV51 (P1) | The medication interaction lexicon is clinically unreviewed despite #318 recording otherwise. Owner's clinical judgement — no agent does this. |
#1K6T35 (P2) | Point-in-time recovery is OFF on the live project (pitr_enabled false, measured 2026-08-19). RPO up to ~24 h on 2,851 documents / 70,120 chunks, and it blocks the "restore point before any mutating phase" rule that #056/#057 depend on. Dashboard/billing decision. |
#CCZ4HB (P1) | Review-bot spending cap reached; three PRs merged 2026-08-22 with no automated review. Billing decision. |
#056, #057, #102 | Supabase windows. check:drift is red with 19 findings, re-measured unchanged 2026-08-18; schema.sql is the stale side for at least seven. Merging under supabase/migrations/** deploys to the live clinical database within seconds. |
#001, #231, #018 | Provider-backed live evaluation; costs money and needs explicit approval. |
#S4K1GA, #71NT23, #75JA0P | Physical iPhone Safari and installed-PWA acceptance. Chromium and Playwright WebKit are not the iOS engine. |
#QSHHGK (P2) | Bundle-budget baseline has no owner or trigger. Note: npm run build reuses a cached .next, so rm -rf .next before measuring or the number is stale. |
Standing rules
- Never report a gate as passing that was not run. Paste the decisive line; exit 0 alone is not proof, and a reused gate receipt is reported as "reused receipt", never as a fresh run.
- Providers need explicit confirmation — OpenAI, Supabase, GitHub, hosted CI — including indirectly through scripts and release gates.
- Flag the task before editing anything under
src/lib/rag/**, clinical-search, retrieval-selection, ranking-config, answer-ranking, the eval harness or the golden fixture, even for a rename. - Run
npm run format and commit the result before any normal push. It is in neither test, typecheck nor lint. - Never assume
localhost:3000. Use npm run ensure. - The ledger is append-only from feature branches:
npm run issues:add|update|done; only a dedicated fresh-base branch runs npm run issues:reconcile.
Task for a local Claude Code session on the Windows workstation. Everything here is blocked by the cloud container specifically, not by approval or cost. Written 2026-08-22 from a web session;
mainatdea32b8d. Every claim below was verified in that session unless it says otherwise.Work A1 → A4 in order. Part B is out of scope for this issue.
Context — what just landed, so it isn't redone
/dictionary/search;/dictionary/browseredirects; phone control row rebuilt; plus the fix for the mobile-/layout shift (0cf0493).#TYZK23,#50QRCF,#KFRC3H, plus new#2TAQDC.Ledger is current as of
dea32b8d. Pending inbox is zero.A1 — Recover or discard the two commits that exist only on the workstation
Why local-only: these objects are not on
originand are unreachable from any container. Verified:git cat-file -t 970d28d25→Not a valid object name;git ls-remote --heads origin claude/phone-dictionary-header-9180eereturns nothing.Per the original Dictionary task brief:
970d28d25fixes the mockup's fit-measurement code to probe intrinsic width;e8e7371b5mergesorigin/main. Branchclaude/phone-dictionary-header-9180ee.Then either cherry-pick onto a fresh branch off
origin/mainand open a PR — mockups are exempt from the wiring and reachability gates but are still typechecked and still weighed bycheck:bundle-budgetagainst themockupsbaseline, so runnpm run verify:pr-local— or state explicitly that it no longer applies and delete the branch. Do not silently drop it; this is the last unresolved item from that task brief.Related and still open: the Codex review comment on #2241 (
comment_id=3831169288) that970d28d25was written to address.A2 — Run the browser gates no cloud session has been able to run
verify:phone-chromegreen — 133 contract tests passed, focused browser 12 passedverify:uigreen — 473 passed, 2 skipped, 0 failed (19.7m)Why local-only: the container has Chromium
1194while Playwright 1.62.1 pins1234, and the network policy blockscdn.playwright.dev, sonpx playwright install chromiumreturns 403. Verified this session:#2253 therefore shipped without the full Chromium gate. Two suites ran through the config's documented
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATHescape hatch against the mismatched revision (ui-dictionary7 passed,ui-mode-nav-density48 passed) and CI Production UI passed — butverify:uiin full andverify:phone-chromehave never run against the merged Dictionary work.Report the decisive "N passed" line, not the exit code.
verify:uiexits75with aDATABASE_HEAVY_RUN_ADMISSION_BUSYmarker under lock contention — that is "blocked, retry", not "red" — and exit 0 alone is not proof.Measurement trap
#XPY409:.phone-sticky-header-stackisposition: fixedand mounts collapsed. Wait ~1200–1400 ms for settled height before measuring or screenshotting phone chrome.A failure here is a real regression in merged work. Fix it with the smallest change and open a PR; do not weaken the test. In particular do not drop production tap targets from
min-h-12tomin-h-11— that reintroduces a knownui-smokeflake and is forbidden inAGENTS.md.A3 — Delete the four dead reconcile branches
issues:reconcile --dry-runno longer refusesWhy it matters: they blocked ledger reconciliation for five days and will block the next one identically.
assertSafeRemoteReconciliationrefuses to start while a branch whose name indicates an in-flight reconcile exists onorigin(#EH9VA6).Already established in #2268 — no need to re-derive. For each of the four, every
docs/outstanding-issues-inboxrequest UUID on the branch is already onmain, in either the pending orapplied/directory, so nothing queued is lost. Their only content absent frommainwas two branch-review records, rescued in #2268. The remaining branch-only files are five sourcesmaindeleted deliberately in #2211 (use-upload-desktop-layout.ts,service-group-nav.tsx,therapy-compass/icons.tsx, two upload tests). None had an open PR as of 2026-08-22.Deletion is irreversible. If any of the four has grown an open PR since 2026-08-22, stop and report instead of deleting.
A4 — Reclaim the Dev Drive (
#6GW95D, P3)The ledger's own update is the point: the scope is far wider than
.claude/worktrees. An accidentalnpx vitest runfromC:/Users/joshsenumerated 253 copies of just two test files across the home directory — 253 separate checkouts of this repository across at least six roots (.codex/worktrees,.gemini/antigravity/worktrees,.copilot/repos/copilot-worktrees,.local/share/opencode/worktree,Documents/Codex/..., and more). The capacity emergency is resolved; the inventory and safe orphan cleanup are not.Inventory first, delete second. Only remove a checkout with no unpushed commits and no uncommitted changes. Read
docs/branch-cleanup-guide.mdfirst. Treat any checkout you cannot prove is clean as one to keep.Part B — explicitly NOT this session
Each is possible on the workstation but is its own piece of work with its own approval. Tracked already in
docs/outstanding-issues.md; listed here only so the boundary is unambiguous.#1YPV51(P1)#318recording otherwise. Owner's clinical judgement — no agent does this.#1K6T35(P2)pitr_enabled false, measured 2026-08-19). RPO up to ~24 h on 2,851 documents / 70,120 chunks, and it blocks the "restore point before any mutating phase" rule that#056/#057depend on. Dashboard/billing decision.#CCZ4HB(P1)#056,#057,#102check:driftis red with 19 findings, re-measured unchanged 2026-08-18;schema.sqlis the stale side for at least seven. Merging undersupabase/migrations/**deploys to the live clinical database within seconds.#001,#231,#018#S4K1GA,#71NT23,#75JA0P#QSHHGK(P2)npm run buildreuses a cached.next, sorm -rf .nextbefore measuring or the number is stale.Standing rules
src/lib/rag/**, clinical-search, retrieval-selection, ranking-config, answer-ranking, the eval harness or the golden fixture, even for a rename.npm run formatand commit the result before any normal push. It is in neithertest,typechecknorlint.localhost:3000. Usenpm run ensure.npm run issues:add|update|done; only a dedicated fresh-base branch runsnpm run issues:reconcile.