feat(mockups): two studies for consolidating the answer-home notices - #1437
Conversation
…ices
The answer-mode hero stacks three separate notices under the composer — the
APP-5 privacy warning, a bare /privacy link, and the accent-blue scope footer —
in three type sizes, two colours and two opposing shield icons, and never says
the generated answer needs checking.
Adds /mockups/warning-consolidation: a design-scratch study that diagnoses the
current stack, adds the missing fourth statement ("Answers are AI-generated —
verify against the cited source before clinical use.") at the bottom of each
concept, and presents three consolidations at desktop and phone widths:
01 Assurance bar one row, descriptive half behind a Details disclosure
02 Safety card two tiers, obligation on a warning-tinted top row
03 Quiet footnote one grey sentence with an inline expander
The pinned governance strings ("Do not enter patient-identifiable
information." and the "Privacy and data processing" link to /privacy) are
reproduced verbatim in every concept; only their styling and grouping change.
No production surface is touched — mockups 404 in production.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBgWarning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in:40 minutes Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughAdded three mockup routes for answer-home and warning-notice proposals. Added route-specific chrome suppression, responsive mockup pages, governance notes, sitemap entries, and related issue and review ledger records. ChangesMockup route and tracking integration
Answer-home proposal
Warning concepts
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant Browser
participant MockupsLayoutClient
participant MockupRoute
participant MockupPage
Browser->>MockupsLayoutClient: Open mockup route
MockupsLayoutClient->>MockupsLayoutClient: Detect route and suppress shared UI
MockupsLayoutClient->>MockupRoute: Render route component
MockupRoute->>MockupPage: Render responsive mockup
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit:74978b94db
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Uh oh!
There was an error while loading. Please reload this page.
BigSimmo
commented
Jul 30, 2026
@codex resolve actionable Codex review findings for this pull request and current head using the repository instructions. This is the pull request's single automatic repair pass: do not perform a fresh review, create new standalone findings, or request another review. Work only the existing unresolved Codex threads on the current head. Always fix P0 and P1 findings. For P2 and lower findings, fix only clear, scoped, low-risk issues; otherwise disposition them with a concise reason. After fixing or dispositioning a thread, reply in that thread with as the first line, followed by a concise summary; that marker authorizes the workflow to close that exact thread. If human input or new authorization is required, do not use the marker and leave the thread open with the blocker. Finish only after every actionable thread is fixed or dispositioned and closed, or explicitly left open for a human decision. Do not update the branch from main, address unrelated reviews, broaden scope, or create more than one scoped fix commit. Do not use external APIs, paid services, credentials, dependency changes, or broad refactors unless explicitly authorized. Add targeted tests where behavior changes and run the narrowest relevant validation. |
…concept Codex review (P2) on #1437: the "Privacy and data processing" label was a styled <span> in all three concepts and in the today's-stack baseline, so a static render of the page produced the label five times and zero /privacy hrefs. The page claims on its face that the pinned APP-5 link is preserved, which made that claim unevidenced — and the focus-ring classes on an inert span did nothing, so the link was not keyboard-reachable either. Renders each one with Next's <Link href="/privacy">, per the internal- navigation convention in AGENTS.md. Verified in Chromium: six a[href="/privacy"] anchors with the disclosures open (was zero), each carrying the verbatim label, and .focus() lands on the recommended concept's link. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
Codex Review: Didn't find any major issues. 👍 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
…ild-skip gate gap Records three items that surfaced during the /mockups/warning-consolidation study (PR #1437) and were not tracked anywhere: #141 P2 task — adopt a consolidated answer-home notice block; the study landed but nothing adopts it, and adoption moves the single site-wide APP-5 line across three composers #142 P2 issue — answer mode ships no verify-before-use caveat while every other clinical mode does #143 P2 issue — verify:pr-local exits 0 when guard-next-build refuses to run, reporting green with the build never executed Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
The merge of origin into this branch hit exactly the damage #133/#140 describe: merge=union concatenated both sides of the ledger rather than merging it. Two collisions, both repaired without dropping either side's rows: - Another agent had already allocated #141-#144 on main for different items while this branch used #141-#143. The incoming rows renumber, per the ledger rule, so the capture becomes #145 (adopt a consolidated answer-home notice block), #146 (answer mode ships no verify-before-use caveat) and #147 (verify:pr-local exits 0 when its build step refuses to run). Their cross-references were updated to match, and the two duplicated next-id markers collapse to one at 148. - #140 appeared in both tables: it was closed on main as a duplicate of #133 (PR #1444) while this branch still carried it open. The resolution is honoured — the stale open row goes, the archive row stays. check:outstanding-issues: 145 rows (72 open, 73 archived), unique ids, next-id=148 above the highest, no merge driver. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
Resolves the one conflicted file, docs/outstanding-issues.md. With merge=union removed by #1444 the ledger now conflicts honestly instead of silently doubling, so this is a real resolution rather than a repair. main had allocated #145 for "a branch sync during in-flight CI cancels a near-complete run" while this branch used #145-#147 for the answer-home notice capture. Per the ledger's own rule the incoming rows renumber: main's #141-#145 are kept verbatim and the capture becomes #146 (adopt a consolidated answer-home notice block), #147 (answer mode ships no verify-before-use caveat) and #148 (verify:pr-local exits 0 when its build step refuses to run), with their cross-references updated to match and the marker lifted to 149. No row was dropped from either side — main's #141-#145 each appear exactly once, verified against origin/main. check:outstanding-issues: 146 rows (73 open, 73 archived), unique ids, next-id=149 above the highest, no merge driver. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
Third ledger collision in a row, same shape as the last two: main allocated #146 for the `ui-phone-scroll` Services anchor issue while this branch used #146-#148 for the answer-home notice capture. Main's row is kept and the incoming rows renumber to #147 (adopt a consolidated answer-home notice block), #148 (answer mode ships no verify-before-use caveat) and #149 (verify:pr-local exits 0 when its build step refuses to run), with their cross-references and the marker (150) following. Verified against origin/main that #141-#146 each still appear exactly once; nothing was taken wholesale from either side. check:outstanding-issues: 147 rows (74 open, 73 archived), unique ids, next-id=150 above the highest, no merge driver. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
The three captured rows are dropped from docs/outstanding-issues.md, leaving it byte-identical to origin/main. They will be re-landed as their own single-file change once this PR merges. AGENTS.md recommends bundling append-only ledger rows because they are normally zero-risk, but that assumes a quiet file. Right now it is the hottest file in the repo: bundling them here cost three ID collisions and three full CI restarts in about thirty minutes (main took #141-#144, then #145, then #146, while this branch needed #145-#149 in turn). #133 already records that this file conflicts on nearly every main advance. The mockups diff itself touches four uncontended files and has not conflicted once today, so removing the ledger rows takes this PR out of a race it has no reason to be in. No content is lost: the row text is preserved verbatim and re-applied against a fresh main with clean ids. check:outstanding-issues: 144 rows (70 open, 74 archived), unique ids, next-id=147 above the highest, no merge driver. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
BigSimmo
commented
Jul 30, 2026
Temporarily paused during the owner-authorized ordered merge sweep so |
#151 was written before the word-only pass existed, so it referenced only /mockups/warning-consolidation and recommended 02 + 01. A memory row that lags the work is the failure mode this ledger exists to prevent, so it now also records: - /mockups/warning-line, the words-only study (six variants A-F), with the line counts measured from the rendered DOM rather than asserted - the constraint that matters: nothing fits one line on a 390px phone while the pinned APP-5 sentence stays verbatim, because 45 characters of obligation plus the 27-character link exceeds the ~60 available at 11px - D as that study's recommendation, and why F fits better but needs the same privacy sign-off as #152 plus a tests/privacy-ui.test.ts update - that PR #1437 was closed unmerged as a deliberate pause during an owner-authorized ordered merge sweep, with the branch preserved Evidence and the original diagnosis are left intact; this extends the Detail and Next rather than rewriting the row. check:outstanding-issues: 151 rows (53 open, 98 archived), unique ids, next-id=154 above the highest, no ids deleted from base db50738. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
Adds /mockups/answer-home-proposal, the concrete proposal that came out of the two exploratory studies. Drawn as before/after of the whole hero at phone 390 and desktop 1440, not of the notice alone, because the change moves information between two places rather than only deleting a line. Six changes, each with its rationale on the page: 1. Remove the "Searches indexed clinical sources · Clinical Guide library" badge — accent-blue semibold 14px, the loudest element on the screen, and a capability claim rather than a safety statement. 2. Remove the ShieldCheck. A shield-and-tick reads as "verified", which is exactly what the PT-06 comment above ModeHomeVerificationFooter in answer-status.tsx forbids the pre-query copy from asserting. The wording obeys that comment; the icon undoes it. It also sat ~40px from a ShieldAlert carrying the opposite meaning. 3. Move "Clinical Guide library" into the existing subtitle, keeping the one genuinely useful fact without a second voice. Ordinary product copy (ui-copy.ts answerEmptyState.subheading), not pinned by any test. 4. Remove the ShieldAlert; hierarchy comes from weight instead. 5. Join the privacy link to the same line — it previously wrapped alone with no lead-in and read as navigation. 6. Add "Verify answers against the cited source." — labelled on the page as needing governance sign-off, per #152. Measured on the rendered page rather than asserted: the proposed notice is one line at desktop width and two at 390px, because the pinned 45-character obligation plus the 27-character link exceeds the ~60 characters available at 11px. The phone subtitle also gains a line where the footer loses two. Both pinned strings appear verbatim on both sides. No production surface changes; mockups 404 in production. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
BigSimmo
commented
Jul 31, 2026
@cursoragent this PR will be re-opened soon. Please resolve any failing CI, run bugbot and resolve any bugbot comments against current repo and fix any merge conflicts and also fix any errors and address and fix all comments or suggestions that are likely to improve the PR and Codebase. Please implement smallest required fix according to best code practices. Check your work. Leave this PR closed for now but still make all these changes and run the review. I want it ready to go for when I re-open it. |
PR #1437 is ready to reopen and left CLOSED. Done
Left as-is
On reopen
|
Merge origin/main into claude/warning-consolidation-mockups-09jyj7. Resolve docs/outstanding-issues.md by keeping main's #151–#154 and renumbering this PR's follow-ups to #155–#157 (next-id=158), matching the ledger's collision rule rather than taking one side wholesale. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
Make the warning-line "today" privacy label a real /privacy Link, align concept F's pitch with its measured two-line phone result, and correct study-1 governance copy so 01/03 paraphrases are labelled as sign-off gated rather than claimed verbatim. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
`git remote get-url` applies global url.*.insteadOf rewrites, so Cursor Cloud sandboxes that inject a tokenized fetch URL made a clean remote.origin.url look credential-bearing and failed origin repair. Inspect `git config --get remote.origin.url` instead, and cover the insteadOf false-positive in the unit suite. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
Stop paraphrasing the obligation in AssuranceBar compact density so the recommended dock path stays governance-safe, and tighten study-1 copy / #155 to match (char count, third study, title tense). Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
This pull request has been ignored for the connected project Preview Branches by Supabase. |
Three conflicts, resolved by evidence rather than by side-preference. scripts/ensure-codex-cloud-git-remote.mjs and tests/codex-cloud-setup.test.ts: took main's version. The branch carried its own fix for the same defect (5aa3d6c, judging origin safety from the configured remote URL) on top of main's #1497, so neither side was obviously newer. main's version introduces a configuredOriginUrl() helper, already covers the url.*.insteadOf case the branch's extra test was written for, and passes 12/12 locally — verified before choosing, since taking a side wholesale is only safe when the other side's content is genuinely subsumed. This also clears the two codex-cloud-setup failures this branch has carried all session. docs/outstanding-issues.md: fifth id collision on this branch. main has since claimed #151-#153 — the exact ids these rows previously held — and now runs to #164. main's rows are kept and the follow-ups renumber to #165 (adopt a consolidated answer-home notice block), #166 (answer mode ships no verify-before-use caveat) and #167 (verify:pr-local exits 0 when its build step refuses to run), with their three cross-references and the marker (168) following. check:outstanding-issues: 165 rows (50 open, 115 archived), unique ids, next-id=168 above the highest, no ids deleted from base 23465d5. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
Sixth conflict on this branch, and the first that is not the issues ledger: main added a search-band-directions mockup to the same chrome-suppression predicates in mockups-layout-client.tsx that this branch extends. Resolved as a union — main's isSearchBandDirectionsMockup alongside this branch's isWarningConsolidationMockup, isWarningLineMockup and isAnswerHomeProposalMockup. Dropping either side would silently restore the shared composer over a study that draws its own, which is the failure these flags exist to prevent. Verified all four are declared once and referenced in both the searchComposerVisible and chromeVisible predicates. The ledger merged cleanly this time: main's marker is still 165, so the #165-#167 renumber from the previous merge still sits above it. check:outstanding-issues: 165 rows (50 open, 115 archived), unique ids, next-id=168 above the highest, no ids deleted from base f6f4833. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/components/warning-line-mockups.tsx (1)
19-20: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winConsider a single shared source for the pinned governance strings.
OBLIGATIONandPRIVACY_LINKare declared independently in this file, inwarning-consolidation-mockups.tsx, and inanswer-home-proposal-mockups.tsx. All three copies must stay byte-identical to the text pinned bytests/privacy-ui.test.ts. Extracting them to one shared module (for example next tosrc/lib/ui-copy.ts, already referenced in these files' comments) would remove the risk of one copy drifting from the pinned wording while the others do not.♻️ Proposed shared-constants extraction
// src/lib/warning-notice-copy.tsexportconstPINNED_OBLIGATION="Do not enter patient-identifiable information.";exportconstPINNED_PRIVACY_LINK="Privacy and data processing";-const OBLIGATION = "Do not enter patient-identifiable information.";-const PRIVACY_LINK = "Privacy and data processing";+import { PINNED_OBLIGATION as OBLIGATION, PINNED_PRIVACY_LINK as PRIVACY_LINK } from "`@/lib/warning-notice-copy`";🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/components/warning-line-mockups.tsx` around lines 19 - 20, Extract the shared governance strings into one module, such as warning-notice-copy.ts, exporting symbols for the pinned obligation and privacy link text. Update the declarations and usages in warning-line-mockups.tsx, warning-consolidation-mockups.tsx, and answer-home-proposal-mockups.tsx to import those shared symbols, preserving the exact byte-identical wording required by tests/privacy-ui.test.ts.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/outstanding-issues.md`:
- Line 148: Update the stale renumbering reference within row `#165` so it no
longer points to unrelated rows: replace the inline `#156/`#157/#158 sequence with
the current `#165/`#166/#167 identifiers, or remove that historical renumbering
clause while preserving the rest of the row.
---
Nitpick comments:
In `@src/components/warning-line-mockups.tsx`:
- Around line 19-20: Extract the shared governance strings into one module, such
as warning-notice-copy.ts, exporting symbols for the pinned obligation and
privacy link text. Update the declarations and usages in
warning-line-mockups.tsx, warning-consolidation-mockups.tsx, and
answer-home-proposal-mockups.tsx to import those shared symbols, preserving the
exact byte-identical wording required by tests/privacy-ui.test.ts.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 24af28ba-14ee-4753-b36e-b8eae069e02e
📒 Files selected for processing (10)
docs/branch-review-ledger.mddocs/outstanding-issues.mddocs/site-map.mdsrc/app/mockups/answer-home-proposal/page.tsxsrc/app/mockups/mockups-layout-client.tsxsrc/app/mockups/warning-consolidation/page.tsxsrc/app/mockups/warning-line/page.tsxsrc/components/answer-home-proposal-mockups.tsxsrc/components/warning-consolidation-mockups.tsxsrc/components/warning-line-mockups.tsx
Uh oh!
There was an error while loading. Please reload this page.
… rows CodeRabbit found row #165 claiming its follow-ups "were renumbered again to #156/#157/#158" — ids that now belong to unrelated rows on main. A reference that resolves to the wrong row is worse than none in a ledger whose whole job is to be followable later. Two fixes: - Dropped the renumbering trail entirely rather than updating it. It listed superseded ids that main has since reissued, and it went stale again on the very next sync; the row now states that renumbering happened and why, without naming numbers that no longer mean anything. - Corrected a second stale reference the earlier renumber missed: row #165 pointed at #157 for the privacy sign-off that variant F would need. That is the answer-mode caveat row, now #166. The earlier pass only rewrote three known cross-reference phrasings and did not catch this one. Verified by extracting every backtick id reference from the three rows: #165 and #166 now point at each other and #167 at #120, all live. check:outstanding-issues: 165 rows (50 open, 115 archived), unique ids, next-id=168 above the highest, no ids deleted from base 3b4872f. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NPyFcMfn1jMmphr6AqiWBg
Uh oh!
There was an error while loading. Please reload this page.


Summary
Two design-scratch studies of the same problem: the answer-mode hero stacks three notices below the composer — the APP-5 privacy warning (11px muted), a bare
/privacylink, and the accent-blue scope footer (14px semibold) — in three type sizes with two opposing shield icons (ShieldAlertamber vsShieldCheckblue, ~40px apart). The least important of the three, the capability claim, is visually the loudest. Nothing on the screen says the answer is generated and must be checked./mockups/warning-consolidation— first pass, "one block instead of three." Three consolidations at desktop 1440 and phone 390, beside the current stack for comparison: 01 Assurance bar (one row, descriptive half behind aDetailsdisclosure, wraps rather than clipping so a safety line is never truncated), 02 Safety card (two tiers — obligation on a warning-tinted top row, everything descriptive in one grey voice below; single shield metaphor), and 03 Quiet footnote (one centred grey sentence with an inline expander). Recommendation: 02 on the hero, 01 on the docked composer — the same content model at two densities, so one component with adensityprop covers both./mockups/warning-line— second pass, "words only, one line." No icon, no border, no tint, no background. Six variants A–F, each a single paragraph under the composer. Line counts are measured from the rendered DOM, not asserted: only B (middot clauses), D (obligation + verify) and F (compressed obligation) hold one line at desktop width, and none do on a 390px phone while the pinned APP-5 sentence stays verbatim. Recommendation: D — the only compliant variant that is both one line and keeps hierarchy, achieved by dropping the scope claim, which is a capability statement already visible on the answer itself.mockups-layout-client.tsx), since each study draws its own composer and the notice under study is the one the shared composer renders.docs/site-map.mdfor the two new routes.docs/outstanding-issues.md—#151(adopt a consolidated notice block),#152(answer mode ships no verify-before-use caveat, which stands independently of any redesign) and#153(verify:pr-localexits 0 when its own build step refuses to run).The two pinned governance strings —
Do not enter patient-identifiable information.and thePrivacy and data processinglink to/privacy— are reproduced verbatim in every concept except F, which shortens the obligation to show what a single phone line would actually cost and is labelled on the page as requiring governance sign-off rather than presented as freely available. Both studies state the constraint on their face so a later reader cannot mistake it for a design preference.No production surface changes. Mockups 404 in production (
mockupsEnabled()), andclassifyPullRequestFilesreturnsclinicalRisk: false,operationalRisk: false,ragRanking: false,ui: truefor this diff.Verification
npm run verify:pr-local— 434 test files / 4563 passed, 4 skipped. Its conditional build step self-skipped on the first run (Refusing to run next build while Clinical KB dev server is running), sonpm run buildwas re-run separately with the dev server stopped: build completed andClient bundle secret surface check passed.That silent self-skip is now tracked as#153.npm run lint(--max-warnings 0) andnpm run typecheck— clean, exit 0npm run sitemap:check— clean aftersitemap:updatetests/route-reachability.test.ts— 5 passednpm run check:outstanding-issues—151 rows (58 open, 93 archived), unique ids, next-id=154 above the highest, no ids deleted from basenpx prettier --check .—All matched files use Prettier code style!<span>) is fixed and the thread resolved: every instance now renders<Link href="/privacy">, verified in Chromium as focusablea[href="/privacy"]anchors, up from zero.UI verification not run:
npm run verify:uicovers production journeys, and this diff adds only design-scratch routes that 404 in production and touches no shipped component. Direct browser rendering at both breakpoints is the proof above.Red checks seen on this PR, none caused by the diff:
Static PR checkshit itstimeout-minutes: 20mid-typecheck onbf4328f. A timed-out job reports ascancelled, so the aggregate emitted its stock "superseded" message even though no newer push existed. Identical content clearedstatic-prin 2m 27s earlier the same day.ui-phone-scrollphone-chrome test failed once on9b4bea1with 120 others passing; it passed locally against a production build in 7.4s and passed again on the next CI run with no code change. Not quarantined — repo policy needs three reproductions on one SHA.PR requiredcancellations from branch syncs cancelling near-complete runs (main's own#145), and fourdocs/outstanding-issues.mdid collisions asmainclaimed#141–#150across one day (#133). Each collision was resolved by renumbering the incoming rows per the ledger's own rule, never by taking one side wholesale;main's row ids were verified present after every resolution.Risk and rollout
docs/site-map.md), append-only ledger rows, and two route-specific branches in the mockup layout client.Clinical Governance Preflight
Not applicable to this diff, and deliberately not half-filled: nothing here reaches ingestion, answer generation, search/ranking, source rendering, document access, privacy behaviour, production env, or clinical output. Both studies reproduce governance copy as static text in routes that 404 in production.
That preflight does become required for the follow-up that adopts any concept (
#151), and that follow-up is a governance change as much as a design one:PrivacyInputNoticeis the single site-wide APP-5 line and renders on the answer, documents, and calculators composers — consolidating it changes all three.#152).tests/privacy-ui.test.tsalongside a privacy decision.tests/privacy-ui.test.ts,tests/ui-accessibility.spec.ts, and the phone-chrome reserve coverage all assert against the current markup and would need updating together.Notes
Summary by CodeRabbit
New Features
Documentation