From 9fa1b1e68148c87689d85b6c6813228508ff2157 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 19 Jul 2026 20:02:00 +0000 Subject: [PATCH 1/6] Elevate Specifiers search results UI for mobile clarity Remove ranking blurb, differentiate mode tray from soft family filter chips, compact the diagnosis select, and make match cards a single accessible tap target with a quieter deciding-signal layout. Co-authored-by: BigSimmo --- src/components/specifiers/specifier-ui.tsx | 171 +++++++++++++++++- .../specifiers/specifiers-home-page.tsx | 124 +------------ tests/ui-specifiers.spec.ts | 9 +- 3 files changed, 180 insertions(+), 124 deletions(-) diff --git a/src/components/specifiers/specifier-ui.tsx b/src/components/specifiers/specifier-ui.tsx index 071daf0b0..35d6acf33 100644 --- a/src/components/specifiers/specifier-ui.tsx +++ b/src/components/specifiers/specifier-ui.tsx @@ -1,9 +1,20 @@ import Link from "next/link"; import type { ComponentType, CSSProperties, ReactNode } from "react"; -import { ArrowLeft, CheckCircle2, ChevronRight, Info, Minus, ShieldAlert, Tags } from "lucide-react"; +import { + ArrowLeft, + ArrowRight, + CheckCircle2, + ChevronRight, + ChevronsUpDown, + Info, + Minus, + ShieldAlert, + Tags, +} from "lucide-react"; import { cn, eyebrowText, pageContainer } from "@/components/ui-primitives"; -import type { SpecifierRecord } from "@/lib/specifiers"; +import type { SpecifierFamily, SpecifierRecord } from "@/lib/specifiers"; +import { specifierFamilies } from "@/lib/specifiers"; import type { SpecifierSourceStatus } from "@/lib/specifiers-search-index"; export const specifierCard = @@ -49,10 +60,10 @@ export function SpecifierBreadcrumbs({ current }: { current?: string }) { export function SpecifierSubnav({ active }: { active: "search" | "builder" | "compare" | "map" }) { const items = [ - { id: "search" as const, label: "Find", href: "/specifiers" }, - { id: "builder" as const, label: "Build wording", href: "/specifiers/builder" }, - { id: "compare" as const, label: "Compare", href: "/specifiers/compare" }, - { id: "map" as const, label: "Map", href: "/specifiers/map" }, + { id: "search" as const, label: "Find", shortLabel: "Find", href: "/specifiers" }, + { id: "builder" as const, label: "Build wording", shortLabel: "Build", href: "/specifiers/builder" }, + { id: "compare" as const, label: "Compare", shortLabel: "Compare", href: "/specifiers/compare" }, + { id: "map" as const, label: "Map", shortLabel: "Map", href: "/specifiers/map" }, ]; return ( @@ -72,13 +83,159 @@ export function SpecifierSubnav({ active }: { active: "search" | "builder" | "co : "text-[color:var(--text-muted)] hover:bg-[color:var(--surface)] hover:text-[color:var(--text)]", )} > - {item.label} + {item.shortLabel} + {item.label} ))} ); } +const familyChipBase = + "inline-flex min-h-tap shrink-0 items-center rounded-lg border px-3 text-xs font-semibold transition focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--focus)] sm:text-sm"; +const familyChipActive = + "border-[color:var(--clinical-accent)] bg-[color:var(--clinical-accent-soft)] text-[color:var(--clinical-accent)]"; +const familyChipIdle = + "border-[color:var(--border)] bg-[color:var(--surface-raised)] text-[color:var(--text-muted)] hover:border-[color:var(--border-strong)] hover:text-[color:var(--text-heading)]"; + +export function SpecifierFamilyFilterChips({ + value, + onChange, +}: { + value: "all" | SpecifierFamily; + onChange: (value: "all" | SpecifierFamily) => void; +}) { + return ( +
+ {specifierFamilies.map((option) => { + const active = value === option.id; + return ( + + ); + })} +
+ ); +} + +export function SpecifierDiagnosisFilter({ + value, + onChange, + options, +}: { + value: string; + onChange: (value: string) => void; + options: Array<{ value: string; label: string }>; +}) { + return ( + + ); +} + +export function SpecifierMatchCard({ record, isTopMatch }: { record: SpecifierRecord; isTopMatch: boolean }) { + return ( +
+ +
+
+
+
+ + {record.name} + + {isTopMatch ? ( + + + Top match + + ) : null} +
+ +
+

+ {record.summary} +

+
+ + +
+
+ +
+

Deciding signal

+

+ {record.clinicalSignal} +

+
+
+ +
+
+

Ask this

+

+ {record.decisionQuestion} +

+
+
+

Typical language

+

+ “{record.patientLanguage[0]}” +

+
+
+ +
+ ); +} + export function SpecifierFamilyBadge({ record }: { record: SpecifierRecord }) { return ( diff --git a/src/components/specifiers/specifiers-home-page.tsx b/src/components/specifiers/specifiers-home-page.tsx index 9d29bee15..84977fade 100644 --- a/src/components/specifiers/specifiers-home-page.tsx +++ b/src/components/specifiers/specifiers-home-page.tsx @@ -4,7 +4,6 @@ import Link from "next/link"; import { useMemo, useState } from "react"; import { ArrowRight, - CheckCircle2, ChevronRight, GitCompareArrows, ListChecks, @@ -17,10 +16,11 @@ import { import { ModeHomeMain, ModeHomeTemplate, ModeHomeVerificationFooter } from "@/components/mode-home-template"; import { CategoryTag, - DiagnosisChips, ReviewStatusBadge, SpecifierBreadcrumbs, - SpecifierFamilyBadge, + SpecifierDiagnosisFilter, + SpecifierFamilyFilterChips, + SpecifierMatchCard, SpecifierPageShell, SpecifierSafetyNote, SpecifierSubnav, @@ -29,7 +29,7 @@ import { import { cn, eyebrowText } from "@/components/ui-primitives"; import { appModeHomeHref } from "@/lib/app-modes"; import { modeHomeDesktopComposerSlotId } from "@/lib/mode-home-composer"; -import { searchSpecifiers, specifierFamilies, specifierSearchPresets, type SpecifierFamily } from "@/lib/specifiers"; +import { searchSpecifiers, specifierSearchPresets, type SpecifierFamily } from "@/lib/specifiers"; import { searchSpecifierCatalog, type SpecifierCatalogMatch } from "@/lib/specifiers-search-index"; // The curated set covers a small number of high-signal mood-episode specifiers. @@ -255,16 +255,12 @@ function SpecifierResults({ query }: { query: string }) { -
-
+
+

Specifier search

Matches for “{query}”

-

- Results ranked by text relevance: title, keywords, episode timing, and patient language. Open a result to - check exclusions and wording. -

{totalMatches} {totalMatches === 1 ? "match" : "matches"} @@ -273,44 +269,10 @@ function SpecifierResults({ query }: { query: string }) {

-
- {specifierFamilies.map((option) => { - const active = family === option.id; - return ( - - ); - })} -
- + +
{totalMatches === 0 ? ( @@ -318,73 +280,7 @@ function SpecifierResults({ query }: { query: string }) { ) : results.length > 0 ? (
{results.map(({ record }, index) => ( -
-
-
-
- - {record.name} - - {index === 0 ? ( - - - Top match - - ) : null} -
-

- {record.summary} -

-
- - -
-
- -
-

Deciding signal

-

- {record.clinicalSignal} -

-
- - - Open - - -
-
-
-

Ask this

-

- {record.decisionQuestion} -

-
-
-

Typical language

-

- “{record.patientLanguage[0]}” -

-
-
-
+ ))}
) : null} diff --git a/tests/ui-specifiers.spec.ts b/tests/ui-specifiers.spec.ts index 5da4ee90c..3dc7f434b 100644 --- a/tests/ui-specifiers.spec.ts +++ b/tests/ui-specifiers.spec.ts @@ -75,11 +75,13 @@ test("searches clinical language without provenance fields and carries a result await expect(page).toHaveURL(/\/specifiers\?.*q=depressed(?:\+|%20)but(?:\+|%20)racing(?:\+|%20)thoughts.*run=1/); await expect(page.getByRole("heading", { name: /Matches for “depressed but racing thoughts”/ })).toBeVisible(); - await expect(page.getByText(/Results ranked by text relevance/i)).toBeVisible(); + await expect(page.getByText(/Results ranked by text relevance/i)).toHaveCount(0); await expect(page.getByText("Top match", { exact: true })).toBeVisible(); + await expect(page.getByRole("group", { name: "Filter by specifier family" })).toBeVisible(); + await expect(page.getByRole("combobox", { name: "Filter by diagnosis" })).toBeVisible(); await expect(page.getByText("Best fit", { exact: true })).toHaveCount(0); await expect(page.getByText(/clinical fit/i)).toHaveCount(0); - await expect(page.getByRole("link", { name: "With mixed features", exact: true })).toBeVisible(); + await expect(page.getByRole("link", { name: "Open With mixed features" })).toBeVisible(); await expect(page.getByText("Source status", { exact: true })).toHaveCount(0); await expect(page.getByText("Source", { exact: true })).toHaveCount(0); @@ -101,7 +103,8 @@ test("keeps mobile search, filters, results, and the fixed composer usable", asy await gotoApp(page, "/specifiers?q=returns+every+winter&run=1"); await expect(page.getByRole("heading", { name: /Matches for “returns every winter”/ })).toBeVisible(); - await expect(page.getByRole("link", { name: "With seasonal pattern", exact: true })).toBeVisible(); + await expect(page.getByRole("link", { name: "Open With seasonal pattern" })).toBeVisible(); + await expect(page.getByRole("group", { name: "Filter by specifier family" })).toBeVisible(); await expect(page.getByRole("combobox", { name: "Filter by diagnosis" })).toBeVisible(); await expect(page.getByTestId("global-search-input").filter({ visible: true }).first()).toBeVisible(); await expect(page.getByText("Source status", { exact: true })).toHaveCount(0); From ae614d115b8b701db71d1e832790c8641c85f78d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 19 Jul 2026 20:02:26 +0000 Subject: [PATCH 2/6] Keep SpecifierSubnav accessible names on phone short labels Use aria-label for the full tool name while showing compact visual labels below the sm breakpoint so Playwright and screen readers stay aligned. Co-authored-by: BigSimmo --- src/components/specifiers/specifier-ui.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/components/specifiers/specifier-ui.tsx b/src/components/specifiers/specifier-ui.tsx index 35d6acf33..3f0422366 100644 --- a/src/components/specifiers/specifier-ui.tsx +++ b/src/components/specifiers/specifier-ui.tsx @@ -75,6 +75,7 @@ export function SpecifierSubnav({ active }: { active: "search" | "builder" | "co - {item.shortLabel} - {item.label} + + {item.shortLabel} + + + {item.label} + ))} From f270ca420025110bd1db48e2c1fd5d7c9c00ba74 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 19 Jul 2026 20:37:45 +0000 Subject: [PATCH 3/6] Tighten Specifiers diagnosis filter sizing on phone Keep the diagnosis control content-sized under family chips so the value shows fully without stretching edge-to-edge on narrow viewports. Co-authored-by: BigSimmo --- src/components/specifiers/specifier-ui.tsx | 9 +++++---- src/components/specifiers/specifiers-home-page.tsx | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/specifiers/specifier-ui.tsx b/src/components/specifiers/specifier-ui.tsx index 3f0422366..e56da007d 100644 --- a/src/components/specifiers/specifier-ui.tsx +++ b/src/components/specifiers/specifier-ui.tsx @@ -114,7 +114,7 @@ export function SpecifierFamilyFilterChips({
{specifierFamilies.map((option) => { const active = value === option.id; @@ -147,16 +147,17 @@ export function SpecifierDiagnosisFilter({ return ( @@ -174,11 +174,13 @@ export function SpecifierDiagnosisFilter({ } export function SpecifierMatchCard({ record, isTopMatch }: { record: SpecifierRecord; isTopMatch: boolean }) { + const typicalLanguage = record.patientLanguage[0]?.trim(); + return (
@@ -191,18 +193,18 @@ export function SpecifierMatchCard({ record, isTopMatch }: { record: SpecifierRe
- + {record.name} {isTopMatch ? ( - + Top match ) : null}
@@ -230,12 +232,14 @@ export function SpecifierMatchCard({ record, isTopMatch }: { record: SpecifierRe {record.decisionQuestion}

-
-

Typical language

-

- “{record.patientLanguage[0]}” -

-
+ {typicalLanguage ? ( +
+

Typical language

+

+ “{typicalLanguage}” +

+
+ ) : null}
diff --git a/tests/ui-specifiers.spec.ts b/tests/ui-specifiers.spec.ts index 3dc7f434b..dfffc3867 100644 --- a/tests/ui-specifiers.spec.ts +++ b/tests/ui-specifiers.spec.ts @@ -109,6 +109,14 @@ test("keeps mobile search, filters, results, and the fixed composer usable", asy await expect(page.getByTestId("global-search-input").filter({ visible: true }).first()).toBeVisible(); await expect(page.getByText("Source status", { exact: true })).toHaveCount(0); await expect(page.getByText("Source", { exact: true })).toHaveCount(0); + + const courseFilter = page.getByRole("button", { name: /^(Course|Course and onset)$/ }); + await courseFilter.click(); + await expect(courseFilter).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByRole("link", { name: "Open With seasonal pattern" })).toBeVisible(); + + await page.getByRole("combobox", { name: "Filter by diagnosis" }).selectOption("depressive"); + await expect(page.getByRole("link", { name: "Open With seasonal pattern" })).toBeVisible(); await expectNoHorizontalOverflow(page); await page.getByRole("link", { name: "Open With seasonal pattern" }).click(); From c786ae9232108663bce331d0bd321404a682ad2e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 19 Jul 2026 20:42:03 +0000 Subject: [PATCH 5/6] docs: record Specifiers results UI review in branch ledger Capture the final review outcome, HEAD, and verification evidence for PR #941 so review throttling and merge readiness stay auditable. Co-authored-by: BigSimmo --- docs/branch-review-ledger.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index 99d863913..c07333607 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -623,3 +623,4 @@ Use this ledger to prevent repeated branch and PR reviews when the reviewed HEAD | 2026-07-19 | main / `codex/supabase-database-review` | 4034d2e60ebb6616130ff17bf3cb69368f36f8f6 + reviewed working diff | live `Clinical KB Database` security, migration, schema-drift, integrity, and performance review against current repo | Confirmed and remediated a P1 privacy defect: 601 private-document title-vocabulary rows were reachable by the service-role query corrector; the live public-only sync/backfill now reports zero private or out-of-scope rows. Applied the committed retrieval-count bound, audit-metadata minimization, registry cleanup/index, public-title corrector, and atomic summary-rate-limit migrations. The missing FK and registry indexes are present and no invalid indexes remain. A second P1 was found in the untracked live `ingestion-worker`: gateway JWT verification accepted any project JWT before privileged direct-Postgres job processing. Recovered the deployed source into the repo, restricted it to POST plus a gateway-verified `service_role` claim, expanded the Deno checker to every tracked Edge Function, and deployed exact-matching v13 with JWT verification enabled. Review also exposed a repo mirror/test gap: the count-clamp migration was not reflected in `schema.sql`; the branch now mirrors it and locks both sources in the focused test. Remaining hosted blocker: `postgres` cannot assume managed `supabase_admin`, so the fail-closed default-ACL migrations and final title-word constraint/trigger migration remain unapplied; the intentional service-role-only table still produces one INFO no-policy advisor. | Supabase connector project identity, migration and Edge Function inventory, full drift snapshot comparison, security/performance advisors, catalog integrity/ACL/index queries, Vault JWT-role compatibility check, post-apply invariants, exact deployed-source hashes, and unauthenticated live rejection (401); focused retrieval/schema/drift Vitest 82/83 with only manifest freshness failing; Edge/retrieval auth 9/9; Deno check for both functions; offline RAG 36 cases / 294 tests; function-grant guard; scoped ESLint, Prettier, and `git diff --check`. `check:supabase-project` was attempted but stopped before provider contact because local project env vars are unset. `drift:manifest` was blocked because Docker Desktop could not start and was cleaned up. `verify:cheap`, `verify:pr-local`, production-readiness, OpenAI, hosted CI, broader deployment, and commit/push were not run. | | 2026-07-19 | cursor/safari-edge-to-edge-f46b (PR #933) | 15061964dd2fdf9665f72b7282f5cc81c736e57f | final Safari edge-to-edge / phone dock reserve review + merge readiness | No high-confidence P0-P1. Confirmed implementation: shared reserve module collapses to 0.75rem when dock hides; shell uses block scrollport + inner mobile-composer-reserve-pad so clearance contributes to scrollHeight; child dock-sized env(safe-area) pads removed; DocumentViewer owns its dock pad. Review polish: formulation/specifier max-sm:min-h-0 alignment, document-route ownership simplification, hidden-pad CSS token guard. Residual P2/P3 only: differentials compare zero-inset backdrop margin, idle 2rem vs max(2rem,safe-area) ~2px, unused-looking #main-content padding transition still needed by ClinicalDashboard. Merge-ready. | Local: format/lint/typecheck/knip/budgets pass; unit 2952 passed with only pre-existing pdf-extraction-budget (python ENOENT, also fails on clean main); production build + client-bundle secret scan pass; focused Chromium composer suite 6/6 (forms hide, tablet/desktop clearance, differentials compare, service-detail endpoint, document-viewer hide, long-answer dock). Hosted CI on prior head fully green including Production UI; polish head re-checked before merge. No OpenAI/live Supabase/provider calls. | | 2026-07-19 | cursor/pr-policy-body-cleanup-f46b (PR #942) + PR #933 closeout | 7c8e6aadf0890b143372fb96f13d9de47a416db9 | post-merge CI triage for #933 PR-policy red check | PR #933 product merge (`bd864de0`) already on main with green post-merge main CI (Static/Unit/Build/Production UI/SAST/Docker). Sole remaining red check on #933 was post-ready PR policy against a stale synced body with unchecked governance boxes (from leftover `PR_POLICY_BODY.md` introduced by #932). Token cannot edit merged PR bodies (403). Removed the stale template via #942 so Sync PR policy body no longer reapplies unchecked governance. Local composer regression 6/6 on main; reserve unit 11/11. No product regression. | Hosted #933 pre-merge + main push green; #942 required checks green then squash-merged; focused Chromium composer 6/6; reserve Vitest 11/11. No OpenAI/Supabase provider calls. | +| 2026-07-19 | cursor/specifiers-results-ui-7850 (PR #941) | c122e35ab1c8ae3c85be93775b161f8ae7fcf51c | Specifiers results UI elevation final review + merge readiness | No high-confidence P0-P1. Ranking blurb removed; solid Aegean subnav kept vs soft family chips; diagnosis control content-sized with min-h-tap; match cards single Open hit target with motion-reduce and guarded typical language. Merged current origin/main for clean base. Residual risk: hosted Production UI must finish green on exact head; full verify:cheap still hits known container-only pdf-extraction-budget failures also seen on main. Merge-ready once required CI green. | Local: format:changed; lint/typecheck on touched files; design-system + icon-scale; vitest specifiers+reserve 10/10; Playwright ui-specifiers 5/5 including filter interactions; production build + client-bundle secret scan; offline RAG fixtures 36/21. PR marked ready for review; mergeable=MERGEABLE. No OpenAI/live Supabase provider calls. | From acd835f15624e63c624ed360777e2701ac491b39 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 19 Jul 2026 20:50:30 +0000 Subject: [PATCH 6/6] docs: pin Specifiers review ledger row to current HEAD Co-authored-by: BigSimmo --- docs/branch-review-ledger.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/branch-review-ledger.md b/docs/branch-review-ledger.md index eac0bd249..652898e75 100644 --- a/docs/branch-review-ledger.md +++ b/docs/branch-review-ledger.md @@ -623,8 +623,5 @@ Use this ledger to prevent repeated branch and PR reviews when the reviewed HEAD | 2026-07-19 | main / `codex/supabase-database-review` | 4034d2e60ebb6616130ff17bf3cb69368f36f8f6 + reviewed working diff | live `Clinical KB Database` security, migration, schema-drift, integrity, and performance review against current repo | Confirmed and remediated a P1 privacy defect: 601 private-document title-vocabulary rows were reachable by the service-role query corrector; the live public-only sync/backfill now reports zero private or out-of-scope rows. Applied the committed retrieval-count bound, audit-metadata minimization, registry cleanup/index, public-title corrector, and atomic summary-rate-limit migrations. The missing FK and registry indexes are present and no invalid indexes remain. A second P1 was found in the untracked live `ingestion-worker`: gateway JWT verification accepted any project JWT before privileged direct-Postgres job processing. Recovered the deployed source into the repo, restricted it to POST plus a gateway-verified `service_role` claim, expanded the Deno checker to every tracked Edge Function, and deployed exact-matching v13 with JWT verification enabled. Review also exposed a repo mirror/test gap: the count-clamp migration was not reflected in `schema.sql`; the branch now mirrors it and locks both sources in the focused test. Remaining hosted blocker: `postgres` cannot assume managed `supabase_admin`, so the fail-closed default-ACL migrations and final title-word constraint/trigger migration remain unapplied; the intentional service-role-only table still produces one INFO no-policy advisor. | Supabase connector project identity, migration and Edge Function inventory, full drift snapshot comparison, security/performance advisors, catalog integrity/ACL/index queries, Vault JWT-role compatibility check, post-apply invariants, exact deployed-source hashes, and unauthenticated live rejection (401); focused retrieval/schema/drift Vitest 82/83 with only manifest freshness failing; Edge/retrieval auth 9/9; Deno check for both functions; offline RAG 36 cases / 294 tests; function-grant guard; scoped ESLint, Prettier, and `git diff --check`. `check:supabase-project` was attempted but stopped before provider contact because local project env vars are unset. `drift:manifest` was blocked because Docker Desktop could not start and was cleaned up. `verify:cheap`, `verify:pr-local`, production-readiness, OpenAI, hosted CI, broader deployment, and commit/push were not run. | | 2026-07-19 | cursor/safari-edge-to-edge-f46b (PR #933) | 15061964dd2fdf9665f72b7282f5cc81c736e57f | final Safari edge-to-edge / phone dock reserve review + merge readiness | No high-confidence P0-P1. Confirmed implementation: shared reserve module collapses to 0.75rem when dock hides; shell uses block scrollport + inner mobile-composer-reserve-pad so clearance contributes to scrollHeight; child dock-sized env(safe-area) pads removed; DocumentViewer owns its dock pad. Review polish: formulation/specifier max-sm:min-h-0 alignment, document-route ownership simplification, hidden-pad CSS token guard. Residual P2/P3 only: differentials compare zero-inset backdrop margin, idle 2rem vs max(2rem,safe-area) ~2px, unused-looking #main-content padding transition still needed by ClinicalDashboard. Merge-ready. | Local: format/lint/typecheck/knip/budgets pass; unit 2952 passed with only pre-existing pdf-extraction-budget (python ENOENT, also fails on clean main); production build + client-bundle secret scan pass; focused Chromium composer suite 6/6 (forms hide, tablet/desktop clearance, differentials compare, service-detail endpoint, document-viewer hide, long-answer dock). Hosted CI on prior head fully green including Production UI; polish head re-checked before merge. No OpenAI/live Supabase/provider calls. | | 2026-07-19 | cursor/pr-policy-body-cleanup-f46b (PR #942) + PR #933 closeout | 7c8e6aadf0890b143372fb96f13d9de47a416db9 | post-merge CI triage for #933 PR-policy red check | PR #933 product merge (`bd864de0`) already on main with green post-merge main CI (Static/Unit/Build/Production UI/SAST/Docker). Sole remaining red check on #933 was post-ready PR policy against a stale synced body with unchecked governance boxes (from leftover `PR_POLICY_BODY.md` introduced by #932). Token cannot edit merged PR bodies (403). Removed the stale template via #942 so Sync PR policy body no longer reapplies unchecked governance. Local composer regression 6/6 on main; reserve unit 11/11. No product regression. | Hosted #933 pre-merge + main push green; #942 required checks green then squash-merged; focused Chromium composer 6/6; reserve Vitest 11/11. No OpenAI/Supabase provider calls. | -<<<<<<< HEAD -| 2026-07-19 | cursor/specifiers-results-ui-7850 (PR #941) | c122e35ab1c8ae3c85be93775b161f8ae7fcf51c | Specifiers results UI elevation final review + merge readiness | No high-confidence P0-P1. Ranking blurb removed; solid Aegean subnav kept vs soft family chips; diagnosis control content-sized with min-h-tap; match cards single Open hit target with motion-reduce and guarded typical language. Merged current origin/main for clean base. Residual risk: hosted Production UI must finish green on exact head; full verify:cheap still hits known container-only pdf-extraction-budget failures also seen on main. Merge-ready once required CI green. | Local: format:changed; lint/typecheck on touched files; design-system + icon-scale; vitest specifiers+reserve 10/10; Playwright ui-specifiers 5/5 including filter interactions; production build + client-bundle secret scan; offline RAG fixtures 36/21. PR marked ready for review; mergeable=MERGEABLE. No OpenAI/live Supabase provider calls. | -======= | 2026-07-19 | cursor/documents-search-header-3eab / PR #936 | a7feaa3033180b672cfafaaaf75dc75088ebf052 | documents search header redesign final review + merge readiness | No remaining high-confidence P0-P1. Implemented identity-first results chrome, unified Sort/type-filter/Library toolbar, removed documents Also-in-library strip, relocated ScopeAndGovernanceNotice under controls, fixed Prettier CI failure and memo-busting empty warnings default, synced accurate PR policy body then removed the stale leftover, and repeatedly merged origin/main so squash auto-merge is not blocked behind/dirty. Hosted required checks including Production UI passed on the integrated head. | Local: typecheck/lint/format; focused Playwright documents `@critical` + deferred source/admin + forms sort persistence; design-system/icon-scale/maintainability; build + RAG fixtures; verify:pr-local units with known pdf-extraction-budget env artifact also on clean main. Hosted: PR policy, Static, Unit, Build, Production UI, Advisory UI, PR required green. No OpenAI/live Supabase writes. | ->>>>>>> origin/main +| 2026-07-19 | cursor/specifiers-results-ui-7850 (PR #941) | ef9bcf23bb93cbaddddeda3aedf08e6d037e2f18 | Specifiers results UI elevation final review + merge readiness | No high-confidence P0-P1. Ranking blurb removed; solid Aegean subnav kept vs soft family chips; diagnosis control content-sized with min-h-tap; match cards single Open hit target with motion-reduce and guarded typical language. Re-synced origin/main after #936 ledger append conflict. Residual risk: hosted Production UI must finish green on exact head; full verify:cheap still hits known container-only pdf-extraction-budget failures also seen on main. | Local: format:changed; lint/typecheck on touched files; design-system + icon-scale; vitest specifiers+reserve 10/10; Playwright ui-specifiers 5/5 including filter interactions; production build + client-bundle secret scan; offline RAG fixtures 36/21. PR marked ready for review. No OpenAI/live Supabase provider calls. |