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
4 changes: 3 additions & 1 deletion docs/branch-review-ledger.md
Original file line number Diff line number Diff line change
Expand Up @@ -883,14 +883,16 @@ Records before 2026-07-28 were written by hand and had drifted: 146 lines carrie
| 2026-08-11 | codex/answer-loading-ui-20260811 | 6758f8156f9d1b3e893981dfd7a1f6563aa90da0 | answer creation loading UI | No high-confidence findings | UI 3 passed; unit 8 passed; lint, typecheck, build, design-system and offline RAG passed; full suite 6022 passed with 16 unchanged baseline failures |
| 2026-08-11 | claude/codex-m4c-retire-shadow-nliak3 | 448a0d084c4cd2cda6153dd7f03dcb67c43a8df0 | DS Track A2 (#261): retire --shadow-focus; composer focus onto sanctioned outline; contract guard; baseline ratchet; design-system docs + ledger | Approved — PR #1807. Token deleted in both themes; .chat-composer-shell-delta:focus-within uses outline 2px var(--focus) at offset 2px and no longer overrides box-shadow. Reach premise corrected: 0 of 37 production routes render the class (only /mockups/calculators-search). legacyShadowAliases 127->125, globals.css pin 3->1. | check:design-system-contract PASS; design-token-contract.test.ts PASS + mutation-verified both ways; verify:pr-local PASS except pre-existing tests/pr-handoff-stop.test.ts failure baselined on untouched base e8b61d8; build PASS; check:rag:fixtures PASS (36 cases); Chromium look both themes on the mockup route (inspection only, rev 1194 vs pinned 1234 #255); verify:ui/verify:phone-chrome NOT run — delegated to CI |
| 2026-08-11 | codex/answer-ecg-animation-20260811 | 12279a8309c225aa957ef1e65afc37545a0ce04c | answer ECG progress variants | No high-confidence findings; physical Safari/PWA remains residual acceptance | design contract, typecheck, focused unit 8/8, trace token 33/33, Chromium 4/4, offline RAG 574/574; full suite baseline/platform failures |
| 2026-08-11 | codex/chat-services-flow-redesign-20260812 | 6f44b92defb91bcd77509bf10337b428be37619c | Services home, results, shortlist, comparison, and referral detail redesign | No findings; changed-area UI, phone contracts, focused unit, build, and RAG fixtures passed; PR-local Windows baseline limitations documented. | 78 focused tests passed post-merge; 185 changed-browser tests; 129 phone contracts; 7 phone-scroll tests; build and RAG fixtures passed |
| 2026-08-11 | claude/filter-popup-design-mockups-x6sbjv | 7b64f2559741a9f353adcf939745831e0daff7db | services filter sheet redesign mockups (3 directions, desktop+phone) | PR #1828 opened; design-scratch route only, no production behaviour change | verify:pr-local (1 pre-existing root-uid test failure, reproduced on origin/main 046feb3), build, check:rag:fixtures, check:bundle-budget both baselines within tolerance, 320px 0px overflow |
| 2026-08-11 | work | 6dcd695076d630d16aae594577763e8004361893 | Codex Cloud setup and local parity | P2 fixed: cache-friendly locked Cloud npm install; parity limitations documented | check:codex-cloud; codex-cloud-setup 24/24; full suite 6059 pass, 7 unrelated timeout/state failures |
| 2026-08-11 | 1822 | 4fab267f52b72992745e1d2e6975fb4847af447a | review-and-fix | clean | Build pass; Static PR checks pass; Change scope pass; PR mergeability pass; PR policy pass; Safety and config checks pass; Semgrep pass; Semgrep ingestion gate pass; Gitleaks pass; GitGuardian pass; Unit coverage pending; Production UI (1) pass; Production UI (2) pass; Production UI critical pending; Production UI (3) pending; Lighthouse budget pass; PR required pending |
| 2026-08-11 | 1822 | 4fab267f52b72992745e1d2e6975fb4847af447a | review-and-fix (supersedes 2026-08-11) | clean | Build pass; Static PR checks pass; Change scope pass; PR mergeability pass; PR policy pass; Safety and config checks pass; Semgrep pass; Semgrep ingestion gate pass; Gitleaks pass; GitGuardian pass; Unit coverage pass; Production UI (1) pass; Production UI (2) pass; Production UI (3) pass; Production UI critical pass; Lighthouse budget pass; PR required pass |
| 2026-08-11 | HEAD | 45fd05c8c3947835c0368666ff576c7a38b33ee4 | answer sources sheet and extracted answer text | Fixed raw PDF navigation/list artifacts and simplified source verification UX | answer-content unit; focused Chromium source flow; PR-local lint/typecheck reached full test |
| 2026-08-11 | 1821 | d76e90547dbdb104256b66a508c15c74302002fc | review-and-fix | dispositioned | PR policy:success; PR mergeability:success; Gitleaks:success; Semgrep:success; Semgrep ingestion gate:success; Safety and config checks:success; Build:success; Production UI critical:success; Production UI (1):success; Production UI (2):success; Production UI (3):failure test not reproduced outside this PR; PR required:failure |
| 2026-08-11 | work | 45fd05c8c3947835c0368666ff576c7a38b33ee4 | mobile evidence sheet UX, accessibility, and feedback logic | fixed unexplained claim marker, excess panel reserve, unclear purpose and feedback copy; no remaining high-confidence defects | focused DOM 7/7; Chromium evidence journey 1/1; offline RAG 23 suites/574 tests |
| 2026-08-11 | 1820 | 897ff11a4cdb13ae1c01f5eb149007847028f5aa | review-and-fix | fixed | Semgrep:IN_PROGRESS, Gitleaks:IN_PROGRESS, Semgrep ingestion gate:IN_PROGRESS, Static PR checks:QUEUED, Safety and config checks:QUEUED, Unit coverage:QUEUED, Build:QUEUED, Production UI critical:QUEUED, Lighthouse budget:QUEUED |
| 2026-08-12 | claude/filter-popup-design-mockups-x6sbjv | 5e41d164e30e8f5a74b255fbeafd34123385dbb9 | services filter: round-two options study (stop-the-bleed / recommended / presets-evicted) | Pushed to PR #1828; merged babysit fixes to round-one facet semantics; design-scratch only | verify:pr-local (1 pre-existing root-uid failure only), build, check:rag:fixtures, bundle-budget mockups 286.8 KiB within 25% tolerance, counts re-verified vs snapshot, 320px 0px overflow |
| 2026-08-11 | codex/chat-services-flow-redesign-20260812 | 6f44b92defb91bcd77509bf10337b428be37619c | Services home, results, shortlist, comparison, and referral detail redesign | No findings; changed-area UI, phone contracts, focused unit, build, and RAG fixtures passed; PR-local Windows baseline limitations documented. | 78 focused tests passed post-merge; 185 changed-browser tests; 129 phone contracts; 7 phone-scroll tests; build and RAG fixtures passed |
| 2026-08-11 | claude/spacing-icon-design-review-rxwh28 | f8701a524f0eb22decc64ce1f626bdafe91751af | mode-home hero spacing rhythm + icon scale (PR #1815) | shipped: group copy reserve banded to measured wrap points, continuous hero medallion, phone composer glyph 1.1rem->icon-lg, surface glyphs onto size-icon-*, privacy link bottom-only negative margin (fixes 8px tap overhang on the APP-5 sentence), composer phone reserve 7.625->6.625rem | test 6043 passed/1 pre-existing root-perm failure; lint; typecheck; build; check:icon-scale; check:type-scale; check:design-system-contract; check:rag:fixtures; check:bundle-budget; prettier --check .; verify:ui NOT run (Playwright r1234 vs image r1194, #255 - delegate to CI Production UI) |
| 2026-08-11 | 1815 | be7461ef1f66357999995acefbeecaf95268e481 | unblock | local-build-pass | MergeTreeClean,UnitCoverage,StaticPRChecks,ContainerImages |
| 2026-08-11 | claude/spacing-icon-design-review-rxwh28 | 455bc198c077860fb1f830670a5fa9c1de08da52 | pr-1815 heavy review-and-fix | remote already merged main (shadow-tight Switch kept); cherry-picked privacy -mb-4 reclaim + calculators dock cancel; removed duplicate UniversalSearchAlsoMatches; rail-aware section-sheet focus restore; dispositioned CodeRabbit docs/ledger/gates nits and outdated Sentry skeleton gap | verify:cheap PASS prior tip; verify:pr-local PASS prior tip; vitest privacy+in-page-nav 28 passed on cherry-pick; merge-tree clean vs origin/main |
Expand Down
2 changes: 2 additions & 0 deletions docs/site-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -1030,6 +1030,8 @@ This file is generated by `npm run docs:update` (or `npm run sitemap:update` dir
- `/mockups/search-heading` - Route discovered from app directory Source: `src/app/mockups/search-heading/page.tsx`.
- `/mockups/search-lens-menu` - Route discovered from app directory Source: `src/app/mockups/search-lens-menu/page.tsx`.
- `/mockups/search-refine-adaptive` - Route discovered from app directory Source: `src/app/mockups/search-refine-adaptive/page.tsx`.
- `/mockups/services-filter-options` - Route discovered from app directory Source: `src/app/mockups/services-filter-options/page.tsx`.
- `/mockups/services-filter-refined` - Route discovered from app directory Source: `src/app/mockups/services-filter-refined/page.tsx`.
- `/mockups/settings-search-clinical` - Route discovered from app directory Source: `src/app/mockups/settings-search-clinical/page.tsx`.
- `/mockups/settings-search-general` - Route discovered from app directory Source: `src/app/mockups/settings-search-general/page.tsx`.
- `/mockups/settings-search-privacy` - Route discovered from app directory Source: `src/app/mockups/settings-search-privacy/page.tsx`.
Expand Down
53 changes: 53 additions & 0 deletions mockups/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,56 @@ Three sticky header directions for record pages that use `InformationPageBreadcr
**Outcome: direction 02 shipped**, as the breadcrumb shape of the existing `InPageNavHeader` rather than a new component — omitting `sections` drops the disclosure and the track, and `primaryAction` / `mode` / `showBackLabel` shape the row. Adopted first on `/factsheets/<slug>`, where the reading level rides the `mode` slot. Contract: `docs/search-chrome-behaviour.md` ("The breadcrumb shape").

**The runnable `/mockups/breadcrumb-header` route was removed once 02 shipped.** It was not deleted for tidiness: `check:bundle-budget` totals every built chunk, mockups included, and `main` sits at roughly +9.4% against a 10% tolerance, so the study's two scratch chunks (~9.8 KiB gzip) alone pushed the repo to +10.1% and failed `Build` — the same failure PR #1580 hit, at the same number. A design-scratch route that 404s in production is the wrong thing to spend the last of that headroom on. The table above is the durable record; recover the route from history if the alternatives need re-reading.

## Services filter surface (2026-08-11)

Runnable study at [`/mockups/services-filter-refined`](../src/app/mockups/services-filter-refined/page.tsx): three
directions for the sheet reached from the **Filter** control in the services results band, each shown at desktop and
phone, plus a reproduction of what ships today with its defects annotated.

The finding that drove the study is not cosmetic. The sheet is titled "Filter services" and nothing in it filters —
every chip calls `applyServiceQuery()`, which pushes a new route and **replaces the query**, so choosing "Crisis" while
reading "16 services · lithium level timing" discards that search and its results. It is a preset switcher wearing a
funnel icon. Secondary defects: no per-option counts, four unrelated categories in one flat chip row, a dead band below
the fold, "Done" as a low-emphasis outlined button doing the primary job, and a phone `role="radiogroup"` contradicting
the desktop rail's `aria-pressed` toggles.

| Direction | Shape | Blast radius |
| ------------------------- | ------------------------------------------------------------ | --------------------------------------------------------------------------- |
| A — Refine in place | Facet groups + separated "Start a new search" block | Fits current `ResultFilterSheet` props; upgrades all 7 modes, nothing forks |
| B — Presets/filters split | Two tabs, plus a persistent active-filter row under the band | Tab contract in the shared sheet + a band row other modes inherit |
| C — Directory-grade | Persistent desktop rail; phone find-a-filter + collapse | New services desktop layout + a services facet index; services-only |

Every count in the study is real, computed live from the 219 services in `data/services-snapshot.json` via ~1KB of
base64 facet bitmasks (OR within a group, AND across groups). The tags are already populated and unused by the UI:
acuity, catchments, age groups, setting flags, substance and housing flags, plus `confidence`.

Three data caveats recorded in the study itself: a **"No cost" facet is not free** (`cost_funding` is 87 distinct
free-text values; ~69 of 219 match a free-ish pattern, so it is deliberately absent rather than faked);
`age_groups: mixed` (202/219) and `setting_flags: public` (207/219) are **omitted as facets** because an option that
never excludes anything is a row of dead pixels; and the radiogroup/`aria-pressed` disagreement must be resolved
deliberately rather than inherited.

### Round two — three options along the recommended path (2026-08-11)

Runnable study at [`/mockups/services-filter-options`](../src/app/mockups/services-filter-options/page.tsx).
Round one offered three _directions_; asked which to build, the answer was a sequence rather than a
winner, plus one bolder move flagged as a product judgement. This study draws those three threads so
they can be compared directly.

| Option | Verdict | What it is |
| ---------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 — Stop the bleed | Ship first | No filtering. Renames the sheet, shows each shortcut's literal query, and puts the current search at the top as the thing you are about to lose. No new state, no new component |
| 2 — The recommendation | Recommended | Direction A's facets + counts + committed `Show N services`, plus direction B's persistent active-filter pill row. Phone shows the sheet open, desktop shows it closed — the closed state is what the pill row is for |
| 3 — Presets evicted | Your call | Sheet becomes purely a filter; the six presets move to the composer as `AnswerSuggestionChips`, a production component whose own prop docs name composer rows as a use. Deletes sheet code rather than adding a surface |

Three points the study makes that are easy to lose: the expensive part (services facet index,
selection state, URL round-tripping) is **identical in options 2 and 3**, so choosing between them on
build cost is a false economy; **counts and multi-select have to ship together**, because a count on
a single-select radio only reports the size of the thing you are about to jump to; and option 1 is
**purely subtractive**, so it can land while the facet work is still being scoped and nothing in it
has to be unpicked afterwards.

The facet engine, chips, band and sheet shell are imported from the round-one study rather than
copied — the ~1KB bitmask table would otherwise be duplicated against a finite `mockups` bundle
budget, and two studies quoting different numbers for the same catalogue would discredit both.
12 changes: 12 additions & 0 deletions src/app/mockups/mockups-layout-client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ export function MockupsLayoutClient({ children }: { children: ReactNode }) {
// Draws its own result bands inside device frames; the shared chrome above
// them would read as a third, real band competing with the two on offer.
const isSearchBandDirectionsMockup = pathname === "/mockups/search-band-directions";
// Draws its own results band and an in-frame filter sheet inside every device
// frame; the shared composer would read as a second, real search bar over a
// study whose whole subject is the control that sits in that band.
const isServicesFilterRefinedMockup = pathname === "/mockups/services-filter-refined";
// Option 3 in this study draws its own services composer with suggestion chips
// beside it — that is the concept under judgement, so the shared composer
// above it would be a second, real search bar competing with the proposal.
const isServicesFilterOptionsMockup = pathname === "/mockups/services-filter-options";
const isPhoneInPageNavigationMockup = pathname === "/mockups/phone-inpage-navigation";
// Draws its own composer in every frame, and the notice under study is the one
// the shared composer renders — showing both would put two different privacy
Expand Down Expand Up @@ -84,6 +92,8 @@ export function MockupsLayoutClient({ children }: { children: ReactNode }) {
!isCalculatorsSearchPageMockup &&
!isPhoneInPageNavigationMockup &&
!isSearchBandDirectionsMockup &&
!isServicesFilterRefinedMockup &&
!isServicesFilterOptionsMockup &&
!isTherapyNavigationMockup &&
!isWarningConsolidationMockup &&
!isWarningLineMockup &&
Expand All @@ -99,6 +109,8 @@ export function MockupsLayoutClient({ children }: { children: ReactNode }) {
!isSearchHeadingMockup &&
!isSearchRefineAdaptiveMockup &&
!isSearchBandDirectionsMockup &&
!isServicesFilterRefinedMockup &&
!isServicesFilterOptionsMockup &&
!isPhoneInPageNavigationMockup &&
!isTherapyNavigationMockup &&
!isWarningConsolidationMockup &&
Expand Down
13 changes: 13 additions & 0 deletions src/app/mockups/services-filter-options/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { Metadata } from "next";

import { ServicesFilterOptionsMockupsPage } from "@/components/services-filter-options-mockups";

export const metadata: Metadata = {
title: "Services filter · three options - Clinical KB",
description:
"Round two of the services filter study: the fix that can ship now, the recommended build, and the bolder move that evicts presets from the sheet — at desktop and phone.",
};

export default function ServicesFilterOptionsMockupPage() {
return <ServicesFilterOptionsMockupsPage />;
}
13 changes: 13 additions & 0 deletions src/app/mockups/services-filter-refined/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { Metadata } from "next";

import { ServicesFilterRefinedMockupsPage } from "@/components/services-filter-refined-mockups";

export const metadata: Metadata = {
title: "Services filter · three directions - Clinical KB",
description:
"Three redesign directions for the services filter sheet, at desktop and phone, with live facet counts from the 219-service catalogue snapshot.",
};

export default function ServicesFilterRefinedMockupPage() {
return <ServicesFilterRefinedMockupsPage />;
}
Loading
Loading