From 28ea0ef067ec5b06a6c28f609f9535f6b92b160b Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 7 Sep 2026 10:02:45 +0000 Subject: [PATCH 1/3] issues: record the four loose ends the differentials rework left behind MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #2665 merged and deployed, and three things it surfaced were recorded nowhere. The session-start hook asked for a capture twice and never got one, so this is that capture. Queued through npm run issues:add/update only; docs/outstanding-issues.md itself is untouched and these apply on the next npm run issues:reconcile. P1 — ten locally authored differential records are live with no clinician sign-off. src/lib/differential-curated.ts seeds delirium, hypoactive delirium, NMS, serotonin toxicity, catatonia in mood disorder, akathisia, alcohol withdrawal, clozapine adverse effects, postpartum psychosis and lithium physiological withdrawal tremor. The labelling and the two enforcing tests are done; the attestation is not, and the content reached psychiatry.tools when main deployed. Shaped after #SBKXZ7, including its rule that assistants never tick the clinical checks on their own behalf. P2 — the differentials export leaves 194 of 201 records with an empty section summary, 150 with no investigations and 110 with no immediate actions, and lithium-physiological-withdrawal-tremor carries akathisia's content outright. The detail page now degrades honestly around this, which is why it is not P1, but the per-slug overlay treats symptoms and no row owned the generator. #QSHHGK updated: the baseline it was opened around has now been refreshed, so its points (2) and (3) are superseded and only the missing refresh owner keeps it open. The update records that it was measured from main at fd81561 rather than from a feature branch — a feature-branch baselineSource is deleted by squash-merge, which is how the previous one became unresolvable — and it deliberately preserves the row's caution that the refresh absorbed growth never attributed to a reviewed change set. That was the owner's call. #ZWJ71W updated with a cross-reference: the two morning specs it names are now test.skip on main as well (18a42d2), so Advisory UI is green and the owner ruling behind those skips is less visible than while they were failing, not more. Verified: check:outstanding-issues in step (121 open); working tree contains nothing outside docs/outstanding-issues-inbox/; npm run format clean. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GMHX5TDG34BBn2yDdi81s5 --- .../2ab09b4d-a5b8-4854-b04e-c18942cbc33b.json | 11 +++++++++++ .../6582c265-084e-4c0d-8de8-4f5511df7b35.json | 14 ++++++++++++++ .../6d9ced9d-0f97-4519-b7d0-8a5bffc596d6.json | 14 ++++++++++++++ .../a4593f03-bf88-4310-8138-c14b4a77b97d.json | 12 ++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 docs/outstanding-issues-inbox/2ab09b4d-a5b8-4854-b04e-c18942cbc33b.json create mode 100644 docs/outstanding-issues-inbox/6582c265-084e-4c0d-8de8-4f5511df7b35.json create mode 100644 docs/outstanding-issues-inbox/6d9ced9d-0f97-4519-b7d0-8a5bffc596d6.json create mode 100644 docs/outstanding-issues-inbox/a4593f03-bf88-4310-8138-c14b4a77b97d.json diff --git a/docs/outstanding-issues-inbox/2ab09b4d-a5b8-4854-b04e-c18942cbc33b.json b/docs/outstanding-issues-inbox/2ab09b4d-a5b8-4854-b04e-c18942cbc33b.json new file mode 100644 index 000000000..6a7df1a9c --- /dev/null +++ b/docs/outstanding-issues-inbox/2ab09b4d-a5b8-4854-b04e-c18942cbc33b.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "2ab09b4d-a5b8-4854-b04e-c18942cbc33b", + "createdOn": "2026-09-07", + "action": "update", + "payload": { + "id": "#ZWJ71W", + "detail": "Found 2026-09-02 while correcting #YTR84P, and recorded separately because it is a different defect from the pinned-clock one and would be missed inside that row's prose. On branch claude/ward-flow-phases-6-7-design at 1888ad1: tests/ui-ward-morning.spec.ts clicks ward-morning-view-fixed and ward-morning-view-live (lines 51-52 and 195-206). Those test ids live in ViewControl (morning-page.tsx around lines 481-487), but owner decision WB-DB-11 ('ONE VIEW, ALWAYS LIVE') left MorningPage rendering MorningBody and nothing else, so ViewControl is exported and rendered by nothing. The spec therefore cannot pass as written. Same root cause as the D5 problem recorded in #YTR84P - the fixed/live split was removed while the code and tests that depend on it were left behind - so both should be settled by the same decision: either restore the fixed view, or retire it and remove the orphaned code and assertions together. SCOPE AND URGENCY: low. That branch's PR #2466 was closed unmerged on 2026-08-31 (299 commits ahead of main, mergeable_state dirty, titled 'DRAFT, not for merge'), and all of it is synthetic design scratch under src/app/mockups/ward-flow/**, which 404s in production. Nothing on main is affected. Recorded so it is not rediscovered from scratch by whoever takes the D5 decision. Offline only - the branch fetches normally from a cloud container with git fetch --depth=50 origin claude/ward-flow-phases-6-7-design. UPDATE 2026-09-06 (cross-reference only; this row's own finding is unchanged): the SAME two tests are now test.skip ON MAIN as well, not just unpassable on the Phase 6 branch. Commit 18a42d2 marked \"the morning page renders its headline, and the rail navigates away and back\" and \"print states when the sheet was printed, and the real PDF is exactly one A4 page\" as test.skip with a stated reason, because on main /mockups/ward-flow/morning is now only a redirect to /capacity and MorningPage is mounted by no route at all - so there is nothing honest to retarget them to either. That commit deliberately skipped rather than deleted or rewrote them, pending an owner ruling on spec D9. WHY THIS MATTERS FOR THIS ROW: the non-required Advisory UI job is consequently GREEN again, so the decision behind these skips is now less visible than it was while they were failing, not more. Component-level coverage continues in tests/ward-morning-page.dom.test.tsx and tests/ward-morning-print.test.ts. The ruling itself is unchanged and still owner-owned: restore the fixed/live morning view, or retire it and remove the orphaned ViewControl code and both specs together. Settling it should close this row and the D5 half of #YTR84P at the same time.", + "baseRowFingerprint": "565ee27887d9f0607ebd62021df38cd59d495a251f856431f23ef6b374007136" + } +} diff --git a/docs/outstanding-issues-inbox/6582c265-084e-4c0d-8de8-4f5511df7b35.json b/docs/outstanding-issues-inbox/6582c265-084e-4c0d-8de8-4f5511df7b35.json new file mode 100644 index 000000000..7131e6284 --- /dev/null +++ b/docs/outstanding-issues-inbox/6582c265-084e-4c0d-8de8-4f5511df7b35.json @@ -0,0 +1,14 @@ +{ + "version": 2, + "id": "6582c265-084e-4c0d-8de8-4f5511df7b35", + "createdOn": "2026-09-07", + "action": "add", + "payload": { + "pri": "P1", + "type": "task", + "summary": "Ten locally authored differential records are live and carry no clinician sign-off", + "detail": "Merged and live in PR #2665 (main e45bd02, which auto-deploys to psychiatry.tools), so this content is in front of clinicians now. TEN SEEDED SLUGS in src/lib/differential-curated.ts: delirium, hypoactive-delirium, neuroleptic-malignant-syndrome, serotonin-toxicity, catatonia-in-mood-disorder, akathisia, alcohol-withdrawal, clozapine-specific-adverse-effects-toxicity, postpartum-psychosis, lithium-physiological-withdrawal-tremor. Each entry may carry atAGlance safety facts, doNow first moves, discriminators for the map comparison table, and a contentNote. WHAT IS ALREADY IN PLACE, so this row is not overstated: every authored block renders the provenance line \"Locally authored - verify before use\" (curatedProvenanceLabel in differential-detail.ts); the Source tab states when a record carries authored content (hasCuratedContent, rendered as testid differential-authored-content-note); authored steps stop at assessment and escalation rather than dosing, which docs/clinical-governance.md \"Clinical Use Rules\" reserves for validated tooling; and two unit tests in tests/differential-detail.test.ts enforce both boundaries - no discriminator may name a diagnosis its own record does not list in related, and no authored doNow step may match a dose pattern. The entry is resolved server-side in getDifferentialDetailContext and travels on DifferentialDetailContext.curated, so only the record on screen crosses the client boundary. WHAT IS MISSING: clinician sign-off. The content was authored by an assistant, not by a clinician, and no qualified reviewer has read it. Treat this exactly as #SBKXZ7 treats therapy sign-off - the tooling and labelling are done, the attestation is not, and assistants must never tick the clinical checks on their own behalf. NEXT: the owner reads the ten entries and either signs them off, edits them, or removes the ones they do not want to stand behind. There is currently no review-status field on a curated entry, so consider whether sign-off should be recorded in the module (a reviewedBy/reviewedAt pair per slug, mirroring the therapy generator's contract) or tracked only here. STOP: do not add further seeded records until these ten are ruled on. SEPARATE BUT ADJACENT: lithium-physiological-withdrawal-tremor is seeded largely to CORRECT the generated export, whose clinicalHinge is the definition of akathisia and whose immediateActions are four statements about akathisia, parkinsonism and tardive syndromes; its contentNote says so on the page. The underlying export defect is its own row.", + "source": "Claude Code session 2026-09-06 (session_01GMHX5TDG34BBn2yDdi81s5), PR #2665 merged as e45bd02", + "issueUlid": "01M1XMVB7K87GR248JR8CYQ151" + } +} diff --git a/docs/outstanding-issues-inbox/6d9ced9d-0f97-4519-b7d0-8a5bffc596d6.json b/docs/outstanding-issues-inbox/6d9ced9d-0f97-4519-b7d0-8a5bffc596d6.json new file mode 100644 index 000000000..5a55509f9 --- /dev/null +++ b/docs/outstanding-issues-inbox/6d9ced9d-0f97-4519-b7d0-8a5bffc596d6.json @@ -0,0 +1,14 @@ +{ + "version": 2, + "id": "6d9ced9d-0f97-4519-b7d0-8a5bffc596d6", + "createdOn": "2026-09-07", + "action": "add", + "payload": { + "pri": "P2", + "type": "issue", + "summary": "The differentials export leaves 194 of 201 records with an empty section summary, and at least one carries another diagnosis's content", + "detail": "Measured over all 201 records in data/differentials-snapshot.json during the 2026-09-06 session: 150 carry NO investigations, 110 carry NO immediate actions, 194 have at least one EMPTY section summary, and 55 of the 91 records that do have \"immediate actions\" carry statements rather than actions. Worse than sparse in at least one case: lithium-physiological-withdrawal-tremor is titled \"Lithium\" with a tremor subtitle, but its clinicalHinge is the definition of AKATHISIA, its four immediateActions are statements about akathisia, drug-induced parkinsonism and tardive syndromes rather than actions, and its related nodes are the EPS family rather than tremor differentials. That is another diagnosis's content presented under this one. WHY THIS IS P2 AND NOT P1: the detail page now degrades honestly around it. Every panel added in PR #2665 renders only when it has content, so a sparse record produces a sparse page rather than a confident-looking empty one; buildDiscriminators derives a row only from data the catalogue actually carries and leaves the cell blank rather than echoing the other column; and the one known-mismatched record shows a content note saying its generated sections mix material from other diagnoses. Nothing fabricates. WHAT REMAINS: the overlay in src/lib/differential-curated.ts treats symptoms one record at a time and does not scale - repairing the generator that produced 194 records with an empty section summary is a data-pipeline job, and no row owned it before this one. NEXT: find the export/generation step behind data/differentials-snapshot.json, establish whether the empty sections are a source-content gap or a mapping bug in the exporter, and fix at that layer. The per-record counts above are the measurement to re-run afterwards - a fix should move them materially, and the lithium record specifically should stop carrying akathisia content. STOP: do not paper over further records by seeding differential-curated.ts; that overlay exists for correction and high-yield enrichment, not as a substitute for a working export, and every seeded record adds clinical content that needs its own sign-off (see the authored-records row).", + "source": "Claude Code session 2026-09-06 (session_01GMHX5TDG34BBn2yDdi81s5), measured across data/differentials-snapshot.json while building PR #2665", + "issueUlid": "01M1XMVVBHVMG7D8T4KN1HCQ0R" + } +} diff --git a/docs/outstanding-issues-inbox/a4593f03-bf88-4310-8138-c14b4a77b97d.json b/docs/outstanding-issues-inbox/a4593f03-bf88-4310-8138-c14b4a77b97d.json new file mode 100644 index 000000000..b7565dc96 --- /dev/null +++ b/docs/outstanding-issues-inbox/a4593f03-bf88-4310-8138-c14b4a77b97d.json @@ -0,0 +1,12 @@ +{ + "version": 2, + "id": "a4593f03-bf88-4310-8138-c14b4a77b97d", + "createdOn": "2026-09-07", + "action": "update", + "payload": { + "id": "#QSHHGK", + "detail": "UPDATE 2026-09-02 (PR #2527): the missing TRIGGER now exists. .github/workflows/bundle-budget-refresh.yml runs weekly (Wednesday 04:40 UTC, deliberately off the crowded Sunday-evening cluster) plus workflow_dispatch, removes .next before building so the measurement is not read from a stale cache, and runs check-bundle-budget.mjs --refresh-baseline. It is REPORT ONLY: it publishes to a rolling bundle-budget-refresh issue and uploads the refreshed bundle-budget.json as an artifact, and never commits, pushes or opens a PR, because check-github-action-pins.mjs bans workflow-authored branch mutation and a baseline moved by a bot is one nobody reviewed. WHAT REMAINS, and why this row stays open: (1) no named refresh OWNER — the apply step is still a human action on the artifact the run produces; (2) the recorded baselineSource 0764fb58 STILL does not resolve, re-checked 2026-09-02 after deepening a container clone to 3419 commits, so the standing +5.2% remains unattributable to any reviewed change set; (3) the baseline numbers were deliberately NOT refreshed in PR #2527, because doing so would have silently absorbed that unattributable growth. The first run — scheduled, or dispatched once after merge — produces a measurement whose source resolves, and that is the point at which a refresh becomes reviewable and this row can close. UPDATE 2026-09-06 (PR #2665): THE BASELINE HAS NOW BEEN REFRESHED, at the owner's explicit instruction, so points (2) and (3) above are superseded. Measured from MAIN at fd8156109c54ed078895610406f629f4baf282b7 rather than from the feature branch, for two reasons that this row's own history explains: a baseline taken on a feature branch describes unreviewed code and freezes that PR's weight into the ceiling as free allowance; and --update stamps HEAD as baselineSource, so run on a feature branch it would have pinned a commit that squash-merge deletes, which is exactly how 0764fb58 became unresolvable. fd81561 was verified as an ancestor of main after the merge, so the provenance warning this row was opened around no longer fires. NUMBERS: production 1656.0 -> 1808.2 KiB gzip, mockups 613.1 -> 746.9, route / 278.5 -> 246.2, route /documents/search 281.6 -> 249.0 (both route budgets FELL). Tolerances untouched at 10/10/25 percent - the ruler was re-datumed, not lengthened. WHAT PROMPTED IT: main sat at +9.2% of a 10% ceiling, leaving roughly eight kilobytes of headroom, and PR #2665's Build job failed at exactly +10.0% - the failure mode this row predicted. That PR's own regression was found and fixed separately (an authored data module was reaching the client bundle) and it passed at +9.7% against the OLD baseline before any refresh, so the refresh was not used to rescue it. THE ROW'S CAUTION STANDS AND SHOULD NOT BE READ AWAY: this refresh DID absorb roughly two weeks of accumulated growth that was never attributed to a reviewed change set. That was the owner's decision, taken knowingly and stated at the time. WHAT KEEPS THIS ROW OPEN: point (1) only - there is still no named OWNER for the weekly bundle-budget-refresh.yml artifact, so the apply step remains an unscheduled human action and the same drift will re-accumulate. Whoever closes this row should name that owner, or decide the weekly report is enough.", + "source": "session 2026-09-02, PR #2527; refreshed 2026-09-06 in PR #2665 (session_01GMHX5TDG34BBn2yDdi81s5)", + "baseRowFingerprint": "b31c2800eec69dfc49e478f141fed32c8b6ac287f84983b5e349ea16b993fcdf" + } +} From 95817005324c88308a84abe500219aa8bf6c12f7 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 7 Sep 2026 11:13:41 +0000 Subject: [PATCH 2/3] issues: close the bundle-budget row, and correct the D9 framing rather than act on it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two of the four PR items had owner decisions that could be executed. Only one of them survived contact with the repository. CLOSED #QSHHGK. The owner is the named refresh owner and the weekly report-only run is sufficient, which resolves the last of the three reasons it stayed open; the other two were resolved by the 2026-09-06 refresh from main at fd81561. The closing note deliberately carries the row's own caution forward: that refresh absorbed roughly two weeks of growth never attributed to a reviewed change set, and closing the row does not un-record it. DID NOT retire the fixed morning view, though that was the decision given. Two independent reasons, either sufficient on its own. First, the question was mis-framed when it was put to the owner, and the mis-framing is mine. Spec D9 is not the fixed/live morning view: the phase-4 design spec defines D9 as the SHIFT HANDOVER page, which is already built at components/ward-management/handover/ and imports none of the morning freeze machinery. The actual open D9 question, in the spec file's own words, is "whether the morning board and the shift handover still owe each other a cross-link once folded" — a navigation question. The fixed/live split is not an open question at all; owner decision WB-DB-11 already reversed it. The two skipped specs are therefore parked on the cross-link ruling, and morning-page.tsx explicitly instructs against the three moves that would pre-empt it. Second, npm run check:dead-code-candidate REFUSED all five candidates — FrozenMorning, buildFrozenMorning, ViewControl, NoHandoverYet, MorningView. Each was introduced 2026-09-03, four days ago and well inside the 30-day threshold; ViewControl is additionally pinned by two committed tests. Per docs/agents/dead-code-deletion.md a refusal is a stop and the threshold is not to be tuned to make a diff pass. Earliest eligible re-check is 2026-10-03. #ZWJ71W updated with both findings and with the question the owner actually needs to answer, so the next reader does not repeat the mis-framing. Its earlier reference to "the D5 half of #YTR84P" is corrected too: D5 in that spec is release-a-hold and cancel-a-transport, unrelated to any of this. No source or test file is touched by this commit. Verified: npm run format clean; working tree contains nothing outside docs/outstanding-issues-inbox/; the dead-code gate output above is quoted from a real run, not assumed. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GMHX5TDG34BBn2yDdi81s5 --- .../2e5e2bc1-25b0-43af-805c-e3f7d8c63a13.json | 11 +++++++++++ .../ce667f09-3a39-4d1d-bc8f-969bc0b5393d.json | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 docs/outstanding-issues-inbox/2e5e2bc1-25b0-43af-805c-e3f7d8c63a13.json create mode 100644 docs/outstanding-issues-inbox/ce667f09-3a39-4d1d-bc8f-969bc0b5393d.json diff --git a/docs/outstanding-issues-inbox/2e5e2bc1-25b0-43af-805c-e3f7d8c63a13.json b/docs/outstanding-issues-inbox/2e5e2bc1-25b0-43af-805c-e3f7d8c63a13.json new file mode 100644 index 000000000..146d963f1 --- /dev/null +++ b/docs/outstanding-issues-inbox/2e5e2bc1-25b0-43af-805c-e3f7d8c63a13.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "2e5e2bc1-25b0-43af-805c-e3f7d8c63a13", + "createdOn": "2026-09-07", + "action": "done", + "payload": { + "id": "#QSHHGK", + "outcome": "CLOSED 2026-09-07 by owner decision: the owner is the named refresh owner, and the weekly report-only run is sufficient. That resolves point (1), the last of the three reasons this row stayed open. Points (2) and (3) were resolved on 2026-09-06 in PR #2665: the baseline was refreshed from main at fd8156109c54ed078895610406f629f4baf282b7, a commit that resolves and is an ancestor of main, so the provenance warning this row was opened around no longer fires. Production moved 1656.0 -> 1808.2 KiB gzip, mockups 613.1 -> 746.9, route / 278.5 -> 246.2, route /documents/search 281.6 -> 249.0, with tolerances untouched at 10/10/25 percent. THE ROW'S CAUTION IS NOT UN-RECORDED BY CLOSING IT: that refresh absorbed roughly two weeks of accumulated growth that was never attributed to a reviewed change set, and the owner took that decision knowingly and explicitly. The standing mechanism is .github/workflows/bundle-budget-refresh.yml, weekly on Wednesday 04:40 UTC plus workflow_dispatch, report-only, publishing a rolling issue and a refreshed bundle-budget.json artifact; the owner applies it at their discretion. REOPEN IF: the weekly run stops producing a resolvable baselineSource, or accumulated drift again fails an unrelated PR before anyone has applied an artifact.", + "baseRowFingerprint": "b31c2800eec69dfc49e478f141fed32c8b6ac287f84983b5e349ea16b993fcdf" + } +} diff --git a/docs/outstanding-issues-inbox/ce667f09-3a39-4d1d-bc8f-969bc0b5393d.json b/docs/outstanding-issues-inbox/ce667f09-3a39-4d1d-bc8f-969bc0b5393d.json new file mode 100644 index 000000000..0d5268892 --- /dev/null +++ b/docs/outstanding-issues-inbox/ce667f09-3a39-4d1d-bc8f-969bc0b5393d.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "ce667f09-3a39-4d1d-bc8f-969bc0b5393d", + "createdOn": "2026-09-07", + "action": "update", + "payload": { + "id": "#ZWJ71W", + "detail": "Found 2026-09-02 while correcting #YTR84P, and recorded separately because it is a different defect from the pinned-clock one and would be missed inside that row's prose. On branch claude/ward-flow-phases-6-7-design at 1888ad1: tests/ui-ward-morning.spec.ts clicks ward-morning-view-fixed and ward-morning-view-live (lines 51-52 and 195-206). Those test ids live in ViewControl (morning-page.tsx around lines 481-487), but owner decision WB-DB-11 ('ONE VIEW, ALWAYS LIVE') left MorningPage rendering MorningBody and nothing else, so ViewControl is exported and rendered by nothing. The spec therefore cannot pass as written. Same root cause as the D5 problem recorded in #YTR84P - the fixed/live split was removed while the code and tests that depend on it were left behind - so both should be settled by the same decision: either restore the fixed view, or retire it and remove the orphaned code and assertions together. SCOPE AND URGENCY: low. That branch's PR #2466 was closed unmerged on 2026-08-31 (299 commits ahead of main, mergeable_state dirty, titled 'DRAFT, not for merge'), and all of it is synthetic design scratch under src/app/mockups/ward-flow/**, which 404s in production. Nothing on main is affected. Recorded so it is not rediscovered from scratch by whoever takes the D5 decision. Offline only - the branch fetches normally from a cloud container with git fetch --depth=50 origin claude/ward-flow-phases-6-7-design. UPDATE 2026-09-06 (cross-reference only; this row's own finding is unchanged): the SAME two tests are now test.skip ON MAIN as well, not just unpassable on the Phase 6 branch. Commit 18a42d2 marked \"the morning page renders its headline, and the rail navigates away and back\" and \"print states when the sheet was printed, and the real PDF is exactly one A4 page\" as test.skip with a stated reason, because on main /mockups/ward-flow/morning is now only a redirect to /capacity and MorningPage is mounted by no route at all - so there is nothing honest to retarget them to either. That commit deliberately skipped rather than deleted or rewrote them, pending an owner ruling on spec D9. WHY THIS MATTERS FOR THIS ROW: the non-required Advisory UI job is consequently GREEN again, so the decision behind these skips is now less visible than it was while they were failing, not more. Component-level coverage continues in tests/ward-morning-page.dom.test.tsx and tests/ward-morning-print.test.ts. The ruling itself is unchanged and still owner-owned: restore the fixed/live morning view, or retire it and remove the orphaned ViewControl code and both specs together. Settling it should close this row and the D5 half of #YTR84P at the same time. CORRECTION 2026-09-07, and this row's framing was wrong: \"SPEC D9\" IS NOT THE FIXED/LIVE MORNING VIEW. Read directly from the source. docs/superpowers/specs/2026-08-25-ward-flow-phase-4-specialist-boards-design.md defines D9 as the SHIFT HANDOVER page - \"its own page, frozen at the moment it is opened, statewide, four sections\" - and that page is already BUILT at src/components/ward-management/handover/handover-page.tsx, independently of the morning freeze machinery (it imports none of FrozenMorning, buildFrozenMorning or MorningView). tests/ui-ward-morning.spec.ts states the actual open D9 question in its own words: \"whether the morning board and the shift handover still owe each other a cross-link once folded\". That is a navigation question, not a restore-or-retire question. SEPARATELY, the fixed/live split is NOT an open question at all: owner decision WB-DB-11 (\"ONE VIEW, ALWAYS LIVE\") already reversed it, and morning-page.tsx says so at the point of the code. So the two skipped specs cannot be deleted as \"the retired fixed view\" - they are skipped pending the CROSS-LINK ruling, and morning-page.tsx explicitly instructs against three specific moves while it is pending: do not delete the component, do not retarget these tests at CapacityScreen, do not quietly re-mount it. This row's earlier reference to \"the D5 half of #YTR84P\" is also mislabelled: D5 in that same spec is \"release-a-hold and cancel-a-transport are added\", unrelated to any of this. DEAD-CODE GATE RESULT, run 2026-09-07 on all five candidates in morning-page.tsx: ALL FIVE REFUSED. FrozenMorning, buildFrozenMorning, ViewControl, NoHandoverYet and MorningView were each introduced 2026-09-03, four days before the check and well inside the 30-day DEAD_CODE_RECENT_DAYS threshold; ViewControl is additionally pinned by committed tests (tests/ui-ward-morning.spec.ts, tests/ward-morning-print.test.ts); and all five are documented in docs/outstanding-issues.md plus two to three other files each. Per docs/agents/dead-code-deletion.md a refusal is a stop, not a hurdle, and the threshold must not be tuned to make a diff pass. EARLIEST ELIGIBLE RE-CHECK: 2026-10-03. WHAT THE OWNER ACTUALLY NEEDS TO RULE ON: once the morning board is folded into Capacity, should the Capacity screen and the shift handover page cross-link to each other, and if so in which direction. Answering that unblocks the two skipped specs; it does not by itself authorise deleting anything, because the gate governs that separately.", + "baseRowFingerprint": "565ee27887d9f0607ebd62021df38cd59d495a251f856431f23ef6b374007136" + } +} From 520064480670b475bfae9187a610829e89caf501 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 7 Sep 2026 11:27:52 +0000 Subject: [PATCH 3/3] issues: cancel two superseded requests so each row carries one pending mutation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes the Static PR checks failure on 9581700. The failing step was `docs:check-links`, which builds the projected ledger markdown and therefore plans the pending request batch: Error: multiple pending mutations require an explicit cancellation decision (#ZWJ71W: 2ab09b4d, ce667f09; #QSHHGK: 2e5e2bc1, a4593f03). Self-inflicted: I queued two mutations against each of those rows across two commits, and the reconciler refuses to guess which one wins. Reproduced locally before fixing, and the same command is green after. CANCELLED 2ab09b4d (#ZWJ71W, first update). Verified superseded verbatim — ce667f09 contains its full 2678 characters plus the D9 correction. Nothing is lost. CANCELLED 2e5e2bc1 (#QSHHGK, the closure). This is ordering, not a reversal: the owner's decision to close that row stands. Its sibling update a4593f03 corrects a statement in the row that is now false — that the baseline was deliberately not refreshed — and a `done` request cannot carry a detail change, so the correction has to land first. The closure is re-queued after the next reconcile. Cancelling the update instead would have left the false statement in the archived row, which is the opposite of why the update exists. Why CI caught this and I did not: I ran the ledger gates and `ledger-inbox.mjs check` locally and all passed, but `ledger-inbox check` validates request files without planning the batch, and I never ran `docs:check-links` — the one gate that does. Running the ledger checks alone was not sufficient evidence. Verified after the fix: docs:check-links, docs:check-scripts, check:outstanding-issues, check:branch-review-ledger, check:ledger-stamp-retention, check:diff-integrity all pass; `ledger-inbox.mjs check` reports 42 pending, 1080 applied; whole-tree `prettier --check .` clean. check:ledger-write-discipline re-run below on the committed tree, since it refuses a verdict on an uncommitted one. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GMHX5TDG34BBn2yDdi81s5 --- .../5057727d-f394-47ee-b8cf-e61328d93e6d.json | 10 ++++++++++ .../7c9df6d8-6113-407a-842e-0899aa7799c2.json | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 docs/outstanding-issues-inbox/5057727d-f394-47ee-b8cf-e61328d93e6d.json create mode 100644 docs/outstanding-issues-inbox/7c9df6d8-6113-407a-842e-0899aa7799c2.json diff --git a/docs/outstanding-issues-inbox/5057727d-f394-47ee-b8cf-e61328d93e6d.json b/docs/outstanding-issues-inbox/5057727d-f394-47ee-b8cf-e61328d93e6d.json new file mode 100644 index 000000000..9e460247e --- /dev/null +++ b/docs/outstanding-issues-inbox/5057727d-f394-47ee-b8cf-e61328d93e6d.json @@ -0,0 +1,10 @@ +{ + "version": 2, + "id": "5057727d-f394-47ee-b8cf-e61328d93e6d", + "createdOn": "2026-09-07", + "action": "cancel", + "payload": { + "requestId": "2ab09b4d-a5b8-4854-b04e-c18942cbc33b", + "reason": "Superseded verbatim by ce667f09-3a39-4d1d-bc8f-969bc0b5393d, which contains this request's full text plus the 2026-09-07 correction that spec D9 is the shift handover page, not the fixed/live morning view. Cancelled so the row carries exactly one pending mutation, per the reconciler's one-mutation-per-row rule." + } +} diff --git a/docs/outstanding-issues-inbox/7c9df6d8-6113-407a-842e-0899aa7799c2.json b/docs/outstanding-issues-inbox/7c9df6d8-6113-407a-842e-0899aa7799c2.json new file mode 100644 index 000000000..f738d96bf --- /dev/null +++ b/docs/outstanding-issues-inbox/7c9df6d8-6113-407a-842e-0899aa7799c2.json @@ -0,0 +1,10 @@ +{ + "version": 2, + "id": "7c9df6d8-6113-407a-842e-0899aa7799c2", + "createdOn": "2026-09-07", + "action": "cancel", + "payload": { + "requestId": "2e5e2bc1-25b0-43af-805c-e3f7d8c63a13", + "reason": "Ordering, not a reversal: the owner's decision to close #QSHHGK stands. Its pending update a4593f03 corrects a statement in the row that is now false (that the baseline was deliberately not refreshed), and a done cannot carry a detail change, so the update must land first. Re-queue this closure after the next reconcile." + } +}