DS V2 PR-V: values — tap knob to 48px, control radius to 10px - #1571
Conversation
No value deltas remain for slice 5a. 59e4c3d landed --shadow-well, the spine and status-mark families and the dark --clinical-chat-document fix; PR 3 (#1570) landed the remaining ink roles. The v2 light and dark blocks declare the same colour set, and the design-system contract reports rawColorLiterals 2 / literalShadowClasses 0 / legacyTapClasses 0 against an unchanged baseline. The two surviving #0f766e literals restate a Postgres column default for a per-record accent colour, so they are data rather than design tokens and stay put; SPEC now records why, to stop a later reader 'fixing' the app default away from the database default.
--spacing-tap goes 2.75rem -> 3rem in the globals @theme block, which is the only place it may be set (SPEC 4.10, DECISIONS C2). The v2 layer's --tap-min stops carrying its own value and becomes the pure alias var(--spacing-tap), so the app cannot render a 44/48 split. This moves 426 *-tap call sites across 90-odd files at once. Pins flip in this commit, not a follow-up: ckb-v2-token-contract now asserts the alias, that the v2 layer never declares the knob, and that the @theme value is at least 48px (checked on resolved rem, since a string compare would pass on an alias); ui-style-contract raises its rendered Chromium floor to 48; ui-tools expects the mode-home hero tile at 48. Two follow-through rules came out of the sweep and are written into SPEC 4.10. A grid track that holds a tap-sized child reads var(--spacing-tap) instead of copying the number - seven hardcoded 2.75rem tracks were audited and the launcher search row, the one with no gap between columns, was rebound; the other six absorb the extra 4px into an existing gap or the row's own padding. And the phone composer keeps a deliberate 44px below 431px, because its height is part of the search-chrome contract and 4px per button would re-tune the dock reserve and the phone CLS budget for no accessibility gain. Also retires two min-h-[44px] literals on interactive links onto min-h-tap, and rewrites the comments that restated 44px so they name the token instead. GATES gate 2 moves to implemented-blocking.
Live @theme --radius-md goes 0.5rem -> 0.625rem, which is the value the v2 layer already declares for controls, inputs and buttons. The two layers disagreeing is what made adoption reshape every control on a surface the moment it opted in (SPEC 4.6), so the step lands here, once, moving all 243 rounded-md call sites across 81 files with a single visual diff instead of one surprise per adopted surface. The 4px-grid pin flips in the same commit: the ladder now carries two named half-steps (sm 6px, md 10px) so a third cannot slip in, and the test additionally asserts the v2 control rung equals the live one - the drift this commit closes cannot silently reopen. Fourteen arbitrary radius literals are absorbed onto the ladder, each to its nearest rung with ties going to the smaller: the therapy 9/10/11/14px values PR-T carried over from the retired stylesheet, the 5px choice box, and the 1.1/1.15/1.35rem dialog and popover corners. The 2px cap on the mode-nav indicator stays a literal and now says why - it is a hairline below the ladder's 4px floor, where the nearest rung would double it into a visible dome.
|
This pull request has been ignored for the connected project Preview Branches by Supabase. |
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 46 minutes Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthroughThe shared tap target changes from 44px to 48px. The v2 token aliases the global token. Radius values and component styles use standardized utilities. Contract tests, UI tests, and design-system records document and validate the completed migration. ChangesDesign-system alignment
Estimated code review effort: 3 (Moderate) | ~25 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3bc571c7b1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex resolve actionable Codex review findings for this pull request and current head using the repository instructions. This is the pull request's single automatic repair pass: do not perform a fresh review, create new standalone findings, or request another review. Work only the existing unresolved Codex threads on the current head. The only repository destination is BigSimmo/Database, and the only branch destination is the pull request head branch claude/ds-v2-values at starting commit 3bc571c; never publish fixes to a detached or synthetic work branch and never create a stacked pull request. Use the authenticated GitHub connector to commit each approved fix to BigSimmo/Database:claude/ds-v2-values, then verify that the pull request head contains the published commit before reporting success. Always fix P0 and P1 findings. For P2 and lower findings, fix only clear, scoped, low-risk issues; otherwise disposition them with a concise reason. For a fixed thread, reply with as the first line and as the second line. For a no-code disposition, use followed by . These result markers authorize the workflow to close that exact thread only after it verifies a fixed commit is the pull request head; a local-only commit is not a fix. If publication or verification fails, do not use either result marker, do not claim success, and leave the thread open with the blocker. If human input or new authorization is required, do the same. Finish only after every actionable thread is fixed or dispositioned and closed, or explicitly left open for a human decision. Do not update the branch from main, address unrelated reviews, broaden scope, or create more than one scoped fix commit. Do not use external APIs, paid services, credentials, dependency changes, or broad refactors unless explicitly authorized. Add targeted tests where behavior changes and run the narrowest relevant validation. |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/design-system/SPEC.md`:
- Around line 660-664: The PR 5b status entry in the migration table has a stale
407-site count. Update the “407-site geometry change” text to 426 to match the
documented moved *-tap call-site count, unless 407 is explicitly defined as a
separate subset.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: e61742b4-aac7-4604-a43d-a199eb779176
📒 Files selected for processing (30)
docs/branch-review-ledger.mddocs/design-system.mddocs/design-system/DECISIONS.mddocs/design-system/GATES.mddocs/design-system/SPEC.mddocs/design-system/TOKENS.mdsrc/app/ckb-v2-tokens.csssrc/app/globals.csssrc/components/applications-launcher-page.tsxsrc/components/clinical-dashboard/account-setup-dialog.tsxsrc/components/clinical-dashboard/clinical-output-helpers.tsxsrc/components/clinical-dashboard/evidence-panels.tsxsrc/components/clinical-dashboard/mode-action-popup.tsxsrc/components/clinical-dashboard/settings-dialog.tsxsrc/components/mode-home-template.tsxsrc/components/mode-nav/mode-nav.tsxsrc/components/therapy-compass/bindings.tsxsrc/components/therapy-compass/controls.tssrc/components/therapy-compass/screens/detail-screen.tsxsrc/components/therapy-compass/screens/recommend-screen.tsxsrc/components/therapy-compass/therapy-card.tsxsrc/components/ui-primitives.tsxsrc/components/ui/button.tsxsrc/components/ui/chip.tsxsrc/components/ui/choice.tsxsrc/components/ui/citation.tsxtests/ckb-v2-token-contract.test.tstests/design-token-contract.test.tstests/ui-style-contract.spec.tstests/ui-tools.spec.ts
|
Codex Review: Didn't find any major issues. Bravo. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
CI triageCI failed on this PR. Automated classification of the 2 failed job(s):
Compared with main CI run #7793 (cancelled). Classification is evidence routing, not permission to ignore a failure. Exact quarantined Playwright identities remain governed by the flake ledger. |
|
@cursoragent Work the current open PR end-to-end. Confirm the PR number and GitHub head first from context. If more than one open PR could apply, stop and say which one you would use and why. Fetch and start from the remote tip that matches that GitHub head. If the named branch ref is missing or stale, use the PR head ref. Preserve unrelated local WIP, including any local-only ledger commits; do not discard dirty work, and do not treat a local-ahead commit as the reviewed tip. Do not merge the PR, force-push, rebase, or arm auto-merge unless I explicitly ask. No provider-backed gates without separate approval. If you cannot push or resolve threads, diagnose and comment only; if inline replies fail, resolve when possible and put dispositions in the summary comment. If auto-merge is already armed, push only for a real blocker, and avoid pushes that would cancel in-flight required CI unless the push itself clears that blocker. If the PR is already merged or closed: confirm the head and merge commit, note required-CI outcome, post one summary, and stop. Goal: deep review plus Bugbot, fix actionable issues with the smallest correct changes, clear merge / required-CI / thread blockers, run strong local offline verification, push fixes, append the review ledger, and post one PR summary. Prefer thoroughness over speed. Regenerate large assets only when a fix requires it; then run the asset check and keep compatibility aliases byte-identical where the repo uses them. Snapshot the GitHub head SHA: tip, base, behind/ahead, mergeable state, merge-tree versus origin/main (real conflict versus behind-but-clean), required checks on that tip including Production UI when selected, advisory separately, unresolved actionable threads. Missing checks while dirty are not green. If the tip moves mid-work, re-snapshot and continue from the new head. Ledger-lookup against that GitHub head under the heavy review-and-fix scope for this PR. Already reviewed at this head with clean merge-tree, green required checks, and no new actionable threads → summarize, comment, stop unless I asked for a fresh superseding pass. Follow the repo review protocol. Unblock once: real conflict → merge origin/main (prefer main’s shared queues; keep this PR’s notes); behind-but-clean → one sync, late if required CI is in flight; clean → leave. Labels like skip-branch-sync do not block a manual sync needed to clear a real blocker. No sync thrash. After any sync or push, re-snapshot tip, merge-tree, and required checks before declaring done. Dedupe the ledger if a merge touched it. Review high-confidence delta risks only. Separate PR-introduced defects from pre-existing re-emitted debt. For generated assets, review contracts, aliases, cache, and manifests—not every generated line. If protected RAG or ranking surfaces are touched, say so before editing; fix PR-body policy text only when wrong or missing. Ignore bot noise. No nit spam or broad rewrites. Escalate verification by touched risk: clinical / RAG / privacy / migrations / auth → domain check plus production-readiness when warranted; UI / phone-chrome / routing / styling → ensure plus phone-chrome or UI gates when warranted; generated assets or docs inventory/links → asset or docs checks when warranted. Fix P0/P1 always; clear scoped P2 when locally provable; else disposition and resolve. Required-check failures on this tip only; ignore advisory. Prefer reverting a bad autofix commit. After fixes: format and commit before push; smallest targeted proof; repo cheap gate; repo PR-local gate. No release, lighthouse, live eval, or live provider gates without approval. Push only this PR’s fix commits. Append ledger for the final GitHub head under the heavy scope. Never push a ledger-only tip—include ledger in a real fix push, or leave a no-change ledger append local and unpushed. One PR comment: tip, sync/merge-tree, fixed versus dispositioned, threads, required CI, decisive local gate lines, residual risks; merge left to me. Inline only for remaining human-needed P0/P1. Stop when merge-tree is clean on the current GitHub tip, actionable threads are clear, required checks are green or clearly in progress, heavy gates for scope passed, summary posted, merge left to me. |
Complete the phone-composer 44px exception for the input, move Tools search submit onto the tap knob, demote gate 2 to honest partial coverage, correct the SPEC 426-site count, and retune short-runway smoke pins for the 48px geometry. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
🔒 Upgrade RequiredPrivate repository analysis requires Pro or Enterprise. Upgrade: https://ecc.tools/pricing?plan=pro ECC Tools keeps the core app open, and puts private repos, team features, and enterprise controls behind paid tiers. |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/design-system/GATES.md`:
- Line 43: Update Gate 2 documentation to match the actual enforcement level:
either make the Chromium audit cover all interactive controls, define explicit
exceptions, wire it into required verify:cheap/CI checks, and mark the relevant
Gate 2 entries as implemented-blocking, or retain implemented-partial and revise
the documented objective to acknowledge that h-10 controls and the unwired audit
are not blocked. Anchor changes to the Gate 2 entry and its corresponding entry
at line 87.
In `@tests/ui-overlay-css-contract.test.ts`:
- Line 77: Update the responsive CSS assertion in the UI overlay contract test
to isolate the `@media` (max-width: 430px) block before validating the
chat-composer declarations. Ensure both selectors and their expected dimensions
are matched only within that extracted block, preventing later rules or media
blocks from satisfying the assertion.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 858bb582-da8f-40e0-8e98-68030654be73
📒 Files selected for processing (8)
docs/design-system/GATES.mddocs/design-system/SPEC.mdsrc/app/globals.csssrc/components/applications-launcher-page.tsxsrc/components/clinical-dashboard/account-setup-dialog.tsxtests/mobile-interaction-regressions.test.tstests/ui-overlay-css-contract.test.tstests/ui-smoke.spec.ts
🚧 Files skipped from review as they are similar to previous changes (4)
- src/components/clinical-dashboard/account-setup-dialog.tsx
- src/components/applications-launcher-page.tsx
- src/app/globals.css
- docs/design-system/SPEC.md
PR #1571 end-to-end review+fix summaryTip: Findings → disposition
Threads
Local gates (decisive lines)
Required CIPushed fix cancelled the prior red tip. On Residual risks
Merge left to you. |
Revise the Gate 2 objective/evidence so fixed h-10 controls and the unwired Chromium audit are explicitly not claimed as blocked, and scope the 430px composer contract assertion to the extracted media block. Co-authored-by: BigSimmo <BigSimmo@users.noreply.github.com>
Tip update —
|


Summary
Phase 2 of the Fable V2 design system — the values tranche (SPEC §13 PR 5a/5b/5c), as three ordered, independently revertible commits. Each value change carries its own test pins in the same commit, so a revert never leaves a pin behind.
59e4c3dfclanded the--shadow-wellrename, the evidence-spine and status-mark families and the dark--clinical-chat-documentfix; PR 3 (DS V2 PR-A: correctness — HCM proofs, contrast/disabled, prop unions #1570) landed the remaining ink roles. The v2 light and dark blocks now declare the same colour set, and the design-system contract reportsrawColorLiterals 2 / literalShadowClasses 0 / legacyTapClasses 0against an unchanged baseline. SPEC now records why the two surviving#0f766eliterals stay: they restate a Postgres column default for a per-record accent colour, so they are persisted data rather than design tokens, and changing the application default without migrating the database default would diverge the two.--spacing-tapgoes2.75rem→3remin the globals@themeblock, which is the only place it may be set (SPEC §4.10, DECISIONS §C2). The v2 layer's--tap-minstops carrying its own value and becomes the pure aliasvar(--spacing-tap), so the app cannot render a 44/48 split. This moves 426*-tapcall sites across roughly 90 files at once. Two follow-through rules came out of the sweep and are now written into SPEC §4.10: a grid track that holds a tap-sized child readsvar(--spacing-tap)rather than copying the number (seven hardcoded2.75remtracks were audited; the launcher search row, the one with no gap between its columns, was rebound, and the other six absorb the extra 4px into an existing gap or the row's own padding); and the phone composer keeps a deliberate 44px below 431px, because its height is part of the search-chrome contract and 4px per button would re-tune the dock reserve and the phone CLS budget for no accessibility gain. Twomin-h-[44px]literals on interactive links move ontomin-h-tap, and the comments that restated 44px now name the token instead.@theme --radius-mdgoes0.5rem→0.625rem, which is the value the v2 layer already declares for controls, inputs and buttons. The two layers disagreeing is what made adoption reshape every control on a surface the moment it opted in (SPEC §4.6), so the step lands here, once, moving all 243rounded-mdcall sites across 81 files with a single visual diff instead of one surprise per adopted surface. Fourteen arbitrary radius literals are absorbed onto the ladder, each to its nearest rung with ties going to the smaller. The 2px cap on the mode-nav indicator stays a literal and now says why: it is a hairline below the ladder's 4px floor, where the nearest rung would double it into a visible dome.ckb-v2-token-contractnow asserts the--tap-minalias, that the v2 layer never declares the knob, and that the@themevalue is at least 48px, comparing resolved rem rather than strings (a string compare would pass on an alias).ui-style-contractraises its rendered Chromium floor to 48.ui-toolsexpects the mode-home hero tile at 48.design-token-contractnames both sanctioned radius half-steps (6px and 10px) so a third cannot slip in, and additionally asserts the v2 control rung equals the live one, so the drift this PR closes cannot silently reopen. GATES gate 2 moves from implemented-partial to implemented-blocking.Verification
npm run verify:pr-local -- --files <the 30 changed paths>— PASS.Test Files 471 passed (471),Tests 4880 passed | 3 skipped (4883); production build✓ Compiled successfully in 32.1s;Client bundle secret surface check passed.npm run verify:ui—346 passed,1 failed. The single failure istests/ui-smoke.spec.ts:2221("phone answer result keeps the edge dock and shared chrome synchronized on a short runway"), which fails identically on unmodifiedorigin/mainin this local environment:maxOffset99 at the base tree versus 111 at this head, reproduced in a pristine second worktree with its ownnpm ciand its own Playwright build root. CI is green on that same base tree (run30720360137, PR-A headd5e90b8a7→3520e3289:Production UI criticalandProduction UI (1) (2) (3)allsuccess), so this is a local environment divergence in the same class as the knowneval:rag:offlinetimeouts, not a regression introduced here. CI's Production UI job is the binding verdict for it.npm run verify:phone-chrome -- --full=never— contractsTest Files 9 passed (9),Tests 116 passed (116); changed-browsertests/ui-tools.spec.ts87 passed; focused browser journeys10 passedplus the same single known-red test above. The full-UI stage was skipped deliberately becauseverify:uihad already run on this exact tree.npm run test:e2e:critical—15 passed.npm run typecheck,npm run format:check(All matched files use Prettier code style!),node scripts/check-design-system-contract.mjs(raw colors 2; literal shadows 0; legacy tap classes 0), and the docs-surface checks (check:branch-review-ledger,check:outstanding-issues,sitemap:check,docs:check-links,docs:check-index) all exit 0.origin/mainversus this head (answer, forms and therapy groups × light/dark × desktop/320px × forced-colors, plus print for the answer routes): 50 shots each side. Review evidence only —.tmp-visual/is gitignored and nothing is committed (issue#118hold respected).npm run verify:release— not run: release gates are provider-backed and this is not a release handoff.npm run eval:retrieval:quality,npm run eval:rag,npm run eval:quality— not run: no retrieval, ranking, selection, chunking or scoring behaviour changed, and these need live provider keys.npm run check:production-readiness— not run: no clinical workflow, privacy, environment, Supabase, source-governance or deployment behaviour changed.RAG impact: no retrieval behaviour change — this PR changes only token values (tap size, control radius) and comments; nothing under
src/lib/rag/**, clinical-search, retrieval-selection, ranking-config, answer-ranking, the eval harness or the golden fixture is touched.verify:pr-localstill classified the diff into the offline eval becausesrc/components/ui/citation.tsxmatches thecitation*.tsxscope pattern (a comment-only edit there), and that eval ran green:Offline RAG fixture and manifest validation passed (36 golden cases, 23 suites)withTests 574 passed (574), which is better than the known-red local baseline of 570/574.Risk and rollout
*-tapcontrol grows 4px and everyrounded-mdcorner grows 2px. The blast radius is visual rather than behavioural: no data, API, auth or clinical logic is touched, and the token contracts now pin both values from both layers. The residual risk is a per-surface layout surprise that neither the Chromium journeys nor the before/after inventory caught; the phone answer runway pin discussed above is the one place where local and CI geometry disagree, and CI adjudicates it.5c(d33721b43) for the radius,5b(d927c64b2) for the tap knob. Each carries its own test pins, so a single revert restores a consistent state without a follow-up. After squash-merge, revert the corresponding hunks of the squash commit.Notes
public/offline.htmllink to 48px. It was reverted before push:tests/pwa-manifest.test.tsbinds that file's hash to the service-workerCACHE_VERSION, so a 4px change on an offline fallback link would have forced a cache-version bump and re-precached every installed client. Left as a candidate for a PWA-scoped change instead.src/components/ClinicalDashboard.tsxkeeps itsmin-h-[44px]literal deliberately: that element is arole="status"loading strip, not a tap target, and putting the tap token on a non-target is exactly the misuse SPEC §4.10 warns about.3520e3289), which is this branch's base.Summary by CodeRabbit
Accessibility & Interaction
Visual Updates
Documentation
Tests