Skip to content

Tighten the mode-home hero rhythm and put its glyphs on the icon scale - #1815

Merged
BigSimmo merged 18 commits into
mainfrom
claude/spacing-icon-design-review-rxwh28
Aug 12, 2026
Merged

Tighten the mode-home hero rhythm and put its glyphs on the icon scale#1815
BigSimmo merged 18 commits into
mainfrom
claude/spacing-icon-design-review-rxwh28

Conversation

@BigSimmo

@BigSimmoBigSimmo commented Aug 11, 2026

Copy link
Copy Markdown
Owner

Summary

  • Reserve the phone hero copy height once, on the pair, not on each half.ModeHomeHero reserved two line-boxes on the heading and two on the subtitle (max-sm:min-h-[2lh] on each) and centred each element inside its own reserve. With a one-line title, half of each element's unused reserve collected between them: measured at 393px the subtitle sat 27.1px from its own title while the medallion sat 6px away, so the pair that should read as one unit was spread wider than the group boundary above it. Reserving once on the wrapping group moves the slack outside the pair, which now holds its declared 4px (2.4px of rendered text gap) at every width.
  • Band that reserve to the measured wrap points. Rendering all 13 src/lib/ui-copy.ts title/subtitle pairs across 320–440px gives 2+2 lines below 323px, 2+1 through 411px, and 1+1 from 412px. The old flat reserve assumed the 320px worst case everywhere, spending 20px of dead space at 393px and 49px at 430px for no stability gain. Cross-mode wrapper height is unchanged within each band, so the mode toggle still cannot shift the composer.
  • Scale the hero medallion continuously. The tile stepped 48 → 48 → 56 at sm/lg, which served the 768–1023px tablet band the phone size while the heading beside it had already grown to 34.56px. New --spacing-hero-medallion tracks the viewport the way --text-hero does; its 3rem floor is load-bearing because tests/ui-tools.spec.ts pins the tile at exactly 48px at 390px across seven mode homes, and that floor holds through 430px.
  • Fix the soft phone composer glyphs. The max-width: 430px block forced .chat-composer-icon-button svg / .chat-send-button svg to 1.1rem (17.6px). Lucide draws on a 24-unit grid with a 2px stroke, so a fractional box lands every stroke on a sub-pixel boundary. They now use var(--spacing-icon-lg) (20px) — the same size these glyphs already had from 431px up. The pinned 44px button and the dock height that block protects are untouched.
  • Move this surface's glyphs onto the named icon scale. Hero glyph, header Menu/ChevronDown/X/MessageSquarePlus, the mode pill and the mode-action + move to size-icon-*; the hero's old lg:h-7 (28px) was not on the scale at all. The largest and smallest glyphs get a size-matched strokeWidth so absolute stroke weight stops swinging 1.17px–2.33px across one screen.
  • Reclaim the privacy notice's dead space without touching its tap target or wording. The wrapped /privacy link spent a full 48px tap box on a 16px line. The negative margin is deliberately bottom-only: split symmetrically (-my-2) the box overhangs the line above by 8px, and because that line is only 16px tall the overhang reaches its centre — verified by elementFromPoint, tapping the "Do not enter patient-identifiable information." sentence navigated to /privacy. Bottom-only keeps the full 48px target, reclaims the same 16px, and leaves the sentence inert. The APP-5 wording and the /privacy href are unchanged.
  • Re-measure the composer reserve. With that 16px reclaimed the settled phone composer block measures 106px, so --spacing-mode-home-composer-phone drops 7.625rem → 6.625rem and its pin in tests/search-route-ownership.test.ts moves with it. Every width now reserves exactly its natural height (dead band 0 at 320/360/375/390/393/430/640/768/1024/1280/1440). The wide value was already exact and is unchanged.
  • New regression pins.tests/shared-home-empty-state.dom.test.tsx asserts the reserve sits on the copy wrapper and not on either child, and that the three measured bands stay in globals.css, so a copy edit that pushes a mode onto another line fails loudly instead of silently reintroducing the jump.

Verification

  • npm run verify:pr-local

It completed check:runtime, check:installed-lock-parity, format:changed, lint and typecheck, then halted at test on a single pre-existing failure unrelated to this diff, so build and check:rag:fixtures were not reached. Both were then run directly and passed:

Offline RAG fixture and manifest validation passed (36 golden cases, 23 suites).
[bundle-budget] production (what users download, 101 routes): 1293.0 KiB gzip — baseline 1279.1 KiB, within tolerance.

The pre-existing failure is tests/pr-handoff-stop.test.ts > emits handoff context only when the marker file exists. It chmods a git dir to 0o555 and expects the marker write to fail, but this container runs as uid 0 and root bypasses file-permission checks, so the write succeeds. It reproduces identically on the base commit with this branch's changes stashed. Full suite otherwise: Test Files 1 failed | 555 passed (556), Tests 1 failed | 6043 passed | 4 skipped (6048).

Design-system gates, all offline and all green:

✓ icon-scale: no retired 4.5 (18px) half-step icon sizes in src.
✓ type-scale: no arbitrary text-[<n>px|rem|em] font sizes in src.
Design-system contract passed (709 production files; raw colors 2; literal shadows 0; legacy tap classes 0; edge conflicts 27; 1px shadow spreads 2).
Scale ratchets: raw padding literals 65; raw radius literals 24; raw gap literals 32; raw line-height literals 3.
  • npm run verify:ui when UI, routing, styling, browser behavior, reduced-motion, or forced-colors behavior changed

UI verification not run: this container cannot launch the pinned Playwright build (repo Playwright wants Chromium r1234, the image ships r1194 — the #255 drift, where the repo's own guidance is to delegate browser proof to CI Production UI rather than force a mismatched binary). Chromium measurement was done against the image's r1194 binary, since layout geometry is unaffected by the browser revision, and is quoted throughout this PR; that is measurement evidence, not the blocking gate. verify:phone-chrome escalates to the full verify:ui for any globals.css or master-search-header.tsx change, so the complete Chromium gate needs to come from CI Production UI on this PR.

  • npm run verify:release before release or handoff confidence claims

Not run — no release or handoff confidence is claimed here, and it is provider-backed.

  • npm run eval:retrieval:quality — not applicable: classifyPullRequestFiles reports ragRanking: false and no retrieval, ranking, selection, chunking or scoring behaviour is touched.
  • npm run eval:rag / npm run eval:quality — not applicable: answer generation, the synthesis prompt and answer post-processing are untouched.
  • npm run check:production-readiness — not run: provider-backed, and this diff changes presentation geometry only. No clinical workflow, environment, Supabase, source-governance or deployment behaviour changes.
  • npm run check:deployment-readiness — not applicable: no deployment startup, hosting or rollout behaviour changed.

Risk and rollout

  • Risk: Presentation-only, and the riskiest part is the phone copy reserve, because under-reserving reintroduces the cross-mode layout jump stabilizePhoneCopy exists to prevent. That is measured rather than assumed: wrapper height is stable across mode copy within every band at 320/360/393/430/768/1024/1440, no horizontal overflow at any of those widths including the 320px blocking acceptance width, and the medallion resolves to exactly 48px at 390px where the suite pins it. The band thresholds are copy-dependent, which is why the new test pins them. Residual risk is that only CI can run the blocking Chromium journeys.
  • Rollback: Single self-contained commit — git revert restores the previous reserve, gaps, medallion steps and glyph sizes together. No data, schema or config migration is involved.
  • Provider or production effects: None. No provider-backed command was run, and no OpenAI, Supabase, Railway or hosted-CI state was touched.

Clinical Governance Preflight

  • Source-backed claims still require linked source verification before clinical use — unchanged. This diff alters spacing, icon sizing and one tap-target margin; it touches no answer, citation or source-rendering path.
  • No patient-identifiable document workflow was introduced or expanded without explicit governance approval — none introduced or expanded. The APP-5 notice's wording and its /privacy link are byte-identical; the change makes the "Do not enter patient-identifiable information." sentence more correct by removing an 8px overhang that made it navigate to /privacy when tapped.
  • Supabase target remains Clinical KB Database (sjrfecxgysukkwxsowpy) — unchanged; no Supabase configuration, env value or migration is in this diff.
  • Service-role keys and private document access remain server-only — unchanged. No key handling, auth, or document-access code is touched, and the production build's client bundle secret surface check passed.
  • Demo/synthetic content remains clearly separated from real clinical sources — unchanged. No demo-mode or corpus code is touched; the separation in src/lib/demo-data.ts and isDemoMode() is untouched.
  • Source metadata, review status, and outdated/unknown-source behavior remain conservative — unchanged. No source-governance, metadata or review-status logic is in this diff, so the conservative degradation behaviour is preserved.
  • Deployment classification/TGA SaMD impact was checked when clinical decision-support behavior changed — checked and not applicable: no clinical decision-support behaviour changes. The diff alters only visual rhythm and icon geometry, so the classification is unaffected.

Notes

  • The committed pixel baselines for this surface (tests/__screenshots__/linux/dashboard-shell-phone.png, dashboard-shell.png) will drift. The visual-baseline job runs on push/schedule/dispatch only — deliberately not on pull_request or merge_group, and not in pr-required — with pixel drift soft-failed, so this will not block the PR. Refresh post-merge with npm run design-system:baselines:adopt against that run's artifact.
  • The desktop composer-width alignment considered during planning was evaluated in Chromium at 1024px and 1440px and dropped: the slot is capped below the 42rem hero measure until ~1344px, and at 1440px the composer's width reads as intentional against the prompt row it contains. It was cosmetic and separable, so it is not in this diff.
  • next dev rewrites a generated block into AGENTS.md whenever the dev server runs (node_modules/next/dist/server/lib/generate-agent-files.js). That is unrelated to this change and was reverted rather than folded into this PR; it will keep reappearing for anyone running the dev server.

Generated by Claude Code

Summary by CodeRabbit

  • New Features

    • Added related-search suggestions to differential, medication, and formulation results.
    • Section navigation now scrolls horizontally, with improved active-section visibility and focus restoration.
    • Added breadcrumbs and clearer headings to specifier pages.
  • Improvements

    • Refined home-page hero spacing, medallion sizing, phone composer layout, and icon sizing.
    • Updated medication navigation labels, including “More.”
    • Simplified phone search hints and removed the suggestion ticker.
  • Bug Fixes

    • Improved search navigation state restoration and responsive privacy-link spacing.
    • Search matching now prioritizes explicit matches rather than typo-based fuzzy results.

The Answer home read as a loose, unresolved stack on a phone and its glyphs
looked soft. Measured in Chromium rather than judged by eye, four of those
impressions were defects in code.
Reserve the phone copy height once, on the pair
-----------------------------------------------
ModeHomeHero reserved two line-boxes on the heading AND two on the subtitle
(`max-sm:min-h-[2lh]` on each) and centred each element in its own reserve.
With a one-line title, half of each element's unused reserve collected between
them: at 393px the subtitle sat 27.1px from its own title while the medallion
sat 6px away, so the pair that should read as one unit was spread wider than
the group boundary above it. Reserving once on the wrapping group puts the
slack outside the pair, which now holds its declared 4px (2.4px of rendered
text gap) at every width.
The reserve is also banded to the measured wrap points instead of assuming the
320px worst case everywhere. Rendering all 13 ui-copy pairs across 320-440px
gives 2+2 lines below 323px, 2+1 to 411px and 1+1 from 412px, so the old flat
reserve spent 20px of dead space at 393px and 49px at 430px for no stability
gain. Cross-mode height is unchanged within each band, so the toggle still
cannot shift the composer.
Scale the medallion continuously
--------------------------------
The tile stepped 48 -> 48 -> 56 at sm/lg, which served the 768-1023px tablet
band the phone size while the heading beside it had already grown to 34.56px.
--spacing-hero-medallion tracks the viewport the way --text-hero does. The 3rem
floor is load-bearing: ui-tools.spec.ts pins the tile at exactly 48px at 390px
across seven mode homes, and the floor holds through 430px.
Icon quality
------------
The phone composer forced its glyphs to 1.1rem (17.6px); lucide draws on a
24-unit grid with a 2px stroke, so every stroke landed on a sub-pixel boundary
and the "+" and send glyphs rendered soft. They now use --spacing-icon-lg
(20px), the same size they already had from 431px up. The hero glyph, header
Menu/ChevronDown/X/MessageSquarePlus, the mode pill and the popup "+" move onto
size-icon-* (the hero's 28px lg step was not on the scale at all), and the two
largest/smallest glyphs get size-matched strokeWidth so absolute stroke weight
stops swinging 1.17px-2.33px across one screen.
Privacy notice
--------------
The wrapped link spent a full 48px tap box on a 16px line. The negative margin
is bottom-only: split symmetrically it overhangs the line above by 8px, and
because that line is 16px tall the overhang reaches its centre, so tapping the
"Do not enter patient-identifiable information." sentence navigated to
/privacy. Bottom-only keeps the 48px target ui-accessibility.spec.ts measures,
reclaims the same 16px, and leaves the sentence inert. Governance wording and
the /privacy href are untouched.
That 16px is why --spacing-mode-home-composer-phone drops to 6.625rem: the
settled phone composer block measures 106px, so the old 122px left an empty
band. Every width now reserves exactly its natural height.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VX8tTx165iiKXz78uHb8J1
@coderabbitai

coderabbitaiBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3968a7d8-c7b6-47ee-ba07-c01586ca2b73

📥 Commits

Reviewing files that changed from the base of the PR and between 9882600 and 224b733.

📒 Files selected for processing (9)
  • docs/branch-review-ledger.md
  • docs/design-system/adoption-manifest.json
  • src/app/globals.css
  • src/components/clinical-dashboard/evidence-panels.tsx
  • src/components/formulation/formulation-home-page.tsx
  • src/components/mode-home-template.tsx
  • tests/favourites-auth-gate.dom.test.tsx
  • tests/shared-home-empty-state.dom.test.tsx
  • tests/ui-smoke.spec.ts
🚧 Files skipped from review as they are similar to previous changes (9)
  • tests/favourites-auth-gate.dom.test.tsx
  • src/components/formulation/formulation-home-page.tsx
  • src/components/clinical-dashboard/evidence-panels.tsx
  • tests/shared-home-empty-state.dom.test.tsx
  • docs/branch-review-ledger.md
  • docs/design-system/adoption-manifest.json
  • src/app/globals.css
  • tests/ui-smoke.spec.ts
  • src/components/mode-home-template.tsx

📝 Walkthrough

Walkthrough

This change updates design-token contracts and shadow usage, removes fuzzy search fallbacks, changes universal-search placement, replaces the medication section rail, refines responsive layouts, adds breadcrumb headers, and standardizes Node 24 container validation.

Changes

Application, design-system, and tooling updates

Layer / File(s)Summary
Design-system contracts and runtime requirements
.design-sync/conventions.md, docs/design-system/*, scripts/design-system-contract-baseline.json, Dockerfile*, worker/validate-runtime.ts
Defines --shadow-tight as an alias for --e1, updates design-system records and baselines, and standardizes container and runtime validation on Node 24.
Search matching and related-results flow
src/lib/*search*, src/components/clinical-dashboard/*, src/components/formulation/*, tests/*search*, tests/audit-navigation-auth-regressions.test.ts
Removes fuzzy matching fallbacks, preserves submitted search state in mode links, and adds or relocates universal related-match rendering.
Navigation and responsive layout
src/components/in-page-nav/*, src/components/mode-nav/*, src/components/specifiers/*, src/components/mode-home-*, src/app/globals.css, tests/*
Replaces the section overflow sheet with a horizontal rail, localizes mode-slot rendering, adds specifier breadcrumbs, and updates responsive hero, composer, icon, and privacy spacing.
Shadow-token migration across UI surfaces
src/components/**, src/app/mockups/*, src/components/ui/*, src/components/services/*, src/components/therapy-compass/*
Replaces legacy --e1 and shadow-e1 references with --shadow-tight across application, mockup, viewer, calculator, service, therapy, and shared UI surfaces.

Estimated code review effort: 4 (Complex) | ~60 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 18.92% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the primary hero-spacing and icon-scale changes in the pull request.
Description check✅ PassedThe description includes a detailed summary, verification results, risk and rollback details, governance preflight, and explanations for skipped checks.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/spacing-icon-design-review-rxwh28

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed: dependency version conflict. Check your lock file or package.json.


Comment @coderabbitai help to get the list of available commands.

@supabase

supabaseBot commented Aug 11, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project sjrfecxgysukkwxsowpy because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

Comment threadsrc/components/mode-home-page-skeleton.tsx Outdated

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:f8701a524f

ℹ️ 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".

Comment threadsrc/components/privacy-input-notice.tsx
@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

CI triage

CI failed on this PR. Automated classification of the 2 failed job(s):

  • Buildneeds investigation: inspect the failing step and uploaded diagnostics; rerun only after classifying the cause.
  • PR requiredneeds investigation: inspect the failing step and uploaded diagnostics; rerun only after classifying the cause.

Compared with main CI run #9791 (failure).

Classification is evidence routing, not permission to ignore a failure. Exact quarantined Playwright identities remain governed by the flake ledger.

@BigSimmo
BigSimmo enabled auto-merge August 11, 2026 11:35
@BigSimmo

Copy link
Copy Markdown
OwnerAuthor

Unblock summary for PR #1815

  • Head snapshot (post-push):c44c8a5 on claude/spacing-icon-design-review-rxwh28 (set as PR head via branch update).
  • Ahead/behind: origin/main...head =

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

🧹 Nitpick comments (2)
src/components/mode-nav/mode-nav.tsx (1)

64-101: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Move the new visual measurements into theme tokens.

The new arbitrary dimensions create separate design values outside the shared token contract.

  • src/components/mode-nav/mode-nav.tsx#L64-L101: Replace the new icon, badge, rule-offset, and rule-radius literals with named theme tokens.
  • src/components/in-page-nav/in-page-section-rail.tsx#L99-L99: Reuse the corresponding named badge-size token.

As per coding guidelines, **/*.{ts,tsx,css} requires: “Use Tailwind 4 @theme tokens in src/app/globals.css and the repository's intentionally unlayered component CSS rather than introducing hardcoded design values.”

🤖 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/mode-nav/mode-nav.tsx` around lines 64 - 101, Move the new
icon size, badge size, rule offset, and rule radius values used by the mode-nav
component into named Tailwind 4 theme tokens defined in the shared theme CSS,
then reference those tokens from the mode-nav classes. Update the badge sizing
in src/components/in-page-nav/in-page-section-rail.tsx:99 to reuse the same
named badge-size token; both affected sites require changes, with no remaining
hardcoded arbitrary design dimensions.

Source: Coding guidelines

tests/favourites-auth-gate.test.ts (1)

92-93: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Add a behavioral access test for UniversalSearchAlsoMatches.

These assertions only confirm that two identifiers exist in the source. The DOM authentication test mocks this component, so it does not execute the access gate. A dead or inverted gate can still pass.

Render UniversalSearchAlsoMatches for a user without Favourites access. Assert that it renders no Favourites result or Favourites href.

🤖 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 `@tests/favourites-auth-gate.test.ts` around lines 92 - 93, Add a behavioral
test that renders UniversalSearchAlsoMatches with a user lacking Favourites
access and verifies the output contains neither a Favourites result nor a
Favourites href. Keep the existing source-identifier assertions, but ensure the
new test exercises the real component and access gate rather than the mocked DOM
authentication path.
🤖 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 @.design-sync/conventions.md:
- Around line 34-36: Update the earlier shadow-alias guidance in conventions.md
to remove the legacy-only and retirement language, and state that the supported
--shadow-* aliases, including --shadow-tight, follow the tier mappings defined
in the later alias list and docs/design-system.md. Preserve --shadow-inset as
bespoke.
In `@Dockerfile.worker`:
- Line 31: Update Dockerfile.worker to copy
scripts/check-installed-lock-parity.mjs into the image before both worker npm ci
commands, ensuring the postinstall hook can locate it in each worker install
stage.
In `@docs/branch-review-ledger.md`:
- Around line 884-886: Update the three ledger rows for 2026-08-11 to include
the decisive output line from each reported verification command, not just test
counts, gate names, or status labels. Preserve the explicit pre-existing
root-permission failure and the “verify:ui NOT run” status, and keep the
existing verification summaries unchanged apart from adding substantiating
command output.
In `@docs/design-system/GATES.md`:
- Line 116: Reconcile the design-system gate by removing --shadow-tight from
legacyShadowAliases if the token inventory and design direction establish it as
the canonical role alias for --e1. Update check:design-system-contract to
ratchet only the remaining legacy aliases, and revise the GATES.md row so new
--shadow-tight usage is allowed while existing legacy aliases remain blocking.
In `@docs/design-system/SPEC.md`:
- Around line 266-267: Update the `--shadow-focus` status wording in the alias
cleanup section of `SPEC.md` from completed deletion to scheduled deletion,
consistent with the open PR 9 entry and the planned status in `TOKENS.md`; leave
the PR 9 tracking entry unchanged.
In `@docs/outstanding-issues.md`:
- Around line 330-331: Update the issues:next-id marker in the
outstanding-issues ledger to 304, leaving the declared `#302` and `#303` rows
unchanged.
- Around line 298-299: Deduplicate the issue records in
docs/outstanding-issues.md so each issue has one canonical entry: remove or
archive the open `#261` row because it is already archived, and resolve the
duplicate `#284/`#296 root-container records by retaining one canonical issue and
eliminating the redundant open/archive entries. Update the affected open and
archived sections consistently without changing unrelated issue records.
In `@src/components/in-page-nav/in-page-nav-header.tsx`:
- Line 397: Update the sheet focus-return handling around returnFocusRef so it
does not always target sectionTriggerRef when that trigger is hidden at the sm
breakpoint. Use a visible active rail button as the fallback target, or close
the sheet when the trigger becomes hidden, while preserving sectionTriggerRef
for visible phone layouts.
In `@src/components/privacy-input-notice.tsx`:
- Around line 36-44: Update the privacy link’s className to remove the
sm:min-h-0 override, preserving min-h-tap at every breakpoint so the link
remains at the required tap size. If needed, adjust the surrounding composer
reserve separately without weakening the link’s minimum height.
---
Nitpick comments:
In `@src/components/mode-nav/mode-nav.tsx`:
- Around line 64-101: Move the new icon size, badge size, rule offset, and rule
radius values used by the mode-nav component into named Tailwind 4 theme tokens
defined in the shared theme CSS, then reference those tokens from the mode-nav
classes. Update the badge sizing in
src/components/in-page-nav/in-page-section-rail.tsx:99 to reuse the same named
badge-size token; both affected sites require changes, with no remaining
hardcoded arbitrary design dimensions.
In `@tests/favourites-auth-gate.test.ts`:
- Around line 92-93: Add a behavioral test that renders
UniversalSearchAlsoMatches with a user lacking Favourites access and verifies
the output contains neither a Favourites result nor a Favourites href. Keep the
existing source-identifier assertions, but ensure the new test exercises the
real component and access gate rather than the mocked DOM authentication path.
🪄 Autofix

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: b968d093-9d23-4669-8cdb-069b2d2d6833

📥 Commits

Reviewing files that changed from the base of the PR and between 45fd05c and 862bfb8.

📒 Files selected for processing (140)
  • .design-sync/conventions.md
  • AGENTS.md
  • Dockerfile
  • Dockerfile.worker
  • docs/branch-review-ledger.md
  • docs/design-system.md
  • docs/design-system/GATES.md
  • docs/design-system/HANDOVER-2026-08-07.md
  • docs/design-system/SPEC.md
  • docs/design-system/TOKENS.md
  • docs/design-system/adoption-manifest.json
  • docs/outstanding-issues.md
  • docs/redesign/02-design-direction.md
  • docs/redesign/permanent-colour-direction.md
  • docs/search-chrome-behaviour.md
  • scripts/design-system-contract-baseline.json
  • src/app/globals.css
  • src/app/mockups/answer-evidence-popups/page.tsx
  • src/app/mockups/mode-dropdown/page.tsx
  • src/components/ClinicalDashboard.tsx
  • src/components/DocumentViewer.tsx
  • src/components/applications-launcher-page.tsx
  • src/components/calculator-mockups/calculator-ui.tsx
  • src/components/calculator-mockups/directory-grid-mockup.tsx
  • src/components/calculator-mockups/guided-flow-mockup.tsx
  • src/components/calculator-mockups/search-page-mockup.tsx
  • src/components/calculators/calculator-ui.tsx
  • src/components/calculators/directory-grid.tsx
  • src/components/calculators/guided-flow.tsx
  • src/components/calculators/search-page.tsx
  • src/components/clinical-dashboard/ClinicalSidebar.tsx
  • src/components/clinical-dashboard/account-setup-dialog.tsx
  • src/components/clinical-dashboard/cross-mode-links.tsx
  • src/components/clinical-dashboard/dashboard-nav.tsx
  • src/components/clinical-dashboard/differentials-home.tsx
  • src/components/clinical-dashboard/document-search-results.tsx
  • src/components/clinical-dashboard/evidence-panels.tsx
  • src/components/clinical-dashboard/favourites-command-library-page.tsx
  • src/components/clinical-dashboard/favourites-hub.tsx
  • src/components/clinical-dashboard/favourites-library-nav.tsx
  • src/components/clinical-dashboard/global-search-shell.tsx
  • src/components/clinical-dashboard/master-search-header.tsx
  • src/components/clinical-dashboard/medication-nav-header.tsx
  • src/components/clinical-dashboard/medication-prescribing-workspace.tsx
  • src/components/clinical-dashboard/mode-action-popup.tsx
  • src/components/clinical-dashboard/settings-dialog.tsx
  • src/components/clinical-dashboard/signed-image.tsx
  • src/components/clinical-dashboard/universal-search-command-surface.tsx
  • src/components/differentials/diagnosis-map-panel.tsx
  • src/components/differentials/differential-detail-page.tsx
  • src/components/document-phone-fused-directions-mockups.tsx
  • src/components/document-phone-title-mockups.tsx
  • src/components/document-phone-title-refined-mockups.tsx
  • src/components/document-search-mockups.tsx
  • src/components/document-top-navigation-mockups.tsx
  • src/components/document-viewer/document-clinical-summary.tsx
  • src/components/document-viewer/non-pdf-source-preview.tsx
  • src/components/document-viewer/pdf-canvas-viewer.tsx
  • src/components/document-viewer/section-nav.tsx
  • src/components/dsm/dsm-comparison-page.tsx
  • src/components/dsm/dsm-differential-considerations-page.tsx
  • src/components/dsm/dsm-search-page.tsx
  • src/components/factsheets/factsheets-data.ts
  • src/components/factsheets/factsheets-search-page.tsx
  • src/components/favourites-page-mockups/favourites-page-mockup-page.tsx
  • src/components/forms/forms-search-results-page.tsx
  • src/components/formulation/formulation-builder-page.tsx
  • src/components/formulation/formulation-home-page.tsx
  • src/components/in-page-nav/in-page-nav-header.tsx
  • src/components/in-page-nav/in-page-section-rail.tsx
  • src/components/master-document-flow-mockups.tsx
  • src/components/mode-home-page-skeleton.tsx
  • src/components/mode-home-template.tsx
  • src/components/mode-nav/mode-nav.tsx
  • src/components/patient-safety-plan.tsx
  • src/components/phone-mode-sheet-yes-mockups.tsx
  • src/components/privacy-input-notice.tsx
  • src/components/privacy-live-signal-perfected-mockups.tsx
  • src/components/pwa-lifecycle.tsx
  • src/components/registry-record-loader.tsx
  • src/components/services/service-detail-page.tsx
  • src/components/services/services-navigator-page.tsx
  • src/components/settings-search-mockups/settings-search-mockup-page.tsx
  • src/components/source-overlay-redesign-mockups.tsx
  • src/components/specifiers/specifier-builder-page.tsx
  • src/components/specifiers/specifier-compare-page.tsx
  • src/components/specifiers/specifier-map-page.tsx
  • src/components/specifiers/specifier-ui.tsx
  • src/components/therapy-compass/bindings.tsx
  • src/components/therapy-compass/controls.ts
  • src/components/therapy-compass/data/select.ts
  • src/components/therapy-compass/screens/compare-screen.tsx
  • src/components/therapy-compass/screens/detail-screen.tsx
  • src/components/therapy-compass/screens/other-screen.tsx
  • src/components/therapy-compass/screens/recommend-screen.tsx
  • src/components/therapy-compass/screens/sheets-screen.tsx
  • src/components/tools-page-mockups/rectangle-direction-mockups.tsx
  • src/components/tools-page-mockups/split-pane-refined-mockups.tsx
  • src/components/tools-page-mockups/task-directory-mockup.tsx
  • src/components/tools-page-mockups/tools-page-mockup-page.tsx
  • src/components/ui-primitives.tsx
  • src/components/ui/button.tsx
  • src/components/ui/document-frame.tsx
  • src/components/ui/segmented-control.tsx
  • src/components/universal-search-redesign-mockups.tsx
  • src/lib/catalog-search.ts
  • src/lib/formulation.ts
  • src/lib/mode-secondary-navigation.ts
  • src/lib/specifiers.ts
  • src/lib/tailwind-merge.ts
  • src/lib/therapies.ts
  • tests/audit-navigation-auth-regressions.test.ts
  • tests/catalog-search.test.ts
  • tests/design-token-contract.test.ts
  • tests/differentials-compare-selection.dom.test.tsx
  • tests/factsheets-data.test.ts
  • tests/favourites-auth-gate.dom.test.tsx
  • tests/favourites-auth-gate.test.ts
  • tests/favourites-empty-state.dom.test.tsx
  • tests/formulation.test.ts
  • tests/helpers/style-contracts.ts
  • tests/in-page-nav-route-sections.dom.test.tsx
  • tests/medication-prescribing-workspace.dom.test.tsx
  • tests/mode-menu-prefetch.dom.test.tsx
  • tests/mode-nav-contract.test.ts
  • tests/mode-secondary-navigation.test.ts
  • tests/page-secondary-navigation.dom.test.tsx
  • tests/search-route-ownership.test.ts
  • tests/shared-home-empty-state.dom.test.tsx
  • tests/specifiers.test.ts
  • tests/style-contract-registry.test.ts
  • tests/tailwind-merge-config.test.ts
  • tests/therapy-card-preview.test.ts
  • tests/ui-overlap.spec.ts
  • tests/ui-overlay-css-contract.test.ts
  • tests/ui-route-coverage.spec.ts
  • tests/ui-smoke.spec.ts
  • tests/ui-specifiers.spec.ts
  • tests/ui-universal-search.spec.ts
  • worker/validate-runtime.ts
💤 Files with no reviewable changes (13)
  • src/components/clinical-dashboard/global-search-shell.tsx
  • tests/specifiers.test.ts
  • docs/design-system/HANDOVER-2026-08-07.md
  • tests/formulation.test.ts
  • src/lib/formulation.ts
  • src/lib/therapies.ts
  • tests/factsheets-data.test.ts
  • tests/ui-route-coverage.spec.ts
  • src/lib/specifiers.ts
  • src/components/ClinicalDashboard.tsx
  • src/components/therapy-compass/data/select.ts
  • tests/page-secondary-navigation.dom.test.tsx
  • tests/ui-universal-search.spec.ts

Comment thread.design-sync/conventions.md
Comment threadDockerfile.worker
Comment threaddocs/branch-review-ledger.md
Comment threaddocs/design-system/GATES.md
Comment threaddocs/design-system/SPEC.md
Comment threaddocs/outstanding-issues.md
Comment threaddocs/outstanding-issues.md
Comment threadsrc/components/in-page-nav/in-page-nav-header.tsx
Comment threadsrc/components/privacy-input-notice.tsx Outdated

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR combines mode-home hero/icon refinements with broader search, navigation, design-token, runtime, and container changes. The review found duplicate cross-mode results, an incorrect phone composer reserve, and a focus-restoration regression.

Changes:

  • Refines responsive hero spacing, medallion sizing, glyph scale, and composer geometry.
  • Expands cross-mode search and changes secondary navigation/search matching.
  • Reintroduces the --shadow-tight alias and standardizes its usage across UI surfaces.

Reviewed changes

Copilot reviewed 141 out of 141 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
worker/validate-runtime.tsPins worker to Node 24.
tests/ui-universal-search.spec.tsFormatting-only test change.
tests/ui-specifiers.spec.tsUpdates specifier headings.
tests/ui-route-coverage.spec.tsAllows new breadcrumbs.
tests/ui-overlay-css-contract.test.tsPins composer icon token.
tests/ui-overlap.spec.tsRemoves phone ticker assertions.
tests/therapy-card-preview.test.tsRemoves typo-search coverage.
tests/tailwind-merge-config.test.tsUpdates shadow-token fixture.
tests/style-contract-registry.test.tsClarifies parser regression context.
tests/specifiers.test.tsRemoves fuzzy-search coverage.
tests/shared-home-empty-state.dom.test.tsxAdds hero reserve contracts.
tests/search-route-ownership.test.tsUpdates phone composer reserve.
tests/page-secondary-navigation.dom.test.tsxRelaxes Find-link assertion.
tests/mode-secondary-navigation.test.tsUpdates navigation state behavior.
tests/mode-nav-contract.test.tsTracks renamed slot component.
tests/mode-menu-prefetch.dom.test.tsxMocks cross-mode results.
tests/medication-prescribing-workspace.dom.test.tsxIsolates cross-mode component.
tests/in-page-nav-route-sections.dom.test.tsxRemoves overflow/focus coverage.
tests/helpers/style-contracts.tsRevises ticker exemptions.
tests/formulation.test.tsRemoves typo-search coverage.
tests/favourites-empty-state.dom.test.tsxMocks cross-mode results.
tests/favourites-auth-gate.test.tsCovers cross-mode favourites gating.
tests/favourites-auth-gate.dom.test.tsxMocks cross-mode results.
tests/factsheets-data.test.tsRemoves typo-search expectation.
tests/differentials-compare-selection.dom.test.tsxMocks cross-mode results.
tests/design-token-contract.test.tsRestores shadow alias contract.
tests/catalog-search.test.tsRemoves fuzzy-search tests.
tests/audit-navigation-auth-regressions.test.tsAdds cross-mode mounting contracts.
src/lib/therapies.tsRemoves fuzzy therapy matching.
src/lib/tailwind-merge.tsRegisters medallion spacing token.
src/lib/specifiers.tsRemoves fuzzy specifier matching.
src/lib/mode-secondary-navigation.tsRoutes searches to mode homes.
src/lib/formulation.tsRemoves fuzzy formulation matching.
src/lib/catalog-search.tsDeletes fuzzy-search implementation.
src/components/universal-search-redesign-mockups.tsxUses shadow role alias.
src/components/ui/segmented-control.tsxUses shadow role alias.
src/components/ui/document-frame.tsxUses shadow role alias.
src/components/ui/button.tsxUses shadow role alias.
src/components/ui-primitives.tsxUpdates shared shadow recipes.
src/components/tools-page-mockups/tools-page-mockup-page.tsxUpdates mockup shadows.
src/components/tools-page-mockups/task-directory-mockup.tsxUpdates mockup shadows.
src/components/tools-page-mockups/split-pane-refined-mockups.tsxUpdates mockup shadows.
src/components/tools-page-mockups/rectangle-direction-mockups.tsxUpdates mockup shadows.
src/components/therapy-compass/screens/sheets-screen.tsxUpdates action shadow.
src/components/therapy-compass/screens/recommend-screen.tsxUpdates card shadow.
src/components/therapy-compass/screens/other-screen.tsxUpdates card shadow.
src/components/therapy-compass/screens/detail-screen.tsxUpdates action shadow.
src/components/therapy-compass/screens/compare-screen.tsxUpdates comparison shadow.
src/components/therapy-compass/data/select.tsRemoves fuzzy therapy matching.
src/components/therapy-compass/controls.tsUpdates control shadow.
src/components/therapy-compass/bindings.tsxUpdates segment shadow.
src/components/specifiers/specifier-ui.tsxRemoves old header; tokenizes taps.
src/components/specifiers/specifier-map-page.tsxAdds breadcrumb and explanatory header.
src/components/specifiers/specifier-compare-page.tsxAdds breadcrumb and explanatory header.
src/components/specifiers/specifier-builder-page.tsxRevises builder heading.
src/components/source-overlay-redesign-mockups.tsxUpdates mockup shadows.
src/components/settings-search-mockups/settings-search-mockup-page.tsxUpdates mockup shadows.
src/components/services/services-navigator-page.tsxUpdates service-surface shadows.
src/components/services/service-detail-page.tsxUpdates contact-tile shadow.
src/components/registry-record-loader.tsxUpdates action shadow.
src/components/pwa-lifecycle.tsxUpdates PWA notice shadows.
src/components/privacy-live-signal-perfected-mockups.tsxUpdates sticky-header shadow.
src/components/privacy-input-notice.tsxResizes icon and adjusts link classes.
src/components/phone-mode-sheet-yes-mockups.tsxUpdates selected-card shadow.
src/components/patient-safety-plan.tsxUpdates active/emergency shadows.
src/components/mode-nav/nav-slot-ink.tsxMoves underline radius to token.
src/components/mode-home-template.tsxRefines hero rhythm and icon scale.
src/components/mode-home-page-skeleton.tsxAligns skeleton with hero geometry.
src/components/master-document-flow-mockups.tsxUpdates mockup shadows.
src/components/in-page-nav/in-page-nav-header.tsxSimplifies section rail and focus return.
src/components/formulation/formulation-home-page.tsxAdds cross-mode matches.
src/components/formulation/formulation-builder-page.tsxUpdates builder shadows.
src/components/forms/forms-search-results-page.tsxUpdates result shadows.
src/components/favourites-page-mockups/favourites-page-mockup-page.tsxUpdates mockup shadows.
src/components/factsheets/factsheets-search-page.tsxUpdates action shadow.
src/components/factsheets/factsheets-data.tsRemoves fuzzy factsheet matching.
src/components/dsm/dsm-search-page.tsxUpdates comparison shadows.
src/components/dsm/dsm-differential-considerations-page.tsxUpdates action shadow.
src/components/dsm/dsm-comparison-page.tsxUpdates action shadow.
src/components/DocumentViewer.tsxUpdates document chrome shadows.
src/components/document-viewer/section-nav.tsxUpdates section-card shadow.
src/components/document-viewer/pdf-canvas-viewer.tsxUpdates PDF surface shadows.
src/components/document-viewer/non-pdf-source-preview.tsxUpdates preview affordance shadow.
src/components/document-viewer/document-clinical-summary.tsxUpdates summary icon shadows.
src/components/document-top-navigation-mockups.tsxUpdates mockup header shadow.
src/components/document-search-mockups.tsxUpdates mockup control shadows.
src/components/document-phone-title-refined-mockups.tsxUpdates pane shadow.
src/components/document-phone-title-mockups.tsxUpdates pane shadow.
src/components/document-phone-fused-directions-mockups.tsxUpdates pane shadow.
src/components/differentials/differential-detail-page.tsxUpdates compare-button shadow.
src/components/differentials/diagnosis-map-panel.tsxUpdates warning-badge shadow.
src/components/ClinicalDashboard.tsxRemoves ticker and favourites mount.
src/components/clinical-dashboard/signed-image.tsxUpdates image-action shadow.
src/components/clinical-dashboard/settings-dialog.tsxUpdates switch shadow.
src/components/clinical-dashboard/mode-action-popup.tsxUses icon-scale class.
src/components/clinical-dashboard/medication-prescribing-workspace.tsxAdds cross-mode matches.
src/components/clinical-dashboard/medication-nav-header.tsxRenames Additional section.
src/components/clinical-dashboard/master-search-header.tsxRemoves ticker and scales glyphs.
src/components/clinical-dashboard/global-search-shell.tsxRemoves ticker configuration.
src/components/clinical-dashboard/favourites-library-nav.tsxUpdates favourites shadows.
src/components/clinical-dashboard/favourites-hub.tsxUpdates hub shadows.
src/components/clinical-dashboard/favourites-command-library-page.tsxUpdates favourites shadows.
src/components/clinical-dashboard/evidence-panels.tsxUpdates selected-state shadow.
src/components/clinical-dashboard/document-search-results.tsxAdds cross-mode matches and shadows.
src/components/clinical-dashboard/differentials-home.tsxAdds cross-mode matches.
src/components/clinical-dashboard/dashboard-nav.tsxUpdates badge shadow.
src/components/clinical-dashboard/cross-mode-links.tsxUpdates hover shadow.
src/components/clinical-dashboard/ClinicalSidebar.tsxUpdates new-chat shadow.
src/components/clinical-dashboard/account-setup-dialog.tsxUpdates submit shadow.
src/components/calculators/search-page.tsxUpdates calculator shadows.
src/components/calculators/guided-flow.tsxUpdates result action shadow.
src/components/calculators/directory-grid.tsxUpdates search shadow.
src/components/calculators/calculator-ui.tsxUpdates score/option shadows.
src/components/calculator-mockups/search-page-mockup.tsxUpdates mockup shadows.
src/components/calculator-mockups/guided-flow-mockup.tsxUpdates mockup action shadow.
src/components/calculator-mockups/directory-grid-mockup.tsxUpdates mockup search shadow.
src/components/calculator-mockups/calculator-ui.tsxUpdates mockup control shadows.
src/components/applications-launcher-page.tsxUpdates launcher shadows.
src/app/mockups/mode-dropdown/page.tsxUpdates dropdown mockup shadows.
docs/search-chrome-behaviour.mdDocuments scrolling medication rail.
docs/redesign/permanent-colour-direction.mdRestores shadow alias guidance.
docs/redesign/02-design-direction.mdRestores shadow alias guidance.
docs/design-system/TOKENS.mdRevises shadow deprecations.
docs/design-system/SPEC.mdRevises shadow cleanup status.
docs/design-system/HANDOVER-2026-08-07.mdRemoves prior focus correction.
docs/design-system/adoption-manifest.jsonRemoves affected test mappings.
docs/design-system.mdUpdates shadow usage guidance.
docs/branch-review-ledger.mdRecords review and unblock entries.
Dockerfile.workerDowngrades worker image to Node 24.
DockerfileDowngrades app image to Node 24.
AGENTS.mdSimplifies generated Next.js guidance.
.design-sync/conventions.mdRestores shadow alias convention.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threadsrc/components/clinical-dashboard/document-search-results.tsx Outdated
Comment threadsrc/components/privacy-input-notice.tsx Outdated
Comment threadsrc/components/in-page-nav/in-page-nav-header.tsx
BigSimmoand others added 2 commits August 11, 2026 23:49
Restore the phone bottom-only -mb-4 privacy-link reclaim that the reduced
composer reserve assumes, cancel it on the calculators fixed dock so the
focus ring stays in-viewport, remove the duplicate documents Also Matches
mount under the dashboard owner, and restore section-sheet focus to a
visible rail control when the title disclosure is sm:hidden.
Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
@BigSimmo

Copy link
Copy Markdown
OwnerAuthor

Babysit summary — PR 1815

Tip:9882600811cfaa355b9fc161a2249701d4036311 on claude/spacing-icon-design-review-rxwh28
Base / sync:origin/main already merged on tip by 6f8c70dc (kept main’s switch tap-target structure + this PR’s shadow-tight thumb). Merge-tree vs origin/main: clean (behind 0 / ahead 14). Auto-merge remains armed (untouched).

Fixed

  • Restored phone privacy-link -mb-4 bottom-only reclaim that --spacing-mode-home-composer-phone assumes; calculators fixed dock cancels via [&_a]:mb-0 (Codex clip + Copilot missing reclaim).
  • Removed duplicate UniversalSearchAlsoMatches from document-search-results.tsx — dashboard remains the single owner.
  • Section-sheet focus restore is visibility-aware: falls back to active/first rail control when the title disclosure is sm:hidden.

Dispositioned (no code)

  • Sentry skeleton sm:gap-1.5 — already present / outdated.
  • CodeRabbit: conventions/GATES/--shadow-focus/outstanding-issues duplicate hygiene → deferred to DS tracks #261/#262 or shared-ledger hygiene; issues:next-id=304 already correct; sm:min-h-0 intentional for wide composer density; ledger rewrite of historical rows skipped (append-only).

Threads

All 13 previously unresolved review threads replied + resolved on this tip.

Required CI

Re-running on 98826008 after the fix push (expected: cancels the prior 6f8c70dc Production UI mid-flight). Prior tip had required checks green including Production UI shards + PR required; mergeability is MERGEABLE with clean merge-tree. Advisory ignored.

Local gates (decisive)

  • verify:cheapPASS (Test Files 556 passed; 6058 passed | 1 skipped)
  • verify:pr-localPASS (failed: (none); includes lint, typecheck, test, build, eval:rag:offlineOffline RAG fixture and production-contract checks passed / 574 passed)
  • Focused after cherry-pick onto remote merge tip: vitest privacy + in-page-nav — 28 passed

Residual risks

  • Exact ledger row for 98826008 left local/unpushed (avoid ledger-only tip); superseded provisional rows are in the pushed fix commit.
  • Physical Safari / installed-PWA and full verify:ui not re-run here (Playwright image drift / browser proof delegated to CI Production UI).
  • Auto-merge is armed — merge left to you / the armed path; this pass did not merge, force-push, rebase, or change auto-merge.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 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 `@Dockerfile.worker`:
- Around line 46-48: Add a production-compatible lock-parity validation after
the npm ci step that checks only the installed production dependency set without
requiring .codex-installed-tree.json or dev-only packages; wire it into the
Dockerfile using the copied check-installed-lock-parity.mjs helper, or remove
that helper copy and revise the surrounding comment if parity validation is
intentionally not needed.
🪄 Autofix

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: 653965f7-402e-42ea-84a0-2bed5c668715

📥 Commits

Reviewing files that changed from the base of the PR and between 862bfb8 and 9882600.

📒 Files selected for processing (16)
  • Dockerfile
  • Dockerfile.worker
  • docs/branch-review-ledger.md
  • src/app/globals.css
  • src/components/ClinicalDashboard.tsx
  • src/components/calculators/search-page.tsx
  • src/components/clinical-dashboard/document-search-results.tsx
  • src/components/clinical-dashboard/settings-dialog.tsx
  • src/components/in-page-nav/in-page-nav-header.tsx
  • src/components/mode-nav/nav-slot-ink.tsx
  • src/components/privacy-input-notice.tsx
  • src/components/ui/segmented-control.tsx
  • src/lib/tailwind-merge.ts
  • tests/in-page-nav-header.dom.test.tsx
  • tests/privacy-ui.test.ts
  • tests/ui-smoke.spec.ts
💤 Files with no reviewable changes (1)
  • src/components/clinical-dashboard/document-search-results.tsx
🚧 Files skipped from review as they are similar to previous changes (8)
  • src/components/clinical-dashboard/settings-dialog.tsx
  • src/components/ui/segmented-control.tsx
  • src/lib/tailwind-merge.ts
  • src/components/ClinicalDashboard.tsx
  • docs/branch-review-ledger.md
  • tests/ui-smoke.spec.ts
  • Dockerfile
  • src/app/globals.css

Comment threadDockerfile.worker
@BigSimmo

Copy link
Copy Markdown
OwnerAuthor

Review summary (babysit pr-1815):

  • tip: �0349a1fbb6f3861fb87364e9d9453ca9a0eba8b
  • merge-state: GH BLOCKED/MERGEABLE after push; merge-tree clean, merge-state snapshot clean versus origin/main
  • behind/ahead:

@BigSimmo

Copy link
Copy Markdown
OwnerAuthor

Babysit review (scope: exact babysit-pr)

Snapshot (current GitHub head): b0349a1fbb6f3861fb87364e9d9453ca9a0eba8b on branch claude/spacing-icon-design-review-rxwh28.

  • Merge state snapshot: mergeStateStatus=BEHIND, mergeable=true (per GitHub).
  • Mergeability/sync check: local merge-tree against origin/main is clean, no conflicts.
  • Diff scope reviewed for touched high-risk areas:
    • src/components/in-page-nav/in-page-nav-header.tsx
    • src/components/mode-home-page-skeleton.tsx
    • src/components/privacy-input-notice.tsx
    • src/components/clinical-dashboard/document-search-results.tsx
  • Threads: no unresolved actionable review threads found.
  • Fixes made in this sweep: none (all previously surfaced items appear already resolved; no new high-confidence defects found).
  • Required checks at head:
    • Remote: Unit coverage failing (PR required failed on this run), others pass/skipped.
    • Local proof: npm exec eslint on touched files ✅, npm exec vitest run tests/in-page-nav-header.dom.test.tsx tests/ui-accessibility.spec.ts tests/mode-nav-contract.test.ts ✅, npm run format -- --check <touched files> ✅.

Outcome: dispositioned (local PR review complete; no code fix required). Merge remains with you.

@BigSimmo

Copy link
Copy Markdown
OwnerAuthor

Babysit snapshot for PR #1815

  • PR tip: 42e10a2564f5a1f1d39dd3c1f9608304b2c74401
  • Branch: claude/spacing-icon-design-review-rxwh28
  • Mergeability: BEHIND on GitHub (mergeStateStatus)
  • Local main sync attempt: git merge refs/remotes/origin/main failed with fatal: refusing to merge unrelated histories in this worktree, so no local merge sync was applied. I kept scope strictly to the required fix and did not broaden this babysit.
  • Snapshot/decision: ledger:lookup --scope babysit --head 42e10a2564f5a1f1d39dd3c1f9608304b2c74401 -> ALREADY REVIEWED at this HEAD after append.

Fixes made

  • Updated tests/shared-home-empty-state.dom.test.tsx assertions to source from runtime copy (sharedHomePresentation.answer.title) instead of hard-coded legacy title text.
  • Adjusted shared home phone copy wrapper assertion to match current DOM layout.
  • Appended ledger row: docs/branch-review-ledger.md
    • Outcome: fixed
    • Checks: Unit coverage: targeted vitest passed: tests/shared-home-empty-state.dom.test.tsx (17 passed). PR required still blocked on pre-existing check failure at old remote head before sync.

Reviews / threads

  • Fetched review threads: all are currently marked isResolved: true.
  • No new open inline threads remain after this targeted fix.

Required checks currently running on head

  • Change scope: pass
  • PR policy: pass
  • PR mergeability (workflow): pass
  • Semgrep / Semgrep ingestion gate: pass
  • GitGuardian / Gitleaks: pass
  • Unit coverage: pending
  • Build, Static PR checks, Safety and config checks, Production UI critical, Advisory UI, Lighthouse budget, Container images / build-and-verify: pending
  • Semgrep: pending
  • Skips retained: Migration replay, Visual baselines (advisory), Refresh*, Supabase Preview, release-browser-matrix

Local proof

  • npm run test -- tests/shared-home-empty-state.dom.test.tsx (1 file)
    • Result: 17 passed
  • npm run format -- --check tests/shared-home-empty-state.dom.test.tsx docs/branch-review-ledger.md
    • Result: all matched files use Prettier code style

Push status

  • Pushed commit: fix(pr-1815): align shared-home empty-state assertions with updated copy
  • Commit: 42e10a2564f5a1f1d39dd3c1f9608304b2c74401
  • Branch now 1 commit ahead of remote branch base pointer.

Next blocker to clear is required CI completion.

@BigSimmo

Copy link
Copy Markdown
OwnerAuthor

Babysit review summary

  • Snapshot: reviewed at GitHub head 42e10a2564f5a1f1d39dd3c1f9608304b2c74401 (branch claude/spacing-icon-design-review-rxwh28, base main).
  • Merge state: BEHIND; mergeable MERGEABLE.
  • Performed one unblock step: refreshed refs/pull/1815/head and attempted sync against origin/main; no effective delta available locally.
  • Threads: all review threads are currently resolved (15 total, all isResolved: true).
  • Required checks: PR mergeability, PR policy, Static PR checks, Unit coverage, Safety and config checks, Lighthouse/Advisory/Production UI, Semgrep, Gitleaks, and GitGuardian are pass; Build is fail in Setup Node and dependencies and therefore PR required is fail.
  • Disposition: blocked on this pass due merge-state drift plus upstream CI blocker (PR required fails from Build), not a newly identified high-confidence code defect in the PR diff.
  • Next action: after PR author syncs base and re-runs checks (or provides a clean rerun of Build with logs), re-snapshot to confirm.

@BigSimmo
BigSimmo merged commit 4587f78 into mainAug 12, 2026
29 checks passed
@BigSimmo
BigSimmo deleted the claude/spacing-icon-design-review-rxwh28 branch August 12, 2026 04:38
BigSimmo pushed a commit that referenced this pull request Aug 13, 2026
Four merge-safe intake requests, no canonical ledger edit:
- P1 rec: no gate detects a merged PR whose content is silently
reverted by a later merge resolution. Blob sweep over origin/main
found seven such PRs since 2026-08-06, six first wiped at one
commit in the PR #1815 unblock chain. The reverts took each PR's
tests in the same stroke, which is why nothing went red.
- P2 task: re-land PR #1800 (fuzzy catalogue search) with the #310
one-edit cap applied in the same commit.
- P2 task: re-land PR #1803 (--shadow-tight retirement); 67 files on
main still reference the retired alias.
- update #310: re-scoped. The defect is not reachable on main because
the matcher is absent, not because it was fixed, so the row must not
be closed and the fix belongs in the #1800 re-land.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuYJz8hauCsCdx8r4fXiZU
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@BigSimmo@claude@cursoragent