From 23e02b3dc2eff3103bf07c7dade4156e425b82d2 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 00:19:53 +0000 Subject: [PATCH 1/6] feat(ui): retire the mode-home assurance badge, keep every caveat MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The mode-home footer looked like one component doing one job, but it was doing two. On five modes it asserted only what the mode does; on nine it carried a review-before-use instruction. Both were rendered as an accent-blue semibold label behind a ShieldCheck — a shield-and-tick reads as "verified", which is exactly what the PT-06 comment in answer-status.tsx says the pre-query copy must not assert, since validation status varies per document and is surfaced on the results themselves. On the answer hero it also sat ~40px from a ShieldAlert meaning the opposite, and outranked the APP-5 privacy line beneath it at 11px muted. The badge treatment is gone everywhere: no icon, no accent colour, one quiet 11px line with hierarchy from weight alone. The `icon` prop is removed from the component and every call site. Removed outright, having said only what the mode does: answer Searches indexed clinical sources · Clinical Guide library documents Searches indexed clinical sources · Clinical source collection favourites Saved clinical work · Local library tools Clinical tools · Source-backed workflows Retained and restyled, because the body is a genuine caveat: differentials ("Review before use"), prescribing ("Confirm against source"), formulation, specifiers, therapy-compass (x2), factsheets, dsm, forms. Services is also retained: its footer carries verifiedCount/totalCount, whose screen-reader "N of M records are locally verified" line would otherwise be lost — caught only because deleting it broke a ternary and forced a second look. No wording changed. This is the styling and the four pure-claim deletions only; the separate proposal to add a verify-before-use sentence to the answer hero is deliberately not included here, because that is new clinical copy needing sign-off rather than a design change. verify:cheap: 443 test files / 4643 passed, plus lint, typecheck and the 29 static gates. Two failures in tests/codex-cloud-setup.test.ts are pre-existing — reproduced on clean origin/main with these changes stashed. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg --- src/components/applications-launcher-page.tsx | 4 +--- .../clinical-dashboard/answer-status.tsx | 19 ++---------------- .../clinical-dashboard/differentials-home.tsx | 2 +- .../document-search-results.tsx | 8 +------- .../clinical-dashboard/favourites-hub.tsx | 17 ++-------------- .../medication-prescribing-workspace.tsx | 2 +- src/components/dsm/dsm-home-page.tsx | 3 +-- .../factsheets/factsheets-home-page.tsx | 3 +-- src/components/forms/forms-home-page.tsx | 1 - .../formulation/formulation-home-page.tsx | 2 -- src/components/mode-home-template.tsx | 20 +++++++++++-------- .../services/services-home-page.tsx | 1 - .../specifiers/specifiers-home-page.tsx | 12 +---------- .../therapy-compass/screens/home-screen.tsx | 3 +-- src/components/therapy-compass/workspace.tsx | 7 +------ 15 files changed, 25 insertions(+), 79 deletions(-) diff --git a/src/components/applications-launcher-page.tsx b/src/components/applications-launcher-page.tsx index 3f91282a67..adcfcf72b2 100644 --- a/src/components/applications-launcher-page.tsx +++ b/src/components/applications-launcher-page.tsx @@ -25,7 +25,7 @@ import { import { type FormEvent, useMemo, useState } from "react"; import { DesktopComposerPortalSlot } from "@/components/desktop-composer-portal-slot"; -import { ModeHomeHero, ModeHomeVerificationFooter } from "@/components/mode-home-template"; +import { ModeHomeHero } from "@/components/mode-home-template"; import { MobileResultFilterControl, SearchResultsHeaderBand, @@ -890,8 +890,6 @@ export function ApplicationsLauncherWorkspace({ - - setDetailOpen(false)} /> ); diff --git a/src/components/clinical-dashboard/answer-status.tsx b/src/components/clinical-dashboard/answer-status.tsx index ea3993580b..38504a1e1d 100644 --- a/src/components/clinical-dashboard/answer-status.tsx +++ b/src/components/clinical-dashboard/answer-status.tsx @@ -1,17 +1,7 @@ "use client"; import type { CSSProperties } from "react"; -import { - Check, - Circle, - Clipboard, - ClipboardCheck, - History, - Loader2, - MessageSquareText, - ShieldCheck, - Square, -} from "lucide-react"; +import { Check, Circle, Clipboard, ClipboardCheck, History, Loader2, MessageSquareText, Square } from "lucide-react"; import { answerProgressDisplayMessage, @@ -22,7 +12,7 @@ import { import { useClientTime } from "@/lib/use-client-time"; import { AnswerSuggestionChips } from "@/components/clinical-dashboard/answer-suggestion-chips"; import { useAppPreferences } from "@/components/clinical-dashboard/use-app-preferences"; -import { ModeHomeTemplate, ModeHomeVerificationFooter } from "@/components/mode-home-template"; +import { ModeHomeTemplate } from "@/components/mode-home-template"; import { cn, floatingControl, sourceCard } from "@/components/ui-primitives"; import { answerEmptyState, answerLoading, copyButton } from "@/lib/ui-copy"; @@ -104,11 +94,6 @@ export function AnswerEmptyState({ {/* Pre-query copy must describe what the search does, not assert that every indexed source is verified/current (PT-06): validation status varies per document and is surfaced on the results themselves. */} - } /> diff --git a/src/components/clinical-dashboard/differentials-home.tsx b/src/components/clinical-dashboard/differentials-home.tsx index 668dbb5980..d4e5d22753 100644 --- a/src/components/clinical-dashboard/differentials-home.tsx +++ b/src/components/clinical-dashboard/differentials-home.tsx @@ -1364,7 +1364,7 @@ export function DifferentialsHome({ onClick: () => handleSuggestedSearch(item.query), })) } - footer={} + footer={} /> ); diff --git a/src/components/clinical-dashboard/document-search-results.tsx b/src/components/clinical-dashboard/document-search-results.tsx index c72eabd040..abdf692d57 100644 --- a/src/components/clinical-dashboard/document-search-results.tsx +++ b/src/components/clinical-dashboard/document-search-results.tsx @@ -28,7 +28,6 @@ import { Route, Shield, ShieldAlert, - ShieldCheck, Sparkles, Tag, Target, @@ -40,7 +39,7 @@ import { import { DocumentTagCloud } from "@/components/DocumentTagCloud"; import { documentDisplayTitle } from "@/components/DocumentOrganizationBadges"; import { isDeployedClinicalKb } from "@/lib/deployed-app"; -import { ModeHomeTemplate, ModeHomeVerificationFooter } from "@/components/mode-home-template"; +import { ModeHomeTemplate } from "@/components/mode-home-template"; import { ScopeAndGovernanceNotice } from "@/components/clinical-dashboard/answer-content"; import { MobileResultFilterControl, @@ -601,11 +600,6 @@ function DocumentSearchHome({ }))} footer={
- {documentCount > 0 ? (

{documentCount.toLocaleString()} indexed source{documentCount === 1 ? "" : "s"} diff --git a/src/components/clinical-dashboard/favourites-hub.tsx b/src/components/clinical-dashboard/favourites-hub.tsx index 7e05fe6814..eb6589fae0 100644 --- a/src/components/clinical-dashboard/favourites-hub.tsx +++ b/src/components/clinical-dashboard/favourites-hub.tsx @@ -1,22 +1,11 @@ "use client"; import Link from "next/link"; -import { - ArrowUpDown, - ChevronDown, - CircleAlert, - Filter, - Folder, - Heart, - Plus, - Search, - ShieldCheck, - X, -} from "lucide-react"; +import { ArrowUpDown, ChevronDown, CircleAlert, Filter, Folder, Heart, Plus, Search, X } from "lucide-react"; import { useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from "react"; import { useDismissableLayer } from "@/components/use-dismissable-layer"; import { DesktopComposerPortalSlot } from "@/components/desktop-composer-portal-slot"; -import { ModeHomeHero, ModeHomeVerificationFooter } from "@/components/mode-home-template"; +import { ModeHomeHero } from "@/components/mode-home-template"; import { cn, floatingControl, @@ -570,8 +559,6 @@ export function FavouritesHub({

- - ); } diff --git a/src/components/clinical-dashboard/medication-prescribing-workspace.tsx b/src/components/clinical-dashboard/medication-prescribing-workspace.tsx index 585bf640b4..7ce1ad61f5 100644 --- a/src/components/clinical-dashboard/medication-prescribing-workspace.tsx +++ b/src/components/clinical-dashboard/medication-prescribing-workspace.tsx @@ -239,7 +239,7 @@ function MedicationHome({ apiUnavailable={apiUnavailable} setupWarning={setupWarning} /> - + } /> diff --git a/src/components/dsm/dsm-home-page.tsx b/src/components/dsm/dsm-home-page.tsx index 92a5c56aff..cd255c60e4 100644 --- a/src/components/dsm/dsm-home-page.tsx +++ b/src/components/dsm/dsm-home-page.tsx @@ -1,4 +1,4 @@ -import { BookOpenCheck, GitCompareArrows, ListChecks, Search, ShieldCheck } from "lucide-react"; +import { BookOpenCheck, GitCompareArrows, ListChecks, Search } from "lucide-react"; import { ModeHomeMain, ModeHomeTemplate, ModeHomeVerificationFooter } from "@/components/mode-home-template"; import { dsmCategories, dsmDiagnoses } from "@/lib/dsm"; @@ -51,7 +51,6 @@ export function DsmHomePage() { }))} footer={ diff --git a/src/components/factsheets/factsheets-home-page.tsx b/src/components/factsheets/factsheets-home-page.tsx index ae2fe4705a..882bdcb37e 100644 --- a/src/components/factsheets/factsheets-home-page.tsx +++ b/src/components/factsheets/factsheets-home-page.tsx @@ -1,5 +1,5 @@ import Link from "next/link"; -import { ArrowRight, BookOpenText, Clock, ShieldCheck } from "lucide-react"; +import { ArrowRight, BookOpenText, Clock } from "lucide-react"; import { categoryCount, @@ -136,7 +136,6 @@ export function FactsheetsHomePage() {
diff --git a/src/components/forms/forms-home-page.tsx b/src/components/forms/forms-home-page.tsx index 55769e80a8..8b6e6595df 100644 --- a/src/components/forms/forms-home-page.tsx +++ b/src/components/forms/forms-home-page.tsx @@ -136,7 +136,6 @@ export function FormsHomePage({ defaultFormSlug = null }: { defaultFormSlug?: st footer={ hasRegistryRecords ? ( diff --git a/src/components/mode-home-template.tsx b/src/components/mode-home-template.tsx index 1bb1a61a8c..4367b6e5a3 100644 --- a/src/components/mode-home-template.tsx +++ b/src/components/mode-home-template.tsx @@ -157,26 +157,30 @@ export function ModeHomeMain({ ); } +// One quiet line of text. Deliberately no icon and no accent colour: a shield +// (and especially a ShieldCheck) reads as "verified", which several of these +// footers must not assert — validation status varies per document and is +// surfaced on the results themselves. Hierarchy comes from weight alone, so the +// caveat half is what carries emphasis rather than the capability half. +// +// Modes whose footer said only what the mode does, with no caveat, no longer +// render this at all; the remaining call sites are the ones whose `body` is a +// genuine review-before-use instruction. export function ModeHomeVerificationFooter({ - icon: Icon, label, body, verifiedCount, totalCount, }: { - icon: LucideIcon; label: string; body: string; verifiedCount?: number; totalCount?: number; }) { return ( -

- - - +

+ {label} + {body} {typeof verifiedCount === "number" && typeof totalCount === "number" ? ( diff --git a/src/components/services/services-home-page.tsx b/src/components/services/services-home-page.tsx index 1f41d1ec22..afcd2a2a2e 100644 --- a/src/components/services/services-home-page.tsx +++ b/src/components/services/services-home-page.tsx @@ -139,7 +139,6 @@ export function ServicesHomePage({ defaultServiceSlug = null }: { defaultService footer={ hasRegistryRecords ? ( diff --git a/src/components/therapy-compass/screens/home-screen.tsx b/src/components/therapy-compass/screens/home-screen.tsx index bcd28c0e8b..dd766acfa5 100644 --- a/src/components/therapy-compass/screens/home-screen.tsx +++ b/src/components/therapy-compass/screens/home-screen.tsx @@ -1,6 +1,6 @@ "use client"; -import { FileText, Network, Search, ShieldCheck, Sparkles, Waypoints } from "lucide-react"; +import { FileText, Network, Search, Sparkles, Waypoints } from "lucide-react"; import { ModeHomeMain, ModeHomeTemplate, ModeHomeVerificationFooter } from "@/components/mode-home-template"; import { modeHomeDesktopComposerSlotId } from "@/lib/mode-home-composer"; @@ -66,7 +66,6 @@ export function HomeScreen() { }))} footer={ diff --git a/src/components/therapy-compass/workspace.tsx b/src/components/therapy-compass/workspace.tsx index 6394084197..12e8a67a17 100644 --- a/src/components/therapy-compass/workspace.tsx +++ b/src/components/therapy-compass/workspace.tsx @@ -1,6 +1,5 @@ "use client"; -import { ShieldCheck } from "lucide-react"; import { usePathname } from "next/navigation"; import type { ReactNode } from "react"; @@ -13,11 +12,7 @@ import { TherapyCompassNav, TherapyModeNav } from "./nav"; function TherapyCompassFooter() { return (

- +
); } From b036d847ef3498f2b40430499f4d3a84942e384c Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 02:15:05 +0000 Subject: [PATCH 2/6] fix(ui): bind the mode-home footer separator so it cannot strand on a wrap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The middot was a free-standing glyph between two spans, so a wrapped line left it dangling at the end of the first line, detached from the clause it was joining. Measured at 390px: five of the nine remaining footers wrapped — forms, specifiers, formulation, therapy-compass and factsheets — and every one of them split the dot from its body. Replaced with sentence punctuation. A full stop binds to the preceding word, so it can never begin or end a line alone, and it is the more honest mark: these are two statements, not two items in a list. The container also moves from flex to centred balanced text, so a wrapped second line centres under the first instead of left-aligning ragged. before Hypothesis-led decision support · Check fit, alternatives, risk, and context before using a draft after Hypothesis-led decision support. Check fit, alternatives, risk, and context before using a draft No wording changed; the four modes that already fitted one line still do. Verified by re-measuring all nine at 390px in Chromium: no stranded separator, zero page errors. npm run test: 443 files / 4643 passed. The two tests/codex-cloud-setup.test.ts failures are pre-existing and reproduce on clean origin/main. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg --- src/components/mode-home-template.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/mode-home-template.tsx b/src/components/mode-home-template.tsx index 4367b6e5a3..6e3b137465 100644 --- a/src/components/mode-home-template.tsx +++ b/src/components/mode-home-template.tsx @@ -178,10 +178,15 @@ export function ModeHomeVerificationFooter({ totalCount?: number; }) { return ( -

- {label} - - {body} + // Sentence punctuation rather than a separator glyph. A free-standing "·" + // between two spans is stranded when the line wraps — measured at 390px, five + // of the nine remaining footers wrapped and every one of them split the dot + // from the body it was joining. A full stop binds to the preceding word, so + // it cannot start or end a line alone, and these are two statements rather + // than two items in a list. Centred text (not flex) so the wrapped second + // line balances instead of left-aligning under the first. +

+ {label}. {body} {typeof verifiedCount === "number" && typeof totalCount === "number" ? ( {verifiedCount} of {totalCount} records are locally verified. From 9dd65a51e9058a87bb0ab7db8a8b62e610f93d4d Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 02:20:47 +0000 Subject: [PATCH 3/6] Revert "fix(ui): bind the mode-home footer separator so it cannot strand on a wrap" This reverts commit b036d847ef3498f2b40430499f4d3a84942e384c. --- src/components/mode-home-template.tsx | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/components/mode-home-template.tsx b/src/components/mode-home-template.tsx index 6e3b137465..4367b6e5a3 100644 --- a/src/components/mode-home-template.tsx +++ b/src/components/mode-home-template.tsx @@ -178,15 +178,10 @@ export function ModeHomeVerificationFooter({ totalCount?: number; }) { return ( - // Sentence punctuation rather than a separator glyph. A free-standing "·" - // between two spans is stranded when the line wraps — measured at 390px, five - // of the nine remaining footers wrapped and every one of them split the dot - // from the body it was joining. A full stop binds to the preceding word, so - // it cannot start or end a line alone, and these are two statements rather - // than two items in a list. Centred text (not flex) so the wrapped second - // line balances instead of left-aligning under the first. -

- {label}. {body} +

+ {label} + + {body} {typeof verifiedCount === "number" && typeof totalCount === "number" ? ( {verifiedCount} of {totalCount} records are locally verified. From 590664c690c93951f39ecb55383ff70e0c779e69 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 02:29:40 +0000 Subject: [PATCH 4/6] fix(ui): bind the mode-home separator to its label so it cannot strand MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The three spans were independent flex items, so a wrapped line could leave the "·" alone, detached from the clause it joins. Measured at 390px: five of the nine remaining footers wrapped — forms, specifiers, formulation, therapy-compass and factsheets — and every one stranded the dot on the line above its body. Label and separator are now one whitespace-nowrap flex item, so the dot always travels with the label. The dot keeps the muted weight and colour it had, rather than inheriting the label's emphasis. Deliberately minimal: the flex layout, the gap, the wording and the type scale are all untouched. An earlier attempt changed the punctuation and the container layout together, which read as a far larger visual change than the problem warranted; this is the smallest edit that removes the artifact, and it is invisible on the four footers that do not wrap. Verified at 390px across all nine: dot shares a line with its label in every case, zero page errors. npm run test: 443 files / 4643 passed; the two tests/codex-cloud-setup.test.ts failures are pre-existing on origin/main. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg --- src/components/mode-home-template.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/mode-home-template.tsx b/src/components/mode-home-template.tsx index 4367b6e5a3..8d2d02ea41 100644 --- a/src/components/mode-home-template.tsx +++ b/src/components/mode-home-template.tsx @@ -179,8 +179,16 @@ export function ModeHomeVerificationFooter({ }) { return (

- {label} - + {/* The separator is bound to the label as one non-breaking flex item. + As three independent items it could wrap alone: measured at 390px, + five of the nine footers wrapped and every one stranded the dot on + the line above the clause it joins. */} + + {label}{" "} + + {body} {typeof verifiedCount === "number" && typeof totalCount === "number" ? ( From cb11b04474ce431cb638e01dc02997157612822c Mon Sep 17 00:00:00 2001 From: "coderabbitai[bot]" <136622811+coderabbitai[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2026 03:13:26 +0000 Subject: [PATCH 5/6] fix: apply CodeRabbit auto-fixes Fixed 1 file(s) based on 1 unresolved review comment. Co-authored-by: CodeRabbit --- src/components/mode-home-template.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/mode-home-template.tsx b/src/components/mode-home-template.tsx index 8d2d02ea41..f7c34a1744 100644 --- a/src/components/mode-home-template.tsx +++ b/src/components/mode-home-template.tsx @@ -161,7 +161,7 @@ export function ModeHomeMain({ // (and especially a ShieldCheck) reads as "verified", which several of these // footers must not assert — validation status varies per document and is // surfaced on the results themselves. Hierarchy comes from weight alone, so the -// caveat half is what carries emphasis rather than the capability half. +// label half (capability) carries the emphasis rather than the body half (caveat). // // Modes whose footer said only what the mode does, with no caveat, no longer // render this at all; the remaining call sites are the ones whose `body` is a From 7d777d3dedc063d6a25d792049cf9a5e513ff996 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 31 Jul 2026 03:17:35 +0000 Subject: [PATCH 6/6] chore: re-trigger required CI after CodeRabbit bot tip The CodeRabbit auto-fix on cb11b044 left the required CI workflow pending with no jobs (bot-authored head). Empty commit from a non-bot identity so pull_request CI can start on this tip. Co-authored-by: BigSimmo