Skip to content

Re-land the --shadow-tight retirement and close three design-token debt rows - #1942

Merged
BigSimmo merged 12 commits into
mainfrom
claude/design-token-relands
Aug 14, 2026
Merged

Re-land the --shadow-tight retirement and close three design-token debt rows#1942
BigSimmo merged 12 commits into
mainfrom
claude/design-token-relands

Conversation

@BigSimmo

@BigSimmo BigSimmo commented Aug 14, 2026

Copy link
Copy Markdown
Owner

Summary

Four low-risk design-token items from the outstanding-issues sweep, bundled because each is a pure CSS/class change with no logic, no clinical or RAG path, and no build-tooling config. Each is its own separately revertible commit. Two follow-up commits repair a ledger request that a concurrent merge invalidated, and retire the token from the three design docs that still described it as live.

  • Re-land the --shadow-tight retirement onto --e1 (row #319). PR Retire the --shadow-tight role alias onto the --e1 elevation tier #1803 retired this role alias across 49 files and squash-merged as 9d8370a on 2026-08-10; the acf78bf merge on 2026-08-11 silently reverted it along with six other PRs. Re-applied against current main: 130 call sites across 67 files, plus both declarations. The alias was a pure pass-through (--shadow-tight: var(--e1) in both themes), and the @media (forced-colors: active) block scopes :root, .dark — the same html element the alias is declared on — so it already resolved through the flattened --e1: none. Value-preserving in light, dark and forced-colors. tests/design-token-contract.test.ts now sweeps the tracked src tree for both spellings (declaration and var() consumer) rather than asserting the declaration alone, so the gate no longer depends on which half of a bad merge lands. Mutation-verified in both directions.

  • Re-pin five design-system contract ratchets to their measured values (#302). The baseline is a ceiling, so paying debt down leaves silent headroom. With the retirement applied: legacyShadowAliases 220 → 119, edgeOwnershipConflicts 27 → 25, rawPaddingLiterals 67 → 63, rawGapLiterals 34 → 32, layoutTransitionExceptions 12 → 11. Regenerated with --print-debt-baseline so per-path debtByPath moves with the totals — those are what findDebtPathRegressions compares. Every metric in the diff decreases; nothing is absorbed upward. Mutation-verified: reintroducing one alias now fails at both the total and the per-path level, where the old ceiling passed it silently.

  • Hold the search-band count bubble in a spacing token (#275). 1.0625rem becomes --spacing-search-band-badge, consumed as h-search-band-badge / min-w-search-band-badge. Re-measured on merged main the badge role is down from this row's five files to one, because #170's convergence landed in between. Value-preserving and proven rather than inferred: compiling globals.css through @tailwindcss/postcss emits .h-search-band-badge { height: var(--spacing-search-band-badge) } and the matching min-width rule. Two arbitrary values in the same component are deliberately left raw and re-filed as their own ledger rows — the min-[414px]:max-[429px] window (the repo defines zero --breakpoint-* tokens and eight peer sites use the same raw form, so naming one is the same drift on another axis), and the three 1.0625rem hits in mode-nav/nav-slot-ink, which size <Icon> glyphs against a 12/14/16/20/24 icon scale and are a different role, not this token.

  • Close out DS Track A3 (#262 parts 2 and 3). Part 3 already shipped in PR feat(design-system): ratchet raw scale literals and gate type-step selection (#262 parts 2 and 3) #1780 per #301; confirmed against the checker, not the row. Part 2 needs no work, and that was already adjudicated in docs/design-system/GATES.md §3: the decidable half of step selection ships inside check:design-system-contract, and the remaining half — which existing step a component picks — is documented there as something "nothing mechanical can" gate, with a standing instruction not to duplicate the arbitrary-value check check:type-scale already ships. §3's live status rows carried the five numbers this PR moved and are corrected in the same commit, per #301's lesson that a row understating shipped work is a duplicate-work generator. §5 is left alone deliberately — it is a dated record, not a live status surface.

  • Retarget the reland ledger record after a mid-flight reconciliation. The first push queued a cancel against inbox request 210e3db5, which was correct at the time. PR chore(issues): reconcile 75 queued ledger requests #1936 then reconciled 75 queued requests — 210e3db5 among them — moving it to docs/outstanding-issues-inbox/applied/ and allocating it canonical row #319. check-docs-links.mjs replays the inbox batch to resolve link targets, so the now-dangling cancel failed CI with cancel request 2e791c01… targets missing pending request 210e3db5…. The cancel is dropped and replaced with a done against #319, which is also the better record: the work is finished rather than withdrawn, so the ledger keeps its outcome and its guard instead of discarding them.

  • Retire the token from the three remaining design docs. docs/redesign/02-design-direction.md, docs/redesign/permanent-colour-direction.md and .design-sync/conventions.md each still listed --shadow-tight → --e1 as a live alias. The source retirement above had left them stating the opposite of the code. Re-audited afterwards: every surviving mention is deliberate — the GATES.md prohibition row (naming the banned token is the point), the retirement test, unrelated CLI-flag fixtures in repo-hygiene.test.ts, the superseded HANDOVER-2026-08-07.md, and a dated historical entry at process-hardening.md:454 describing a 2026-07-02 change, which would be falsified by editing.

Verification

  • npm run verify:pr-local

Re-run after merging origin/main. All stages pass except one pre-existing failure unrelated to this diff, detailed below.

- completed: check:runtime, check:installed-lock-parity, format:changed, sitemap:check,
  docs:check-index, docs:check-inventory, docs:check-scripts, docs:check-links,
  check:branch-review-ledger, check:outstanding-issues, check:ledger-write-discipline,
  lint, typecheck, test, build, eval:rag:offline, check:medication-interactions
- failed: check:medication-lexicon-report (exit 1)

check:medication-lexicon-report reports docs/medication-interaction-lexicon-review.md is stale. This is pre-existing on origin/main and not caused by this branch: the diff touches zero medication, lexicon or data/ files, and a clean worktree at pristine origin/main reproduces it at both d47aa6d and 79b01b3. It is also not wired into any CI workflow — a grep over .github/workflows/ finds nothing — so it fails every local preflight while CI stays green. Filed as its own ledger row rather than fixed here: the stale file is a clinical-facing generated document, and regenerating it inside a CSS-token PR would bundle a clinical-risk artefact with unrelated chores.

Full unit suite:

Test Files  601 passed (601)
Tests  6510 passed | 4 skipped (6514)

Token contract and tailwind-merge config gates:

Test Files  2 passed (2)
Tests  69 passed (69)

Re-verified on the current tip after both the origin/main merge and the doc commits, rather than assumed: the tracked tree holds zero --shadow-tight references in src/, and every pinned ratchet still measures exactly its baseline — so neither the merge nor the doc changes moved a metric, and the pins stay honest.

UI verification not run locally: the change is value-preserving by construction and proven so at the CSS level rather than visually. --shadow-tight resolved to var(--e1) in every scope, the badge token compiles to the same 1.0625rem, and no measurement moved. There is no rendered difference for a browser gate to detect. CI covers it regardless — Production UI (1), (2), (3), Advisory UI and Lighthouse budget all pass on this head.

Risk and rollout

  • Risk: Low. CSS custom-property and class changes only; no logic, no data, no API, no auth. The widest blast radius is the shadow substitution across 67 files, which is value-preserving in light, dark and forced-colors and is now pinned by a tracked-tree contract test. The main residual risk is the one this PR is fixing — that a future merge silently reverts it again — which the new gate makes loud.
  • Rollback: git revert any single commit independently while the branch is open. After the squash-merge the commits fold into one, so a post-merge rollback of one item means reverting that commit's hunks by hand. The baseline re-pin is the only commit with an ordering dependency: it must not be reverted while the retirement stands, or the ratchet regains roughly 100 units of headroom.
  • Provider or production effects: None. No provider-backed gate was run; nothing touches OpenAI, Supabase, hosted CI, or deployment.
  • One process note for the reviewer: a follow-up commit removes an inbox request file that an earlier push had already published. That trips the pre-push ledger-write guard, which compares against the pushed branch tip, so the push used the repo's documented SKIP_LEDGER_WRITE_GUARD=1 escape hatch with the maintainer's approval. The removal is invisible in the merged result — the file appears nowhere in git diff origin/main...HEAD — and CI's own copy of the same check, which uses the main base, passes. There was no in-place repair available: the tooling forbids cancelling a cancellation by design, and a revert commit registers as the same deletion.

Clinical Governance Preflight

classifyPullRequestFiles returns clinicalRisk: true for this diff because it touches DocumentViewer, document-viewer/** and clinical-dashboard source-rendering components. Those edits are shadow-token substitutions inside className strings only — no source, citation, retrieval or document-access behaviour changes. ragRanking is false; no ranking surface is touched, so no RAG impact: line applies.

  • Source-backed claims still require linked source verification before clinical use
  • No patient-identifiable document workflow was introduced or expanded without explicit governance approval
  • Supabase target remains Clinical KB Database (sjrfecxgysukkwxsowpy)
  • Service-role keys and private document access remain server-only
  • Demo/synthetic content remains clearly separated from real clinical sources
  • Source metadata, review status, and outdated/unknown-source behavior remain conservative
  • Deployment classification/TGA SaMD impact was checked when clinical decision-support behavior changed

Notes

  • Ledger records are queued as immutable inbox requests, not written to the canonical ledger: #319, #262, #302 and #275 closed, and four new rows filed — the two #275 carve-outs (the repo-wide breakpoint-token decision, and three off-icon-scale mode-nav glyphs), plus the two findings this preflight surfaced (the stale lexicon report that no CI job runs, and Claude Code web containers shipping Node 22 with no node_modules, which fails npm ci on engine-strict before any repo script can run). Run npm run issues:reconcile after this lands.
  • Two comments corroborate the original merge loss: the globals.css note that "the resting-hairline role is gone" and the token test's "unlike the --shadow-tight assertion above" both survived acf78bf while the code they describe was reverted. Both are accurate again.
  • One measurement trap for anyone re-checking #262 part 2: a raw grep for text-<step> overcounts, because it also matches the --text-*: declarations and doc comments. That is the 733-vs-705 discrepancy GATES.md line 66 already warns about, and it reproduces today — a naive sweep returns 773. Use the AST class-root pass.

claude added 4 commits August 14, 2026 10:31
PR #1803 retired the --shadow-tight role alias in favour of the --e1
elevation tier across 49 files and squash-merged as 9d8370a on
2026-08-10. The acf78bf merge on 2026-08-11 silently reverted it, along
with six other PRs. This re-applies the retirement against current main:
130 call sites across 67 files, plus both declarations.

The alias was a pure pass-through -- `--shadow-tight: var(--e1)` in the
light and dark role blocks -- so the substitution is value-preserving.
Confirmed for forced-colors too rather than assumed: the
`@media (forced-colors: active)` block scopes `:root, .dark`, the same
`html` element the alias is declared on, so `--shadow-tight` already
resolved through the flattened `--e1: none` there. The .ckb-v2
redeclaration hazard does not bite for the same reason -- .ckb-v2 sits on
<html> and .ckb-v2.ckb-v2 outspecifies :root, so both spellings
substitute against the winning v2 tier.

Two comments survived acf78bf while the code they describe did not: the
globals.css note that "the resting-hairline role is gone", and the token
test's "unlike the --shadow-tight assertion above". Both are accurate
again.

The token contract test now sweeps the tracked src tree for both
spellings (declaration and var() consumer) instead of only asserting the
declaration. A declaration-only check would have caught this particular
revert, but only because the declarations happened to come back with the
call sites; sweeping both makes the gate independent of which half of a
bad merge lands. Mutation-verified in both directions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XsBPUoxpsvTwvFMJzrNoyz
…values

`scripts/design-system-contract-baseline.json` is a ceiling, so paying
debt down leaves silent headroom behind. Ledger #302 records that
pattern: legacyShadowAliases was pinned at 220 against a measured 193,
27 units of unguarded slack, up from 3 units on 2026-08-10.

With the previous commit's --shadow-tight retirement applied the gap is
wider still -- 220 pinned against 119 measured -- because the reland pays
down the debt the acf78bf revert had re-hidden. Four other ratchets had
accumulated slack from unrelated work in the same window.

  legacyShadowAliases        220 -> 119
  edgeOwnershipConflicts      27 -> 25
  rawPaddingLiterals          67 -> 63
  rawGapLiterals              34 -> 32
  layoutTransitionExceptions  12 -> 11

Regenerated with --print-debt-baseline rather than hand-edited, so the
per-path debtByPath counts move with the totals -- those are what
findDebtPathRegressions compares, and the retirement moved them
wholesale. Every metric in the diff decreases; nothing is absorbed
upward.

This is not the baseline refresh #262 warns against. That stop rule
forbids refreshing to hide the movement; this pins the movement in so it
cannot silently drift back a second time.

Mutation-verified: reintroducing one alias in button.tsx now fails at
both the total (119 -> 120) and the per-path level. Under the old 220
ceiling the same addition passed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XsBPUoxpsvTwvFMJzrNoyz
The active-filter badge sized itself with a raw `h-[1.0625rem]
min-w-[1.0625rem]` pair. Ledger #275 tracks that value as leaked debt:
it had reached five files, so the fix has always been to tokenise once
rather than edit a call site.

Re-measured on merged main, the badge role is down to a single call
site. #170's convergence landed in the meantime -- document-search-
results.tsx now renders the shared control and therapy-compass/
filter-sheet.tsx was deleted outright -- so the leak this row was
written about has already been reabsorbed by the extraction. Holding
the value in @theme is what stops it leaving again.

Two arbitrary values in the same component are deliberately left raw:

  pr-[0.6875rem] and min-[414px]:max-[429px] -- the repo defines no
  --breakpoint-* tokens at all, and eight peer sites use the same raw
  min-[]/max-[] form (359px, 389px, 414px). Naming one window while the
  peers stay raw is the same drift #275 warns about on another axis, and
  Tailwind named breakpoints would add variants across the whole utility
  surface. That belongs in a repo-wide decision, filed separately.

The three remaining 1.0625rem hits in mode-nav.tsx and nav-slot-ink.tsx
are NOT this token. They size <Icon> glyphs -- a 17px icon against a
12/14/16/20/24 --spacing-icon-* scale -- so folding them under a badge
token would merge two roles that only happen to share a number.
check:icon-scale deliberately does not flag arbitrary h-[Nrem], so they
are a real but separate finding, filed rather than guessed at.

The token is also registered in CLINICAL_TWMERGE_THEME.spacing, which
tests/tailwind-merge-config.test.ts asserts against the @theme block --
without it `cn()` cannot resolve a conflict on the new utility. Safe by
that file's own `tap` reasoning: the single call site is a static string
carrying no competing h-*/min-w-* class and never passes through `cn()`,
so there is no same-variant pair for declaration to hand to the later
class. The entry is protective for future use, not load-bearing today.

Value-preserving, and proven rather than inferred: compiling globals.css
through @tailwindcss/postcss emits
  .h-search-band-badge { height: var(--spacing-search-band-badge) }
  .min-w-search-band-badge { min-width: var(--spacing-search-band-badge) }
No ratchet moved, so the ceilings pinned in the previous commit still sit
at zero slack.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XsBPUoxpsvTwvFMJzrNoyz
… rows

Track A3 is `#262`. Its three parts are now all settled, each checked
against code rather than against the row that describes it.

Part 1 is the --shadow-tight retirement re-landed earlier in this PR.
Part 3 shipped in PR #1780 per `#301`: rawPaddingLiterals,
rawRadiusLiterals and rawLineHeightLiterals are live baseline keys
enforced over both the class and CSS-declaration spellings, plus
rawGapLiterals beyond the original ask.

Part 2 needs no work, and that had already been adjudicated -- GATES.md
section 3 records it, which is why nothing here builds it. The decidable
half of step selection shipped on 9 Aug inside check:design-system-
contract: a declared @theme step no production surface selects fails the
build. The remaining half -- which existing step a component picks -- is
documented there as something "nothing mechanical can" gate, being a
judgement about the rendered design rather than a property of the source,
with a standing instruction not to duplicate the arbitrary-value check
check:type-scale already ships. Reading `#262` alone would have sent a
session to build it; that is the `#301` failure mode, so the closure
record says so explicitly.

Section 3's live status rows carried numbers this PR moved. `#301`'s
lesson is that a row understating shipped work is a duplicate-work
generator, so they are corrected in the same change:

  legacyShadowAliases        224 -> 119, and the alias is now retired
                             outright rather than "224 left to retire"
  edgeOwnershipConflicts      27 -> 25
  rawPaddingLiterals          67 -> 63
  rawGapLiterals              34 -> 32
  layoutTransitionExceptions  12 -> 11

Section 5 is left alone deliberately: it is a dated record measured
against 8db1e53, not a live status surface, and rewriting its figures
would destroy the provenance it exists to hold.

Ledger records are queued as immutable inbox requests: `#262`, `#302` and
`#275` closed; two carve-outs split out of `#275` filed as their own rows
(the repo-wide breakpoint-token decision, and three 17px mode-nav icon
glyphs that sit off the --spacing-icon-* scale with no gate covering
them). The queued re-land request 210e3db5 is cancelled rather than
reconciled -- its headline "67 files on main still use the retired alias"
is false as of this branch, so it would open a row wrong on arrival. The
request file and the cancellation both survive as provenance for the
acf78bf merge loss.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XsBPUoxpsvTwvFMJzrNoyz
@supabase

supabase Bot commented Aug 14, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project sjrfecxgysukkwxsowpy because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 7 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 @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 49cc48d9-f1da-4911-ab63-9253c308b5b7

📥 Commits

Reviewing files that changed from the base of the PR and between 3d5cd7c and 3685848.

📒 Files selected for processing (85)
  • .design-sync/conventions.md
  • docs/branch-review-records/a575dd1afa8eb2039c28d877548cd8f17499a67838484db45ce4d92c7593d198.record.md
  • docs/design-system.md
  • docs/design-system/GATES.md
  • docs/outstanding-issues-inbox/04a0b8d6-8af9-4779-8af8-8e3b6e9a3b2b.json
  • docs/outstanding-issues-inbox/11e56221-8d46-4c9a-a89c-78621f18e754.json
  • docs/outstanding-issues-inbox/25f6b53a-86e2-42e9-9b38-1c2daae28892.json
  • docs/outstanding-issues-inbox/39b08439-bd16-4b6d-b218-f04ad0a9a8cd.json
  • docs/outstanding-issues-inbox/69b9cd4a-9c2a-4e37-a146-48c7e540b87e.json
  • docs/outstanding-issues-inbox/7268da45-5b77-4583-a3cb-27e5ec7067b1.json
  • docs/outstanding-issues-inbox/dcb09280-0436-4651-a707-b0007e872d7b.json
  • docs/outstanding-issues-inbox/fc23f1ec-c597-4690-b256-2263ecf73c86.json
  • docs/redesign/02-design-direction.md
  • docs/redesign/permanent-colour-direction.md
  • scripts/design-system-contract-baseline.json
  • src/app/globals.css
  • src/app/mockups/answer-evidence-popups/page.tsx
  • src/app/mockups/mode-dropdown/page.tsx
  • src/components/DocumentViewer.tsx
  • src/components/applications-launcher-page.tsx
  • src/components/calculator-mockups/calculator-ui.tsx
  • src/components/calculator-mockups/directory-grid-mockup.tsx
  • src/components/calculator-mockups/guided-flow-mockup.tsx
  • src/components/calculator-mockups/search-page-mockup.tsx
  • src/components/calculators/calculator-ui.tsx
  • src/components/calculators/directory-grid.tsx
  • src/components/calculators/guided-flow.tsx
  • src/components/calculators/search-page.tsx
  • src/components/clinical-dashboard/ClinicalSidebar.tsx
  • src/components/clinical-dashboard/cross-mode-links.tsx
  • src/components/clinical-dashboard/dashboard-nav.tsx
  • src/components/clinical-dashboard/differentials-home.tsx
  • src/components/clinical-dashboard/document-search-results.tsx
  • src/components/clinical-dashboard/evidence-panels.tsx
  • src/components/clinical-dashboard/favourites-command-library-page.tsx
  • src/components/clinical-dashboard/favourites-hub.tsx
  • src/components/clinical-dashboard/favourites-library-nav.tsx
  • src/components/clinical-dashboard/master-search-header.tsx
  • src/components/clinical-dashboard/result-filter-control.tsx
  • src/components/clinical-dashboard/settings-dialog.tsx
  • src/components/clinical-dashboard/signed-image.tsx
  • src/components/differentials/differential-detail-page.tsx
  • src/components/document-phone-fused-directions-mockups.tsx
  • src/components/document-phone-title-mockups.tsx
  • src/components/document-phone-title-refined-mockups.tsx
  • src/components/document-search-mockups.tsx
  • src/components/document-top-navigation-mockups.tsx
  • src/components/document-viewer/document-clinical-summary.tsx
  • src/components/document-viewer/non-pdf-source-preview.tsx
  • src/components/document-viewer/pdf-canvas-viewer.tsx
  • src/components/document-viewer/section-nav.tsx
  • src/components/dsm/dsm-comparison-page.tsx
  • src/components/dsm/dsm-differential-considerations-page.tsx
  • src/components/dsm/dsm-search-page.tsx
  • src/components/factsheets/factsheets-search-page.tsx
  • src/components/favourites-page-mockups/favourites-page-mockup-page.tsx
  • src/components/forms/forms-search-results-page.tsx
  • src/components/formulation/formulation-builder-page.tsx
  • src/components/master-document-flow-mockups.tsx
  • src/components/patient-safety-plan.tsx
  • src/components/phone-mode-sheet-yes-mockups.tsx
  • src/components/privacy-live-signal-perfected-mockups.tsx
  • src/components/pwa-lifecycle.tsx
  • src/components/registry-record-loader.tsx
  • src/components/services/service-detail-page.tsx
  • src/components/settings-search-mockups/settings-search-mockup-page.tsx
  • src/components/source-overlay-redesign-mockups.tsx
  • src/components/therapy-compass/bindings.tsx
  • src/components/therapy-compass/controls.ts
  • src/components/therapy-compass/screens/compare-screen.tsx
  • src/components/therapy-compass/screens/detail-screen.tsx
  • src/components/therapy-compass/screens/other-screen.tsx
  • src/components/therapy-compass/screens/recommend-screen.tsx
  • src/components/therapy-compass/screens/sheets-screen.tsx
  • src/components/tools-page-mockups/rectangle-direction-mockups.tsx
  • src/components/tools-page-mockups/split-pane-refined-mockups.tsx
  • src/components/tools-page-mockups/task-directory-mockup.tsx
  • src/components/tools-page-mockups/tools-page-mockup-page.tsx
  • src/components/ui-primitives.tsx
  • src/components/ui/button.tsx
  • src/components/ui/segmented-control.tsx
  • src/components/universal-search-redesign-mockups.tsx
  • src/lib/tailwind-merge.ts
  • tests/design-token-contract.test.ts
  • tests/tailwind-merge-config.test.ts

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f94fa299a6

ℹ️ 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".

Comment thread tests/design-token-contract.test.ts
@BigSimmo

Copy link
Copy Markdown
Owner Author

@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/design-token-relands at starting commit 50cf53d; 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/design-token-relands, 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.

@github-actions

Copy link
Copy Markdown
Contributor

CI triage

CI failed on this PR. Automated classification of the 2 failed job(s):

  • Static PR checksneeds investigation: inspect the failing step and uploaded diagnostics; rerun only after classifying the cause.
  • PR requiredneeds investigation: inspect the failing step and uploaded diagnostics; rerun only after classifying the cause.

Compared with main CI run #10766 (success).

Classification is evidence routing, not permission to ignore a failure. Exact quarantined Playwright identities remain governed by the flake ledger.

claude added 2 commits August 14, 2026 11:12
…flight

CI failed `docs:check-links` on this branch with

  Error: cancel request 2e791c01... targets missing pending request
  210e3db5...

`check-docs-links.mjs` replays the inbox batch to resolve link targets, so
an unresolvable request fails it. The cause was a race, not a bad record:
PR #1936 reconciled 75 queued requests -- 210e3db5 among them -- while
this branch was already in flight. Reconciling moves the request file
into `docs/outstanding-issues-inbox/applied/` and allocates it a canonical
row, so by the time this branch merged main there was no pending request
left for the cancellation to name.

Cancelling was the right call against a pending request and is the wrong
one against a reconciled row. The cancel is dropped and replaced with a
`done` against `#319`, the row 210e3db5 became. That is also the better
record: the work is finished rather than withdrawn, so the ledger should
carry its outcome and its guard, which a cancellation would have thrown
away.

Also merges origin/main (this branch was 3 behind) and files two findings
the PR preflight surfaced, both deliberately not fixed here:

  - `check:medication-lexicon-report` has been failing on main for every
    local `verify:pr-local`, and no CI job runs it -- a grep over
    .github/workflows finds nothing. It is the last step of the local
    chain, so it fails preflights while CI stays green. The stale file is
    a clinical-facing generated document; regenerating it inside a
    CSS-token PR would bundle a clinical-risk artefact with unrelated
    chores.
  - Claude Code web containers can ship Node 22 with no node_modules,
    which fails `npm ci` on engine-strict before any repo script can run.

Re-verified after the merge: the tracked tree still holds zero
`--shadow-tight` references, and every pinned ratchet still measures
exactly its baseline, so the merge moved no metric and the pins stay
honest.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XsBPUoxpsvTwvFMJzrNoyz
@chatgpt-codex-connector

Copy link
Copy Markdown

Summary

  • Updated all four live design-system guidance sources to recommend --e1 directly for resting-hairline elevation, while retaining the remaining supported role aliases. .design-sync/conventions.mdL32-L38 docs/design-system.mdL148-L158 docs/redesign/02-design-direction.mdL44-L48 docs/redesign/permanent-colour-direction.mdL100-L105
  • Replaced the obsolete copyable shadow-[var(--shadow-tight)] example with shadow-[var(--e1)]. docs/design-system.mdL218-L223
  • Created the single scoped local commit requested: c420899ca8307b57c1c0c0f4546a1e0010cc7d42 (docs(design-system): remove retired shadow guidance).
  • Publication is blocked: the authenticated GitHub connector and make_pr tool are unavailable in this session, while shell Git has no GitHub credentials. The commit therefore could not be published to BigSimmo/Database:claude/design-token-relands, the PR head could not be verified, and the review thread remains open. Per the trigger requirements, I did not emit resolution/result markers or claim a remote fix.

Testing

  • npm run format
  • npx prettier --check .design-sync/conventions.md docs/design-system.md docs/redesign/02-design-direction.md docs/redesign/permanent-colour-direction.md
  • ! rg -n -- '--shadow-tight' .design-sync/conventions.md docs/design-system.md docs/redesign/02-design-direction.md docs/redesign/permanent-colour-direction.md
  • npm run docs:check-links
  • git diff --check
  • ⚠️ git push origin HEAD:refs/heads/claude/design-token-relands — environment limitation: GitHub authentication was unavailable (could not read Username for 'https://github.com'), so remote publication and PR-head verification did not occur.

View task →

@BigSimmo
BigSimmo merged commit f89fbcc into main Aug 14, 2026
29 checks passed
@BigSimmo
BigSimmo deleted the claude/design-token-relands branch August 14, 2026 11:57
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.

2 participants