Skip to content

Clinical pages: one record layout, calmer lists, phone fixes (audit 13 Oct) - #3516

Merged
gitar-bot[bot] merged 42 commits into
mainfrom
claude/project-thread-fvqxin
Oct 13, 2026
Merged

gitar-bot[bot] merged 42 commits into
mainfrom
claude/project-thread-fvqxin

Conversation

@BigSimmo

@BigSimmo BigSimmo commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner

User description

Requested by Josh · project thread

Summary

Before: each kind of Clinical record (DSM, Differentials, Specifiers, Formulation, Therapy, Forms, Medication, Services) had its own layout. Lists were walls of coloured pills. On phones, several things were broken: Compare sheet buttons off screen, raw tags like crisis_high on service records, the bottom box squashed at large text, and cut-off prompts.

After: every record follows one layout, modelled on the Factsheet record: name, an At a glance card in full, then cautions in full, plain sections, and sources last. Lists use grey words and status shapes instead of coloured pills. The phone faults are fixed.

Builds the "Build now" list from the Clinical pages audit (/mnt/project-files/clinical-audit-2026-10-13/README.md) that Josh approved:

  • 1: Compare sheet footer is pinned on phones (all six compare sheets).
  • 2: service records hide or map raw machine tags, and show the phone number once with Call.
  • 3: bottom box sizing at large text. CSS only; 0 differing pixels at normal size.
  • 4: Therapy Avoid/modify is no longer clamped. Safety & cautions sits right after the summary.
  • 5: one Documents failure message with Retry.
  • 6: shared record layout (clinical-record-panels.tsx) across the eight record types.
  • 8: status shapes and grey words on Differentials, Services, Sources and Medication results. Labels, categories and ranking are unchanged.
  • 10, 11: side bars removed; main buttons are Clinical blue.
  • 12: compact rows on Formulation, Recommend and Calculators.
  • 13: A to Z strip on Dictionary, and on Services when sorted A to Z.
  • 14: Dictionary rows tidied.
  • 15: Psychiatry Continue moved first; duplicate First Nations entry removed; Tools page is now "All tools".
  • 17: Browse links on empty mode homes.
  • 18: shorter prompts.
  • 21: plain Calculators notice.
  • Also fixes the medication Access panel cutting the Formulation value to "Tablets (12".

Areas touched: App experience, Design system, Clinical reference content, Delivery and assurance, Personal practice (plus 1 file not yet placed in any area)

RAG impact: no retrieval behaviour change. No ranking-protected file is touched; src/lib/medications.ts scoring and labels are unchanged.

Verification

  • Checks run (local, demo mode):
    • npm run typecheck: recorded a pass for "typecheck:internal"
    • eslint on changed files: clean
    • prettier --check: All matched files use Prettier code style!
    • changed unit test files: Tests 347 passed (347)
  • Browser specs that were edited (ui-tools, ui-overlap, ui-accessibility, ui-formulation-result-cards, ui-tools-show-all) have not been run locally. The full browser suite will run on this draft.
  • Before and after screenshots: /mnt/project-files/clinical-audit-2026-10-13/built/{faults,records,lists}/

Risk and rollout

  • Risk: clinical display only. No clinical wording, facts, urgency categories or ranking change. The 13YARN tag labels need a First Nations governance check.
  • Rollback: revert this PR.
  • Provider or production effects: none.

Notes

  • Stays DRAFT until the full browser suite is green and Josh sends it live.
  • The approved wording changes (audit items 19 and 20) are in a separate stacked draft.
  • Header, band, record top bar, tabs and Back were not touched; the header thread owns them.

🤖 Generated with Claude Code

https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8

Generated by Claude Code


Summary by cubic

Unifies all eight Clinical record types onto one shared layout and fixes the phone faults from the 13 Oct audit: compare sheet buttons stay on screen, service records hide raw machine tags, the bottom box stops squashing at large text, and prompts are shortened.

Record layout and lists

  • Every record (DSM, Differentials, Specifiers, Formulation, Therapy, Forms, Medication, Services) now follows the Factsheet model: name, At a glance card, cautions in full, plain sections, sources last.
  • Lists (Differentials, Services, Sources, Medication) use grey words with a small status shape; service chip shapes are keyed to availability and confidence labels rather than tone, so acuity and confidence rows keep plain grey.
  • The service Call bar is a compact phone button that keeps the visible number.
  • Formulation, Recommend and Calculators lists use compact rows; Dictionary gets a phone A to Z strip and Services gets one only when sorted A to Z, each keeping its keyboard position when filtering shortens it.
  • Therapy cautions and safety sections are no longer clamped; a therapy record's Format card keeps the session length beside the time required; the medication Formulation row shows the whole field, strengths and forms included.

Other fixes

  • A failed documents search with nothing listed shows one message with Retry, wired to re-run the current query rather than an older failed one; the red error box stays only when earlier matches are still listed, so they cannot pass for the new query's results.
  • Empty mode homes show two Browse links, keeping the idle phone home on one screen; Psychiatry's Continue moves first and the duplicate First Nations entry is removed; Tools becomes "All tools".
  • Map and Related are reachable from every diagnosis tab and start the new tab at its heading so the top bar and section picker come back into view; main buttons and compare actions use the Clinical blue primary button; side bars are removed from records.

Display-only changes: no clinical wording, facts, urgency categories or ranking change. The 13YARN tag labels need a First Nations governance check.

Written for commit 7d320bb. Summary will update on new commits.

View guided diff Turn on auto-fix


CodeAnt-AI Description

Standardize clinical records and fix mobile search and compare flows

What Changed

  • Clinical records now share a consistent layout, with full “At a glance” details, cautions near the top, and sources and related links at the end. Repeated facts and “Tap for detail” prompts are removed.
  • Clinical result lists use compact rows and quieter status labels. Service records hide or translate machine-style tags and avoid repeating contact numbers; phone buttons keep the same call action.
  • Compare controls stay pinned while lists scroll in phone sheets. Dictionary and alphabetically sorted service lists offer letter jumps, and composer controls remain usable with large text.
  • Failed document searches show one message with the failure reason and a Retry option, instead of stacking a separate error message.
  • Empty Clinical home pages offer links to browse relevant pages; the tools directory is labeled “All tools.”

Impact

✅ Full safety cautions visible without extra taps
✅ Compare controls stay reachable while phone lists scroll
✅ Failed document searches can be retried in place

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.

claude added 30 commits October 13, 2026 06:15
The picker's Done and Reset sat at the end of the scrolling body, below the
screen edge on 390x844 and 390x667. On phones they now render as the sheet's
pinned footer, with the list scrolling above; wider screens keep them inline.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Differentials urgency, service chips, source grades and medication match
labels become grey words with a status shape only where one applies. The
service Call bar becomes a compact phone button with the same tel: action.
No label wording, urgency category or ranking changes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Adds the shared record body primitives (intro, action row, At a glance card,
cautions, plain sections) to clinical-record-panels and moves the therapy
record onto them: name, one line and tags, then the compare action, one At a
glance card with Format, Setting and Suits in full (no Tap for detail), Safety
& cautions straight after and never clamped, plain section headings, related
and sources last. Sections that repeat a glance value word for word are not
printed twice.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Name, one line and tags; the existing ICD-10 copy and Compare in one action
row; the four summary tiles become one At a glance card; criteria, key
features and specifiers as plain sections; documentation support unchanged;
differential considerations, record summary and the reference notice close
the record in one reading column. All wording and facts unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…items 13, 14)

One shared press-and-drag strip for long A to Z phone lists, used on the
Dictionary and on Services when sorted A to Z. Letters that exist only,
one keyboard stop, hidden at desktop widths and when large text cannot fit.
Dictionary rows drop the unclear Browse result label and keep a labelled
source tick and the compare link.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Tags & catchments printed machine tokens (digital_phone, crisis_high,
aboriginal_torres_strait_islander). They now show the existing facet label
where exactly one facet map names the token, and are hidden otherwise; no new
wording is made up. The referral band's number also reappeared as the Contact
line, the Route fact card and the Primary route and Phone rows; exact repeats
are dropped, distinct values and the Call button stay.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ummary

The Avoid / modify cell on the older result card is no longer clamped. On a
therapy record the Safety & cautions card now sits directly after the key-fact
tiles and is not clamped behind Show more, and the Cautions tile shows its whole
first sentence (full row on phones) instead of a 64-character cut. No wording
changed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…lculators (audit item 12)

Long-list cards become the compact row Therapy search uses: name, one line,
tags, small 48px actions, whole row opens the record. Every action stays
(Use, Open, favourite, compare, sheet). On Recommend the Avoid / modify
warning stays in full in amber, with rank and review status kept.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Name, one line, urgency and source status; Compare, Copy and Save in one row
under the title at every width (replacing the separate desktop cluster and
the phone action bar). The safety facts become the At a glance card with full
labels; the safety snapshot becomes the cautions block with every Watch for
item wrapping instead of scrolling off the edge. Hinge, Do now and Clinical
review are plain sections; review rows keep their fold with no icon tiles.
Map and Related close the phone record. At a glance reflows by container
query so large text falls back to one column. Chromium spec and source
contracts updated to the new layout.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…tem 15)

Psychiatry moves Continue to the top when it has items and lists First
Nations once (in Sections). Psychiatry and Medicines each link once to
All tools. Tools becomes a plain All tools list: flat hairline groups,
no amber card around Safety, no coloured group dots. No tool removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A failed documents search stacked a red dashed Search unavailable box on top
of the results' own degraded state. The documents results now own the
message: the red box is not shown once a documents search was submitted, the
degraded zero-result card loses its double side bar, keeps the honest copy,
adds a Retry wired to the dashboard's own search runner, and shows the
specific failure as a quiet Reason line. The band's partial count line stays
(a test pins it as the only announced status above the failure).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Name, one line and tags; the existing Compare in one action row; What matters
now becomes the At a glance card (values in full, same anchor id); When this
may not fit becomes the cautions block straight after; fit, checks, patient
language, plan, quick reference, example wording and compare next as plain
sections. Use in builder now uses the Clinical blue primary button instead
of the black one.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
With nothing to continue and no favourites, a Clinical mode home shows
three or four Browse links to that mode's existing pages, as a hairline
group under the unchanged box. Adds Formulation, Specifiers, Forms,
Factsheets, Dictionary and Services. Medication has no medicine catalogue
page, so it links Factsheets and the Medicines home instead.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Name, definition and tags; the existing Compare in one action row; What
matters now becomes the At a glance card (same anchor and label ids); the
record's own caveats become the cautions block straight after, in full; fit,
clues, patient language, the three Ps, case example, formulation language,
treatment target, quick reference, add to a draft, compare next and evidence
notes as plain sections. Use in formulation now uses the Clinical blue
primary button instead of the black one. The shared list moves into
clinical-record-panels; the icon-tile fact and accordion blocks, now unused,
are removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Name, class line, indication and badges as the record intro; the key figures
sit in the At a glance card with each figure's flag unchanged (a high-risk
figure stays red and spoken); the record's avoid/caution quick-reference rows
become the cautions block straight after, in full; the tab sections are plain
headings with hairline rows and keep their fold, with the green left bar on
the sections panel removed; quick reference and access are plain sections and
From this page closes the record. Access values now wrap instead of clipping.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Measured against the composer's text width (194 px on mode homes, 241 px on
result pages, Geist 16 px): ten mode placeholders were cut with an ellipsis.
Only the placeholder words change; every mode keeps its fuller accessible
name, and the composer component is untouched.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
"3 candidate calculators remain governance-gated pending version, rights and
workflow review" now reads "Three more calculators are waiting for version,
rights and workflow checks before they appear." The telemetry sentence now
says the app's usage logs, and anything documented in the clinical record,
are covered separately. Same meaning.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… All tools heading

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
At a glance card holds every priority fact in full (no Tap for detail),
the legal boundary follows as the cautions card, and the cultural notes
move below the attachment row unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… check

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The header card loses its blue left bar and icon tile and becomes the
shared record intro; priority facts become the At a glance card (the
region keeps the name Priority facts); sections are plain headings.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The compare picker Done, the compare empty-state and slot-strip actions,
and the DSM Add to comparison button move from black to the Clinical
blue primary button.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
At 320 px with a 200% root the composer's buttons grew to 88 px and the
16 px field shrank to 0-24 px, so the prompt read "As". In the single
max-width:430px composer block each rem size is now capped in px just above
the largest density value (17 px root), so the composer is pixel-identical at
15, 16 and 17 px roots (verified 0 differing pixels at 390, 320 and 390
spacious on four pages) and stops growing past them. At large text the field
is now 130 px and "Ask a follow-up..." shows in full. Content clearance is
rem-based and already exceeds the smaller dock.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… height

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8
…f5631045485a3490

# Conflicts:
#	src/components/compare/compare-catalog-picker.tsx
#	src/components/services/service-detail-page.tsx
#	src/components/therapy-compass/record/key-facts.tsx
#	src/components/therapy-compass/record/record-sections.tsx
#	src/components/therapy-compass/screens/detail-screen.tsx
…ut to "Tablets (12")

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8
@qodo-code-review

Copy link
Copy Markdown
Contributor

Qodo Fixer

No findings are available for this PR yet. Findings appear here once Qodo has reviewed the PR.

…ation; offer Retry on degraded zero results

A failed documents search now keeps the red error box when earlier matches
are still listed, so they cannot pass for results of the new query. The
medication Formulation row shows the whole field rather than its first
sentence, so no form is hidden. A degraded zero-result search now offers
the Retry its message promises.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8
Comment thread src/components/ClinicalDashboard.tsx Resolved
gitar-bot[bot]
gitar-bot Bot previously approved these changes Oct 13, 2026

@gitar-bot gitar-bot Bot 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.

Gitar has auto-approved this PR (configure)

…ed one

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8
gitar-bot[bot]
gitar-bot Bot previously approved these changes Oct 13, 2026

@gitar-bot gitar-bot Bot 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.

Gitar has auto-approved this PR (configure)

@qodo-code-review

qodo-code-review Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Action required

No findings for this group


Remediation recommended

No findings for this group


Informational

No findings for this group

Grey Divider


Resolved findings

1. Clinicians see closed services as urgent ✓ Resolved
Description
serviceChipShape converts every danger chip to the urgent triangle and every warning chip to
the unrecorded ring, even when the label is not urgent or unverified. This affects closed,
superseded, and low-confidence services as well as moderate-acuity, planned, temporarily
unavailable, and medium-confidence services, so their status is communicated with the wrong clinical
meaning.
Code

src/components/services/services-navigator-page.tsx[R95-97]

+  // A closed, superseded or low-confidence service must not look like a plain region word.
+  if (chip.tone === "danger") return "urgent";
+  if (chip.tone === "warning") return "unrecorded";
Relevance

●●● Strong

Tone-only mapping conflates distinct clinical statuses with urgent or unrecorded meanings,
undermining the PR’s status-shape intent.

PR-#3463

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The changed fallback assigns shapes based only on tone, while the service mapper emits those tones
for multiple unrelated meanings. The status-tag component defines the urgent shape as
overdue/emergent/crisis and the unrecorded shape as not recorded/not verified, proving that the
fallback communicates incorrect semantics for several generated service labels.

src/components/services/services-navigator-page.tsx[90-98]
src/lib/service-catalog-mapper.ts[50-88]
src/components/mode-kit/status-tag.tsx[8-20]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`serviceChipShape` uses generic `danger` and `warning` tones to select the urgent and unrecorded shapes. Service status generation uses those tones for several meanings that do not match those shapes, including closed, superseded, low-confidence, moderate-acuity, planned, temporarily unavailable, and medium-confidence statuses.

## Fix Focus Areas
- src/components/services/services-navigator-page.tsx[90-98]
- src/lib/service-catalog-mapper.ts[50-88]

## Recommended Fix
Remove the generic tone fallbacks or map each known status label to a semantically correct shape. Reserve `urgent` for crisis/emergency/high-acuity labels and `unrecorded` for explicitly unverified states; render closed, superseded, planned, temporarily unavailable, confidence, and moderate-acuity labels as plain words unless a dedicated shape accurately represents them. Add regression coverage for representative labels from each tone.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Service letter jumps can mislead readers ✗ Dismissed
Description
ServicesNavigatorPage builds alphabetEntries from displayedMatches without checking
sortValue, and alphabetStripEntries accepts lists with a few out-of-order rows. When
relevance-ranked results happen to be mostly alphabetical, the phone strip appears even though the
list is not sorted A to Z, so a letter jump can land before another result under that same letter.
Code

src/components/services/services-navigator-page.tsx[R538-541]

+  const alphabetEntries = useMemo(
+    () =>
+      alphabetStripEntries(
+        displayedMatches,
Relevance

●●● Strong

Sorting-dependent UI is expected to gate alphabetic navigation and avoid misleading jumps from
relevance-ranked results.

PR-#2407
PR-#2253

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The navigator preserves ranked search order until the user selects alphabetical sorting, but its new
strip calculation runs for either sort mode. The entry helper permits up to two out-of-order rows
(or five percent of the list), and the strip scrolls to the generated row target.

src/components/services/services-navigator-page.tsx[499-506]
src/components/services/services-navigator-page.tsx[533-546]
src/lib/result-sort.ts[7-10]
src/components/mode-kit/alphabet-strip.tsx[253-278]
src/components/mode-kit/alphabet-strip.tsx[99-109]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The Services phone letter strip can appear for relevance-ranked results that happen to be nearly alphabetical, making its letter jumps unreliable.
## Fix Focus Areas
- src/components/services/services-navigator-page.tsx[535-546]
## Recommended Fix
Only build and render alphabet entries when the selected sort mode is A to Z. Include the sort mode in the memo dependencies; keep the existing entry helper for alphabetically sorted results.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Service list cards no longer show the phone number ✓ Resolved
Description
The Call link on each navigator card now holds only a phone icon. Its accessible name is `Call
${service.title}, and the number exists only in the title` attribute. Touch users never see
tooltips and screen readers don't announce title as part of the name, so on phones the number
can't be read or written down before dialling. The old card showed Call {number} as visible text.
Code

src/components/services/services-navigator-page.tsx[R280-285]

+            aria-label={`Call ${service.title}`}
+            title={`Call ${call.display}`}
            data-testid={`service-call-${service.slug}`}
-            className="relative z-10 inline-flex min-h-12 min-w-0 flex-1 items-center justify-center gap-2 rounded-lg border border-[color:var(--clinical-accent)] bg-[color:var(--clinical-accent)] px-3 text-sm font-bold text-[color:var(--clinical-accent-contrast)] hover:bg-[color:var(--clinical-accent-hover)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--focus)] sm:flex-none"
+            className="relative z-10 inline-flex min-h-12 min-w-12 shrink-0 items-center justify-center rounded-lg border border-[color:var(--border)] bg-[color:var(--surface)] text-[color:var(--clinical-accent)] hover:bg-[color:var(--surface-subtle)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--focus)]"
          >
            <Phone className="h-4 w-4 shrink-0" aria-hidden />
-            <span className="truncate tabular-nums">Call {call.display}</span>
Relevance

●●● Strong

Recent phone-contact and accessibility findings favor exposing actionable contact details beyond
hover-only or tooltip presentation.

PR-#2609
PR-#3156

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The removed <span>Call {call.display}</span> was the only place the number appeared on the card.
The new link has only aria-label (no number), title (the number), and an aria-hidden icon. The
updated test checks the number only through the title attribute.

src/components/services/services-navigator-page.tsx[277-287]
tests/services-call-button.dom.test.tsx[130-142]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The compact Call button on service cards hides the phone number. It is only in a `title` tooltip, which touch devices never show, and it is missing from the accessible name.

## Fix Focus Areas
- src/components/services/services-navigator-page.tsx[277-287]
- tests/services-call-button.dom.test.tsx[130-142]

## Recommended Fix
Put the number back in `aria-label` (`Call ${call.display}, ${service.title}`). Also show `call.display` as visible tabular text next to the icon, or on its own line in the tag row, so the button stays compact but the number can still be read. Update the test to check the visible text.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View resolved (1)
4. Closed or unverified services look like plain region tags ✗ Dismissed
Description
serviceChipShape decides the shape by matching the chip label against regexes and ignores
chip.tone entirely. So danger- and warning-tone chips from buildStatusChips, such as "Closed",
"Superseded", "Temporarily unavailable", "Planned — not open", "Verify before use" and "Low
confidence", get none. A closed or unvetted service in the navigator list then looks exactly like
an acuity or region word, even though the PR aims to keep colour where a row differs.
Code

src/components/services/services-navigator-page.tsx[R90-95]

+function serviceChipShape(chip: ServiceStatusChip): StatusTagShape {
+  const label = chip.label?.toLowerCase() ?? "";
+  if (/\b(crisis|urgent|emergency)\b/.test(label)) return "urgent";
+  if (/unverified|not verified|unconfirmed/.test(label)) return "unrecorded";
+  if (/^active$/.test(label.trim())) return "done";
+  return "none";
Relevance

●●● Strong

Recent status-shape precedent preserves explicit warning and danger semantics instead of rendering
them as neutral labels.

PR-#3489

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The mapper creates these chips with explicit danger/warning tones. The new shape function only
matches crisis/urgent/emergency, unverified/not verified/unconfirmed, or exactly "Active", so every
other cautionary label falls through to none. The old chipTone passed danger and warning
straight through to a coloured chip.

src/lib/service-catalog-mapper.ts[75-90]
src/lib/service-catalog-mapper.ts[223-251]
src/components/services/services-navigator-page.tsx[90-96]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`serviceChipShape` ignores `chip.tone`, so chips the catalogue marks as danger or warning (Closed, Superseded, Temporarily unavailable, Planned — not open, Verify before use, Low confidence) show as plain grey words with no status shape.

## Fix Focus Areas
- src/components/services/services-navigator-page.tsx[90-96]
- src/lib/service-catalog-mapper.ts[75-90]

## Recommended Fix
Keep the crisis label check. Then map by tone: `danger` -> "urgent", `warning` -> "soon" (or "unrecorded" for verification chips), `success` with an "Active" label -> "done". Return "none" only for `info`/`neutral` chips. Add a test for a Closed service and for a "Verify before use" chip.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 9 rules
✅ Cross-repo context — repo relationships
  Explored: repo: BigSimmo/Medications (sha: f0fe3d04) — View relationship
✅ REVIEW.md
Review mode: Auto: 🧠 Deep: Multiple independent behavioral changes span authorization, navigation, UI, and RAG evidence paths.
✅ Fix-loop round: fix loop

Grey Divider

Tip of the day
💡 Did you know, you can turn these tips off under Display > Comment parts

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Previous reviews

Review updated until commit 7d320bb 🧠 Deep

Results up to commit 25e404e 🧠 Deep


🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Action required

No findings for this group


Remediation recommended

No findings for this group


Informational

No findings for this group


Resolved findings

1. Closed or unverified services look like plain region tags ✗ Dismissed
Description
serviceChipShape decides the shape by matching the chip label against regexes and ignores
chip.tone entirely. So danger- and warning-tone chips from buildStatusChips, such as "Closed",
"Superseded", "Temporarily unavailable", "Planned — not open", "Verify before use" and "Low
confidence", get none. A closed or unvetted service in the navigator list then looks exactly like
an acuity or region word, even though the PR aims to keep colour where a row differs.
Code

src/components/services/services-navigator-page.tsx[R90-95]

+function serviceChipShape(chip: ServiceStatusChip): StatusTagShape {
+  const label = chip.label?.toLowerCase() ?? "";
+  if (/\b(crisis|urgent|emergency)\b/.test(label)) return "urgent";
+  if (/unverified|not verified|unconfirmed/.test(label)) return "unrecorded";
+  if (/^active$/.test(label.trim())) return "done";
+  return "none";
Relevance

●●● Strong

Recent status-shape precedent preserves explicit warning and danger semantics instead of rendering
them as neutral labels.

PR-#3489

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The mapper creates these chips with explicit danger/warning tones. The new shape function only
matches crisis/urgent/emergency, unverified/not verified/unconfirmed, or exactly "Active", so every
other cautionary label falls through to none. The old chipTone passed danger and warning
straight through to a coloured chip.

src/lib/service-catalog-mapper.ts[75-90]
src/lib/service-catalog-mapper.ts[223-251]
src/components/services/services-navigator-page.tsx[90-96]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`serviceChipShape` ignores `chip.tone`, so chips the catalogue marks as danger or warning (Closed, Superseded, Temporarily unavailable, Planned — not open, Verify before use, Low confidence) show as plain grey words with no status shape.

## Fix Focus Areas
- src/components/services/services-navigator-page.tsx[90-96]
- src/lib/service-catalog-mapper.ts[75-90]

## Recommended Fix
Keep the crisis label check. Then map by tone: `danger` -> "urgent", `warning` -> "soon" (or "unrecorded" for verification chips), `success` with an "Active" label -> "done". Return "none" only for `info`/`neutral` chips. Add a test for a Closed service and for a "Verify before use" chip.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Service list cards no longer show the phone number ✓ Resolved
Description
The Call link on each navigator card now holds only a phone icon. Its accessible name is `Call
${service.title}, and the number exists only in the title` attribute. Touch users never see
tooltips and screen readers don't announce title as part of the name, so on phones the number
can't be read or written down before dialling. The old card showed Call {number} as visible text.
Code

src/components/services/services-navigator-page.tsx[R280-285]

+            aria-label={`Call ${service.title}`}
+            title={`Call ${call.display}`}
            data-testid={`service-call-${service.slug}`}
-            className="relative z-10 inline-flex min-h-12 min-w-0 flex-1 items-center justify-center gap-2 rounded-lg border border-[color:var(--clinical-accent)] bg-[color:var(--clinical-accent)] px-3 text-sm font-bold text-[color:var(--clinical-accent-contrast)] hover:bg-[color:var(--clinical-accent-hover)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--focus)] sm:flex-none"
+            className="relative z-10 inline-flex min-h-12 min-w-12 shrink-0 items-center justify-center rounded-lg border border-[color:var(--border)] bg-[color:var(--surface)] text-[color:var(--clinical-accent)] hover:bg-[color:var(--surface-subtle)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--focus)]"
          >
            <Phone className="h-4 w-4 shrink-0" aria-hidden />
-            <span className="truncate tabular-nums">Call {call.display}</span>
Relevance

●●● Strong

Recent phone-contact and accessibility findings favor exposing actionable contact details beyond
hover-only or tooltip presentation.

PR-#2609
PR-#3156

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The removed <span>Call {call.display}</span> was the only place the number appeared on the card.
The new link has only aria-label (no number), title (the number), and an aria-hidden icon. The
updated test checks the number only through the title attribute.

src/components/services/services-navigator-page.tsx[277-287]
tests/services-call-button.dom.test.tsx[130-142]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The compact Call button on service cards hides the phone number. It is only in a `title` tooltip, which touch devices never show, and it is missing from the accessible name.

## Fix Focus Areas
- src/components/services/services-navigator-page.tsx[277-287]
- tests/services-call-button.dom.test.tsx[130-142]

## Recommended Fix
Put the number back in `aria-label` (`Call ${call.display}, ${service.title}`). Also show `call.display` as visible tabular text next to the icon, or on its own line in the tag row, so the button stays compact but the number can still be read. Update the test to check the visible text.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Service letter jumps can mislead readers ✗ Dismissed
Description
ServicesNavigatorPage builds alphabetEntries from displayedMatches without checking
sortValue, and alphabetStripEntries accepts lists with a few out-of-order rows. When
relevance-ranked results happen to be mostly alphabetical, the phone strip appears even though the
list is not sorted A to Z, so a letter jump can land before another result under that same letter.
Code

src/components/services/services-navigator-page.tsx[R538-541]

+  const alphabetEntries = useMemo(
+    () =>
+      alphabetStripEntries(
+        displayedMatches,
Relevance

●●● Strong

Sorting-dependent UI is expected to gate alphabetic navigation and avoid misleading jumps from
relevance-ranked results.

PR-#2407
PR-#2253

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The navigator preserves ranked search order until the user selects alphabetical sorting, but its new
strip calculation runs for either sort mode. The entry helper permits up to two out-of-order rows
(or five percent of the list), and the strip scrolls to the generated row target.

src/components/services/services-navigator-page.tsx[499-506]
src/components/services/services-navigator-page.tsx[533-546]
src/lib/result-sort.ts[7-10]
src/components/mode-kit/alphabet-strip.tsx[253-278]
src/components/mode-kit/alphabet-strip.tsx[99-109]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The Services phone letter strip can appear for relevance-ranked results that happen to be nearly alphabetical, making its letter jumps unreliable.
## Fix Focus Areas
- src/components/services/services-navigator-page.tsx[535-546]
## Recommended Fix
Only build and render alphabet entries when the selected sort mode is A to Z. Include the sort mode in the memo dependencies; keep the existing entry helper for alphabetically sorted results.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Results up to commit 32ac289 🚀 Fast


🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Action required

No findings for this group


Remediation recommended

No findings for this group


Informational

No findings for this group


Resolved findings

1. Clinicians see closed services as urgent ✓ Resolved
Description
serviceChipShape converts every danger chip to the urgent triangle and every warning chip to
the unrecorded ring, even when the label is not urgent or unverified. This affects closed,
superseded, and low-confidence services as well as moderate-acuity, planned, temporarily
unavailable, and medium-confidence services, so their status is communicated with the wrong clinical
meaning.
Code

src/components/services/services-navigator-page.tsx[R95-97]

+  // A closed, superseded or low-confidence service must not look like a plain region word.
+  if (chip.tone === "danger") return "urgent";
+  if (chip.tone === "warning") return "unrecorded";
Relevance

●●● Strong

Tone-only mapping conflates distinct clinical statuses with urgent or unrecorded meanings,
undermining the PR’s status-shape intent.

PR-#3463

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The changed fallback assigns shapes based only on tone, while the service mapper emits those tones
for multiple unrelated meanings. The status-tag component defines the urgent shape as
overdue/emergent/crisis and the unrecorded shape as not recorded/not verified, proving that the
fallback communicates incorrect semantics for several generated service labels.

src/components/services/services-navigator-page.tsx[90-98]
src/lib/service-catalog-mapper.ts[50-88]
src/components/mode-kit/status-tag.tsx[8-20]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`serviceChipShape` uses generic `danger` and `warning` tones to select the urgent and unrecorded shapes. Service status generation uses those tones for several meanings that do not match those shapes, including closed, superseded, low-confidence, moderate-acuity, planned, temporarily unavailable, and medium-confidence statuses.

## Fix Focus Areas
- src/components/services/services-navigator-page.tsx[90-98]
- src/lib/service-catalog-mapper.ts[50-88]

## Recommended Fix
Remove the generic tone fallbacks or map each known status label to a semantically correct shape. Reserve `urgent` for crisis/emergency/high-acuity labels and `unrecorded` for explicitly unverified states; render closed, superseded, planned, temporarily unavailable, confidence, and moderate-acuity labels as plain words unless a dedicated shape accurately represents them. Add regression coverage for representative labels from each tone.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

@cubic-dev-ai

cubic-dev-ai Bot commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

Plan monthly usage limit reached ↗
Resets Oct 16

Get more usage

…pes, visible call number

Addresses review threads on #3516.
gitar-bot[bot]
gitar-bot Bot previously approved these changes Oct 13, 2026

@gitar-bot gitar-bot Bot 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.

Gitar has auto-approved this PR (configure)

@qodo-code-review

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 32ac289

…idence chips, not by tone

Acuity and confidence chips share danger and warning tones with availability,
so the tone fallback gave High acuity the crisis triangle and Moderate acuity
the not-verified ring. Match the availability and confidence labels instead.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8

@gitar-bot gitar-bot Bot 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.

Gitar has auto-approved this PR (configure)

@qodo-code-review

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 7d320bb

@gitar-bot

gitar-bot Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor
CI failed: One Playwright UI test failed in the Care Plan mockup suite: a page-wide test-id locator matched two identity-uncertain alerts, causing a strict-mode violation. Relation to this PR is unclear, so it is not attributed to the change.

Overview

Single unique error template across 7 analyzed logs for commit 7d320bb. The only blocking failure is one Playwright test (tests/ui-care-plan-mockup.spec.ts:1612) in the chromium-mockups project; 67 tests passed, 1 skipped. Overall: a test-locator ambiguity, not a confirmed application regression.

Failures

Ambiguous test-id locator in Care Plan identity-uncertain assertion (confidence: high)

  • Type: test
  • Affected jobs: 115250502653
  • Related to change: unclear
  • Root cause: getByTestId("care-plan-identity-uncertain") resolved to two elements (one inside the Rowan Sample clinical snapshot region, one elsewhere), so the toContainText assertion failed under strict mode. The log shows a locator ambiguity; the supplied context does not show edits to this test or its implementation establishing that this PR caused the duplicate.
  • Suggested fix: Scope the assertion to the intended region (e.g. the Rowan Sample clinical snapshot region) or select the specific alert whose text should contain "Return to search". If both alerts are unintended duplicates, make the test id unique in the rendering.

Summary

  • Change-related failures: None confirmed. The one failure is marked unclear.
  • Infrastructure/flaky failures: None identified. Chromium install retries occurred but the run proceeded to tests.
  • Recommended action: Scope the Care Plan identity-uncertain assertion to its region or fix the duplicated test id, then rerun the mockup suite to confirm.
Code Review ✅ Approved 4 closed / 4 findings

🟡 Medium risk · Reworking clinical record layouts and mobile search flows could make safety or referral details harder to find if presentation changes mislead users.

Unifies Clinical record layouts and phone list behaviour across the eight record types, including service chip shapes keyed to availability and confidence labels. Resolved the stale degraded-zero Retry issue and the tone-based chip shape fallback, which now uses each chip's own label. Two A to Z strip row-skipping issues were closed without a fix in this PR. No open issues remain.

✅ 4 closed
✅ Bug: Degraded-zero Retry can re-run a stale failed query

📄 src/components/ClinicalDashboard.tsx:3499-3504
onRetrySearch is now passed whenever the mode is documents and query.trim() is set, so it also shows on degraded zero results where no error occurred. It still calls ask(lastFailedQuery ?? query). Nothing clears lastFailedQuery after a successful search or a mode switch: it is only reset at lines 1740, 2328, 2368 and 2665, and the answer-search catch sets it at 1968. Example: an answer search for "X" fails, then the user runs a documents search for "Y" that comes back degraded with zero results. Pressing Retry searches "X" again instead of "Y". The fix is to use lastFailedQuery only when the search actually failed, or to retry the current query.

✅ Bug: Tone fallback gives acuity and confidence chips the wrong status shapes

📄 src/components/services/services-navigator-page.tsx:84-98
The new chip.tone fallback in serviceChipShape covers more chips than the closed, superseded and low-confidence cases its comment names. acuityChipTone in service-catalog-mapper.ts sets "High acuity" to danger and "Moderate acuity" to warning. confidenceTone sets "Medium confidence" to warning and "Low confidence" to danger. Bundled chips such as "24/7 Acute Inpatient" (danger) and "Forensic & Acute Inpatient" (warning) are affected too. As a result, "High acuity" and "Low confidence" get the same red triangle as "Crisis / urgent". "Moderate acuity" and "Forensic & Acute Inpatient" get the dashed ring, which status-tag.tsx defines as "not recorded, not verified", so a verified service looks unverified. This also contradicts the docstring just above, which says acuity chips stay plain grey words. A fix is to match the availability and confidence labels the comment means (closed, superseded, temporarily unavailable, planned, low or medium confidence) and leave every other tone as none.

Closed: Edge Case: A to Z strip skips the first row after a stray, so a letter can vanish

📄 src/components/mode-kit/alphabet-strip.tsx:250-264
alphabetStripEntries decides whether a row is in place by comparing it with its raw neighbours (letters[index - 1] and letters[index + 1]), even when the neighbour is the stray that was just skipped. Take [G1, W(stray), H1, H2]. W is skipped as intended. H1 is then also treated as out of place because the letter before it is W > H, so the strip's H jumps to H2 and scrolls past H1. If H1 is the only H row ([G1, W, H1, I1]), H drops out of the strip altogether. The JSDoc's own case, a row like "WACHS Goldfields" filed under G, triggers this whenever the stray sits just before the next letter's first row. To fix it, compare each row with the last in-place letter instead of the raw previous item, and keep the forward check only for spotting the stray itself.

Closed: Edge Case: Low stray row still drops the previous letter's first row

📄 src/components/mode-kit/alphabet-strip.tsx:255-264
The fix replaced the raw previous row with the last kept row, but after is still the raw next row. When a stray filed too early comes right after a letter's first row, the real row fails letter <= after and gets skipped. Example: ["Goldfields", "Hedland", "Albany", "Inner City"] (G H A I). Hedland fails because H > A, then Albany fails because G > A, so the strip shows only G and I, H is lost, and the list is charged with two strays instead of one. This is the mirror image of the case this commit fixed. Suggested fix: when picking after, skip upcoming rows whose letter is below the last kept letter, since those are strays too. Add a test for this case.

Verification

Rules No rules evaluated

Functional validation Not enabled

Set up

Auto-approval Approved

Tip

Comment Gitar fix CI or enable auto-apply: gitar auto-apply:on

Options

Auto-apply is off → Gitar will not commit updates to this branch.
Display: compact → Counting what did not apply, without listing it.

Comment with these commands to change the behavior for this request:

Auto-apply Compact
gitar auto-apply:on         
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

BigSimmo added a commit that referenced this pull request Oct 13, 2026
…pes, visible call number

Same fixes as #3516 (32ac289); this branch carries the same navigator code.

Copy link
Copy Markdown
Owner Author

Advisory UI (non-blocking) failed on 7d320bb in tests/ui-care-plan-mockup.spec.ts:1599, the Care Plan mockup's degraded-specimen test. This PR touches no Care Plan or mockup files, and the same job passed on the previous head before main was merged in. So it is not this PR's change. It most likely comes from the recent main work on the role switcher and audit hardening, or it is a flake. I'm not fixing it here, per the owner's instruction to report failures rather than widen this PR, and I haven't re-run it. It does not block merge.


Generated by Claude Code

@gitar-bot
gitar-bot Bot merged commit 65860e7 into main Oct 13, 2026
47 of 49 checks passed
@gitar-bot
gitar-bot Bot deleted the claude/project-thread-fvqxin branch October 13, 2026 10:49
gitar-bot Bot pushed a commit that referenced this pull request Oct 13, 2026
… WA guidance, differentials group note once (#3517)

* Compare sheet: pin Done and Reset to the bottom of the phone sheet

The picker's Done and Reset sat at the end of the scrolling body, below the
screen edge on 390x844 and 390x667. On phones they now render as the sheet's
pinned footer, with the list scrolling above; wider screens keep them inline.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Clinical lists: colour only where a row differs (audit item 8)

Differentials urgency, service chips, source grades and medication match
labels become grey words with a status shape only where one applies. The
service Call bar becomes a compact phone button with the same tel: action.
No label wording, urgency category or ranking changes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Therapy record: move the body onto one shared record layout

Adds the shared record body primitives (intro, action row, At a glance card,
cautions, plain sections) to clinical-record-panels and moves the therapy
record onto them: name, one line and tags, then the compare action, one At a
glance card with Format, Setting and Suits in full (no Tap for detail), Safety
& cautions straight after and never clamped, plain section headings, related
and sources last. Sections that repeat a glance value word for word are not
printed twice.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* DSM record: move the body onto the shared record layout

Name, one line and tags; the existing ICD-10 copy and Compare in one action
row; the four summary tiles become one At a glance card; criteria, key
features and specifiers as plain sections; documentation support unchanged;
differential considerations, record summary and the reference notice close
the record in one reading column. All wording and facts unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Clinical lists: phone A to Z strip and tidier Dictionary rows (audit items 13, 14)

One shared press-and-drag strip for long A to Z phone lists, used on the
Dictionary and on Services when sorted A to Z. Letters that exist only,
one keyboard stop, hidden at desktop widths and when large text cannot fit.
Dictionary rows drop the unclear Browse result label and keep a labelled
source tick and the compare link.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Service record: hide raw catalogue tags and drop repeated phone numbers

Tags & catchments printed machine tokens (digital_phone, crisis_high,
aboriginal_torres_strait_islander). They now show the existing facet label
where exactly one facet map names the token, and are hidden otherwise; no new
wording is made up. The referral band's number also reappeared as the Contact
line, the Route fact card and the Primary route and Phone rows; exact repeats
are dropped, distinct values and the Call button stay.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Therapy: show cautions in full and lift Safety & cautions under the summary

The Avoid / modify cell on the older result card is no longer clamped. On a
therapy record the Safety & cautions card now sits directly after the key-fact
tiles and is not clamped behind Show more, and the Cautions tile shows its whole
first sentence (full row on phones) instead of a 64-character cut. No wording
changed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Clinical lists: compact rows on Formulation, Therapy Recommend and Calculators (audit item 12)

Long-list cards become the compact row Therapy search uses: name, one line,
tags, small 48px actions, whole row opens the record. Every action stays
(Use, Open, favourite, compare, sheet). On Recommend the Avoid / modify
warning stays in full in amber, with rank and review status kept.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Differentials record: move the body onto the shared record layout

Name, one line, urgency and source status; Compare, Copy and Save in one row
under the title at every width (replacing the separate desktop cluster and
the phone action bar). The safety facts become the At a glance card with full
labels; the safety snapshot becomes the cautions block with every Watch for
item wrapping instead of scrolling off the edge. Hinge, Do now and Clinical
review are plain sections; review rows keep their fold with no icon tiles.
Map and Related close the phone record. At a glance reflows by container
query so large text falls back to one column. Chromium spec and source
contracts updated to the new layout.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Psychiatry, Medicines and Tools: less overlap below the band (audit item 15)

Psychiatry moves Continue to the top when it has items and lists First
Nations once (in Sections). Psychiatry and Medicines each link once to
All tools. Tools becomes a plain All tools list: flat hairline groups,
no amber card around Safety, no coloured group dots. No tool removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Documents: one calm message when search cannot run

A failed documents search stacked a red dashed Search unavailable box on top
of the results' own degraded state. The documents results now own the
message: the red box is not shown once a documents search was submitted, the
degraded zero-result card loses its double side bar, keeps the honest copy,
adds a Retry wired to the dashboard's own search runner, and shows the
specific failure as a quiet Reason line. The band's partial count line stays
(a test pins it as the only announced status above the failure).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Specifiers record: shared record layout and a Clinical blue main button

Name, one line and tags; the existing Compare in one action row; What matters
now becomes the At a glance card (values in full, same anchor id); When this
may not fit becomes the cautions block straight after; fit, checks, patient
language, plan, quick reference, example wording and compare next as plain
sections. Use in builder now uses the Clinical blue primary button instead
of the black one.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Mode homes: Browse links under the box on an empty home (audit item 17)

With nothing to continue and no favourites, a Clinical mode home shows
three or four Browse links to that mode's existing pages, as a hairline
group under the unchanged box. Adds Formulation, Specifiers, Forms,
Factsheets, Dictionary and Services. Medication has no medicine catalogue
page, so it links Factsheets and the Medicines home instead.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Formulation record: shared record layout and a Clinical blue main button

Name, definition and tags; the existing Compare in one action row; What
matters now becomes the At a glance card (same anchor and label ids); the
record's own caveats become the cautions block straight after, in full; fit,
clues, patient language, the three Ps, case example, formulation language,
treatment target, quick reference, add to a draft, compare next and evidence
notes as plain sections. Use in formulation now uses the Clinical blue
primary button instead of the black one. The shared list moves into
clinical-record-panels; the icon-tile fact and accordion blocks, now unused,
are removed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Medication record: shared record layout, no green side bar

Name, class line, indication and badges as the record intro; the key figures
sit in the At a glance card with each figure's flag unchanged (a high-risk
figure stays red and spoken); the record's avoid/caution quick-reference rows
become the cautions block straight after, in full; the tab sections are plain
headings with hairline rows and keep their fold, with the green left bar on
the sections panel removed; quick reference and access are plain sections and
From this page closes the record. Access values now wrap instead of clipping.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Shorten bottom-box prompts so each fits at 390 px

Measured against the composer's text width (194 px on mode homes, 241 px on
result pages, Geist 16 px): ten mode placeholders were cut with an ellipsis.
Only the placeholder words change; every mode keeps its fuller accessible
name, and the composer component is untouched.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Calculators: plain words in the About these tools notice

"3 candidate calculators remain governance-gated pending version, rights and
workflow review" now reads "Three more calculators are waiting for version,
rights and workflow checks before they appear." The telemetry sentence now
says the app's usage logs, and anything documented in the clinical record,
are covered separately. Same meaning.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Tests: follow the compact call button, single First Nations entry and All tools heading

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Forms record: shared record layout, facts shown in full

At a glance card holds every priority fact in full (no Tap for detail),
the legal boundary follows as the cautions card, and the cultural notes
move below the attachment row unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Tests: find the services phone button by its test id in the tap-floor check

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Services record: shared record layout, no blue side bar

The header card loses its blue left bar and icon tile and becomes the
shared record intro; priority facts become the At a glance card (the
region keeps the name Priority facts); sections are plain headings.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Compare sheet and comparison buttons: Clinical blue main buttons

The compare picker Done, the compare empty-state and slot-strip actions,
and the DSM Add to comparison button move from black to the Clinical
blue primary button.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* Phone composer: stop rem sizes growing past normal at large text

At 320 px with a 200% root the composer's buttons grew to 88 px and the
16 px field shrank to 0-24 px, so the prompt read "As". In the single
max-width:430px composer block each rem size is now capped in px just above
the largest density value (17 px root), so the composer is pixel-identical at
15, 16 and 17 px roots (verified 0 differing pixels at 390, 320 and 390
spacious on four pages) and stops growing past them. At large text the field
is now 130 px and "Ask a follow-up..." shows in full. Content clearance is
rem-based and already exceeds the smaller dock.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* A to Z strip: use the leading-snug token instead of an arbitrary line height

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8

* Medication Access panel: keep decimal strengths in Formulation (was cut to "Tablets (12")

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8

* Clinical wording: neutral Clozapine summary, missed-dose line matches WA guidance, differentials group note once

Josh approved items 19a-e and 20a-b of the Clinical audit wording proposals.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8

* fix(services): letter strip only for A to Z sort, tone-based chip shapes, visible call number

Same fixes as #3516 (32ac289); this branch carries the same navigator code.

* test(differentials): cover the once-only group note, Whole group marker and phone heading

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8

* fix(medications): match the Clozapine quick-reference missed-dose line to the approved wording

The quick reference still carried the old 'exactly 48 hours ... CANNOT restart'
text, contradicting the corrected dosing row and the WA interruption guidance on
the same page. It now repeats the approved line, with a test keeping the two in step.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015k5m5pXngW8LaerzAGumW8

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔴 Large blast radius size:XXL This PR changes 1000+ lines, ignoring generated files 🕐 40+ Minutes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants