Skip to content

fix(therapy): restore the shared search command surface on the Therapy home - #2160

Merged
BigSimmo merged 16 commits into
mainfrom
claude/therapy-lightweight-home-consistency-c14whb
Aug 19, 2026
Merged

fix(therapy): restore the shared search command surface on the Therapy home#2160
BigSimmo merged 16 commits into
mainfrom
claude/therapy-lightweight-home-consistency-c14whb

Conversation

@BigSimmo

@BigSimmo BigSimmo commented Aug 18, 2026

Copy link
Copy Markdown
Owner

Summary

  • Restore the shared search command surface on Therapy. Therapy was the only one of the 15 app modes with no entry in searchCommandSurfaceByMode (src/lib/search-command-surface.ts). UniversalSearchCommandSurface early-returns on a null config, so Therapy silently lost four shared affordances rather than the one that was reported: the phone "Try this / Tap to search" ticket, the sm+ "Smart search · Try …" rotating line, the sm+ prompt-chip row, and the entire desktop command dropdown (recents, cross-mode chips, typeahead). This affected both the shared home / in Therapy mode and the standalone /therapy-compass home. The new entry sets remoteSearchEnabled: false because Therapy reads the local generated catalogue — tests/search-command-surface.test.ts already pinned that expectation and passed only because the config was null. Every example was run through the real scorer (scoreTherapyCandidate) against the 205-record catalogue, so the ticket cannot advertise a query the catalogue has no answer for: trauma-focused CBT 188 matches, behavioural activation 30, insomnia 4.
  • Declare the hero composer placement for /therapy-compass (src/lib/search-shell-props.ts). It was the only standalone mode home not setting desktopSearchPlacement: "hero", which left it on a different composer code path from its twelve peers in the portal-fallback case. Gated on isStandaloneModeHome, so sub-routes are unaffected.
  • Use the canonical mode glyph on the standalone Therapy home (src/components/therapy-compass/screens/home-screen.tsx). It hard-coded a magnifier as the mode's identity medallion, so the same mode showed a different glyph depending on which door the clinician came through — the shared home, nav and the mode picker all render the compass from APP_MODE_ICON. It is now derived from that record rather than chosen locally.
  • Correct two stale comments in search-results-header-band.tsx and search-results-header-band.dom.test.tsx that cited "therapy-compass has no entry" as load-bearing rationale. The real reason that empty state offers no example is that no onTryExample handler is wired at the call site, which this PR does not change. Test coverage is widened to pin the whole mode set, so no future mode can silently lose the command surface the way Therapy did.

Verification

  • npm run verify:pr-local
PR-local verification summary:
- completed: check:runtime, check:installed-lock-parity, format:changed, lint, typecheck, test, build, check:rag:fixtures, check:medication-interactions, check:medication-lexicon-report
- failed: (none)
- not reached: (none)

Full unit suite inside that gate: Test Files 680 passed (680) / Tests 7371 passed | 4 skipped (7375).

UI verification not run: the container's Playwright browser revision is 1194 against the 1234 this install expects (the known installed-lock drift), so verify:ui cannot run here and browser proof is delegated to CI Production UI. Functional browser evidence was captured instead against the pre-installed Chromium and the running dev server, at 390px and 1280px:

  • /therapy-compass at 390px — ticket visible, reading TRY THIS | trauma-focused CBT | Tap to search; tapping it fills the composer with exactly the suggested query.

  • /therapy-compass at 1280px — ticket correctly hidden (phone-only), rotating hint line and prompt-chip row visible, exactly one visible composer.

  • /?mode=therapy-compass at 390px — the surface in the original report; the ticket now renders in the same position as the Answer and Calculators homes.

  • Hero glyph resolves to lucide lucide-compass, no longer the magnifier.

  • npm run eval:retrieval:quality — not applicable: no retrieval, ranking, selection, chunking, or scoring behaviour changed. This PR adds display-only suggestion strings.

  • npm run check:production-readiness — not applicable: no clinical workflow, privacy, environment, Supabase, source-governance, or deployment behaviour changed.

RAG impact: no retrieval behaviour change — this adds display-only example and suggestion strings to the command-surface catalogue and touches no ranking, retrieval, selection, or ordering code. classifyPullRequestFiles returns ragRanking: false for this diff.

Risk and rollout

  • Risk: Low, and confined to presentation. The change is one data entry plus two one-line configuration/derivation fixes. The one behavioural consequence worth naming is that Therapy's desktop command dropdown now renders where it previously did not; it is fed by the same local catalogue the mode already uses, with remote search explicitly disabled. Note that the committed pixel baseline tests/__screenshots__/linux/therapy-compass-home.png is captured at desktop 1280×900 clipped to #main-content, so it legitimately changes here (new sm+ hint row, compass glyph) and needs re-adoption from the CI artifact via npm run design-system:baselines:adopt — deliberately not regenerated locally, since the spec warns that laptop font hinting turns every later run red.
  • Rollback: git revert the change commit. No migration, no data change, no generated asset regenerated.
  • Provider or production effects: None. No OpenAI, Supabase, or hosted-CI call was made; the new entry explicitly sets remoteSearchEnabled: false.

Clinical Governance Preflight

  • Source-backed claims still require linked source verification before clinical use
  • No patient-identifiable document workflow was introduced or expanded without explicit governance approval
  • Supabase target remains Clinical KB Database (sjrfecxgysukkwxsowpy)
  • Service-role keys and private document access remain server-only
  • Demo/synthetic content remains clearly separated from real clinical sources
  • Source metadata, review status, and outdated/unknown-source behavior remain conservative
  • Deployment classification/TGA SaMD impact was checked when clinical decision-support behavior changed

The Therapy catalogue-wide review disclosure (TherapyReviewNotice) and the per-record review badges are untouched; this PR adds no clinical claim and changes no source, review status, or document-access behaviour.

Notes

A cross-mode consistency audit was run alongside this fix, as requested. The low-risk findings are fixed above; the remainder are reported for separate decisions. The most significant:

  • Two competing title systems disagree for 8 of 13 modes. sharedHomePresentation (src/lib/ui-copy.ts) drives /; standalone homes hard-code their own. Its own doc comment claims each entry "mirrors the mode's own standalone home … so a clinician sees the same words whichever door they came through", which is not true today — Documents/Clinical Documents, Forms/Clinical Forms, Therapy/Therapy Compass, and five more. Product copy decision, so not auto-fixed.
  • Three more homes override the canonical mode glyph (same class as the Therapy fix here, each needing its own visual-baseline check): services uses Users, forms uses FileText — identical to the Documents tile — and dictionary uses BookOpen.
  • Three standalone mode homes have no loading.tsx (/medications, /calculators, /dictionary) despite chrome invariant 18 requiring ModeHomeRouteLoading; tests/mode-home-loading-contract.test.ts lists only ten routes, so the contract test cannot catch it.
  • /tools on a phone is the only mode home with no visible "Do not enter patient-identifiable information." line — it is the sole route using the footer dock, and that path suppresses the notice. This matches the documented exception in docs/search-chrome-behaviour.md, but the docs do not record that the exception costs the governance copy. Worth a decision for a clinical product.
  • /favourites and /?mode=favourites render visibly different homes for the same mode; Tools and Favourites are bespoke homes whose hand-rolled composer slots also skip the SSR height reservation that chrome invariant 15 exists to enforce.
  • Smaller drift: three placeholder-punctuation conventions, inconsistent heading levels (Documents' home has an h2 and no h1), suggestion data duplicated across three unrelated sources, and docs/site-map.md's mode index covering 11 of 15 modes.

🤖 Generated with Claude Code

https://claude.ai/code/session_01W5HsA9TpWxAN6KbqFAx7GA

Summary by CodeRabbit

  • New Features

    • Added Therapy Compass search examples, categorized suggestions, and links to related areas.
    • Moved desktop search to the Therapy Compass hero area.
    • Standardized the Therapy Compass home icon.
  • Documentation

    • Recorded outstanding issues covering privacy messaging, inconsistent home-page content, loading states, layout shifts, titles, icons, favourites rendering, and duplicated suggestions.
  • Tests

    • Expanded coverage for search configuration and Therapy Compass search placement.

…y home

Therapy was the only one of the 15 app modes with no entry in
`searchCommandSurfaceByMode`. `UniversalSearchCommandSurface` early-returns on a
null config, so Therapy silently lost four shared affordances rather than one:
the phone "Try this / Tap to search" ticket, the sm+ rotating hint line, the
sm+ prompt-chip row, and the entire desktop command dropdown. This affected both
the shared home `/` in Therapy mode and the standalone `/therapy-compass` home.

Add the missing entry, with `remoteSearchEnabled: false` — Therapy reads the
local generated catalogue, and `tests/search-command-surface.test.ts` already
pinned that expectation (it passed only because the config was null). Every
example was run through the real scorer against the 205-record catalogue so the
ticket cannot advertise a query the catalogue has no answer for.

Two adjacent deviations found while auditing, both low-risk:

- `/therapy-compass` was the only standalone mode home not declaring
  `desktopSearchPlacement: "hero"`, leaving it on a different composer code path
  from its twelve peers in the portal-fallback case.
- The standalone home hard-coded a magnifier as its identity medallion, so the
  same mode showed a different glyph depending on the door. It now derives from
  APP_MODE_ICON, matching nav, the mode picker and the shared home.

Also correct two comments that cited "therapy-compass has no entry" as
load-bearing rationale; the real reason that empty state offers no example is
that no `onTryExample` handler is wired, which is unchanged here. Pin whole-set
coverage so no future mode can silently lose the command surface.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W5HsA9TpWxAN6KbqFAx7GA
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented Aug 18, 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: 4a8fe469-79f8-4124-b603-f186144b10e1

📥 Commits

Reviewing files that changed from the base of the PR and between efcccd4 and ad8c175.

📒 Files selected for processing (16)
  • docs/outstanding-issues-inbox/61d609ea-0f7c-4934-ab71-b9a972f5a7be.json
  • docs/outstanding-issues-inbox/6eb8b382-a129-4470-91ec-383bc580c25f.json
  • docs/outstanding-issues-inbox/72ec8611-0294-4e33-aa36-92668ed25cd6.json
  • docs/outstanding-issues-inbox/b10cb24d-17fa-40ca-b8bb-90eee806ea0a.json
  • docs/outstanding-issues-inbox/c09532b5-549c-47e0-a4b7-5977435d1d0f.json
  • docs/outstanding-issues-inbox/c196b2fd-fde1-482b-9cac-355cc2b4ee04.json
  • docs/outstanding-issues-inbox/db8e7ade-2f04-4255-b812-29900e801e47.json
  • docs/outstanding-issues-inbox/ef811fd9-df86-4a1f-bd5e-cd86233d251e.json
  • docs/outstanding-issues-inbox/fa9f768a-9eee-4a67-96b5-ded98afbecd9.json
  • src/components/clinical-dashboard/search-results-header-band.tsx
  • src/components/therapy-compass/screens/home-screen.tsx
  • src/lib/search-command-surface.ts
  • src/lib/search-shell-props.ts
  • tests/search-command-surface.test.ts
  • tests/search-results-header-band.dom.test.tsx
  • tests/search-shell-props.test.ts

Included review availability: 0 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 1 review per hour.


📝 Walkthrough

Walkthrough

The PR adds Therapy Compass search configuration, hero placement, canonical icon usage, exhaustive search-surface tests, updated empty-state comments, and nine outstanding-issue inbox records from a mode-home audit.

Changes

Therapy Compass search integration and audit records

Layer / File(s) Summary
Therapy search wiring
src/lib/search-command-surface.ts, src/lib/search-shell-props.ts, src/components/therapy-compass/screens/home-screen.tsx
Therapy Compass now has local examples, suggestions, cross-mode links, disabled remote search, hero search placement, and the shared mode icon.
Search validation and empty-state contract
tests/search-command-surface.test.ts, tests/search-results-header-band.dom.test.tsx, tests/search-shell-props.test.ts, src/components/clinical-dashboard/search-results-header-band.tsx
Tests cover all application-mode command surfaces and Therapy Compass behavior. Empty-state comments describe handler-dependent controls.
Outstanding-issue audit records
docs/outstanding-issues-inbox/*.json
Nine JSON records document mode-home privacy, copy, loading, layout-shift, title, icon, rendering, and suggestion-source findings.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Merge Risk: ⚪ Minimal · up to ad8c1

This PR restores Therapy’s shared search controls and aligns its standalone home presentation without changing retrieval, clinical content, permissions, or deployment behavior; no actionable merge-blocking risk remains after normal checks and review.

Possibly related PRs

Suggested labels: codex

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% 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 name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the primary change: restoring Therapy's shared search command surface.
Description check ✅ Passed The description covers the changes, verification results, UI limitation, risk, rollback, governance checks, RAG impact, and follow-up findings.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check 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/therapy-lightweight-home-consistency-c14whb

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.

@BigSimmo
BigSimmo enabled auto-merge (squash) August 18, 2026 21:58
@supabase

supabase Bot commented Aug 18, 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 ↗︎.

@BigSimmo
BigSimmo disabled auto-merge August 18, 2026 21:59
@BigSimmo
BigSimmo enabled auto-merge August 18, 2026 21:59
@BigSimmo BigSimmo changed the title fix(therapy): restore the shared search command surface on the Therap… fix(therapy): restore the shared search command surface on the Therapy home Aug 18, 2026
claude added 2 commits August 18, 2026 22:02
…uests

Eight merge-safe inbox requests recording the deviations found while auditing
the mode homes for the Therapy fix in this PR. The low-risk ones are already
fixed in the preceding commit; these are the remainder, which need either an
owner decision or their own visual-baseline work:

- competing title systems (sharedHomePresentation vs hard-coded standalone)
- three more homes overriding the canonical APP_MODE_ICON glyph
- three standalone homes with no loading.tsx, invisible to the contract test
- /tools phone dock suppressing the patient-identifiable-information warning
- /favourites rendering two different homes for one mode
- bespoke composer slots skipping the invariant-15 SSR height reservation
- placeholder/heading/doc-index copy drift
- suggestion data duplicated across three sources

Each is an immutable request file; docs/outstanding-issues.md itself is
untouched, so this cannot conflict with a concurrent ledger write. Run
npm run issues:reconcile from a serialized ledger branch after this lands.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W5HsA9TpWxAN6KbqFAx7GA
…consistency-c14whb' into claude/therapy-lightweight-home-consistency-c14whb
@github-actions

github-actions Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

CI triage

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

  • Lighthouse budgetneeds 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 #12433 (success).

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

Copy link
Copy Markdown
Owner Author

Lighthouse budget: diagnosis and action

Lighthouse budget failed on 6ed8572 with one metric outside tolerance:

**1 metric(s) regressed:** mobile-therapy-compass cls +0.032 vs baseline (max +0.02).
mobile /therapy-compass (confirmed regression; 2/3 samples breached)

This is caused by this PR, and the measurement is correct — but it is convergence, not a regression. The committed baseline for Therapy was recorded while Therapy was the one mode with no searchCommandSurfaceByMode entry, so its home rendered no suggestion ticket and no rotating hint at all:

cell baseline CLS this run
mobile-therapy-compass 0.000 0.032
mobile-dsm 0.0353 0.034
mobile-root 0.016 0.014
mobile-forms 0.088 0.013

Every mode that already carries the ticket sits at the same level — dsm's own baseline is 0.0353. Therapy's 0.000 was the anomaly, and restoring the shared command surface moved it onto the shared chrome's existing layout-shift cost. No other cell regressed; several improved.

Action: the baseline is refreshed through the sanctioned path, not hand-edited — lighthouse-budget.json states it is browser-specific and refreshable only from the CI artifact. I have dispatched Refresh Lighthouse baseline against this branch; the rewritten lighthouse-budget.json will be reviewed and committed here, so the baseline lands atomically with the change that justifies it.

Follow-up, deliberately not in this PR: the ~0.035 shift is real and pre-existing on every ticket-bearing mode home. The ticket renders inside the mode-home composer slot, whose reserve (--spacing-mode-home-composer-phone) accounts for the composer but not the hint row, so the portal attaching post-hydration shifts content — the class of defect chrome invariant 15 exists to prevent. Fixing it means raising that shared token, which changes all 15 mode homes and needs verify:phone-chrome proof; it is filed as an inbox request rather than bundled into a low-risk consistency fix.


Generated by Claude Code

BigSimmo and others added 5 commits August 19, 2026 06:13
The Lighthouse budget failure on this PR traced to a shared defect rather
than the Therapy change alone: the mode-home composer slot reserves the
composer's height but not the suggestion ticket and rotating hint that
UniversalSearchCommandSurface renders above it, so the portal attaching
post-hydration shifts content on every ticket-bearing mode home.

Evidence from this PR's own run — mobile-dsm baseline CLS 0.0353,
mobile-forms 0.088, mobile-root 0.016, while mobile-therapy-compass sat at
0.000 purely because Therapy rendered no ticket at all. Restoring it moved
Therapy to 0.032, in line with its peers.

Fixing the reserve would take every mode home toward zero, but it touches a
shared token across all 15 homes and needs verify:phone-chrome plus
Lighthouse and visual baseline re-adoption, so it is filed rather than
bundled into a low-risk consistency fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W5HsA9TpWxAN6KbqFAx7GA

Copy link
Copy Markdown
Owner Author

Correction: the baseline refresh does not fix this, and I am not committing it

My previous comment said Therapy had converged on a stable ~0.032 CLS and that refreshing the baseline would resolve the failure. The refresh run disproves that, so the plan changes.

Refresh Lighthouse baseline (run 32191676913) succeeded on 4e6f8b0 — a head that already contains this PR — and recorded:

| mobile-therapy-compass | 2351 | 383 | 0.000 |
| mobile-dsm             | 2267 | 355 | 0.034 |

mobile-therapy-compass measured 0.000, not 0.032. So this route's CLS is bimodal (0.000 in one run, 0.032 in the run that failed at 2/3 samples), and a refreshed baseline recording 0.000 would leave the exact same intermittent breach against the 0.02 absolute tolerance. Committing it would have looked like a fix while changing nothing. It is not being committed.

What is actually happening, measured

Instrumenting layout-shift entries locally at 390px:

route reserve (min-height) settled slot height deficit CLS
/therapy-compass 106px 162px 56px 0.042
/dsm 106px 162px 56px 0.047

--spacing-mode-home-composer-phone reserves 106px, but UniversalSearchCommandSurface renders the smart-search hint inside that slot, above the composer. The ticket is a 48px row (~56px with its gap), so the slot grows 56px when the portal attaches and the shift sources are exactly the action and pill <section>s below it. DSM shows the identical defect today — this is pre-existing on every ticket-bearing mode home, and Therapy has joined it rather than caused it. The token's own comment confirms it: it was last measured as "the composer pill plus the privacy notice", before the hint row existed.

Why the obvious fix is not in this PR

Raising the phone token to 10.125rem would make the phone reserve exact, because the phone ticket is a fixed-height row. The wide token cannot be fixed the same way: at sm+ the slot settles at 160px at 1280 but 199px at 800, because the prompt-chip row rewraps with viewport width. One static token is wrong at some width by construction, so this needs a real fix (reserve the fixed row only, or render the hint server-side), not a bigger number — plus verify:phone-chrome and re-adoption of every mode home's visual and Lighthouse baselines. That is a separate, architecturally significant change and is filed as an inbox request in this PR.

Decision needed from the owner

This PR restores the shared command surface on Therapy, which is correct and is what was asked for. It also moves Therapy onto the shared reserve defect, so Lighthouse budget will intermittently fail on mobile-therapy-compass until that defect is fixed. Either land it and accept a flaky Lighthouse red on this one cell, or hold it behind the reserve fix. I have not tried to paper over it by refreshing the baseline.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Baseline refresh cannot fix this — closing that route out

Following up on my two earlier comments, with the result of the second refresh.

The two code paths disagree systematically, twice each:

path run mobile-therapy-compass CLS
graded (check:lighthouse-budget on the PR) 32190472966 0.032 (2/3 samples)
graded 32193554993 0.032
refresh (--update) 32191676913 0.000
refresh (--update) 32194194206 0.000

The graded gate reliably sees the shift; the refresh reliably does not. So a refreshed baseline would record 0.000 and leave the identical breach — it cannot stabilise this cell. Both refresh artifacts are therefore left uncommitted, and I am not dispatching a third time; that would just burn runner minutes on a coin that has landed the same way twice.

Note this is also a gap in the refresh tooling itself, independent of this PR: a baseline generator that cannot reproduce what the grader measures cannot correct a stale cell on this route.

The only real fix

The shift is a shared, pre-existing defect, measured locally at 390px:

route reserve settled slot deficit CLS
/therapy-compass 106px 162px 56px 0.042
/dsm 106px 162px 56px 0.047

--spacing-mode-home-composer-phone reserves the composer but not the smart-search hint rendered above it inside the same slot. Raising it to 10.125rem would make the phone reserve exact and should take every ticket-bearing mode home toward zero. The wide token needs a different approach (160px at 1280 vs 199px at 800 — the chip row rewraps), so it cannot be a matching constant.

I did not ship that change: it touches shared chrome on all 15 mode homes, and I could not run local browser verification to prove it. It is filed as an inbox request in this PR with the measurements.

Owner decision: land this PR and accept a red Lighthouse budget on mobile-therapy-compass until the reserve is fixed, or hold it behind that fix. The Therapy change itself is verified and unrelated to the shift's cause.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

PR required is failing on Lighthouse budget: mobile-therapy-compass cls +0.032 vs baseline (max +0.02) (confirmed regression, 2/3 samples breached).

This looks like an expected side effect of the fix itself rather than a bug: before this PR, therapy-compass had no entry in searchCommandSurfaceByMode, so UniversalSearchCommandSurface early-returned and rendered nothing on the phone hero. This PR adds that entry, so the "Try this / Tap to search" ticket now actually renders there for the first time — new DOM content appearing on a page whose Lighthouse baseline was captured with none of it is a plausible, straightforward source of a CLS increase, and every other mode that already has this ticket presumably had its own baseline calibrated with it present.

I didn't try to fix this by touching the ticket's rendering — reserving space or changing when it mounts on a hunch, without being able to run the actual Lighthouse measurement locally, risks trading a real regression for a guessed one. If the CLS bump is the accepted cost of restoring the feature, the mobile-therapy-compass baseline needs a deliberate refresh (the same kind of pass #2167 just did for the visual baselines) rather than a code change here — but that's a call for you to make, not something to wave through silently.


Generated by Claude Code

@BigSimmo
BigSimmo merged commit 51ee393 into main Aug 19, 2026
29 checks passed
@BigSimmo
BigSimmo deleted the claude/therapy-lightweight-home-consistency-c14whb branch August 19, 2026 01:02
Sign up for free to 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.

2 participants