From b7ac0f244b128494aa564cd3e300fe673b2b6d2b Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Aug 2026 15:04:10 +0000 Subject: [PATCH 1/4] =?UTF-8?q?chore(issues):=20queue=20closure=20of=20#17?= =?UTF-8?q?0=20and=20#309=20=E2=80=94=20filter=20rollout=20delivered?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both rows describe work that has since landed, and left open they would send the next session to rebuild finished code. Closed with evidence taken from merged source on main 2d27039, not from PR state: #170 — services (service-facets.ts, scope segment on a `scope` URL param, quick filters evicted to composer suggestions), factsheets (SegmentedControl + counts), therapy-compass (filter-sheet.tsx deleted, converged in #1885/#1889), documents (converged in #1910 with meterContent/footerOverride). Contract also spread to dsm, forms, tools and differential-stream. #309 — the dense tier now lives in the shared ResultFilterSheet: find-a-filter plus collapse-by-default per facet group, ported UP from documents by PR F rather than duplicated, which is what the row's stop rule required. Queued as inbox requests rather than canonical edits. I first wrote straight to docs/outstanding-issues.md via scripts/outstanding-issues.mjs and check:ledger-write-discipline correctly rejected it — `npm run issues:done` routes through scripts/ledger-inbox.mjs, which is the merge-safe path. Reverted and redone. Run npm run issues:reconcile from a fresh ledger branch once this lands. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_011btGFwWKYFWDs5McQkqz9J --- .../24423d90-c47f-437d-8707-0885fb9b2183.json | 10 ++++++++++ .../e48b440b-d5a0-436b-bea8-ca7670d1a6bb.json | 10 ++++++++++ 2 files changed, 20 insertions(+) create mode 100644 docs/outstanding-issues-inbox/24423d90-c47f-437d-8707-0885fb9b2183.json create mode 100644 docs/outstanding-issues-inbox/e48b440b-d5a0-436b-bea8-ca7670d1a6bb.json diff --git a/docs/outstanding-issues-inbox/24423d90-c47f-437d-8707-0885fb9b2183.json b/docs/outstanding-issues-inbox/24423d90-c47f-437d-8707-0885fb9b2183.json new file mode 100644 index 0000000000..674bf96ab4 --- /dev/null +++ b/docs/outstanding-issues-inbox/24423d90-c47f-437d-8707-0885fb9b2183.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "id": "24423d90-c47f-437d-8707-0885fb9b2183", + "createdOn": "2026-08-13", + "action": "done", + "payload": { + "id": "#309", + "outcome": "DELIVERED and verified by content on main 2d27039 (2026-08-13). The density tier now lives in the shared component rather than in any one mode: src/components/clinical-dashboard/result-filter-control.tsx carries the dense branch, a find-a-filter field and collapse-by-default per facet group, with a group opening itself when it holds a selection and a live needle owning openness — the same rules documents had. Resolved by option (b) from this row: PR F (#1910) ported documents' existing implementation UP into the shared sheet rather than growing a second one, so the row's stop rule (never add a per-mode dense list) held. The component's header comment now states the contract directly: below the section 5 threshold a facet group is a plain chip row, above it the sheet grows the needle and collapse. The row's other concern — that services would hit the same rule from the >3-groups direction — is settled too, since services adopted the shared sheet with its six groups in PR C. Nothing in this row remains open." + } +} diff --git a/docs/outstanding-issues-inbox/e48b440b-d5a0-436b-bea8-ca7670d1a6bb.json b/docs/outstanding-issues-inbox/e48b440b-d5a0-436b-bea8-ca7670d1a6bb.json new file mode 100644 index 0000000000..537c7d4813 --- /dev/null +++ b/docs/outstanding-issues-inbox/e48b440b-d5a0-436b-bea8-ca7670d1a6bb.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "id": "e48b440b-d5a0-436b-bea8-ca7670d1a6bb", + "createdOn": "2026-08-13", + "action": "done", + "payload": { + "id": "#170", + "outcome": "DELIVERED and verified by content on main 2d27039 (2026-08-13), not by PR state. Every mode named in this row now uses the shared ResultFilterTrigger + ResultFilterSheet under the lens/facet contract in docs/filter-contract.md. Services: src/lib/service-facets.ts exists, the navigator imports resultFilterFacetGroup, the scope segment is a SegmentedControl backed by a `scope` URL param, and the six query-replacing quick filters now feed AnswerSuggestionChips as composer suggestions instead of the sheet (PR C). Factsheets: converted to SegmentedControl with per-option counts; no eviction was needed because the earlier plan's claim that its presets discarded the query was measured false — searchHref keeps `q` and adds `category` (PR D). Therapy-compass: src/components/therapy-compass/filter-sheet.tsx DELETED, screens/search-screen.tsx converged onto the shared control (PRs #1885, #1889). Documents: converged onto the shared sheet with meterContent and footerOverride so its progress meter and Browse all sources footer survive (PR #1910). The contract also spread past the original six — dsm-search-page, forms-search-results-page, tools-search-results-page and differential-stream-workspace are on the shared sheet. Foundations: #1847 kinds + contract doc, #1848 SegmentedControl hint slot, #1857 four lens modes, #1858 formulation first facet adoption. REMAINING and tracked elsewhere, not part of this row: #275 (shared trigger's arbitrary spacing across five files) and filter-contract.md section 7 (SearchScopeFilters, 20 server-side keys editable from no panel, explicitly not a prerequisite)." + } +} From a504bf5cb2bfca81b18ee00df43fa01d87e34e37 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Aug 2026 15:05:13 +0000 Subject: [PATCH 2/4] chore(ledger): record the #170/#309 closure review Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_011btGFwWKYFWDs5McQkqz9J --- ...f1ef75e5fc68a4e23226d261c700a10fb4113feca85edc6de57.record.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/branch-review-records/20b22bab9c03df1ef75e5fc68a4e23226d261c700a10fb4113feca85edc6de57.record.md diff --git a/docs/branch-review-records/20b22bab9c03df1ef75e5fc68a4e23226d261c700a10fb4113feca85edc6de57.record.md b/docs/branch-review-records/20b22bab9c03df1ef75e5fc68a4e23226d261c700a10fb4113feca85edc6de57.record.md new file mode 100644 index 0000000000..2e7c4e6a97 --- /dev/null +++ b/docs/branch-review-records/20b22bab9c03df1ef75e5fc68a4e23226d261c700a10fb4113feca85edc6de57.record.md @@ -0,0 +1 @@ +| 2026-08-13 | claude/close-filter-rollout-rows | b7ac0f244b128494aa564cd3e300fe673b2b6d2b | close ledger rows #170 and #309 after verifying the filter contract rollout shipped | PR #1925 opened; docs-only. Both rows verified DELIVERED by content on main 2d27039, not PR state: services (service-facets.ts, scope segment on a scope URL param, quick filters evicted to composer suggestions), factsheets (SegmentedControl + counts, no eviction needed - the claim that its presets discarded the query was measured false), therapy-compass (filter-sheet.tsx deleted, converged #1885/#1889), documents (converged #1910 with meterContent/footerOverride); #309 dense tier now in the shared sheet, ported up from documents by PR F rather than duplicated. Also recorded: I first wrote canonical edits via scripts/outstanding-issues.mjs and check:ledger-write-discipline correctly rejected it - npm run issues:done routes through ledger-inbox.mjs, the two entry points are not interchangeable | check:ledger-write-discipline passed for 2d270392f9cf..HEAD; check:outstanding-issues passed 310 rows 114 open 196 archived no ids deleted from base; prettier --check on the two inbox JSON files passed; each mode claim re-grepped against main before writing | From fa23c13e82b5963747bbcaca2c84105858c61525 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Aug 2026 16:06:14 +0000 Subject: [PATCH 3/4] chore(issues): capture the write-discipline false-green on a dirty tree check:ledger-write-discipline compares a committed range, so an uncommitted edit to docs/outstanding-issues.md yields an empty range and a pass having evaluated nothing. Hit live in this session: I made a forbidden canonical edit, the gate said green, and only committing and re-running surfaced the real failure. Also records that scripts/outstanding-issues.mjs (canonical, reconcile side) and npm run issues:done (inbox, branch side) are different tools with nothing at the call site saying so. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_011btGFwWKYFWDs5McQkqz9J --- .../4944d2d8-69b6-479c-b0bd-a977494a74fb.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 docs/outstanding-issues-inbox/4944d2d8-69b6-479c-b0bd-a977494a74fb.json diff --git a/docs/outstanding-issues-inbox/4944d2d8-69b6-479c-b0bd-a977494a74fb.json b/docs/outstanding-issues-inbox/4944d2d8-69b6-479c-b0bd-a977494a74fb.json new file mode 100644 index 0000000000..90afc2c84a --- /dev/null +++ b/docs/outstanding-issues-inbox/4944d2d8-69b6-479c-b0bd-a977494a74fb.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "id": "4944d2d8-69b6-479c-b0bd-a977494a74fb", + "createdOn": "2026-08-13", + "action": "add", + "payload": { + "pri": "P2", + "type": "issue", + "summary": "check:ledger-write-discipline reports a pass when run against an uncommitted working tree", + "detail": "Found 2026-08-13 while closing #170/#309. The gate compares a committed range (it reported `Ledger write discipline passed for 2d270392f9cf..HEAD`), so when the ledger edit is still unstaged or uncommitted the range is empty and it prints a pass having evaluated nothing. I edited docs/outstanding-issues.md directly, ran the gate, saw green, and only discovered the violation after committing to a branch and re-running — at which point it correctly failed with \"does not exactly match the audited application of 0 moved inbox request(s) from the base\". The green was real but meaningless, which is the worst kind: it actively told me a forbidden edit was fine. **Outcome:** the gate either refuses to report a verdict when the working tree is dirty for the files it governs, or evaluates the working tree as well as the committed range. **Next:** make check-ledger-write-discipline.mjs detect uncommitted changes to docs/outstanding-issues.md (and the inbox directory) and either fail with an explicit \"commit before checking\" message or include them in the audited diff. Add a self-test covering the dirty-tree case, since the existing self-test passes today. **Related contributing factor worth fixing in the same pass:** `node scripts/outstanding-issues.mjs done ...` and `npm run issues:done` are different tools — the first edits the canonical ledger in place (reconcile-side), the second queues a merge-safe inbox request via scripts/ledger-inbox.mjs (branch-side). Nothing at the call site says so, and the raw script is what AGENTS.md's usage header documents. Consider making scripts/outstanding-issues.mjs refuse to run outside a reconcile context, or print a pointer to issues:done. **Stop:** do not \"fix\" this by relaxing the discipline check — the check itself was right, it just was not asked the right question.", + "source": "session 2026-08-13 closing #170/#309; scripts/check-ledger-write-discipline.mjs; scripts/ledger-inbox.mjs vs scripts/outstanding-issues.mjs" + } +} From 862b6503fa04bfb6e21a943458eb99b5725a1b6a Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Aug 2026 16:13:50 +0000 Subject: [PATCH 4/4] =?UTF-8?q?fix(issues):=20keep=20#309=20open=20?= =?UTF-8?q?=E2=80=94=20only=20the=20>20=20tier=20shipped,=20not=20the=206-?= =?UTF-8?q?20=20band?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Codex reviewer on PR #1925 is right and my closure was wrong. Verified on main 2d27039: result-filter-control.tsx computes const dense = facetGroups.length > 3 || totalFacetOptions > 20 so formulation — one facet group of nine derived domains, the exact case that opened #309 — evaluates dense=false and still renders a wrapping chip row. The 6-20 full-width tier with its right-aligned count column does not exist, and neither does the nine-option DOM assertion the row asked for. What PR F (#1910) delivered is the upper tier: find-a-filter and collapse for >3 groups or >20 options, which is what documents needed. Section 5 has two thresholds; I conflated them and would have archived the row whose specific band is unbuilt. Replaces the done request with an update recording the partial delivery, what remains, and an explicit stop rule against closing on the strength of the upper tier. #170 is unaffected — mode adoption did complete. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_011btGFwWKYFWDs5McQkqz9J --- .../24423d90-c47f-437d-8707-0885fb9b2183.json | 10 ---------- .../4bb5ba0d-ca46-454e-97f4-5a49f5c87f22.json | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 docs/outstanding-issues-inbox/24423d90-c47f-437d-8707-0885fb9b2183.json create mode 100644 docs/outstanding-issues-inbox/4bb5ba0d-ca46-454e-97f4-5a49f5c87f22.json diff --git a/docs/outstanding-issues-inbox/24423d90-c47f-437d-8707-0885fb9b2183.json b/docs/outstanding-issues-inbox/24423d90-c47f-437d-8707-0885fb9b2183.json deleted file mode 100644 index 674bf96ab4..0000000000 --- a/docs/outstanding-issues-inbox/24423d90-c47f-437d-8707-0885fb9b2183.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": 1, - "id": "24423d90-c47f-437d-8707-0885fb9b2183", - "createdOn": "2026-08-13", - "action": "done", - "payload": { - "id": "#309", - "outcome": "DELIVERED and verified by content on main 2d27039 (2026-08-13). The density tier now lives in the shared component rather than in any one mode: src/components/clinical-dashboard/result-filter-control.tsx carries the dense branch, a find-a-filter field and collapse-by-default per facet group, with a group opening itself when it holds a selection and a live needle owning openness — the same rules documents had. Resolved by option (b) from this row: PR F (#1910) ported documents' existing implementation UP into the shared sheet rather than growing a second one, so the row's stop rule (never add a per-mode dense list) held. The component's header comment now states the contract directly: below the section 5 threshold a facet group is a plain chip row, above it the sheet grows the needle and collapse. The row's other concern — that services would hit the same rule from the >3-groups direction — is settled too, since services adopted the shared sheet with its six groups in PR C. Nothing in this row remains open." - } -} diff --git a/docs/outstanding-issues-inbox/4bb5ba0d-ca46-454e-97f4-5a49f5c87f22.json b/docs/outstanding-issues-inbox/4bb5ba0d-ca46-454e-97f4-5a49f5c87f22.json new file mode 100644 index 0000000000..8edbd8a515 --- /dev/null +++ b/docs/outstanding-issues-inbox/4bb5ba0d-ca46-454e-97f4-5a49f5c87f22.json @@ -0,0 +1,10 @@ +{ + "version": 1, + "id": "4bb5ba0d-ca46-454e-97f4-5a49f5c87f22", + "createdOn": "2026-08-13", + "action": "update", + "payload": { + "id": "#309", + "detail": "Raised by the Codex reviewer on PR #1858 and correct. docs/filter-contract.md section 5 sets density by option count: <=5 chips, 6-20 dense full-width list with a right-aligned count column and group headings, >20 or >3 groups adds find-a-filter and collapse-by-default. **PARTIALLY DELIVERED 2026-08-13, and the part this row was opened for is NOT done.** PR F (#1910) ported documents' implementation up into the shared ResultFilterSheet, so the >20-or->3-groups tier now exists there: find-a-filter, per-group collapse-by-default, a group opening itself when it holds a selection, and a live needle owning openness. That is the tier documents needed. **The 6-20 band is still unimplemented.** result-filter-control.tsx computes `const dense = facetGroups.length > 3 || totalFacetOptions > 20`, so a mode with one facet group of nine options — formulation, the exact case that opened this row — evaluates dense=false and still renders ResultFilterFacetChips as a wrapping chip row. Verified 2026-08-13 on main 2d27039: formulation passes one group with formulationDomainsInUse.length === 9, so neither condition fires. An earlier attempt to close this row as delivered was wrong and was caught in review on PR #1925; the mistake was conflating \"the dense tier landed\" with \"this row's band landed\" — section 5 has two thresholds and only the upper one shipped. **Next:** either implement the 6-20 full-width renderer with the right-aligned count column and add the nine-option DOM assertion this row already asked for, or amend section 5 to drop the middle band deliberately and record that the contract was reversed rather than satisfied. **Stop:** do not close this row on the strength of the >20 tier, and do not add a per-mode dense list — a second hand-rolled facet layout is the drift the shared renderer was extracted to remove." + } +}