diff --git a/data/outstanding-issues-snapshot.json b/data/outstanding-issues-snapshot.json index 8e2d8114d6..50ca815b20 100644 --- a/data/outstanding-issues-snapshot.json +++ b/data/outstanding-issues-snapshot.json @@ -5,13 +5,13 @@ "committed_at": "2026-08-25T17:45:01Z" }, "counts": { - "open": 91, + "open": 98, "p1": 1, - "p2": 57, - "p3": 33, + "p2": 60, + "p3": 37, "queued": 9, - "pending": 22, - "resolved": 412 + "pending": 0, + "resolved": 414 }, "queue": [ { @@ -196,15 +196,6 @@ "source": "docs/audit/live-drift-forensics-2026-08.md Phase 5 close-out 5.1(a) and 5.2; production probes 2026-08-22 Perth (2026-08-21 UTC); docs/rag-improvement/231-diagnosis-2026-08-22.md (corrected after PR #2264 review)", "added": "2026-08-04" }, - { - "id": "#321", - "priority": "P3", - "type": "task", - "summary": "Four follow-up groups cover nine controls after #291", - "detail": "PARTIAL 18 August 2026. Of the four follow-up groups: (1) the filmstrip 'Page unknown' control is FIXED — document-image-filmstrip.tsx converted its data-driven disabled state from native disabled to aria-disabled=true + ignoreUnavailableActivation + an sr-only reason, per docs/wiring-conventions.md's stated-reason pattern (settles this one control from #291's follow-up list); tests/document-image-filmstrip.dom.test.tsx gained a focused case (aria-disabled, not natively disabled, accessible description, click is a no-op), vitest run: 3 passed. The other three groups are unchanged and still not single-PR-sized: the six differential comparison page controls remain coupled to its own planned rewrite and pinned density test; DocumentViewer's persistent-access-reason/transient-loading split is a classification design decision, not yet made; the pin-limit control remains a capacity-state judgement call. Stays open for those three.", - "source": "PR #1778 body; verified against main 2d27039", - "added": "2026-08-14" - }, { "id": "#2AB2NJ", "priority": "P3", @@ -331,15 +322,6 @@ "source": "CI run 32531103787 on head 0cf0493; local reproduction 2026-08-22; merged in PR #2253; full trace on #TYZK23", "added": "2026-08-21" }, - { - "id": "#45V4Y7", - "priority": "P3", - "type": "task", - "summary": "Dead exports on protected surfaces: answerQuestion (rag.ts), embedText (openai.ts), clinicalRankScore (clinical-search.ts)", - "detail": "The 2026-08-20 repo-cleanup sweep removed 60+ verified-dead exported symbols but deliberately left three untouched because they sit on RAG-protected surfaces that AGENTS.md requires flagging before any edit, deletion included. All three are exported, imported by nothing, and referenced nowhere else in the tree: src/lib/rag/rag.ts answerQuestion (a thin wrapper superseded by answerQuestionWithScope, which is what /api/answer actually calls), src/lib/openai.ts embedText, and src/lib/clinical-search.ts clinicalRankScore. Removing them cannot change retrieval behaviour because nothing calls them, but the removal still travels through docs/rag-behaviour and the RAG impact declaration on the PR. Next step: confirm with the owner, then delete in a single RAG-scoped PR carrying 'RAG impact: no retrieval behaviour change -- dead exports with zero callers'.", - "source": "src/lib/rag/rag.ts, src/lib/openai.ts, src/lib/clinical-search.ts", - "added": "2026-08-20" - }, { "id": "#TYZK23", "priority": "P2", @@ -933,140 +915,88 @@ "detail": "ensureTeam's insert ... on conflict do nothing is what makes the stopService race cross-team-only. After Task 11b fix round 2 it carries a comment naming it, but no test pins it, so a future change to that insert could widen the race silently. Either pin it with a test that names the serialisation or make it deliberate with a lock.", "source": "docs/caring-contacts/phase-2a-build-record.md deferred list item 4", "added": "2026-08-24" - } - ], - "pending": [ - { - "request_id": "0257b988-e4dc-460d-9356-662893a7af6c", - "action": "add", - "summary": "Ward Flow role screens: intermittent Playwright strict-mode violation, a role screen's own test id resolves to 2 elements", - "created_at": "2026-08-26" }, { - "request_id": "1b2198c4-a52f-4302-be1c-806d91f905ac", - "action": "cancel", - "summary": "Cancel request ecabc51d-034a-4a68-91cd-280214aac6bf: Superseded by completion. This request would file Ward Flow Phase 5 as an open P2 task, but Phase 5 was built and merged on 2026-08-26 (PR 2390, squash commit ea5482b9, all checks green). Applying it would add finished work to the recommended queue. The two items genuinely still owed from Phase 5 are tracked separately: the unvalidated spec D14 four-state model, and the Phase 6/7 design conversation. Cancelled 2026-08-27.", - "created_at": "2026-08-27" + "id": "#V27DZ1", + "priority": "P3", + "type": "issue", + "summary": "Ward Flow role screens: intermittent Playwright strict-mode violation, a role screen's own test id resolves to 2 elements", + "detail": "Reproduced on a quiet tree against the isolated production Playwright server, on BOTH refs, so it is not Phase 5's: this branch 1 failing run in 3 (ward-unit-screen), clean origin/main 1 failing run in 7 (ward-ed-screen, a screen Phase 5 never touches). tests/ui-ward-roles.spec.ts is byte-identical between the two refs. Both render sites of each id are mutually exclusive branches of one early return, so two elements means two component instances or streamed markup momentarily co-present; the mechanism is NOT yet established. Sample too small to say whether Phase 5 changed the rate. Not quarantined: the repo requires three reproductions on one SHA, and the assertion is correct as written. Evidence table in docs/ward-flow-complete-ledger.md section 5d-ii.", + "source": "session 2026-08-26", + "added": "2026-08-26" }, { - "request_id": "31bbefdc-0125-4b69-9ba5-f85ce916dc1a", - "action": "add", + "id": "#BR2217", + "priority": "P2", + "type": "issue", "summary": "outstanding-issues snapshot ledger_revision rolled backwards by a stale regenerator", - "created_at": "2026-08-27" + "detail": "data/outstanding-issues-snapshot.json carries a ledger_revision pointer. Commit ca376969b moved it BACKWARDS: sha 707b965965a9b843c13deb6b5c9ddd158fe2631d (2026-08-25T17:45:01+00:00) reverted to 6085a0a59aca4c1bb9e19fb4d490fd34dec950cd (2026-08-22T20:52:39Z), and the +00:00 normalisation reverted to Z. Pending entries are intact so nothing is lost, but a regenerator run from a stale base overwrote a newer pointer with an older one, and nothing detected it. Found 2026-08-27 while verifying that PR 2390 squash-merged completely. Not caused by that PR. Next step: decide whether generate-outstanding-issues-snapshot.mjs should refuse to move ledger_revision backwards, which would make this class of regression self-detecting.", + "source": "PR 2390 merge verification, 2026-08-27", + "added": "2026-08-27" }, { - "request_id": "344cfd1b-b9b1-4b5a-a788-6560bfdc956e", - "action": "add", + "id": "#TBW7BR", + "priority": "P2", + "type": "issue", "summary": "AGENTS.md states run-playwright.mjs exits 0 on test failure; the script propagates exit codes", - "created_at": "2026-08-27" - }, - { - "request_id": "3a4868e6-281a-48c1-895b-82d6aade2bc7", - "action": "cancel", - "summary": "Cancel request 8b2a3f89-9bdb-4fb1-8fd0-35165d050263: Implemented the requested local source-card width constant in this owning answer-page change.", - "created_at": "2026-08-25" + "detail": "AGENTS.md (Evidence and calibration section) and the Phase 5 handover both said scripts/run-playwright.mjs exits 0 when tests fail and when it refuses to run. Reading the script on 2026-08-27 shows otherwise: it exits 75 with a DATABASE_HEAVY_RUN_ADMISSION_BUSY marker on admission contention, propagates Playwright's own exit status on test failure, and exits 1 on a wrapper error. The stale wording tells callers to discard a reliable signal and parse logs instead, which loses the distinction between blocked and red. Raised by automated review on PR 2405; the handover and the new docs/development-speed-playbook.md were corrected there. AGENTS.md was deliberately left alone because editing it is a policy change and would widen that PR's risk classification. Next step: correct the AGENTS.md wording to say that both the non-zero status and the decisive output line must be checked, and consider a contract test pinning the script's exit codes so the guidance cannot drift from the code again.", + "source": "Codex review on PR 2405, 2026-08-27", + "added": "2026-08-27" }, { - "request_id": "3eebb95f-3671-41d0-afa8-85460a9b5ff3", - "action": "done", - "summary": "#321: Standardized control focus rings and ARIA descriptors across modal and drawer surfaces.", - "created_at": "2026-08-26" - }, - { - "request_id": "40ff11ca-52f3-4b95-9118-5e0c107e68f0", - "action": "cancel", - "summary": "Cancel request 970b4089-9e76-4bcf-821e-2e70e16a3617: Superseded before reconciliation: the original wording incorrectly implied every component metric belongs in :root. The replacement distinguishes module-local one-consumer constants from shared CSS custom properties.", - "created_at": "2026-08-26" - }, - { - "request_id": "454d0cd5-8f4c-4ab9-b9b3-7b5a588283a1", - "action": "cancel", - "summary": "Cancel request 76744c9f-6e7f-4390-a202-756e50be0cd1: Superseded by a539a411-4648-4f71-8b40-90d49646e8a4 on #243HCC", - "created_at": "2026-08-27" - }, - { - "request_id": "485bdac6-7f79-4539-9d90-347866604b35", - "action": "add", + "id": "#76GGRG", + "priority": "P3", + "type": "rec", "summary": "Overflow menus split between a real ARIA menu and menu roles with no keyboard model", - "created_at": "2026-08-25" - }, - { - "request_id": "531e6569-42da-4bb6-9c0f-6a410e207aea", - "action": "cancel", - "summary": "Cancel request 854ca9ba-ba3b-442b-be6d-6f5873ed60ed: Wired connection and permission unavailable recovery screens in Caring Contacts.", - "created_at": "2026-08-26" - }, - { - "request_id": "5fa0b2ee-38ea-4a6a-bada-815b021b5aac", - "action": "cancel", - "summary": "Cancel request a0548b2c-2c80-44f9-9440-5b983e169a13: Repaired closing-message refusal guard in Caring Contacts service state.", - "created_at": "2026-08-26" - }, - { - "request_id": "6e929764-e281-4941-9ef4-062ec5a08497", - "action": "cancel", - "summary": "Cancel request 1838b99a-9323-4e3b-84a5-8e52535ecec8: Connected governed-message validator to outbound dispatch routes with fail-closed enforcement.", - "created_at": "2026-08-26" - }, - { - "request_id": "76744c9f-6e7f-4390-a202-756e50be0cd1", - "action": "done", - "summary": "#243HCC: Emitted data-settings-nav-target on sub-navigation tabs in settings-dialog.", - "created_at": "2026-08-26" - }, - { - "request_id": "8b2a3f89-9bdb-4fb1-8fd0-35165d050263", - "action": "add", - "summary": "The answer source-rail card carries three hardcoded pixel measurements, one of them duplicated", - "created_at": "2026-08-25" - }, - { - "request_id": "970b4089-9e76-4bcf-821e-2e70e16a3617", - "action": "add", - "summary": "Component metrics stay in :root, not @theme — record the rule where reviewers read it, because bots keep re-raising it", - "created_at": "2026-08-26" + "detail": "search-pins-menu.tsx declares role=menu/menuitem but implements no arrow-key, Home/End or roving-focus handling, so it promises the ARIA menu keyboard model and delivers Tab. mode-action-popup.tsx implements the model properly. answer-source-drawer.tsx was the third shape and was changed on 2026-08-25 (PR #2370) to role=group with plain buttons — a disclosure, which is what it actually is. Next action: pick one rule for the repo and apply it to search-pins-menu.tsx — either implement the keyboard model or drop the menu roles as the drawer did. No gate covers this, so it will keep diverging. Not urgent: every one of these menus is operable by Tab today; the defect is the mismatch between what is announced and what works.", + "source": "PR #2370 review (CodeRabbit), verified in source 2026-08-25", + "added": "2026-08-25" }, { - "request_id": "970bbb8b-4dbe-4e27-97a4-80142db94d7d", - "action": "add", + "id": "#875H6T", + "priority": "P3", + "type": "rec", "summary": "Ward Flow: six agreed enhancements not yet assigned to a phase", - "created_at": "2026-08-26" + "detail": "Ward prediction track record; 'why not here' across the whole state for one patient; a sixty-second self-driving guided tour; out-of-area ledger; 'waiting since' promoted in the priority queue; named moments on the demo clock. All accepted by the product owner 2026-08-26 and described in docs/ward-flow-roadmap.md.", + "source": "Product-owner direction, 2026-08-26", + "added": "2026-08-26" }, { - "request_id": "a5dd669d-8d52-4b67-b249-51b0757a3b9f", - "action": "done", - "summary": "#45V4Y7: Removed verified dead exports answerQuestion in src/lib/rag/rag.ts, embedText in src/lib/openai.ts, and clinicalRankScore in src/lib/clinical-search.ts. Verified 0 AST references remain across src/ and tests/; typecheck and tests pass cleanly.", - "created_at": "2026-08-27" - }, - { - "request_id": "b85ad821-4c9b-4925-b86b-2d5767052b20", - "action": "add", + "id": "#HX1KSZ", + "priority": "P3", + "type": "rec", "summary": "Scope the component-metric rule: keep one-consumer values local; use :root only for shared off-scale CSS custom properties, not @theme", - "created_at": "2026-08-26" + "detail": "The earlier pending request overgeneralised the :root-versus-@theme boundary. Correct rule: keep a one-consumer component metric local to its owning JS/TS module, such as cardTextWidth (max-w-[158px] in src/components/clinical-dashboard/answer-source-rail.tsx); do not promote it to a global CSS custom property or an @theme token. Apply the :root-versus-@theme decision only when a shared CSS custom property is needed by multiple non-nested consumers: a shared off-scale metric such as --answer-message-gutter (calc(2.75rem + 1px), including its transparent-border compensation) belongs in :root, while @theme is reserved for deliberate design-scale tokens that should generate a utility family. NEXT ACTION (small, docs-only): add a prohibition-table row to docs/design-system/GATES.md section 3 that states this three-way boundary (module-local component constant vs shared :root custom property vs @theme scale token), names both prior examples accurately, and explicitly does not convert either value. The existing tailwind-merge coupling still applies to any deliberate @theme --spacing-* token: tests/tailwind-merge-config.test.ts requires CLINICAL_TWMERGE_THEME.spacing coverage.", + "source": "PR #2381 review thread PRRT_kwDOSh5Fis6cUDDj, reviewing request 970b4089-9e76-4bcf-821e-2e70e16a3617; prior instances #2374 and #2377", + "added": "2026-08-26" }, { - "request_id": "cfa44b9c-3d68-4030-b1e3-3d8f182ca3d4", - "action": "add", + "id": "#9GPWT3", + "priority": "P2", + "type": "issue", "summary": "Ward Flow's bed-release state model is unvalidated by any ward clinician", - "created_at": "2026-08-26" + "detail": "predicted -> confirmed -> blocked -> released is a software model of how a bed comes free. A bed may be confirmed and blocked simultaneously in reality, and 'predicted' may compress several states a charge nurse would separate. Cheap to change while synthetic; recorded in the Phase 5 spec as D14 and as the assumption most likely to be wrong. Check before Phase 7 builds on it.", + "source": "Ward Flow Phase 5 design, 2026-08-26", + "added": "2026-08-26" }, { - "request_id": "d2a6122a-4fcd-4429-92a7-6004fa19eb24", - "action": "add", + "id": "#2X46NY", + "priority": "P3", + "type": "task", "summary": "Docstring coverage on the answer-source changes sits at 62.5% against CodeRabbit's 80% advisory threshold", - "created_at": "2026-08-25" - }, - { - "request_id": "ecabc51d-034a-4a68-91cd-280214aac6bf", - "action": "add", - "summary": "Ward Flow Phase 5: bed availability becomes real - discharge lifecycle, egress board, predicted capacity, freshness everywhere", - "created_at": "2026-08-26" + "detail": "CodeRabbit's pre-merge Docstring Coverage check warned on every head of PR #2370, measuring 56 functions across 17 files. It is advisory only — not a required GitHub check, and it never blocked the merge. Recorded so the next person who sees the warning knows it was read rather than missed. Next action: none required. If someone wants the number up, the gap is in small helpers and test harness functions rather than in the exported surfaces, which are documented; decide whether the threshold is measuring something this repo actually wants before writing comments to satisfy it.", + "source": "PR #2370 pre-merge checks, 2026-08-25", + "added": "2026-08-25" }, { - "request_id": "f7c6371d-b92b-4050-9629-9aac5065f0a8", - "action": "add", + "id": "#WG24JB", + "priority": "P3", + "type": "task", "summary": "Ward Flow spec D9: the discharge board is reachable only from the sidebar, not from the capacity board's own figures", - "created_at": "2026-08-26" + "detail": "Spec D9 (docs/superpowers/specs/2026-08-26-ward-flow-phase-5-bed-availability-design.md) says the discharge board is reached from the sidebar's Boards group AND from the capacity board's own figures. Only the sidebar entry was built; the capacity headline cards are plain non-interactive articles. Found by the Phase 5 whole-branch review. Unimplemented spec clause, not a defect. Small, and best done at the start of Phase 6 while the numbers are fresh. Any new inbound link must keep the route-reachability contract satisfied.", + "source": "session 2026-08-26", + "added": "2026-08-26" } - ] + ], + "pending": [] } diff --git a/docs/outstanding-issues-inbox/0257b988-e4dc-460d-9356-662893a7af6c.json b/docs/outstanding-issues-inbox/applied/0257b988-e4dc-460d-9356-662893a7af6c.json similarity index 100% rename from docs/outstanding-issues-inbox/0257b988-e4dc-460d-9356-662893a7af6c.json rename to docs/outstanding-issues-inbox/applied/0257b988-e4dc-460d-9356-662893a7af6c.json diff --git a/docs/outstanding-issues-inbox/1b2198c4-a52f-4302-be1c-806d91f905ac.json b/docs/outstanding-issues-inbox/applied/1b2198c4-a52f-4302-be1c-806d91f905ac.json similarity index 100% rename from docs/outstanding-issues-inbox/1b2198c4-a52f-4302-be1c-806d91f905ac.json rename to docs/outstanding-issues-inbox/applied/1b2198c4-a52f-4302-be1c-806d91f905ac.json diff --git a/docs/outstanding-issues-inbox/31bbefdc-0125-4b69-9ba5-f85ce916dc1a.json b/docs/outstanding-issues-inbox/applied/31bbefdc-0125-4b69-9ba5-f85ce916dc1a.json similarity index 100% rename from docs/outstanding-issues-inbox/31bbefdc-0125-4b69-9ba5-f85ce916dc1a.json rename to docs/outstanding-issues-inbox/applied/31bbefdc-0125-4b69-9ba5-f85ce916dc1a.json diff --git a/docs/outstanding-issues-inbox/344cfd1b-b9b1-4b5a-a788-6560bfdc956e.json b/docs/outstanding-issues-inbox/applied/344cfd1b-b9b1-4b5a-a788-6560bfdc956e.json similarity index 100% rename from docs/outstanding-issues-inbox/344cfd1b-b9b1-4b5a-a788-6560bfdc956e.json rename to docs/outstanding-issues-inbox/applied/344cfd1b-b9b1-4b5a-a788-6560bfdc956e.json diff --git a/docs/outstanding-issues-inbox/3a4868e6-281a-48c1-895b-82d6aade2bc7.json b/docs/outstanding-issues-inbox/applied/3a4868e6-281a-48c1-895b-82d6aade2bc7.json similarity index 100% rename from docs/outstanding-issues-inbox/3a4868e6-281a-48c1-895b-82d6aade2bc7.json rename to docs/outstanding-issues-inbox/applied/3a4868e6-281a-48c1-895b-82d6aade2bc7.json diff --git a/docs/outstanding-issues-inbox/3eebb95f-3671-41d0-afa8-85460a9b5ff3.json b/docs/outstanding-issues-inbox/applied/3eebb95f-3671-41d0-afa8-85460a9b5ff3.json similarity index 100% rename from docs/outstanding-issues-inbox/3eebb95f-3671-41d0-afa8-85460a9b5ff3.json rename to docs/outstanding-issues-inbox/applied/3eebb95f-3671-41d0-afa8-85460a9b5ff3.json diff --git a/docs/outstanding-issues-inbox/40ff11ca-52f3-4b95-9118-5e0c107e68f0.json b/docs/outstanding-issues-inbox/applied/40ff11ca-52f3-4b95-9118-5e0c107e68f0.json similarity index 100% rename from docs/outstanding-issues-inbox/40ff11ca-52f3-4b95-9118-5e0c107e68f0.json rename to docs/outstanding-issues-inbox/applied/40ff11ca-52f3-4b95-9118-5e0c107e68f0.json diff --git a/docs/outstanding-issues-inbox/454d0cd5-8f4c-4ab9-b9b3-7b5a588283a1.json b/docs/outstanding-issues-inbox/applied/454d0cd5-8f4c-4ab9-b9b3-7b5a588283a1.json similarity index 100% rename from docs/outstanding-issues-inbox/454d0cd5-8f4c-4ab9-b9b3-7b5a588283a1.json rename to docs/outstanding-issues-inbox/applied/454d0cd5-8f4c-4ab9-b9b3-7b5a588283a1.json diff --git a/docs/outstanding-issues-inbox/485bdac6-7f79-4539-9d90-347866604b35.json b/docs/outstanding-issues-inbox/applied/485bdac6-7f79-4539-9d90-347866604b35.json similarity index 100% rename from docs/outstanding-issues-inbox/485bdac6-7f79-4539-9d90-347866604b35.json rename to docs/outstanding-issues-inbox/applied/485bdac6-7f79-4539-9d90-347866604b35.json diff --git a/docs/outstanding-issues-inbox/531e6569-42da-4bb6-9c0f-6a410e207aea.json b/docs/outstanding-issues-inbox/applied/531e6569-42da-4bb6-9c0f-6a410e207aea.json similarity index 100% rename from docs/outstanding-issues-inbox/531e6569-42da-4bb6-9c0f-6a410e207aea.json rename to docs/outstanding-issues-inbox/applied/531e6569-42da-4bb6-9c0f-6a410e207aea.json diff --git a/docs/outstanding-issues-inbox/5fa0b2ee-38ea-4a6a-bada-815b021b5aac.json b/docs/outstanding-issues-inbox/applied/5fa0b2ee-38ea-4a6a-bada-815b021b5aac.json similarity index 100% rename from docs/outstanding-issues-inbox/5fa0b2ee-38ea-4a6a-bada-815b021b5aac.json rename to docs/outstanding-issues-inbox/applied/5fa0b2ee-38ea-4a6a-bada-815b021b5aac.json diff --git a/docs/outstanding-issues-inbox/6e929764-e281-4941-9ef4-062ec5a08497.json b/docs/outstanding-issues-inbox/applied/6e929764-e281-4941-9ef4-062ec5a08497.json similarity index 100% rename from docs/outstanding-issues-inbox/6e929764-e281-4941-9ef4-062ec5a08497.json rename to docs/outstanding-issues-inbox/applied/6e929764-e281-4941-9ef4-062ec5a08497.json diff --git a/docs/outstanding-issues-inbox/76744c9f-6e7f-4390-a202-756e50be0cd1.json b/docs/outstanding-issues-inbox/applied/76744c9f-6e7f-4390-a202-756e50be0cd1.json similarity index 100% rename from docs/outstanding-issues-inbox/76744c9f-6e7f-4390-a202-756e50be0cd1.json rename to docs/outstanding-issues-inbox/applied/76744c9f-6e7f-4390-a202-756e50be0cd1.json diff --git a/docs/outstanding-issues-inbox/8b2a3f89-9bdb-4fb1-8fd0-35165d050263.json b/docs/outstanding-issues-inbox/applied/8b2a3f89-9bdb-4fb1-8fd0-35165d050263.json similarity index 100% rename from docs/outstanding-issues-inbox/8b2a3f89-9bdb-4fb1-8fd0-35165d050263.json rename to docs/outstanding-issues-inbox/applied/8b2a3f89-9bdb-4fb1-8fd0-35165d050263.json diff --git a/docs/outstanding-issues-inbox/970b4089-9e76-4bcf-821e-2e70e16a3617.json b/docs/outstanding-issues-inbox/applied/970b4089-9e76-4bcf-821e-2e70e16a3617.json similarity index 100% rename from docs/outstanding-issues-inbox/970b4089-9e76-4bcf-821e-2e70e16a3617.json rename to docs/outstanding-issues-inbox/applied/970b4089-9e76-4bcf-821e-2e70e16a3617.json diff --git a/docs/outstanding-issues-inbox/970bbb8b-4dbe-4e27-97a4-80142db94d7d.json b/docs/outstanding-issues-inbox/applied/970bbb8b-4dbe-4e27-97a4-80142db94d7d.json similarity index 100% rename from docs/outstanding-issues-inbox/970bbb8b-4dbe-4e27-97a4-80142db94d7d.json rename to docs/outstanding-issues-inbox/applied/970bbb8b-4dbe-4e27-97a4-80142db94d7d.json diff --git a/docs/outstanding-issues-inbox/a5dd669d-8d52-4b67-b249-51b0757a3b9f.json b/docs/outstanding-issues-inbox/applied/a5dd669d-8d52-4b67-b249-51b0757a3b9f.json similarity index 100% rename from docs/outstanding-issues-inbox/a5dd669d-8d52-4b67-b249-51b0757a3b9f.json rename to docs/outstanding-issues-inbox/applied/a5dd669d-8d52-4b67-b249-51b0757a3b9f.json diff --git a/docs/outstanding-issues-inbox/b85ad821-4c9b-4925-b86b-2d5767052b20.json b/docs/outstanding-issues-inbox/applied/b85ad821-4c9b-4925-b86b-2d5767052b20.json similarity index 100% rename from docs/outstanding-issues-inbox/b85ad821-4c9b-4925-b86b-2d5767052b20.json rename to docs/outstanding-issues-inbox/applied/b85ad821-4c9b-4925-b86b-2d5767052b20.json diff --git a/docs/outstanding-issues-inbox/cfa44b9c-3d68-4030-b1e3-3d8f182ca3d4.json b/docs/outstanding-issues-inbox/applied/cfa44b9c-3d68-4030-b1e3-3d8f182ca3d4.json similarity index 100% rename from docs/outstanding-issues-inbox/cfa44b9c-3d68-4030-b1e3-3d8f182ca3d4.json rename to docs/outstanding-issues-inbox/applied/cfa44b9c-3d68-4030-b1e3-3d8f182ca3d4.json diff --git a/docs/outstanding-issues-inbox/d2a6122a-4fcd-4429-92a7-6004fa19eb24.json b/docs/outstanding-issues-inbox/applied/d2a6122a-4fcd-4429-92a7-6004fa19eb24.json similarity index 100% rename from docs/outstanding-issues-inbox/d2a6122a-4fcd-4429-92a7-6004fa19eb24.json rename to docs/outstanding-issues-inbox/applied/d2a6122a-4fcd-4429-92a7-6004fa19eb24.json diff --git a/docs/outstanding-issues-inbox/ecabc51d-034a-4a68-91cd-280214aac6bf.json b/docs/outstanding-issues-inbox/applied/ecabc51d-034a-4a68-91cd-280214aac6bf.json similarity index 100% rename from docs/outstanding-issues-inbox/ecabc51d-034a-4a68-91cd-280214aac6bf.json rename to docs/outstanding-issues-inbox/applied/ecabc51d-034a-4a68-91cd-280214aac6bf.json diff --git a/docs/outstanding-issues-inbox/f7c6371d-b92b-4050-9629-9aac5065f0a8.json b/docs/outstanding-issues-inbox/applied/f7c6371d-b92b-4050-9629-9aac5065f0a8.json similarity index 100% rename from docs/outstanding-issues-inbox/f7c6371d-b92b-4050-9629-9aac5065f0a8.json rename to docs/outstanding-issues-inbox/applied/f7c6371d-b92b-4050-9629-9aac5065f0a8.json diff --git a/docs/outstanding-issues.md b/docs/outstanding-issues.md index 59a272e377..745e900e73 100644 --- a/docs/outstanding-issues.md +++ b/docs/outstanding-issues.md @@ -91,7 +91,6 @@ removed after current-main verification; it is not missing recommended work. | #102 | P3 | task | Apply the additive `documents` index debt (operator) | UPDATE 2026-08-21 (read-only Supabase MCP get_advisors performance lint against production ref sjrfecxgysukkwxsowpy): documents_title_trgm_idx exists on public.documents and is reported by the unused_index lint as never used. TREAT THAT AS WEAK EVIDENCE, NOT CONFIRMATION: 20260819100200_restore_search_health_trigram_indexes was applied two days earlier and recreating an index resets its usage statistics, so a zero-use reading is expected regardless of whether the bare-column ILIKE predicates can reach it. The same lint currently reports 31 unused indexes, several of them freshly restored in the 20260819100000-100300 batch, which is consistent with a stats reset rather than dead indexing. The row's actual claim - that the index covers a CONCATENATED expression and so cannot serve the bare-column predicates in the documents API route and rag-candidate-sources - was NOT tested, because that needs EXPLAIN or a pg_indexes read and SQL execution was blocked in this session. Re-measure with EXPLAIN in the operator window before applying the prepared runbook. | `docs/audit/latency-audit-2026-07-28.md` L2-3/L2-5; `docs/operator-apply-performance-latency-remediation.md` | 2026-07-29 | | #191 | P3 | task | X5: ACL-migration consolidation (provider-gated) | **Outcome:** ACL-related migrations are consolidated per maturity work-order X5 without weakening owner-scope/RLS. **Next:** DB-owner approved window only; live-DB provider confirmation required before apply. **Stop:** no hosted apply from an agent session without explicit approval. | docs/maturity-backlog-workorders.md X5; #086 | 2026-07-31 | | #231 | P2 | issue | Re-scoped: separate initial provider timeouts from quality-retry exhaustion before changing the RAG path | PHASE 5.2 CONFIRMED SATISFIED with fresh data 2026-08-22 Perth (2026-08-21 UTC), not reopened. This row already recorded that remediation-plan Phase 5.2 is satisfied by S1's 2026-08-17 healthy-latency probes; the Phase 5 close-out re-measured production end to end and confirms it. Retrieval now costs 955 ms on the text fast path and 6,720 ms on hybrid (from 31,610 ms and 21,757 ms at the incident), against answerRouteBudgetMs.fast of 25,000 ms -- so retrieval consumes 4-27% of the fast budget and is no longer capable of binding it. The 2026-08-14 verdict that pre-generation latency WAS the binding cause stands for that window and is now closed out. Residual R4 (chronic ~30 s strong-route provider_timeout on metformin-renal-dosing and valproate-pregnancy, with a safe source-backed extractive fallback) is generation-side and unchanged; no separate R4 row was created, per this row's own instruction. CORRECTION FROM THE 2026-08-22 Gate E diagnosis: the retrieval-side premise remains closed, but the remaining provider_timeout label cannot be attributed to one mechanism. The response-bearing subset supports a quality-retry-ladder problem: lamotrigine-rash-action carried missing_query_overlap under both labels across runs, mirtazapine-dose v19 carried bad_final_answer_quality before timing out, and the quality retries at rag.ts:3623 and rag.ts:3709 have no deadline-admission check. However, three listed timeout instances (benzodiazepine-agitation-dose v18, ect-source-gap-specific v18, quetiapine-dose v19) recorded zero provider responses. No completed answer existed for a quality predicate or retry to reject, so retry admission control cannot explain or fix them. NEXT: preserve these as two mechanisms. First add per-attempt response/latency telemetry and separate initial-attempt timeouts from retry-ladder exhaustion. Only then evaluate a deadline-admission change for the response-bearing subset. Do not raise answerRouteBudgetMs or weaken quality gates. A separate predicate-strictness issue covers the two incoherent grounded extractive examples: current predicates accept them, so moving a call site alone is not a demonstrated remedy. | docs/audit/live-drift-forensics-2026-08.md Phase 5 close-out 5.1(a) and 5.2; production probes 2026-08-22 Perth (2026-08-21 UTC); docs/rag-improvement/231-diagnosis-2026-08-22.md (corrected after PR #2264 review) | 2026-08-04 | -| #321 | P3 | task | Four follow-up groups cover nine controls after #291 | PARTIAL 18 August 2026. Of the four follow-up groups: (1) the filmstrip 'Page unknown' control is FIXED — document-image-filmstrip.tsx converted its data-driven disabled state from native disabled to aria-disabled=true + ignoreUnavailableActivation + an sr-only reason, per docs/wiring-conventions.md's stated-reason pattern (settles this one control from #291's follow-up list); tests/document-image-filmstrip.dom.test.tsx gained a focused case (aria-disabled, not natively disabled, accessible description, click is a no-op), vitest run: 3 passed. The other three groups are unchanged and still not single-PR-sized: the six differential comparison page controls remain coupled to its own planned rewrite and pinned density test; DocumentViewer's persistent-access-reason/transient-loading split is a classification design decision, not yet made; the pin-limit control remains a capacity-state judgement call. Stays open for those three. | PR #1778 body; verified against main 2d27039 | 2026-08-14 | | #2AB2NJ | P3 | task | Owner decision: enable RAG_TELEMETRY_EXTENDED (verification_latency_ms projection) in production once a dashboard consumer exists | Packet S5 (PR #2056, merge 093f9340c) landed the B1 telemetry gap assessment: the one proven gap is verification_latency_ms, now persisted behind RAG_TELEMETRY_EXTENDED (typed, default false) via the allow-listed projection module with canary-absence tests. Enabling it in production is an owner decision gated on a dashboard consumer existing (no consumer today), and is a Railway env change (provider-backed, explicit approval; rollback = set false). Next: when a dashboard question needs verification latency, set RAG_TELEMETRY_EXTENDED=true on the Database service after confirming the canary-absence tests are still green on main. Stop: do not enable speculatively; do not add unproven fields. | RAG programme coordinator, packet S5 (PR #2056) follow-ups, 2026-08-17 | 2026-08-17 | | #C2D9JF | P2 | issue | Adversarial divergence (S5 harness pin): scope-other-owner-document — abstains in substance but the review fallback still cites in-scope evidence | Pinned in tests/rag-adversarial-harness.test.ts KNOWN_DIVERGENCES (self-expiring). Observed shape: grounded false, confidence unsupported, but cited chunk ids [syn-scope-owner-a] — the answer correctly abstains from the other-owner document, yet the review fallback attaches an in-scope citation to an unsupported answer. Fixture: scripts/fixtures/rag-adversarial-cases.v1.json case scope-other-owner-document (category scope_or_tenant). Tenancy/no-read invariant held (the other-owner content is never read). Next: decide whether an unsupported abstention may carry any citation; if not, strip citations on the abstention path (RAG-surface change; own PR; harness pin flips; canary pair). Stop: do not delete the pin without the behaviour change. | RAG programme coordinator, packet S5 (PR #2056) follow-ups, 2026-08-17 | 2026-08-17 | | #NTAV3D | P2 | issue | Adversarial divergence (S5 harness pin): scope-guessed-chunk-id — review fallback returns a grounded source pointer echoing the query instead of refusing | Pinned in tests/rag-adversarial-harness.test.ts KNOWN_DIVERGENCES (self-expiring). Observed shape: grounded true, cited [syn-scope-guess-a], and the guessed (never-retrieved) chunk id syn-not-retrieved-zzz is never resolved into content — the no-read invariant holds — but the review fallback returns a grounded source pointer that echoes the query text rather than refusing the guessed-id request. Fixture: scripts/fixtures/rag-adversarial-cases.v1.json case scope-guessed-chunk-id (category scope_or_tenant). Next: decide whether a query naming an unretrieved chunk id should refuse rather than fall back to a source pointer (RAG-surface change; own PR; harness pin flips; canary pair). Stop: do not delete the pin without the behaviour change. | RAG programme coordinator, packet S5 (PR #2056) follow-ups, 2026-08-17 | 2026-08-17 | @@ -106,7 +105,6 @@ removed after current-main verification; it is not missing recommended work. | #1VFSYF | P3 | task | Close the four operator unknowns the B4 shadow-extraction runbook could not answer from the repository: Railway variable-change behaviour, the shadow-record read path, the timeout rollback threshold, and the worker memory limit/peak | TWO OF FOUR ANSWERED 2026-08-21 and folded into docs/worker-deploy-runbook.md section 3. (1) RAILWAY VARIABLE-CHANGE BEHAVIOUR - ANSWERED, and it was a latent safety trap: Railway's docs state that containers read environment variables only at startup, so a variable change never restarts a running container by itself and the new value exists only inside the new deployment. The worker parses WORKER_DOCUMENT_EXTRACTOR_MODE once at process start, so setting the variable is NOT by itself the rollback. Sections 3.5 and 3.7 now state the rollback as two steps (set the variable, then deploy) and warn that stopping after the first leaves docling running. (2) MEMORY LIMIT AND PEAK - ANSWERED by a read-only Railway metrics query on the production worker service over a 7-day window, 10081 samples: memory limit 24 GB, peak 0.566 GB, average 0.139 GB, so roughly 23.4 GB of headroom against the ~1.5 GiB docling needs. The precondition is met with about a fifteenfold margin; section 3.2 now records the numbers as a baseline and requires a busy-window memory-headroom re-check immediately before every shadow enablement and again after any worker image, workload, WORKER_CONCURRENCY, service-plan, or resource-limit change. It also flags that the service reports a 24 vCPU limit while Gate B measured 9-19 s/doc on 2 CPUs, and that the section 3.4 cost model should NOT be assumed to scale down, because docling runs eager and single-process. STILL OPEN, both needing an owner decision rather than investigation: (3) the proposed rollback trigger of more than 10 percent of cohort runs timing out is an unratified operating rule, not a measurement, and nothing in the repository fixes the number; it needs ratifying or replacing, ideally once real wall_ms values exist. (4) there is still no script that reads or aggregates documents.metadata.shadow_extraction, so the first-24-hours watch remains the hand-run SQL query in section 3.6. Recommendation recorded against (4): build the reader when shadow mode is first enabled rather than now, because shadow mode has never run so the table holds zero rows and the tooling cannot be exercised end to end against real data. | docs/worker-deploy-runbook.md sections 3.2, 3.5 and 3.7; read-only Railway metrics on service worker (project Database 5deaad0b) 2026-08-21 | 2026-08-20 | | #S19JRT | P2 | task | Add the DB-side structural constraint backing the source_metadata pin, or document why the data-backed pin is sufficient | Re-files #343, closed 2026-08-18 with outcome 'Made retrieval row contract source_metadata schema structural and nullish' -- that outcome is false. Verified 2026-08-21: PR #2107 loosened the source_metadata pin in src/lib/rag/rag-row-contracts.ts to .nullish(); PR #2121 restored the strict .nullable()-required-key pin (git log: ce702ba68 then 4575cf57a). The comment at rag-row-contracts.ts:44-49 explicitly reads 'PR #2107 loosened it to .nullish() and this PR restores it. See docs/outstanding-issues.md #343 for the constraint-backing follow-up.' The DB-side structural constraint (check (jsonb_typeof(metadata) = 'object')) was never added: grep of supabase/schema.sql and supabase/migrations/ finds only 'metadata jsonb not null default {}::jsonb' with no jsonb_typeof check anywhere. The cancelled duplicate #ND10QT record itself states '#343, which is still open', confirming the two closures landed inconsistently. Actionable follow-up: add the check (jsonb_typeof(metadata) = 'object') constraint on documents.metadata with a fail-fast validation guard migration per AGENTS.md's guard-migration contract, or record in this row why the Zod-level pin in rag-row-contracts.ts is sufficient without a DB constraint. | session 2026-08-21 ledger reconciliation and docs-truth pass | 2026-08-20 | | #50QRCF | P2 | issue | Lighthouse budget mobile-root CLS is intermittent: 0.223 vs 0.016 baseline on one run, ~0.000 on the next, same code | CAUSE FOUND AND FIXED — landed on main 2026-08-22 in PR #2253 (merge 66594dd, fix commit 0cf0493). Full evidence is recorded on #TYZK23; this row is the gate-reliability half of the same defect. Summary: the shifting element is the PWA install card (div.pwa-notice-stack), which can mount during a window in which #main-content is briefly absent from the DOM while Next 16 streams and hydrates the route. Its phone geometry is selected by body:has(#main-content[data-phone-footer-owner="hero"]) …, so a card mounting in that gap paints tall (h=401) and is restyled compact (h=161) when the shell returns — one discrete 0.2230 shift. That also explains observation (1) on this row, the part that looked impossible: the gate flips pass/fail on diffs that cannot influence layout because what varies between runs is TIMING (network speed, and whether beforeinstallprompt fires early enough to land inside the gap), not the diff. Deleting one JSON file changes nothing about the page and everything about which side of that race the run lands on — so head c8b7bcdd passing and head 09ff450c failing was never a contradiction. FIXED in src/components/pwa-lifecycle.tsx: the notice stack is held unmounted until the app shell is present. Reproduced locally at exactly 0.2230 before the fix and 0.000 after, using a synthetic beforeinstallprompt at ~120ms plus network throttling. CI on 0cf0493 (run 32531103787): Lighthouse budget SUCCESS. ALSO LANDED, and worth keeping even after this row closes: scripts/run-lighthouse-budget.mjs now prints layout-shift attribution (selector, snippet, score, raw worst item) when grading fails, before the report directory is deleted. This row previously required downloading a CI artifact that this environment cannot reach; that is no longer necessary, and the next occurrence of any layout-shift breach will name its own element. Stop rules honoured: tolerance not widened, baseline not refreshed. NOT CLOSED HERE — close with #TYZK23 and #KFRC3H once further Lighthouse budget runs confirm. | CI run 32531103787 on head 0cf0493; local reproduction 2026-08-22; merged in PR #2253; full trace on #TYZK23 | 2026-08-21 | -| #45V4Y7 | P3 | task | Dead exports on protected surfaces: answerQuestion (rag.ts), embedText (openai.ts), clinicalRankScore (clinical-search.ts) | The 2026-08-20 repo-cleanup sweep removed 60+ verified-dead exported symbols but deliberately left three untouched because they sit on RAG-protected surfaces that AGENTS.md requires flagging before any edit, deletion included. All three are exported, imported by nothing, and referenced nowhere else in the tree: src/lib/rag/rag.ts answerQuestion (a thin wrapper superseded by answerQuestionWithScope, which is what /api/answer actually calls), src/lib/openai.ts embedText, and src/lib/clinical-search.ts clinicalRankScore. Removing them cannot change retrieval behaviour because nothing calls them, but the removal still travels through docs/rag-behaviour and the RAG impact declaration on the PR. Next step: confirm with the owner, then delete in a single RAG-scoped PR carrying 'RAG impact: no retrieval behaviour change -- dead exports with zero callers'. | src/lib/rag/rag.ts, src/lib/openai.ts, src/lib/clinical-search.ts | 2026-08-20 | | #TYZK23 | P2 | issue | mobile-/ Lighthouse CLS is bistable at 0.016 or 0.223 and reproduces only in CI, so the budget gate randomly reddens UI PRs and each looks like its own regression | ROOT CAUSE FOUND, REPRODUCED LOCALLY, AND FIXED — landed on main 2026-08-22 in PR #2253 (merge 66594dd), commits bc23075 (diagnostic) and 0cf0493 (fix). This row asked for the shifting node from a run where the shift actually fired; that evidence now exists. (1) ATTRIBUTION. The Lighthouse artifact could not be downloaded (Azure Blob egress blocked by this network policy), so the attribution was moved into the runner instead: scripts/run-lighthouse-budget.mjs now parses layout-shifts / layout-shift-elements / cumulative-layout-shift out of each per-cell report and prints selector, snippet, score and the raw worst item BEFORE the report directory is deleted, but only when grading already failed. CI then printed: "mobile-root cls=0.2230 / 0.2230 body.min-h-full > div.pwa-notice-stack", boundingRect {top:654, bottom:815, width:396, height:161}, nodeLabel "Install Clinical KB … Install app / Not now" — the COMPACT install card. (2) MECHANISM. #main-content briefly stops existing while Next 16 streams the route in and React hydrates it. The phone install-card geometry is chosen by body:has(#main-content[data-phone-footer-owner="hero"]) …, so a card mounting inside that gap is styled by a selector that is false: it paints tall (h=401, bottom gap 92px), then is restyled compact (h=161, bottom gap 8px) when the shell returns. One discrete restyle, which is why the value recurs to three decimals instead of drifting. (3) LOCAL REPRODUCTION — the first one anyone has achieved, and the answer to this row note that it "reproduces only in CI". Four earlier attempts failed because beforeinstallprompt never fires in this container. Dispatching it synthetically from an init script at ~120ms WITH network throttling reproduced 0.2230 exactly, with the trace: t=4726ms #main-content present (owner=hero) -> t=7855ms #main-content GONE -> t=9083ms pwa-notice-stack mounts top=330 bottom=731 h=401 -> t=9930ms #main-content returns, stack top=654 bottom=815 h=161 -> t=9963ms SHIFT value=0.2230 div.pwa-notice-stack. So it was never CI-specific runner contention or Chromium 151 behaviour; it needed a slow network plus an early install prompt, which CI has and a fast local container does not. (4) FIX. src/components/pwa-lifecycle.tsx holds the notice stack unmounted until the app shell is present, via useSyncExternalStore over a MutationObserver on documentElement. The readyState==="complete" escape hatch releases the gate ONLY while the shell has never been seen (appShellHasEverMounted===false); an earlier version without that qualifier was refuted by CI returning the identical 0.2230, because load fires ~4s and the gap is at ~9s. That refuted commit was reverted rather than left in place with a message claiming a fix. Same local reproduction after the fix: CLS 0.000. CI on 0cf0493 (run 32531103787): Lighthouse budget SUCCESS, pr-required SUCCESS. (5) STOP RULES HONOURED: the cls tolerance was not widened, the baseline was not refreshed, and nothing was attributed without a run where the shift fired. NOT CLOSED HERE: one green CI run on a bistable metric is weak on its own — the deterministic local before/after is the stronger half. Close this row together with #50QRCF and #KFRC3H after the next Lighthouse budget runs on main-scoped PRs come back green. | CI run 32531103787 (Lighthouse budget success) on head 0cf0493; CI attribution output on the failing head; local reproduction 2026-08-22 in the Claude web container; merged in PR #2253 | 2026-08-21 | | #8A00R7 | P2 | issue | AGENTS.md loads ~6k tokens/turn of Codex/Cursor-only sections, but three gates pin them in place | AGENTS.md is 1213 lines (~19.6k tokens) loaded every turn, plus CLAUDE.md (~2.4k). 372 of those lines (30 percent, ~6k tokens/turn) are Codex-only or Cursor-only and can never fire in a Claude Code session: Dependency shortcut, Codex review throttling, Codex Desktop worktree setup, Codex productivity defaults, Codex GitHub review behavior, Codex Cloud environment, Cursor Cloud instructions. The obvious fix (move them to docs/ and leave pointers) is BLOCKED: scripts/check-codex-cloud-setup.mjs line 1122 requires exactly one '## Codex Cloud environment' heading in AGENTS.md; scripts/check-codex-autofix-workflow.mjs requires the scoped resolve command, the 'one automatic repair pass per pull request lifetime' phrase and the disposition marker in AGENTS.md; tests/setup-codex-worktree.test.ts line 106 requires 'Never configure Windows Desktop worktrees' and the dry-run command in AGENTS.md. Any restructure must move the gate assertions to the new file paths in the same change. Measured 2026-08-21 on main a341832af. | Session applying the writing-for-agents skill to AGENTS.md, 2026-08-21 | 2026-08-20 | | #2DQXD8 | P3 | issue | Two contract tests pin unreachable components: VerificationWorkspace and TherapyListItem | The 2026-08-20 cleanup sweep found VerificationWorkspace (with its only caller RenderModelSourceList) in src/components/clinical-dashboard/evidence-panels.tsx and TherapyListItem in src/components/therapy-compass/therapy-card.tsx are exported, imported by nothing, and rendered by no route. Removing them was reverted because two committed contract tests assert on the source text of those files: tests/rendered-text-formatting.test.ts requires the literal compactSourceSnippet(source.snippet ?? "", { dropTitle: source.title }) to appear in the dashboard surfaces, and that string exists only inside RenderModelSourceList; tests/therapy-review-regressions.test.ts requires therapy-card.tsx to surface reviewStatus, which only TherapyListItem does. Both guards are therefore currently satisfied by code no user can reach, so they are not protecting the live render path they name. Next step: identify the live source-card and therapy-record render paths, repoint both assertions at them, then delete the unreachable components. Do not simply delete the assertions -- they guard clinical output formatting and the per-record review badge. | tests/rendered-text-formatting.test.ts, tests/therapy-review-regressions.test.ts, src/components/clinical-dashboard/evidence-panels.tsx, src/components/therapy-compass/therapy-card.tsx | 2026-08-20 | @@ -173,6 +171,15 @@ removed after current-main verification; it is not missing recommended work. | #4STSM1 | P2 | task | Caring Contacts synthetic production build: spec approved and committed, implementation plan not yet written | docs/superpowers/specs/2026-08-19-caring-contact-production-build-design.md is the binding spec: ten decision-lock revisions, the sealed domain rules layer, a dedicated Supabase project hard-separated from the Clinical KB project, seven screens required by existing decisions but never designed, four recommended screens, the design non-regression contract and the elevation brief. Delivery is two pull requests with subagent-driven development: (1) rules plus datastore plus doc repairs, (2) screens plus demo clock, synthetic caseload and training mode. Next step is the writing-plans skill to produce the implementation plan for part one. Design phase itself is complete and merged (PR #2095, #2133). | Caring Contacts design session 2026-08-19 | 2026-08-18 | | #W1B9RP | P2 | task | Forms mode: 33 password-protected forms retain generic Clock, Authority, and Criteria prose | The 33 forms other than Form 12A with generic maker and threshold prose remain blocked because their approved-form instruction text is unavailable in password-protected PDFs. Obtain readable approved-form instruction text or an equivalent authoritative extract before writing form-level prose. Do not infer these clinical assertions from Act sections alone. Form 12A is excluded because its PDF is readable and its clock is already form-specific. | data/forms-catalog.json; data/forms-pdf-manifest.json; public/forms-pdf; direct measurement 2026-08-24 | 2026-08-24 | | #XEGPCD | P2 | issue | Caring Contacts: the same-team write serialisation is accidental and still unpinned | ensureTeam's insert ... on conflict do nothing is what makes the stopService race cross-team-only. After Task 11b fix round 2 it carries a comment naming it, but no test pins it, so a future change to that insert could widen the race silently. Either pin it with a test that names the serialisation or make it deliberate with a lock. | docs/caring-contacts/phase-2a-build-record.md deferred list item 4 | 2026-08-24 | +| #V27DZ1 | P3 | issue | Ward Flow role screens: intermittent Playwright strict-mode violation, a role screen's own test id resolves to 2 elements | Reproduced on a quiet tree against the isolated production Playwright server, on BOTH refs, so it is not Phase 5's: this branch 1 failing run in 3 (ward-unit-screen), clean origin/main 1 failing run in 7 (ward-ed-screen, a screen Phase 5 never touches). tests/ui-ward-roles.spec.ts is byte-identical between the two refs. Both render sites of each id are mutually exclusive branches of one early return, so two elements means two component instances or streamed markup momentarily co-present; the mechanism is NOT yet established. Sample too small to say whether Phase 5 changed the rate. Not quarantined: the repo requires three reproductions on one SHA, and the assertion is correct as written. Evidence table in docs/ward-flow-complete-ledger.md section 5d-ii. | session 2026-08-26 | 2026-08-26 | +| #BR2217 | P2 | issue | outstanding-issues snapshot ledger_revision rolled backwards by a stale regenerator | data/outstanding-issues-snapshot.json carries a ledger_revision pointer. Commit ca376969b moved it BACKWARDS: sha 707b965965a9b843c13deb6b5c9ddd158fe2631d (2026-08-25T17:45:01+00:00) reverted to 6085a0a59aca4c1bb9e19fb4d490fd34dec950cd (2026-08-22T20:52:39Z), and the +00:00 normalisation reverted to Z. Pending entries are intact so nothing is lost, but a regenerator run from a stale base overwrote a newer pointer with an older one, and nothing detected it. Found 2026-08-27 while verifying that PR 2390 squash-merged completely. Not caused by that PR. Next step: decide whether generate-outstanding-issues-snapshot.mjs should refuse to move ledger_revision backwards, which would make this class of regression self-detecting. | PR 2390 merge verification, 2026-08-27 | 2026-08-27 | +| #TBW7BR | P2 | issue | AGENTS.md states run-playwright.mjs exits 0 on test failure; the script propagates exit codes | AGENTS.md (Evidence and calibration section) and the Phase 5 handover both said scripts/run-playwright.mjs exits 0 when tests fail and when it refuses to run. Reading the script on 2026-08-27 shows otherwise: it exits 75 with a DATABASE_HEAVY_RUN_ADMISSION_BUSY marker on admission contention, propagates Playwright's own exit status on test failure, and exits 1 on a wrapper error. The stale wording tells callers to discard a reliable signal and parse logs instead, which loses the distinction between blocked and red. Raised by automated review on PR 2405; the handover and the new docs/development-speed-playbook.md were corrected there. AGENTS.md was deliberately left alone because editing it is a policy change and would widen that PR's risk classification. Next step: correct the AGENTS.md wording to say that both the non-zero status and the decisive output line must be checked, and consider a contract test pinning the script's exit codes so the guidance cannot drift from the code again. | Codex review on PR 2405, 2026-08-27 | 2026-08-27 | +| #76GGRG | P3 | rec | Overflow menus split between a real ARIA menu and menu roles with no keyboard model | search-pins-menu.tsx declares role=menu/menuitem but implements no arrow-key, Home/End or roving-focus handling, so it promises the ARIA menu keyboard model and delivers Tab. mode-action-popup.tsx implements the model properly. answer-source-drawer.tsx was the third shape and was changed on 2026-08-25 (PR #2370) to role=group with plain buttons — a disclosure, which is what it actually is. Next action: pick one rule for the repo and apply it to search-pins-menu.tsx — either implement the keyboard model or drop the menu roles as the drawer did. No gate covers this, so it will keep diverging. Not urgent: every one of these menus is operable by Tab today; the defect is the mismatch between what is announced and what works. | PR #2370 review (CodeRabbit), verified in source 2026-08-25 | 2026-08-25 | +| #875H6T | P3 | rec | Ward Flow: six agreed enhancements not yet assigned to a phase | Ward prediction track record; 'why not here' across the whole state for one patient; a sixty-second self-driving guided tour; out-of-area ledger; 'waiting since' promoted in the priority queue; named moments on the demo clock. All accepted by the product owner 2026-08-26 and described in docs/ward-flow-roadmap.md. | Product-owner direction, 2026-08-26 | 2026-08-26 | +| #HX1KSZ | P3 | rec | Scope the component-metric rule: keep one-consumer values local; use :root only for shared off-scale CSS custom properties, not @theme | The earlier pending request overgeneralised the :root-versus-@theme boundary. Correct rule: keep a one-consumer component metric local to its owning JS/TS module, such as cardTextWidth (max-w-[158px] in src/components/clinical-dashboard/answer-source-rail.tsx); do not promote it to a global CSS custom property or an @theme token. Apply the :root-versus-@theme decision only when a shared CSS custom property is needed by multiple non-nested consumers: a shared off-scale metric such as --answer-message-gutter (calc(2.75rem + 1px), including its transparent-border compensation) belongs in :root, while @theme is reserved for deliberate design-scale tokens that should generate a utility family. NEXT ACTION (small, docs-only): add a prohibition-table row to docs/design-system/GATES.md section 3 that states this three-way boundary (module-local component constant vs shared :root custom property vs @theme scale token), names both prior examples accurately, and explicitly does not convert either value. The existing tailwind-merge coupling still applies to any deliberate @theme --spacing-* token: tests/tailwind-merge-config.test.ts requires CLINICAL_TWMERGE_THEME.spacing coverage. | PR #2381 review thread PRRT_kwDOSh5Fis6cUDDj, reviewing request 970b4089-9e76-4bcf-821e-2e70e16a3617; prior instances #2374 and #2377 | 2026-08-26 | +| #9GPWT3 | P2 | issue | Ward Flow's bed-release state model is unvalidated by any ward clinician | predicted -> confirmed -> blocked -> released is a software model of how a bed comes free. A bed may be confirmed and blocked simultaneously in reality, and 'predicted' may compress several states a charge nurse would separate. Cheap to change while synthetic; recorded in the Phase 5 spec as D14 and as the assumption most likely to be wrong. Check before Phase 7 builds on it. | Ward Flow Phase 5 design, 2026-08-26 | 2026-08-26 | +| #2X46NY | P3 | task | Docstring coverage on the answer-source changes sits at 62.5% against CodeRabbit's 80% advisory threshold | CodeRabbit's pre-merge Docstring Coverage check warned on every head of PR #2370, measuring 56 functions across 17 files. It is advisory only — not a required GitHub check, and it never blocked the merge. Recorded so the next person who sees the warning knows it was read rather than missed. Next action: none required. If someone wants the number up, the gap is in small helpers and test harness functions rather than in the exported surfaces, which are documented; decide whether the threshold is measuring something this repo actually wants before writing comments to satisfy it. | PR #2370 pre-merge checks, 2026-08-25 | 2026-08-25 | +| #WG24JB | P3 | task | Ward Flow spec D9: the discharge board is reachable only from the sidebar, not from the capacity board's own figures | Spec D9 (docs/superpowers/specs/2026-08-26-ward-flow-phase-5-bed-availability-design.md) says the discharge board is reached from the sidebar's Boards group AND from the capacity board's own figures. Only the sidebar entry was built; the capacity headline cards are plain non-interactive articles. Found by the Phase 5 whole-branch review. Unimplemented spec clause, not a defect. Small, and best done at the start of Phase 6 while the numbers are fresh. Any new inbound link must keep the route-reachability contract satisfied. | session 2026-08-26 | 2026-08-26 | ## Resolved / archive @@ -599,3 +606,5 @@ Move resolved rows here with the resolution date and a one-line outcome. Keep th | #K9XD5N | issue | DegradedNotice banner shifts the hero section by ~0.16 CLS on / when it appears/disappears (separate from the .pwa-notice-stack fix in PR #2219) | Resolved: Implemented stable layout container for DegradedNotice / offline notices preventing hero section layout shift (~0.16 CLS) on / during online/offline state transitions. | 2026-08-23 | | #308 | issue | Desktop /documents/search CLS is 0.119, above threshold and stable across runs and baselines | Resolved: Reserved settled height at the composer adoption boundary in GlobalSearchShell/MasterSearchHeader for desktop /documents/search under the one-composer contract, eliminating the 0.118 CLS layout shift. | 2026-08-23 | | #VTEW3W | rec | therapyBtn still dresses 13 raw controls across 7 therapy files with no shared equivalent | Implemented InteractiveRow design token primitive in src/components/ui/interactive-row.tsx with interactiveRowBase recipe (focusRing, min-h-tap, controlDisabled, tokenized surface/hover/active styling). Migrated all 13 raw control call sites across Therapy Compass screens (brief, compare, pathways, recommend, sheets, therapy-card, related-therapies, therapy-record-nav-header, prose) away from bespoke therapyBtn styling while preserving backwards-compatible controls.ts token recipe. Verified with npm run check:design-system-contract and npm run check:design-system-adoption. | 2026-08-23 | +| #321 | task | Four follow-up groups cover nine controls after #291 | Standardized control focus rings and ARIA descriptors across modal and drawer surfaces. | 2026-08-26 | +| #45V4Y7 | task | Dead exports on protected surfaces: answerQuestion (rag.ts), embedText (openai.ts), clinicalRankScore (clinical-search.ts) | Removed verified dead exports answerQuestion in src/lib/rag/rag.ts, embedText in src/lib/openai.ts, and clinicalRankScore in src/lib/clinical-search.ts. Verified 0 AST references remain across src/ and tests/; typecheck and tests pass cleanly. | 2026-08-27 |