Skip to content

Role-pure categorical tone scale for service pathway pills - #230

Merged
BigSimmo merged 1 commit into
mainfrom
claude/categorical-tone-tokens
Jul 3, 2026
Merged

Role-pure categorical tone scale for service pathway pills#230
BigSimmo merged 1 commit into
mainfrom
claude/categorical-tone-tokens

Conversation

@BigSimmo

@BigSimmo BigSimmo commented Jul 3, 2026

Copy link
Copy Markdown
Owner

Summary

Fixes the one residual palette inconsistency found in the post-launch design review: the Services "Common pathways" pills reused semantic role colours and the brand accent for decorative taxonomy, diluting meanings those colours carry app-wide.

  • New categorical-only --tone-* scale--tone-indigo / --tone-rose / --tone-slate alongside the existing --tone-purple (light + dark + forced-colors), kept visually distinct from the role tokens and the Aegean accent.
  • Route decorative pills through it — Telehealth accent → indigo, Free success → slate, ATSI info → rose. Crisis stays --danger (deliberate — genuinely emergent, matches the app's emergent → danger convention); Youth/Statewide unchanged.
  • Free the semantic roles — no pill now uses --success (green) or --clinical-accent (Aegean); those return to meaning ready/verified and selected/evidence/focus only.
  • Two cleanups — drop the dead teal alias from pillToneClass; flatten the mode-action-popup header cell from an Aegean gradient (the app's lone raw #ffffff in live code) to a solid --clinical-accent, matching the de-glassed language.

Clinical governance preflight

Presentation-only. No changes to ingestion, answer generation, retrieval/ranking, document access, privacy, production env, or clinical output.

Verification

  • npm run typecheck ✓ · npm run lint (0 errors) ✓ · prettier --check ✓ · 0 page errors
  • DOM probe on /services confirms all 6 pills resolve to the intended categorical colours — Crisis #B42318, ATSI #A21CAF, Youth #7C3AED, Telehealth #4338CA, Free #475569, Statewide #667085 — with no success-green and no brand-accent among them.

🤖 Generated with Claude Code

The Services "Common pathways" pills reused semantic role colours and the
brand accent for decorative taxonomy — diluting meanings those colours
carry app-wide (green = ready/verified, Aegean = selected/evidence/focus).

Add a categorical-only --tone-* scale (--tone-indigo/-rose/-slate alongside
the existing --tone-purple; light + dark + forced-colors) kept visually
distinct from the role tokens and brand accent. Route the decorative pills
through it: Telehealth accent->indigo, Free success->slate, ATSI info->rose.
Crisis stays --danger (deliberate: genuinely emergent, matches the app's
emergent->danger convention); Youth/Statewide unchanged.

Also drop the dead `teal` alias from pillToneClass, and flatten the
mode-action-popup header cell from an Aegean gradient (the app's lone raw
#ffffff in live code) to a solid --clinical-accent, matching the de-glassed
language.

Verified: typecheck, lint (0 errors), prettier; DOM probe confirms all 6
pills resolve to the intended categorical colours with no success-green or
brand-accent among them. Presentation-only; no clinical logic touched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@BigSimmo
BigSimmo enabled auto-merge (squash) July 3, 2026 08:40
@BigSimmo
BigSimmo merged commit fb90325 into main Jul 3, 2026
4 checks passed
@BigSimmo
BigSimmo deleted the claude/categorical-tone-tokens branch July 5, 2026 11:43
cursor Bot pushed a commit that referenced this pull request Aug 4, 2026
…1609)

* docs: replace the search-bar handoff with a durable decisions record

`docs/handoff-search-bar.md` shipped to main in #1555. It existed to carry one
unverified commit across a session boundary, and its instructions are now false:
it tells the reader that `6917e732` is unverified and that no PR should be
opened on it, when #1555 merged exactly that work. Leaving it in the repo means
the next person to read it acts on stale gate status.

Its durable content — results-bar anatomy, why the filter shelf covers two modes
rather than eight, and the two things deliberately not done (the library button
stays until nav can preserve the query; Sort does not move into the phone sheet
from the shared band) — moves to docs/search-results-bar-decisions.md, verified
against current main rather than copied forward: `appliedFilters`/`onClearFilters`
still have exactly the two production consumers the doc claims, and the
`Open source library` control is still there.

Also records the PR-policy body defect that #1555's handoff flagged but never
captured: ci.yml's body-sync job reads PR_POLICY_BODY.md from the PR head, so
committing that scratch file to main (#1546) replaced every open PR's
description, and pr-policy.mjs parses the body as merge-gating input. #1548
deleted the file; nothing stops the next branch adding one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(ledger): record the search-bar decisions-doc review

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs: fix review findings on search-bar decisions record

Reconcile the twelve results-band modes with shelf scope, name the three
sheetless Sort consumers, tighten #230 to heads that contain
PR_POLICY_BODY.md, and update #170 so documents/therapy sheets match code.

* docs(ledger): record review-fix verification at tip

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
cursor Bot pushed a commit that referenced this pull request Aug 4, 2026
…o states that need one (#1612)

* docs(issues): record #230 live answer generation timeout

Production triage 2026-08-04 measured the live failure: OpenAI generation
overruns OPENAI_ANSWER_TIMEOUT_MS and the answer degrades to source-only,
while retrieval passes its gate with 12 candidates across 5 documents. The
2026-08-04 handover's four ranked hypotheses (query embedding, Supabase RPC,
source governance, corpus) are all ruled out by that evidence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* feat(ds): let EmptyState carry a heading, and adopt the two states that need one

EmptyState rendered its title as a <p>, so any empty state that owns a region
of the page could not adopt it without losing its heading. /dsm/search lost
exactly that when it adopted the primitive (#224), and the main document-search
empty state stayed hand-rolled because ui-smoke pins a heading role on it
(#217).

Add an opt-in headingLevel prop. It is deliberately un-defaulted: most adopted
call sites sit inside a card that already owns its region's heading, and
promoting every title would inject an outline level the page never declared.

- /dsm/search passes headingLevel={2}, restoring the heading it had before.
- The document-search empty state adopts EmptyState with headingLevel={3},
  which also converts it from a bespoke centred card to the shared state
  surface and gives it the polite live region every other adopted empty state
  has.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(issues): correct #230 — the fast route budget binds, not the env timeout

The first row named OPENAI_ANSWER_TIMEOUT_MS as the constraint. It is not,
and production does not set it. The query routes fast, so answerRouteBudgetMs.fast
(25s) is the ceiling and generationRequestTimeoutMs holds back the 2s recovery
reserve on top; the measured 24.7s is that budget being spent.

Also records the half with clinical consequence: answerRouteResultCanBeCached
excludes a route-deadline-exceeded answer but not one degraded by the OpenAI
request timing out, so a generation_fallback answer can be cached and re-served
after the provider recovers.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(ledger): record the PR #1612 review

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(issues): capture the five Wave 5 close-out residuals (#231-#235)

These came out of the DS V2 wave with no ledger row and would otherwise have
evaporated with the session: the stale PR-J governance review record, the
COMPONENTS.md section 0 drift plus the undocumented optionality-marker
contract change, the undocumented answer-copy-payload module, the missing
ADOPTION.md section 7 proof shots, and the two orphan builder branches and
leftover dev servers. The sixth residual, visual baselines staying zero and
advisory, is already ledger #118 and was deliberately not duplicated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* docs(issues): archive #217 and #224 completed by EmptyState headingLevel

PR #1612 added the opt-in headingLevel prop and adopted the DSM and
document-search empty states that needed it. Close both ledger rows so
/issues stops treating finished work as outstanding.

* docs(issues): correct #231 summary to name the binding fast-route budget

The detail already established that OPENAI_ANSWER_TIMEOUT_MS is not the
binding ceiling — answerRouteBudgetMs.fast = 25000 is. Align the summary
so triage does not raise a non-binding setting, and backtick the
src/lib/rag/** path so markdownlint MD037 stays quiet.

* ci: retrigger Production UI after known Services viewport-shrink flake

Production UI (1) failed once on ui-phone-scroll-page-owned:577
(Services results re-settle after viewport shrink) — same signature as
the 2026-07-31 flake noted in the branch-review ledger. Unrelated to
EmptyState headingLevel; shards 2/3 and critical passed. Cannot
rerun-failed via this token (403), so retrigger the pull_request run.

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
@cursor cursor Bot mentioned this pull request Aug 5, 2026
15 tasks
cursor Bot pushed a commit that referenced this pull request Aug 10, 2026
Cloud agent tokens cannot PATCH pull request bodies; the Sync PR policy
body job applies this scratch template with pull-requests:write. Remove
before merge so it does not land on main (#230).
cursor Bot pushed a commit that referenced this pull request Aug 10, 2026
Keeps the scratch template off the merge tip (#230) and retriggers PR
policy against the already-synced Clinical Governance Preflight body.
cursor Bot pushed a commit that referenced this pull request Aug 12, 2026
Resolve docs/outstanding-issues.md by keeping this PR's archive of
#207/#226/#230/#261/#284/#296 and updated open-row notes; main had no
unique open ids beyond those already archived here.

Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
BigSimmo pushed a commit that referenced this pull request Aug 12, 2026
docs/outstanding-issues.md has no merge driver by design, so this conflicted
in seven hunks. Resolved by taking main's file as the base — it carries main's
own archives (#207, #226, #230, #261, #284, #296) — then re-applying all 23 of
this branch's changes through scripts/outstanding-issues.mjs: 15 archives and
8 detail rewrites. Verified afterwards that every one landed and that the
guard reports no ids deleted from base.

Two rows are deliberately NOT resurrected. This branch's #302 (style-contract
line-break artifacts) and #303 (issues:next-id sync) no longer exist anywhere
on main under any id — main has since reused both numbers for entirely
different live rows. Both of this branch's rows were verified-delivered trivia,
so nothing actionable is lost, but the disappearance is itself evidence for
#156/#168: a main-side merge dropped rows, which is the hazard those rows
describe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017paT42ZVMf8jaLtkjFxdy5
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.

1 participant