Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
| 2026-08-19 | claude/rag-d6-reconcile-b4 | 175f49acf06e0ece2cb8e8a29961c7b6979df3c7 | issues:reconcile post-B4 (2 requests; #9DGA6R closed) + HANDOVER S7 merged row + pending fixtures.v2 request (docs-only) | reconcile clean; 1 pending (new request, applies next pass); register refreshed | check:outstanding-issues; check:ledger-write-discipline passed 5437c309f27f..HEAD; verify:pr-local docs scope |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
{
"version": 2,
"id": "a20fc4ce-0608-4939-97c1-f2fb7f8a1285",
"createdOn": "2026-08-19",
"action": "add",
"payload": {
"pri": "P3",
"type": "task",
"summary": "docling-lab-fixtures.v2: add unruled, merged-cell and rotated-header table fixtures to the Docling lab before any table-quality promotion argument",
"detail": "Gate B (PR #2154, run 32176604314 at 8a92378) passed with the table-heavy leg at parity-on-ceiling: the v1 fixture set under eval/docling/ cannot separate docling from the legacy extractor on tables because every fixture is ruled/simple. Packet B4 (PR #2170, squash 5437c309f) shipped shadow mode as measurements only. Before anyone argues docling table quality (a precondition for any promotion beyond shadow, README §B4), author docling-lab-fixtures.v2: unruled tables, merged/spanning cells, rotated headers, plus expected exact number/unit/comparator checks, and re-run the lab (docling-lab.yml dispatch = hosted CI, owner approval). Synthetic/public sources only; hashed lockfile unchanged; aggregate-only report. Stop: no worker, extractor, or database change; shadow numbers remain measurements until v2 says otherwise.",
"source": "RAG programme coordinator, post-B4 (2026-08-19)",
"issueUlid": "01M0CC6XPRVZN8G3PKYM1E30AW"
}
}
2 changes: 1 addition & 1 deletion docs/outstanding-issues.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -139,7 +139,6 @@ removed after current-main verification; it is not missing recommended work.
| #G4M3DV <!-- issue-ulid:01M0ANYV88G4M3DV1JNG2DKHPR --> | P3 | issue | Two documented workflow steps conflict: npm run ensure guarantees verify:pr-local fails its build stage with BUILD_REFUSED_DEV_SERVER | Reproduced 2026-08-18 on branch claude/therapy-mode-consistency-a466b0. AGENTS.md requires npm run ensure before any browser/UI work, and docs/testing.md requires npm run verify:pr-local at PR handoff. Doing both in one session always fails, because the production build refuses to run while the project dev server holds its port: verify:pr-local exits with 'failed: build (exit 76)' and the note 'production build was refused while the Clinical KB dev server is running (BUILD_REFUSED_DEV_SERVER). This is a failed gate, not a skip.' The refusal itself is correct and should stay - a build sharing a port with a dev server is not trustworthy - but nothing in either doc warns that the two required steps are ordered, so the gate reads as a real failure. Workaround used: stop the dev server, rm -rf .next, re-run npm run build standalone (exit 0), then check:bundle-budget against the fresh output. Options: have verify-pr-local.mjs name the remedy in its own failure note, or document the ordering in the testing speed playbook. Stop rule: do not make the build stage soft-skip when a dev server is up; the existing fail-closed behaviour is the correct half of this. | session 2026-08-18 | 2026-08-18 |
| #NEBJAM <!-- issue-ulid:01M0BC5ER3NEBJAMD4VC43PGZV --> | P2 | rec | Therapy keeps a private eight-component UI kit whose shared equivalents it imports zero times, including the badge that carries review status | Measured 2026-08-18 on main at adf93a75, after PRs #2122 and #2150. src/components/therapy-compass/ui.tsx exports Tag, TagRow, StatusBadge, IconTile, LoadingState, EmptyState, Eyebrow and Meter. Shared equivalents exist and Therapy imports them zero times: ui/chip.tsx for Tag/TagRow (Chip is imported in exactly one therapy file), ui/status-mark.tsx for StatusBadge, ui/error-state.tsx for EmptyState, ui/progress.tsx for Meter, the eyebrowText primitive for Eyebrow, and category-icon-tile.tsx for IconTile. This is the same class of duplication card-recipes.ts was written to end for cards, one layer down, and it survived the #2122 convergence because that work targeted Button, card surfaces and page headers only. Highest-consequence piece: StatusBadge renders the Needs source review label, which since #2150 is the per-record half of the only protection standing between an unreviewed therapy record and a clinical decision - and it is a module-private implementation no shared contract governs. Two migration hazards to respect. (1) StatusBadge pairs its warning tone with a TriangleAlert glyph via reviewStatusMeta in data/select.ts; any swap must preserve that shape channel or the warning becomes colour-only and trips the status-colour boundary ratchet. (2) Meter's colour-only status was deliberately fixed in commit 8c791a1ad by naming the completeness band in text; a naive swap to shared Progress would regress it. Suggested order: Eyebrow and Tag/TagRow first (lowest risk, no status semantics), then EmptyState and IconTile, then Meter and StatusBadge last with the colour-only contract tests extended first. Stop rule: do not fold any of these into ui-primitives.tsx; COMPONENTS.md section 0.4 lists that module as over-budget and slated to split. Related: #ZF006G tracks the parallel SectionHeading duplication across four modes. | session 2026-08-18 | 2026-08-18 |
| #SBKXZ7 <!-- issue-ulid:01M0B4YZFPSBKXZ7BGFC4YJ52G --> | 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 <!-- issue-ulid:01M0B66FJ69DGA6R5W8QN9V7CY --> | 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 <!-- issue-ulid:01M0AXXCJMBSBE9BYR4QX6QBC8 --> | 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 <!-- issue-ulid:01M0BFHSA2HSSHRGH346NRVYJY --> | 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 <!-- issue-ulid:01M0BFH5685DYBQQRVNX40SM75 --> | 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 |
Expand DownExpand Up@@ -501,3 +500,4 @@ Move resolved rows here with the resolution date and a one-line outcome. Keep th
| #326 | task | Keep post-restore environment recovery controls visible in the universal ledger | Documented post-restore environment recovery controls in launch runbook | 2026-08-18 |
| #183 | task | Create Sentry metric alert for production DB span p95 > 500ms | Configured Sentry alert routing on critical worker spans | 2026-08-18 |
| #FEWQZ5 <!-- issue-ulid:01M0AD3GDAFEWQZ5HN2TWP3V1S --> | task | Therapy Compass has three shared-component stages left: Button call sites, card-recipes adoption, and page headers | Done — all three stages landed in PR #2122 (squash 092633eb). B3: 19 control-recipe call sites converted to the shared Button and commandControl/outlineControl/iconControl deleted. C: all 16 therapy card surfaces converged on card-recipes cardSurface, with the hero accent edge kept on the left as heroAccentEdge reading the shared --cat-accent. D: six page headers adopted the shared PageHeader; three h1 remain and are tracked separately as #D6G8TC. Verified by verify:cheap (673 files, 7276 tests), verify:ui (447 passed) and check:design-system-contract; ratchets fell (legacy shadow aliases 104 to 89, padding 53 to 52, gaps 30 to 28) and none rose. | 2026-08-18 |
| #9DGA6R <!-- issue-ulid:01M0B66FJ69DGA6R5W8QN9V7CY --> | task | Build packet B4: Docling worker shadow mode (WORKER_DOCUMENT_EXTRACTOR_MODE=legacy\|shadow) — authorised by the Gate B PASS of 2026-08-18 | Resolved 2026-08-19 by PR #2170 (branch claude/docling-worker-shadow-mode-b6fa17): typed WORKER_DOCUMENT_EXTRACTOR_MODE=legacy\|shadow (default legacy) + WORKER_SHADOW_EXTRACTION_COHORT_PERCENT (1-5, owner-approved 2) + WORKER_DOCLING_PYTHON_BIN; docling runs only after commitDocumentIndexGeneration on an index-quality-selected PDF cohort (tables / OCR / layout proxy), aggregate numbers-only record in documents.metadata.shadow_extraction via the existing metadata merge, no chunk/embedding/index/table-fact/document_index_quality writes, bounded 120 s / 40 pages / one process, fail-open (lost lease swallowed); docling venv + models provisioned in Dockerfile.worker from the Gate B lab lock (CI container build green); rollback WORKER_DOCUMENT_EXTRACTOR_MODE=legacy. Evidence: verify:pr-local heavy plan exit 0 (7292 tests), ingestion-worker-reviewer approve-with-nits (fixed). Both Gate B caveats carried in the PR body; enabling shadow in production is an operator Railway-variable step gated by docs/worker-deploy-runbook.md preconditions. | 2026-08-19 |
Loading
Loading