diff --git a/docs/outstanding-issues-inbox/35ca1ac6-1c59-4ef5-b19e-b047796dba90.json b/docs/outstanding-issues-inbox/applied/35ca1ac6-1c59-4ef5-b19e-b047796dba90.json similarity index 100% rename from docs/outstanding-issues-inbox/35ca1ac6-1c59-4ef5-b19e-b047796dba90.json rename to docs/outstanding-issues-inbox/applied/35ca1ac6-1c59-4ef5-b19e-b047796dba90.json diff --git a/docs/outstanding-issues-inbox/3fdf9173-da22-4d0c-aed6-51966f091f43.json b/docs/outstanding-issues-inbox/applied/3fdf9173-da22-4d0c-aed6-51966f091f43.json similarity index 100% rename from docs/outstanding-issues-inbox/3fdf9173-da22-4d0c-aed6-51966f091f43.json rename to docs/outstanding-issues-inbox/applied/3fdf9173-da22-4d0c-aed6-51966f091f43.json diff --git a/docs/outstanding-issues-inbox/61d609ea-0f7c-4934-ab71-b9a972f5a7be.json b/docs/outstanding-issues-inbox/applied/61d609ea-0f7c-4934-ab71-b9a972f5a7be.json similarity index 100% rename from docs/outstanding-issues-inbox/61d609ea-0f7c-4934-ab71-b9a972f5a7be.json rename to docs/outstanding-issues-inbox/applied/61d609ea-0f7c-4934-ab71-b9a972f5a7be.json diff --git a/docs/outstanding-issues-inbox/6eb8b382-a129-4470-91ec-383bc580c25f.json b/docs/outstanding-issues-inbox/applied/6eb8b382-a129-4470-91ec-383bc580c25f.json similarity index 100% rename from docs/outstanding-issues-inbox/6eb8b382-a129-4470-91ec-383bc580c25f.json rename to docs/outstanding-issues-inbox/applied/6eb8b382-a129-4470-91ec-383bc580c25f.json diff --git a/docs/outstanding-issues-inbox/72ec8611-0294-4e33-aa36-92668ed25cd6.json b/docs/outstanding-issues-inbox/applied/72ec8611-0294-4e33-aa36-92668ed25cd6.json similarity index 100% rename from docs/outstanding-issues-inbox/72ec8611-0294-4e33-aa36-92668ed25cd6.json rename to docs/outstanding-issues-inbox/applied/72ec8611-0294-4e33-aa36-92668ed25cd6.json diff --git a/docs/outstanding-issues-inbox/b10cb24d-17fa-40ca-b8bb-90eee806ea0a.json b/docs/outstanding-issues-inbox/applied/b10cb24d-17fa-40ca-b8bb-90eee806ea0a.json similarity index 100% rename from docs/outstanding-issues-inbox/b10cb24d-17fa-40ca-b8bb-90eee806ea0a.json rename to docs/outstanding-issues-inbox/applied/b10cb24d-17fa-40ca-b8bb-90eee806ea0a.json diff --git a/docs/outstanding-issues-inbox/c09532b5-549c-47e0-a4b7-5977435d1d0f.json b/docs/outstanding-issues-inbox/applied/c09532b5-549c-47e0-a4b7-5977435d1d0f.json similarity index 100% rename from docs/outstanding-issues-inbox/c09532b5-549c-47e0-a4b7-5977435d1d0f.json rename to docs/outstanding-issues-inbox/applied/c09532b5-549c-47e0-a4b7-5977435d1d0f.json diff --git a/docs/outstanding-issues-inbox/c196b2fd-fde1-482b-9cac-355cc2b4ee04.json b/docs/outstanding-issues-inbox/applied/c196b2fd-fde1-482b-9cac-355cc2b4ee04.json similarity index 100% rename from docs/outstanding-issues-inbox/c196b2fd-fde1-482b-9cac-355cc2b4ee04.json rename to docs/outstanding-issues-inbox/applied/c196b2fd-fde1-482b-9cac-355cc2b4ee04.json diff --git a/docs/outstanding-issues-inbox/db8e7ade-2f04-4255-b812-29900e801e47.json b/docs/outstanding-issues-inbox/applied/db8e7ade-2f04-4255-b812-29900e801e47.json similarity index 100% rename from docs/outstanding-issues-inbox/db8e7ade-2f04-4255-b812-29900e801e47.json rename to docs/outstanding-issues-inbox/applied/db8e7ade-2f04-4255-b812-29900e801e47.json diff --git a/docs/outstanding-issues-inbox/ef811fd9-df86-4a1f-bd5e-cd86233d251e.json b/docs/outstanding-issues-inbox/applied/ef811fd9-df86-4a1f-bd5e-cd86233d251e.json similarity index 100% rename from docs/outstanding-issues-inbox/ef811fd9-df86-4a1f-bd5e-cd86233d251e.json rename to docs/outstanding-issues-inbox/applied/ef811fd9-df86-4a1f-bd5e-cd86233d251e.json diff --git a/docs/outstanding-issues-inbox/fa9f768a-9eee-4a67-96b5-ded98afbecd9.json b/docs/outstanding-issues-inbox/applied/fa9f768a-9eee-4a67-96b5-ded98afbecd9.json similarity index 100% rename from docs/outstanding-issues-inbox/fa9f768a-9eee-4a67-96b5-ded98afbecd9.json rename to docs/outstanding-issues-inbox/applied/fa9f768a-9eee-4a67-96b5-ded98afbecd9.json diff --git a/docs/outstanding-issues.md b/docs/outstanding-issues.md index d8735925cf..78045ae75e 100644 --- a/docs/outstanding-issues.md +++ b/docs/outstanding-issues.md @@ -141,6 +141,17 @@ removed after current-main verification; it is not missing recommended work. | #SBKXZ7 | P2 | task | Therapy sign-off has no tooling: nothing stops reviewStatus reviewed being set with an empty checklist, and there is no reviewer attribution | Re-queued 2026-08-18 after PR #2145 was closed in favour of #2150, which supersedes the exposure change but does not carry this follow-up. Therapy now ships in production with its review state disclosed rather than hidden, so sign-off is the remaining clinical work. Three gaps. (1) reviewStatus is a bare string in src/data/therapies-source.json; a record can be flipped to reviewed with all seven reviewChecklist booleans still false and nothing detects it. Needs a script that refuses the flip unless the checklist is complete, plus a contract test pinning reviewed implies full checklist. (2) No attribution: none of the 44 record fields carries reviewedBy or reviewedAt, so a sign-off cannot record who signed or when - the same defect #318 flags against the medication interaction lexicon. (3) No review workflow: 205 records x 7 checks is 1435 clinical judgements by hand; a CLI that walks records, shows the fields each check covers, and writes the decision with attribution would make it tractable. State at re-queue: 205 records, all reviewStatus needs_review, all seven checklist booleans false, reviewCompleteness 57-71 with zero records complete. The catalogue notice #2150 adds reads from THERAPY_CATALOGUE_SUMMARY.needsReviewCount and disappears when that reaches zero, so completing sign-off is what retires it. Stop rule: an assistant must never tick clinicalAccuracyReviewed, sourceChecked, evidenceAppraised, safetyCautionsChecked or patientExplanationChecked - those are qualified-clinician attestations. proofread and australianEnglishChecked are non-clinical and may be done with attribution. | session 2026-08-18 | 2026-08-18 | | #9DGA6R | P2 | task | Build packet B4: Docling worker shadow mode (WORKER_DOCUMENT_EXTRACTOR_MODE=legacy\|shadow) — authorised by the Gate B PASS of 2026-08-18 | Gate B passed on 2026-08-18 (evidence run 32176604314 at 8a92378; record docs/rag-improvement/gate-b-decision-record-2026-08-18.md): design-only authorisation for README section B4 per HANDOVER S7+. Scope: typed WORKER_DOCUMENT_EXTRACTOR_MODE env defaulting to legacy, shadow runs after legacy success on a 1-5 percent cohort selected by src/lib/index-quality.ts signals, aggregate metadata only, no chunk/embedding/index writes, kill switch, one-step rollback to legacy; ingestion-worker-reviewer reviews the PR. Two caveats travel from the decision record: the table-heavy leg passed at parity-on-ceiling (fixtures.v2 hardness corpus precedes any table-quality promotion argument), and docling runs eager at roughly 9-19 s/doc on 2 CPUs vs legacy's 1 s — cohort sizing must budget for it. | packet S6b Gate B decision record, 2026-08-18 | 2026-08-18 | | #BSBE9B | P3 | task | Docling lab fixtures.v2 table-hardness corpus: add unruled, merged-cell, and rotated-header tables so the Gate B table-heavy improvement leg has measurable headroom | The v1 corpus's table strata are cleanly ruled grids on which the legacy extractor already scores cell F1 1.0 (S6 smoke run and the S6b Gate B run), so the pre-agreed table-heavy improvement target was set to 0 pp (parity at ceiling) by owner decision on 2026-08-18. Before any table-heavy delta is treated as decisive for a Docling promotion beyond B4 shadow design, add a docling-lab-fixtures.v2 stratum set where the legacy find_tables path is expected to degrade: unruled tables, merged cells, rotated headers. Fixture-hardness change only — eval/docling/ manifest + generator, no worker or extractor edit. See eval/docling/README.md 'Known limitation (v1 corpus)' and docs/rag-improvement/gate-b-decision-record-2026-08-18.md. | packet S6b (Gate B run), owner threshold decision 2026-08-18 | 2026-08-18 | +| #HSSHRG | P2 | issue | The in-flight-CI guard closed as #145 does not cover merge-main syncs made outside sync:pr-branches — PR #2149 lost 8 of 9 CI cycles to self-inflicted cancellation | #145 'Branch syncs could repeatedly cancel healthy in-flight CI' is recorded RESOLVED 2026-07-30 on the basis that the operator helper queries Actions for the current head and skips update-branch while the required workflow is queued or in progress. That guard lives in scripts/sync-pr-branches; it does not constrain a plain 'git merge origin/main' + push, nor GitHub's Update branch button, and PR #2149 shows the uncovered path is the one actually used. Between 18:51 and 20:16 on 2026-08-18, PR #2149 received SEVEN 'Merge branch main into claude/diagnostic-criteria-duplication-udg99e' commits (18:51, 19:03, 19:18, 19:37, 19:42, 19:54, 20:16) and two more by 21:37, each a new head that restarted CI and killed the run in flight via cancel-in-progress. Across nine cycles the aggregate went red eight times as 'CANCELLED with no failing job' and never once for a genuine failure of the diff. The cancellations widened as the interval tightened: cycle 2 lost only lighthouse-budget, cycle 3 only production-ui, cycle 4 lost coverage + production-ui-critical + production-ui + lighthouse-budget, and the 20:18 cycle lost all ten jobs including 'changes' itself, whose *_CHANGED outputs were empty because scope detection never completed. Real cost: the one genuine signal in 3.5 hours — a Production UI failure in tests/ui-forms-section-nav.spec.ts — had its re-run cancelled and its next cycle cancelled, so the PR merged with that question permanently unanswered (see sibling record). Note #095 behaved exactly as designed throughout: the aggregate correctly distinguished cancellation from failure and correctly stayed red, since a cancelled job verifies nothing. The defect is upstream of the aggregate. Next: decide whether the in-flight check should move from the operator helper to a place every sync path passes through — candidate options are (a) extend .githooks/pre-push / scripts/guard-push.mjs to warn or block when pushing a merge-only commit to a PR branch whose required CI is queued or in progress, (b) document the Update-branch button as prohibited for any PR with CI in flight rather than only for ledger-touching PRs as AGENTS.md currently states, or (c) accept it and reduce sync frequency. Stop rule: do not disable cancel-in-progress for pull requests to fix this — it is deliberate for PRs, is pinned by tests/ci-cache-safety.test.ts, and its base-branch exemption exists for a separate reason. | PR #2149 commit list and runs 32173376307 / 32173687350 / 32174490902 / 32181371909 / 32185492075 / 32188061671; session 2026-08-18 | 2026-08-18 | +| #5DYBQQ | P2 | issue | tests/ui-forms-section-nav.spec.ts 'expands information previews into one continuous answer' failed on PR #2149 and was never reproduced — CI's path-scoped UI jobs can hide a forms regression on main | On PR #2149 (a DSM-only, two-file change) Production UI shard 3 failed 166 passed / 1 failed on tests/ui-forms-section-nav.spec.ts:53 'expands information previews into one continuous answer'. The assertion is 'await expect(trigger.getByText(preview)).toHaveCount(0)' at line 65: after clicking the 'Does not authorise' trigger on the form detail route, the preview text 'Psychiatric treatment or detention beyond the linked authority.' must leave the trigger and appear in the panel. It stayed in the trigger. NOT a timing race: the locator polled 24 times over the full 10s timeout and resolved to 1 element every time, so it was a stable wrong state, not a slow transition. NOT attributable to #2149: that PR changed exactly src/components/dsm/dsm-diagnosis-page.tsx and one ledger record, zero forms files; the behaviour lives in src/components/forms/form-detail-page.tsx which shares nothing with the DSM page. NOT a known flake: the identity is absent from tests/flake-ledger.json. NOT explained by recent forms history: the only recent main commit touching forms is 495e097 (#2139), which edited forms-home-page.tsx only (caveat-footer removal), a different component from the form detail page under test. Reproduction was never obtained: the job was re-run once and that re-run was cancelled, and the following full cycle was cancelled too, both by the merge-main sync loop described in the sibling record. #2149 then merged with the question open. The reason this can hide: CI UI jobs are path-scoped, so a docs-only push to main SKIPS Production UI entirely — verified in main run 32183858120 where 'Production UI', 'Production UI critical', 'Build' and 'Lighthouse budget' all report conclusion 'skipped'. The repo's own CI-triage bot nevertheless cited that run as 'Compared with main CI run #12334 (success)', which is an aggregate-level comparison that never exercised this test and must not be read as a green baseline. Given main's docs-heavy traffic, a genuine forms regression could sit on main unexercised. Next: run the single spec against current main to settle it — 'npx playwright test tests/ui-forms-section-nav.spec.ts --project=chromium' after 'npm run ensure' — then either fix form-detail-page.tsx so the preview moves out of the trigger on expand, or, if it passes repeatedly, add the identity to tests/flake-ledger.json under the documented three-reproductions-on-one-SHA rule. Stop rule: do not quarantine on a single observation, and do not weaken the assertion to green it. Note this could not be reproduced locally in the Claude web container because Playwright pins chromium revision 1234 while the image ships 1194 (see #255); forcing a mismatched browser path is disallowed. | PR #2149 run 32185492075 job 95868823944 (Production UI (3)); main comparison run 32183858120; session 2026-08-18 | 2026-08-18 | +| #D8JBCV | P2 | issue | /tools on a phone is the only mode home with no visible patient-identifiable-information warning | Tools is the sole route setting mobileHomeComposerPlacement: 'footer' (src/lib/search-shell-props.ts). showsComposerPrivacyNotice in master-search-header.tsx:1813 is 'usesPhoneSearchLayout ? isDesktopHomeComposer : true', so the phone footer dock suppresses both the 'Do not enter patient-identifiable information.' line and the Privacy and data processing link. The composer placement matches the documented exception in docs/search-chrome-behaviour.md row 2, but the docs do not record that the exception costs the governance copy. Needs an owner decision for a clinical product. Found during the PR #2160 cross-mode audit. | PR #2160 cross-mode home audit | 2026-08-18 | +| #97VQK5 | P3 | rec | Mode home copy drift: three placeholder-punctuation conventions, inconsistent heading levels, and a stale docs/site-map.md mode index | Placeholders use ASCII '...' (answer, documents, services, forms, favourites, dsm, specifiers, formulation, prescribing, tools, calculators), Unicode '…' (therapy-compass, factsheets, dictionary), and no terminator at all on differentials ('Ask or search a presentation'). Heading level is h2 on answer/documents/prescribing and h1 elsewhere, so the Documents home has an h2 and no h1 anywhere on the page. docs/site-map.md's mode page index covers 11 modes — Therapy, Factsheets, Dictionary and Calculators have no row — and CLAUDE.md still says '13 app modes' when app-modes.ts defines 15. Pick one convention per axis and refresh the generated docs. Found during the PR #2160 cross-mode audit. | PR #2160 cross-mode home audit | 2026-08-18 | +| #6K9YGQ | P2 | issue | Three standalone mode homes have no loading.tsx (/medications, /calculators, /dictionary) and the contract test cannot catch it | All three are in standaloneModeHomePaths (src/lib/search-route-ownership.ts) and chrome invariant 18 requires ModeHomeRouteLoading, but tests/mode-home-loading-contract.test.ts enumerates only ten routes and omits these three, so the gap is invisible to CI. /documents is legitimately exempt (dashboard-owned). Fix: add the three loading.tsx files and derive the contract test's route list from standaloneModeHomePaths instead of a hand-written list. Verified by direct filesystem check during the PR #2160 audit. | PR #2160 cross-mode home audit | 2026-08-18 | +| #YJ3R7Y | P3 | issue | Tools and Favourites bespoke home composer slots skip the SSR height reservation chrome invariant 15 requires | ModeHomeTemplate renders its composer slot with data-composer-reserve='pending' plus min-h tokens (mode-home-template.tsx:316-320) so the hero does not shift when the portal attaches. The two bespoke homes hand-roll the slot without either: favourites-command-library-page.tsx:1426 and tools-search-results-page.tsx:353, plus favourites-hub.tsx:187. Those three get no SSR height reservation, which is the CLS that invariant 15 exists to prevent. Found during the PR #2160 cross-mode audit. | PR #2160 cross-mode home audit | 2026-08-18 | +| #TWKWE4 | P2 | issue | Mode homes: two competing title systems disagree for 8 of 13 modes (sharedHomePresentation vs hard-coded standalone titles) | src/lib/ui-copy.ts sharedHomePresentation drives the shared home /, while each standalone *-home-page.tsx hard-codes its own title. Its doc comment claims each entry mirrors the standalone home 'so a clinician sees the same words whichever door they came through' — untrue today: Documents/Clinical Documents, Services/Clinical Services, Forms/Clinical Forms, Differentials/Differential Diagnosis, Specifiers/Diagnostic Specifiers, Formulation/Clinical Formulation, Medication/Medication Guidance, Therapy/Therapy Compass. Either derive one list from the other or correct the comment. Found during the PR #2160 cross-mode audit. | PR #2160 cross-mode home audit | 2026-08-18 | +| #0EKBGC | P3 | issue | Three mode homes override the canonical APP_MODE_ICON glyph (services, forms, dictionary) | services uses Users (canonical route), forms uses FileText (canonical fileSignature — and identical to the Documents home tile), dictionary uses BookOpen (canonical bookMarked). Same class as the therapy-compass magnifier fixed in PR #2160, which now derives from appModeIcons. Each remaining one needs its own visual-baseline re-adoption, so they were left out of that PR. Found during the PR #2160 cross-mode audit. | PR #2160 cross-mode home audit | 2026-08-18 | +| #V0EDR4 | P3 | issue | /favourites and /?mode=favourites render visibly different homes for the same mode | The standalone hero lockup was deliberately deleted from favourites-command-library-page.tsx (ledger #164), but the dashboard variant FavouritesHub (src/components/clinical-dashboard/favourites-hub.tsx:179) still renders ModeHomeHero with 'Favourites / Saved notes, sources, and sets.' So the same mode looks different depending on the door. Decide which treatment is canonical and apply it to both. Found during the PR #2160 cross-mode audit. | PR #2160 cross-mode home audit | 2026-08-18 | +| #90Y0FD | P3 | rec | Mode home suggestion data is duplicated across three unrelated sources | searchCommandSurfaceByMode examples/suggestions (src/lib/search-command-surface.ts) drive the Try this ticket, rotating hint and prompt chips; per-page pills arrays (e.g. therapy-compass/screens/home-screen.tsx:14, services-home-page.tsx) drive the mode-home pill row; src/lib/tools-catalog.ts:348 is a third. Only the first drives the ticket, so after PR #2160 the Therapy home advertises two different suggestion sets — its five pills and the three ticket examples. Reconcile to one source per mode. Found during the PR #2160 cross-mode audit. | PR #2160 cross-mode home audit | 2026-08-18 | +| #JVYQEM | P2 | issue | Mode-home composer reserve does not account for the suggestion ticket, so every ticket-bearing home carries a ~0.035 CLS shift | ModeHomeTemplate reserves the composer slot with --spacing-mode-home-composer-phone (6.625rem) / --spacing-mode-home-composer-wide (5.5rem), but the portal content is UniversalSearchCommandSurface, which renders SmartRotatingHint (phone ticket) and the sm+ rotating line/prompt-chip row ABOVE the composer inside that same slot. The reserve therefore under-accounts, and the portal attaching post-hydration shifts content — the defect class chrome invariant 15 exists to prevent. Evidence from the PR #2160 Lighthouse run: mobile-dsm baseline CLS 0.0353, mobile-forms 0.088, mobile-root 0.016, while mobile-therapy-compass was 0.000 purely because Therapy had no command-surface entry and so rendered no ticket. Restoring the ticket moved Therapy to 0.032, matching its peers. Fix: raise the reserve tokens to include the hint row height (or reserve it separately), which should take every mode home toward ~0. Touches all 15 mode homes, so it needs verify:phone-chrome plus Lighthouse and visual baseline re-adoption — deliberately not bundled into PR #2160. | PR #2160 Lighthouse budget failure | 2026-08-18 | ## Resolved / archive