Role-pure categorical tone scale for service pathway pills - #230
Merged
Conversation
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
enabled auto-merge (squash)
July 3, 2026 08:40
Merged
3 tasks
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>
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.
This was referenced Aug 12, 2026
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
11 tasks
1 task
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
--tone-*scale —--tone-indigo/--tone-rose/--tone-slatealongside the existing--tone-purple(light + dark + forced-colors), kept visually distinct from the role tokens and the Aegean accent.accent → indigo, Freesuccess → slate, ATSIinfo → rose. Crisis stays--danger(deliberate — genuinely emergent, matches the app'semergent → dangerconvention); Youth/Statewide unchanged.--success(green) or--clinical-accent(Aegean); those return to meaning ready/verified and selected/evidence/focus only.tealalias frompillToneClass; flatten themode-action-popupheader cell from an Aegean gradient (the app's lone raw#ffffffin 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/servicesconfirms 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