diff --git a/docs/outstanding-issues-inbox/338d45ec-397e-4eb4-b991-3185079509a4.json b/docs/outstanding-issues-inbox/338d45ec-397e-4eb4-b991-3185079509a4.json new file mode 100644 index 0000000000..9d5a6936f7 --- /dev/null +++ b/docs/outstanding-issues-inbox/338d45ec-397e-4eb4-b991-3185079509a4.json @@ -0,0 +1,13 @@ +{ + "version": 2, + "id": "338d45ec-397e-4eb4-b991-3185079509a4", + "createdOn": "2026-08-18", + "action": "add", + "payload": { + "pri": "P3", + "type": "rec", + "summary": "therapyBtn still dresses 30 raw controls across 8 therapy files with no shared equivalent", + "detail": "Measured 2026-08-18 on main at adf93a75. src/components/therapy-compass/controls.ts exports therapyBtn, used at 30 call sites across therapy-card.tsx (2), detail-screen (2), pathways-screen (4), compare-screen (3), search-screen (2), sheets-screen (8), recommend-screen (6) and brief-screen (3). PR #2122 deleted the three button recipes it sat beside (commandControl, outlineControl, iconControl) and converted their 19 call sites to the shared Button, but deliberately kept therapyBtn: its remaining consumers are list rows, disclosure headers, section toggles and chips - controls that are not Buttons in the design-system sense, so forcing them onto the Button variants would have been wrong. The gap is that nothing shared covers them either, so therapy carries its own focus ring, hover lift and dual disabled encoding (native disabled plus aria-disabled) while every other mode hand-rolls or omits equivalents. Worth deciding whether the design system should own an interactive-row or quiet-control recipe, which would serve more than therapy - the same question card-recipes.ts answered for cards. Note therapyBtn already composes the shared focusRing from card-recipes.ts, so the focus contract is not forked; what is local is the hover/press motion and the disabled encoding. Stop rule: do not resolve this by converting the 30 sites to Button variants - that was considered and rejected during #2122 because a list row is not a button, and it would put button chrome on card-like surfaces.", + "issueUlid": "01M0BC5VWSVTEW3WBG12P6WNRG" + } +} diff --git a/docs/outstanding-issues-inbox/95093e96-5953-48a0-a8bc-508d625fb57e.json b/docs/outstanding-issues-inbox/95093e96-5953-48a0-a8bc-508d625fb57e.json new file mode 100644 index 0000000000..0678e55041 --- /dev/null +++ b/docs/outstanding-issues-inbox/95093e96-5953-48a0-a8bc-508d625fb57e.json @@ -0,0 +1,13 @@ +{ + "version": 2, + "id": "95093e96-5953-48a0-a8bc-508d625fb57e", + "createdOn": "2026-08-18", + "action": "add", + "payload": { + "pri": "P2", + "type": "rec", + "summary": "Therapy keeps a private eight-component UI kit whose shared equivalents it imports zero times, including the badge that carries review status", + "detail": "Measured 2026-08-18 on main at adf93a75, after PRs #2122 and #2150. src/components/therapy-compass/ui.tsx exports Tag, TagRow, StatusBadge, IconTile, LoadingState, EmptyState, Eyebrow and Meter. Shared equivalents exist and Therapy imports them zero times: ui/chip.tsx for Tag/TagRow (Chip is imported in exactly one therapy file), ui/status-mark.tsx for StatusBadge, ui/error-state.tsx for EmptyState, ui/progress.tsx for Meter, the eyebrowText primitive for Eyebrow, and category-icon-tile.tsx for IconTile. This is the same class of duplication card-recipes.ts was written to end for cards, one layer down, and it survived the #2122 convergence because that work targeted Button, card surfaces and page headers only. Highest-consequence piece: StatusBadge renders the Needs source review label, which since #2150 is the per-record half of the only protection standing between an unreviewed therapy record and a clinical decision - and it is a module-private implementation no shared contract governs. Two migration hazards to respect. (1) StatusBadge pairs its warning tone with a TriangleAlert glyph via reviewStatusMeta in data/select.ts; any swap must preserve that shape channel or the warning becomes colour-only and trips the status-colour boundary ratchet. (2) Meter's colour-only status was deliberately fixed in commit 8c791a1ad by naming the completeness band in text; a naive swap to shared Progress would regress it. Suggested order: Eyebrow and Tag/TagRow first (lowest risk, no status semantics), then EmptyState and IconTile, then Meter and StatusBadge last with the colour-only contract tests extended first. Stop rule: do not fold any of these into ui-primitives.tsx; COMPONENTS.md section 0.4 lists that module as over-budget and slated to split. Related: #ZF006G tracks the parallel SectionHeading duplication across four modes.", + "issueUlid": "01M0BC5ER3NEBJAMD4VC43PGZV" + } +} diff --git a/docs/outstanding-issues-inbox/ff1ea3f9-2bdc-4a9f-86de-185ec1b6c9e5.json b/docs/outstanding-issues-inbox/ff1ea3f9-2bdc-4a9f-86de-185ec1b6c9e5.json new file mode 100644 index 0000000000..386f4207a5 --- /dev/null +++ b/docs/outstanding-issues-inbox/ff1ea3f9-2bdc-4a9f-86de-185ec1b6c9e5.json @@ -0,0 +1,11 @@ +{ + "version": 2, + "id": "ff1ea3f9-2bdc-4a9f-86de-185ec1b6c9e5", + "createdOn": "2026-08-18", + "action": "done", + "payload": { + "id": "#FEWQZ5", + "outcome": "Done — all three stages landed in PR #2122 (squash 092633eb). B3: 19 control-recipe call sites converted to the shared Button and commandControl/outlineControl/iconControl deleted. C: all 16 therapy card surfaces converged on card-recipes cardSurface, with the hero accent edge kept on the left as heroAccentEdge reading the shared --cat-accent. D: six page headers adopted the shared PageHeader; three h1 remain and are tracked separately as #D6G8TC. Verified by verify:cheap (673 files, 7276 tests), verify:ui (447 passed) and check:design-system-contract; ratchets fell (legacy shadow aliases 104 to 89, padding 53 to 52, gaps 30 to 28) and none rose.", + "baseRowFingerprint": "7b5fdb9a549a2a27814e8cdc0f54123556a5f285c093a0968e357d9a23463730" + } +}