Skip to content

feat(design): DS-X-16 gallery stories controls and inputs - #1712

Merged
mergify[bot] merged 8 commits into
mainfrom
codex/ds-x-16
Oct 20, 2026
Merged

mergify[bot] merged 8 commits into
mainfrom
codex/ds-x-16

Conversation

@Cuarroc

@Cuarroc Cuarroc commented Oct 18, 2026 •

Copy link
Copy Markdown
Owner

Die Galerie zeigt jetzt alle 13 Bedienelemente und Eingaben mit eigenen Beispielen.
Jedes Beispiel zeigt seine vorhandenen Zustände und benennt die nicht anwendbaren Zustände.
Die hellen und dunklen Bilder sind geprüft; die unabhängige Prüfung beauftragt Root.

Report

Plan-ID: DS-X-16

Base: main at f3fb146.
Candidate: f50ea50.
Size: 181 changed lines (164 additions, 17 deletions), including tests and exactly one PLAN row.

Added one rendered story for each controls/inputs registry entry. Every matrix cell has data-force-state; pseudo-class previews share the actual CSS declaration block, including the reduced-motion override. Disabled examples also use native disabled; invalid inputs expose aria-invalid and a linked error label. Lamp loading/error use its existing busy/bad props and unchanged production CSS. Natural-language UI strings come from de.ts; component identifiers come from the registry. Beispieldaten remains visible above the stories. The coverage test checks rendered articles on both family pages, with an explicit family list for DS-X-17 to extend. No dependency, seam, registry or shot.mjs change.

Applicable states (all other matrix states are listed as not applicable in each story):

Story States
Button default, hover, focus, active, disabled
ButtonGroup default
Chip default
FilterChip default, hover, focus, active, disabled
Segmented default, hover, focus, active
Switch default, focus, disabled
Avatar default
Input default, focus, disabled, error
Textarea default, focus, disabled, error
Kbd default
Lamp default, loading, error
Meter default
Select default, focus, disabled, error

Evidence (Linux, 2026-10-18):

  • Red test: npx vitest run src/design/registry.coverage.test.ts src/design/gallery/stories.test.tsx — exit 1 before implementation; both new checks fail because no story exists. Failing tests committed first as 729e4e5, implementation c1e885b, plan-only commit 3eb4176.
  • npx vitest run src/design — exit 0; 47 files, 236 tests passed.
  • npm run typecheck — exit 0.
  • node scripts/contrast-check.mjs — exit 0; 760 pairs passed.
  • node scripts/plan-check.mjs --offline — exit 0; no findings.
  • bash scripts/ci/red-first.sh — exit 0; all three named new checks absent/red at the merge base and green at the candidate.
  • VITE_TAURI_MOCKS=true node node_modules/.cache/ds-x-16-proof.mjs <artifact-directory> — exit 0. The retained local proof script starts Vite, awaits the existing shot.mjs captureRoute for both routes, then closes browser and server. No detached process or desktop app. Browser assertions confirm 6 controls and 7 inputs stories, equal real/forced Button hover background and focus outline in both themes, and no forced press transform under reduced motion.
  • Initial bash scripts/ci/gates.sh lane prepush — exit 1 at the hardcoded UI-string check (three internal component-name arguments and a separator). Fixed in f50ea50 by deriving identifiers from the registry and placing the separator in de.ts; no assertion or baseline was weakened. Focused hardcoded/coverage/story checks: npx vitest run src/i18n/hardcoded.test.ts src/design/registry.coverage.test.ts src/design/gallery/stories.test.tsx — exit 0, 27 tests.
  • bash scripts/ci/gates.sh lane prepush — exit 0 on f50ea50 in this worktree; 410 seconds, all 28 gates green, including 2278 Rust tests passed (7 existing platform/capability skips).
  • PA_PREPUSH=light git push -u origin codex/ds-x-16 — exit 0; the supported branchpush hook also passed (200 seconds). Full prepush above was completed on the identical head first. git ls-remote origin codex/ds-x-16 — exit 0; remote head f50ea50 matches local HEAD.

Screenshots inspected: ds-x-16-controls-light.png, ds-x-16-controls-dark.png, ds-x-16-inputs-light.png, ds-x-16-inputs-dark.png (existing shot.mjs, 1440×900, browser mocks, reduced motion). Additional inspected ds-x-16-{controls,inputs}-{light,dark}-full.png images show every story in a taller browser viewport. Artifact filenames are public-safe; the private handover contains their local locations.

NICHT ABGEDECKT:

  • Linux cannot compile or execute the #[cfg(windows)] tests (ConPTY, DPAPI, npm shim and Windows PTY paths), or the Windows clippy branches. The Windows lane runs in the merge queue.
  • The prepush lane does not include the full linux lane's frontend build, browser smoke and workflow gates. Screenshots and focused browser assertions above were run separately.
  • Native select popup rendering in Windows WebView2, touch-only hover and other glass variants were not inspected.
  • Offline plan-check does not check live GitHub/plan age or running jobs. No external service or release validation.

Review: pending, Root commissions (tier B; one independent non-author-family reviewer per this dispatch). No self-approval, labels, ready action or merge.

Integration note: controls.css and Gallery.tsx overlap the already assigned #1693/#1706 and #1701/#1702 changes. A later IconButton/loading registry addition needs a corresponding story when integrated; this candidate covers the 13 entries at its recorded base.

🤖 Generated with Claude Code on the ProjectA server worker

Review round 1 (18.10.)

This append records the review-fix delta; the earlier report above remains the historical evidence for f50ea50. No PLAN row was changed in this round.

Reviewed head: f50ea50 (Anthropic subscription review, APPROVE WITH CONDITIONS). New head: 1cd4fe4.

ID Source Severity Finding Disposition
R1712-K1 Anthropic review of f50ea50 medium Registered toggle states and visual variants were missing. Accepted in 1cd4fe4: default cells now include both Switch values, both FilterChip pressed values, all five Button variants, and ok/off/warn/unknown Lamp shapes; busy/bad remain in loading/error cells.
R1712-K2 Anthropic review of f50ea50 low FilterChip lacks the shared disabled appearance. Follow-up: kommt mit #1706 (DS-X-20, R1706-C3). It was OPEN at job start, so no main merge or duplicate disabled rule was added.
R1712-T1 Anthropic review of f50ea50 low Only one forced-state CSS twin had a committed check. Accepted in 1cd4fe4, tests first in f1052f7: one generic PostCSS check covers every hover/active/focus-visible/disabled/aria-invalid selector in controls.css and inputs.css, including nested media rules. Removing each twin is also checked to fail.
R1712-A1 Anthropic review of f50ea50 low Samples in different cells had identical accessible names. Accepted in 1cd4fe4: sample names combine the component heading and state caption via aria-labelledby, or aria-label for Segmented's existing interface. Error descriptions stay linked. ButtonGroup keeps its children's option names.
R1712-P1 Anthropic review of f50ea50 medium Requested marking this still-open package Erledigt and changing other package statuses. Rejected by Root's dispatch: no row may claim Erledigt before merge; PLAN-CLEAN-5 (#1708) and plan:sync own post-merge status updates. Other package rows are outside this fix.
R1712-P2 Anthropic review of f50ea50 medium Requested a second initial review through OpenRouter. Rejected by Root's package-specific dispatch: this package has one non-author initial review, followed by one non-OpenAI delta review commissioned by Root. No OpenRouter use is authorized for this job.
R1712-V1 Anthropic review of f50ea50 low, optional Gallery error caption duplicates the status word. Follow-up for Root: the optional vocabulary cleanup is outside the accepted K1/T1/A1 delta; the existing caption dictionary is unchanged.

Changes and test boundaries:

  • Gallery rendering and accessible names are exercised through rendered stories. No component interface, production CSS, registry, dependency, seam or PLAN change in this round.
  • CSS selector lists are parsed with the already installed Vite/PostCSS toolchain. Twins must live in the same declaration rule; Segmented's deliberate selected-tab-stop restriction is normalized explicitly.
  • Failing tests were committed first as f1052f7. The initial story test command exited 1 with two real failures (missing checked Switch and indistinguishable sample names). The generic guard was separately observed red after temporarily removing the primary-hover twin, then CSS was restored byte-for-byte.

Evidence (Linux, 2026-10-18):

  • npx vitest run src/design/gallery/stories.test.tsx before the fix — exit 1 (two expected regression failures).
  • npx vitest run src/design/gallery/stories.test.tsx -t 'every interactive CSS selector has its forced-state twin in the same rule' with a deliberately removed CSS twin — exit 1, specifically the missing primary-hover twin. The mutation was restored and is not committed.
  • npx vitest run src/design src/i18n/hardcoded.test.ts — exit 0 (48 files, 254 tests).
  • npx vitest run src/design after the final generic-selector change — exit 0 (47 files, 239 tests).
  • npm run typecheck — exit 0.
  • node scripts/contrast-check.mjs — exit 0 (760 pairs).
  • node scripts/plan-check.mjs --offline — exit 0 (0 findings).
  • VITE_TAURI_MOCKS=true node node_modules/.cache/ds-x-16-review-proof.mjs node_modules/.cache/ds-x-16-review-round1 — exit 0. Uses existing shot.mjs, with browser mocks and an awaited Vite lifecycle. Checked both theme variants, six controls/seven inputs stories, checked Switch, pressed FilterChip, five Buttons, four default Lamp shapes, real/forced Button hover and focus, and reduced-motion press behavior. An initial proof attempt exited 1 because its fixed 180 ms delay sampled an unfinished transition; the final probe awaits the animation's finished promise and confirms real :hover before comparing colors.
  • Screenshots inspected: ds-x-16-controls-light-full.png, ds-x-16-controls-dark-full.png, ds-x-16-inputs-light-full.png, ds-x-16-inputs-dark-full.png. Standard route shots were also captured at 1440x900; full-page images show every story. Artifacts and the proof script are local ignored files.
  • bash scripts/ci/red-first.sh — exit 0 on the new head; all six distinct named tests are absent/red at the merge base and green at the head (repeated trailers are also checked).
  • bash scripts/ci/secret-scan.sh — exit 0 before each of the two new commits; no leaks. Both commits passed the regular precommit hook.
  • bash scripts/ci/gates.sh lane prepush — exit 0 on the new head in this worktree; 551 seconds, all 28 gates green, including 1,639 frontend tests and 2,278 Rust tests passed (7 existing platform/capability skips).
  • First PA_PREPUSH=light git push -u origin codex/ds-x-16 — exit 1: the supported branchpush hook stopped at src/screens/leitstand/perf/renderBudget.test.tsx:53 after its unchanged 5,000 ms timeout (5,483 ms observed). All 1,638 other frontend tests passed. The hook correctly prevented the push. Render counts were within budget (mount 1/40, refresh 1/1, filter 1/0); uptime then showed load averages 27.04/24.87/23.08 on 8 cores. Contention is a hypothesis, not a proven cause.
  • npx vitest run src/screens/leitstand/perf/renderBudget.test.tsx — exit 0 without changes, 920 ms test duration. No timeout, retry setting, threshold or assertion was changed.
  • Second PA_PREPUSH=light git push -u origin codex/ds-x-16 — exit 0; supported branchpush hook green in 117 seconds, all 1,639 frontend tests passed with unchanged defaults. The full prepush lane above had already passed on the identical head. No hook was bypassed.
  • git ls-remote origin codex/ds-x-16 — exit 0; remote head 1cd4fe4 matches local HEAD. Working tree is clean.

Size versus main (merge-base f3fb146): 9 files changed, 221 insertions(+), 17 deletions(-); 238 changed lines. Limit: 300 changed lines including tests.

NICHT ABGEDECKT:

  • Linux does not compile or execute #[cfg(windows)] tests or the Windows clippy branches. The Windows lane runs in the merge queue.
  • The prepush lane excludes the full Linux lane's frontend build, browser smoke and workflow gates. The focused gallery browser proof above was run separately.
  • FilterChip's shared disabled appearance comes with feat(design): DS-X-20 icon button, loading, link tabs #1706. A new IconButton/loading registry entry from that package still needs its gallery story at integration; current coverage remains the 13 entries at this package's base.
  • The existing render-budget test had one observed timeout during this job; it passed the full prepush run, isolated diagnosis and the unchanged second push hook. Root owns any separate flakiness follow-up.
  • Other component sizes/prop variants, Windows WebView2 native select popup, touch-only hover, forced colors, other glass variants, external services and releases were not checked. Offline plan-check does not verify live GitHub/plan age or running jobs.

Review: ausstehend (Stufe B). Review: pending, Root commissions the required non-OpenAI delta review. No ready action, label or merge.

🤖 Generated with Claude Code on the ProjectA server worker

Conflict fix (Codex, 2026-10-20)

BLOCKED: the authorized textual merge is resolved, but full local prepush exits 1 on two deterministic integration failures. No retry and no push were attempted; these are not the permitted SessionProvider timeout. Root must authorize a separate/broader correction before this candidate can pass and be pushed.

  • Observed model: gpt-6.1-sol, effort high, provider openai, read from this worker's harness transcript on 2026-10-20; provider quota was not observable. Native goal created/read for JOB codex-dsx16-conflict, owner this worker, parent Root's PR feat(design): DS-X-16 gallery stories controls and inputs #1712 conflict task; acceptance remains unmet.
  • Original head and unchanged remote head (git ls-remote origin refs/heads/codex/ds-x-16, exit 0, checked after the failed gate): 1cd4fe43b829f5123533d9dfa4ce63523872c7bb.
  • Local merge candidate only: c618784818dd73f1c7f13acef3b5652a8638caeb; second parent/main: 9f33f721d52a3a9188a3129118b52bab2cf1bfcd. Commit has the requested Cuarroc identity, merge message, No-Test trailer and observed-model co-author.
  • git fetch origin: exit 0. git merge origin/main: exit 1 with exactly the four authorized conflicting files; all four were resolved, no additional conflict files. No rebase.
  • PLAN resolution: use main unchanged and retain the branch-only DS-X-16 row exactly once; byte comparison after removing that row equals main. node scripts/plan-check.mjs --offline: exit 0, 0 findings (also repeated after prepush).
  • controls.css: retained main's press/disabled tokens, loading/icon-button rules and reduced-motion behavior; added the branch's forced-state selectors to the corresponding main rules, including the shared disabled rule.
  • gallery.css: retained main's icon-gallery rule and appended the branch's story/matrix/cell layout rules.
  • inputs.css: retained main's disabled token and transform-based meter rules; added the branch's error/disabled/focus preview selectors.
  • Read-only PostCSS comparison: removing the added forced-state selectors reconstructs main's controls.css and inputs.css exactly, exit 0. Automatic Gallery.tsx and de.ts merges retain only this PR's original additions relative to main.
  • npm ci: exit 0 (installed updater was 2.13.0 while the merged lockfile requires 2.14.0). No tracked dependency edits.
  • bash scripts/ci/secret-scan.sh: exit 0, no leaks. Requested git ... commit: exit 0; all precommit gates passed, including cargo check and typecheck.
  • git diff origin/main...HEAD --stat: exit 0; exactly the original nine PR paths, 221 insertions and 17 deletions (238 total), including only one added PLAN row. git diff --cached --check: exit 0 before commit.
  • npm run dev:start-check: exit 0 before the full gate; 4.6 GB free, 0 cargo builds. Full gate ran in C:/Users/Cuarr/orca/ProjectA/.claude/worktrees/codex-dsx16 at the local candidate with CARGO_TARGET_DIR=C:/Users/Cuarr/cargo-targets/projecta-c, CARGO_BUILD_JOBS=1.
  • bash scripts/ci/gates.sh lane prepush, run 1: exit 1 after 176 s; fe-test failed (230 test files: 228 passed/2 failed; 1692 tests: 1690 passed/2 failed). All earlier gates, including plan-check, red-first-plan, typecheck and lint, passed. No rerun.
  • Failure 1: src/design/controls/controls.test.tsx:164 matches only :active immediately before {; the preserved press-token rules now include the required gallery selectors, so its parser finds only the unchanged tabs rule (assertion at line 165).
  • Failure 2: src/design/registry.coverage.test.ts:129 requires a story for every controls/inputs registry entry; main adds IconButton (src/design/registry.ts:29), but the branch's story catalogue has none (src/design/gallery/stories.tsx:30). Test reports: unable to find article named IconButton.
  • Review disposition: no review fixes or external reviewers were commissioned by this conflict-only assignment. Root owns the next scope decision and review of any later candidate. PR draft state, labels and queue were not changed by this worker.

NICHT ABGEDECKT:

  • Prepush stopped before hq-test, denkraum, clippy and rust-suite; the earlier precommit run separately passed denkraum and cargo check.
  • Windows run: Unix-only tests and Linux clippy branches were not covered. No Linux lane, full native-tests lane, browser-smoke/frontend-build/workflow Linux gates, or new visual inspection.
  • shellcheck and actionlint were absent; their local gates explicitly skipped those checks.
  • Offline plan check excludes live GitHub/plan-age/job comparison. No external updater/provider/mirror service verification. Provider quota and lage-jetzt mirror unavailable in this worktree.
  • Push and a new remote SHA are absent because full prepush is red. The existing remote head is unchanged. Resume condition: Root authorizes/adapts scope for the selector-test compatibility and the missing IconButton story, then the resulting candidate must pass the required full checks before push.

Integration fix (Codex, 2026-10-20)

BLOCKED at commit-msg: the requested second Test-First trailer contains commas in its exact test title. scripts/lib/test-first.sh:87-89 rejects every comma as a list. The regular commit exited 1 after all precommit gates passed; no new commit or push was made. Resume condition: Root authorizes the validated comma-free test filter shown below, or provides an authorized hook correction. No hook bypass, test rename, rebase, ready action, label, merge or queue comment.

Observed model: gpt-6.1-sol, effort high, from this job's harness turn_context on 2026-10-20. Provider quota was not observable. Native goal was created and read; it remains active because commit/push acceptance is unmet. The lage-jetzt mirror is unavailable in this worktree; live Git and PR evidence was used.

Old and rechecked remote head (git ls-remote origin refs/heads/codex/ds-x-16, exit 0): 1cd4fe4. New remote head: unchanged. Local HEAD remains c618784, with exactly three staged files: controls.css, gallery/stories.tsx and gallery/stories.test.tsx.

CSS resolutions:

  • .g-btn:active retains main's standalone press-token rule; the branch's forced-active selector has an identical adjacent rule.
  • .g-fchip:active retains main's standalone press-token rule; the branch's forced-active selector has an identical adjacent rule.
  • .g-seg button:active retains main's standalone press-token rule; the branch's forced-active preview retains the selected tab-stop restriction in an identical adjacent rule.
  • .g-tabs button remains unchanged in layout.css; all four controls use scale(var(--g-press-scale, .98)). Other merged CSS, including hover, disabled, loading and reduced-motion rules, is unchanged by this fix.

Added the IconButton gallery story using the existing story matrix, existing Icon/check glyph and existing de.ts state labels. It shows default, hover, focus, active, disabled and loading; disabled is native and loading uses the component's existing prop. No de.ts change was needed. The branch-only story guard now also accepts an identical adjacent declaration block in the same parent/media context. Existing selector-removal mutation checks remain. No test inherited from main was changed; both named regression files are byte-unchanged from the starting merge.

Evidence (Windows, this worktree, 2026-10-20):

  • npx vitest run src/design/controls/controls.test.tsx -t "gives button, filter chip, segment and tab the one press token and no hard-coded scale" before the fix: exit 1, missing the three controls press rules.
  • npx vitest run src/design/registry.coverage.test.ts -t "every controls and inputs entry has a gallery story" before the fix: exit 1, missing IconButton article.
  • The branch-only same-rule guard was observed failing after splitting the press rules (exit 1); its equivalent-adjacent-rule handling then passed with the full suite.
  • First npx vitest run src/design during implementation: exit 1, five failures from my unsupported plus glyph name. Corrected to the existing check glyph before final verification.
  • Final npx vitest run src/design: exit 0, 58 files / 279 tests passed.
  • node scripts/plan-check.mjs --offline: exit 0, zero findings.
  • git diff --cached --check: exit 0.
  • bash scripts/ci/secret-scan.sh after staging and before the commit attempt: exit 0, no leaks.
  • Requested git -c user.name=Cuarroc -c user.email=47299143+Cuarroc@users.noreply.github.com commit with the exact requested subject, both exact Test-First lines and final Co-Authored-By: gpt-6.1-sol noreply@openai.com: exit 1. All precommit gates passed in 66 seconds; commit-msg then rejected the comma-bearing title. Full log: C:/Users/Cuarr/AppData/Local/Temp/dsx16-integration-precommit-20261020.log.
  • Read-only proposal validation: bash .githooks/commit-msg C:/Users/Cuarr/AppData/Local/Temp/dsx16-integration-proposed-message-20261020.txt: exit 0. It uses the unchanged first trailer and Test-First: src/design/controls/controls.test.tsx::gives button as the second trailer. This validates the existing test's unique name filter without renaming or editing that test. This message was NOT used to commit.
  • npm run dev:start-check before prepush: exit 0, 4.9 GB free RAM, zero cargo builds; no provider-usage file was supplied.
  • bash scripts/ci/gates.sh lane prepush: exit 0, first and only run, 528 seconds, all 28 gates green. Header reports local HEAD c618784 with uncommitted changes; Vitest and cargo report this exact worktree C:/Users/Cuarr/orca/ProjectA/.claude/worktrees/codex-dsx16. Environment: CARGO_TARGET_DIR=C:/Users/Cuarr/cargo-targets/projecta-c, CARGO_BUILD_JOBS=1; no CARGO_PROFILE_* setting. Frontend: 230 files / 1692 tests passed. Rust: 2319 passed, 20 existing skips. No load-flake rerun was needed. Full log: C:/Users/Cuarr/AppData/Local/Temp/dsx16-integration-prepush-20261020.log.
  • git diff origin/main...HEAD --shortstat: exit 0, committed PR remains 238 changed lines (221 additions, 17 deletions). The prepared tree versus its merge base 9f33f72 is 244 changed lines (230 additions, 14 deletions), nine files. origin/main advanced to a69971e during the run; no additional merge was attempted.
  • git push origin HEAD:codex/ds-x-16: NOT RUN because the requested commit was rejected. git ls-remote confirms the old remote head remains unchanged.
  • bash scripts/sync.sh note codex-dsx16: exit 0; checkpoint written to the untracked local activity note.

NICHT ABGEDECKT:

  • Commit and push are not complete; prepush evidence belongs to the staged tree on c618784, not a new committed candidate.
  • Windows cannot compile or execute #[cfg(unix)] tests or the Linux clippy branches (KI-7). No WSL/ext4 Linux lane ran here.
  • Prepush excludes the full Linux lane's frontend build, application browser smoke and workflow gates. No new gallery screenshots or native WebView2 visual verification were performed in this integration fix.
  • Offline plan-check does not verify live GitHub/plan age or running jobs; external services and releases were not validated.

Review disposition: pending Root's required non-OpenAI delta review. This worker did not approve itself or change PR readiness, labels or merge state.

Review round 2 / delta and integration (Root, 2026-10-20)

  • Root delta review (Claude Opus 5.5, Anthropic ≠ author OpenAI) of f50ea504..5bf3bf4a (fix round 1cd4fe43, merge c6187848, integration 5bf3bf4a): APPROVE. Low follow-ups only:
    • RD1: the five Button variants in the default cell share one accessible name.
    • RD2: Meter aria-label is redundant next to aria-labelledby.
  • Integration 5bf3bf4a (Regression-For: c6187848) does three things:
    • splits the press-token rules so main's controls test reads them per control, with the same declarations;
    • adds the IconButton story;
    • lets the gallery twin test accept an identical adjacent rule.
      Push-hook prepush exit 0; git ls-remote = 5bf3bf4a.
  • NVIDIA Nemotron 3 Ultra (kilo free, non-author) on 5bf3bf4a: verdict "reject". Every high/medium finding was checked at the source and rejected:
ID Source Severity Finding Disposition
N-F1/F2/F3 NVIDIA high (claimed) non-default cells show one variant / unpressed / unchecked only rejected: DS-X-16 asks for a state matrix per entry, not variant×state; variants and toggle values in the default cell were the accepted K1 fix
N-F4 NVIDIA medium Segmented lacks disabled rejected: SegmentedProps has no disabled, so "nicht anwendbar" is correct
N-F5/F6 NVIDIA high/medium forced active targets [tabindex="0"] only; the test normalises it rejected: intentional preview of the selected tab stop, commented in stories.test.tsx; the real .g-seg button:active rule is unchanged
N-F7 NVIDIA medium IconButton uses aria-label rejected: IconButtonProps requires aria-label by type; the label includes the state, so it stays unique
N-F8 NVIDIA low .g-inp lacks hover/active twins rejected: inputs.css has no :hover/:active rule, so there is nothing to twin; the twin test is green
N-F9 NVIDIA low Select may drop aria-invalid rejected: Select spreads ...rest onto the native <select class="g-inp">
N-S1..S5 NVIDIA smell duplication / stringly states no action

No confirmed high finding. review-ok bound to head 5bf3bf4adf2bae45059f87eb2d0247ba93847619.

Cuarroc and others added 4 commits October 18, 2026 20:00
Test-First: src/design/registry.coverage.test.ts::every controls and inputs entry has a gallery story
Test-First: src/design/gallery/stories.test.tsx::a forced hover state uses the hover style
Co-Authored-By: GPT-6 <noreply@openai.com>
Test-First: src/design/registry.coverage.test.ts::every controls and inputs entry has a gallery story
Test-First: src/design/gallery/stories.test.tsx::a forced hover state uses the hover style
Test-First: src/design/gallery/stories.test.tsx::stories show only supported states with disabled and invalid semantics
Co-Authored-By: GPT-6 <noreply@openai.com>
No-Test: plan text only
Co-Authored-By: GPT-6 <noreply@openai.com>
Regression-For: c1e885b
Co-Authored-By: GPT-6 <noreply@openai.com>
Test-First: src/design/gallery/stories.test.tsx::every interactive CSS selector has its forced-state twin in the same rule
Test-First: src/design/gallery/stories.test.tsx::default cells include registered toggle states and visual variants
Test-First: src/design/gallery/stories.test.tsx::each story sample is named by its component and state caption
Co-Authored-By: GPT-6 <noreply@openai.com>
@mergify

mergify Bot commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

@Cuarroc Dieser PR hat einen Konflikt mit main und kann nicht in die Merge-Queue. Bitte main hineinmergen (kein Rebase, kein Force-Push) und den Konflikt loesen; das Label conflict verschwindet danach von selbst.

@mergify mergify Bot added the conflict label Oct 18, 2026
Test-First: src/design/gallery/stories.test.tsx::every interactive CSS selector has its forced-state twin in the same rule
Test-First: src/design/gallery/stories.test.tsx::default cells include registered toggle states and visual variants
Test-First: src/design/gallery/stories.test.tsx::each story sample is named by its component and state caption
Co-Authored-By: GPT-6 <noreply@openai.com>
Cuarroc and others added 2 commits October 20, 2026 14:18
No-Test: merge commit, merge commit resolving main conflicts

Co-Authored-By: gpt-6.1-sol <noreply@openai.com>
…n story

Merging origin/main (c618784) broke two checks: main's controls test
reads the press-token rule per control, and the new IconButton entry
from DS-X-21 had no gallery story. Keep main's press-token rules
separate, add the IconButton story, and let the gallery CSS-twin test
accept an identical adjacent rule.

Regression-For: c618784

Co-Authored-By: gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@mergify mergify Bot removed the conflict label Oct 20, 2026
@Cuarroc
Cuarroc marked this pull request as ready for review October 20, 2026 13:00
@Cuarroc Cuarroc added the review-ok Pipeline: review disposition complete, no open high finding label Oct 20, 2026
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-20T13:06:50.024106Z 5bf3bf4 Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@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: 5bf3bf4adf

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


// Only the components' existing states are shown; this is fixture data, never app state.
const stories: Record<string, Story> = {
Button: { states: PRESS, render: (s, name) => (s === "default" ? buttonVariants : buttonVariants.slice(0, 1)).map((variant) => <Button key={variant} {...sampleProps(s, name)} variant={variant} disabled={s === "disabled"}>{sample}</Button>) },

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Include Button's loading state in its story

When the controls gallery is opened, this story omits loading, so its “Nicht anwendbar” list incorrectly says that loading does not apply to Button. The component already accepts loading, renders aria-busy and a spinner, and the registry lists loading as a supported state; add a loading cell that passes the prop so the gallery does not misdocument the component.

Useful? React with 👍 / 👎.

Comment thread docs/PLAN.md
| DS-X-11 | Zeile, Trenner und Marke: `surface/ListRow.tsx` (wählbare Zeile, Auswahl kommt vom Aufrufer per `aria-current` oder `aria-selected`, ein Tabstopp), `surface/Separator.tsx` (`<hr>`, dekorativ für Hilfstechnik verborgen) und `surface/Badge.tsx` (Zahl oder Stichwort als Text, ersetzt weder `.g-st` noch `.g-proof`); drei Registereinträge, Familie „Flächen“; die Halle (DS-H-05) nutzt die Zeile | Implementierer · Claude; Root nimmt ab | DS-Blueprint-Schnitt 16.10. (DS-X-11) | Server | B | Erledigt: #1673 (merged 2026-10-17); keine Bildschirmmigration, die Halle (DS-H-05) bindet die Zeile seit #1680 ein | Tests rot→grün; `vitest run src/design`, typecheck, `contrast-check` (746 Paarungen), `plan-check --offline` und prepush Exit 0; Bilder der Galerie hell und dunkel; zwei Stufe-B-Reviews fremder Nicht-Anthropic-Familien | – |
| DS-X-14 | Komponenten-Register und Abdeckungstest: `src/design/registry.ts` führt jede exportierte Designkomponente einmal (Familie, Varianten, Zustände, Bedienhilfe, Textquelle), `registry.coverage.test.ts` wird rot, wenn eine fehlt oder ein Eintrag keine Komponente mehr trifft | Implementierer · Claude; Root nimmt ab | DS-Blueprint-Schnitt 16.10. (DS-X-14) | Server | B | Erledigt: #1656 (merged 2026-10-16); 25 Komponenten gelistet, auch `hall/` wird gescannt (dort noch keine .tsx, DS-H-04 trägt seinen Eintrag selbst ein); Galerie DS-X-15 und Geschichten DS-X-16/17 lesen später dieses Register | Abdeckungstest rot→grün; `vitest run src/design`, typecheck, `plan-check --offline` und prepush Exit 0; zwei Stufe-B-Reviews fremder Nicht-Anthropic-Familien | – |
| DS-X-15 | Designsystem-Galerie, Hülle und Grundlagen (D6): Einstellungen › Version › „Designsystem ansehen“ öffnet `#/designsystem` (eigener `React.lazy`-Chunk, außerhalb von `ROUTES`, also nicht in Seitenleiste oder Palette); Navigation über die Register-Familien, Seiten Farben (Kontrast zur Grundfläche), Schrift, Abstand, Radius, Glas, Bewegung (ruht bei reduzierter Bewegung); keine echten Daten, Beispielinhalt trägt „Beispieldaten“ | Implementierer · Claude; Root nimmt ab | DS-Blueprint-Schnitt 16.10. (DS-X-15) | Server | B | Erledigt: #1662 (merged 2026-10-16); Geschichten je Baustein kommen mit DS-X-16/17, Werkzeugleiste und Übertrag aus #1656 (DS-X-14b) nicht enthalten | Tests rot→grün; `vitest run`, typecheck, `contrast-check`, `plan-check --offline` und prepush Exit 0; Bildschirmfotos hell/dunkel; zwei Stufe-B-Reviews fremder Nicht-Anthropic-Familien | – |
| DS-X-16 | Galerie-Geschichten für alle Registereinträge der Familien controls und inputs: Zustandsmatrix über data-force-state und die echten CSS-Regeln, nicht anwendbare Zustände benannt, sichtbare Beispieldaten, Texte aus de.ts | Implementierer · Codex; Root nimmt ab | DS-X-15 (#1662); DS-Blueprint-Schnitt 16.10. (DS-X-16) | Server | B | In Prüfung: Entwurfs-PR auf codex/ds-x-16; nach Merge sind 13 Geschichten mit Abdeckungstest vorhanden; weitere Familien bleiben DS-X-17, shot.mjs bleibt DS-H-07b | Tests rot→grün; Design-Tests, typecheck, contrast-check, plan-check --offline und eigene prepush Exit 0; Bilder beider Familien hell/dunkel geprüft; ein unabhängiger Stufe-B-Review, Root beauftragt | – |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Update the plan to count the IconButton story

The registry at this commit contains seven controls and seven inputs, and this change supplies a story for every one, including IconButton; the delivered total is therefore 14 rather than the 13 claimed here. Because this text explicitly describes the post-merge result, the canonical plan would become stale as soon as the change merges.

AGENTS.md reference: AGENTS.md:L121-L121

Useful? React with 👍 / 👎.

Input: { states: INPUT, render: (s, name) => <Input {...inputProps(s, name)} defaultValue={sample} /> },
Textarea: { states: INPUT, render: (s, name) => <Textarea {...inputProps(s, name)} defaultValue={sample} /> },
Kbd: { states: STATIC, render: (s, name) => <Kbd {...sampleProps(s, name)}>{de["gallery.key"]}</Kbd> },
Lamp: { states: ["default", "loading", "error"], render: (s, name) => (s === "default" ? lampShapes : [s === "loading" ? "busy" as const : "bad" as const]).map((state) => <Lamp key={state} {...sampleProps(s, name)} state={state} label={de[`gallery.state.${s}`]} />) },

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Label each Lamp shape in the default story

In the default Lamp cell, this renders ok, off, warn, and unknown as four adjacent glyphs under the single caption “Standard”, while every glyph also receives the same accessible name. A gallery visitor therefore cannot determine which shape corresponds to which LampState, visually or with a screen reader; render a visible and state-specific label for each shape.

Useful? React with 👍 / 👎.

.g-btn--danger:hover { background: color-mix(in srgb, var(--g-bad-bg), var(--g-bad) 8%); border-color: var(--g-bad); }
.g-fchip:not([aria-pressed="true"]):hover { background: var(--g-tint-hi); }
.g-seg button:not([aria-checked="true"]):hover { background: var(--g-tint); }
.g-btn:hover, [data-force-state="hover"] .g-btn { background: var(--g-hover); }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Apply forced hover previews outside hover-capable media

On a touch-only or coarse-primary-pointer environment, this entire media query is false, so the new [data-force-state="hover"] selectors never apply and every gallery cell labelled “Zeiger darüber” displays the default appearance. Keep the real :hover rules guarded by the capability query, but place equivalent forced-preview rules outside it so the state matrix remains accurate on devices that cannot physically hover.

Useful? React with 👍 / 👎.

@mergify mergify Bot added the queued label Oct 20, 2026
@mergify mergify Bot mentioned this pull request Oct 20, 2026
30 of 46 tasks
@mergify
mergify Bot merged commit fc51eb7 into main Oct 20, 2026
25 checks passed
@mergify

mergify Bot commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • ✅ Entered queue — 2026-10-20 13:08 UTC · Rule: default · triggered by merge protections
  • ✅ Checks passed · on draft merge queue: checking #1712 on main (a69971e) #1746
  • ✅ Merged — 2026-10-20 13:17 UTC · at fc51eb7a3525b78ea4d368598004aca72b839104 · merge

This pull request spent 8 minutes 47 seconds in the queue, including 8 minutes 7 seconds running CI.

Required conditions to merge
  • check-success = gates (linux)
  • check-success = gates (windows)
  • check-success = red-first
  • github-review-approved [🛡 GitHub repository ruleset rule main-pr-required-checks]
  • label != do-not-merge
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-success = @github-actions/gates (linux)
    • check-neutral = @github-actions/gates (linux)
    • check-skipped = @github-actions/gates (linux)
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-success = @github-actions/gates (windows)
    • check-neutral = @github-actions/gates (windows)
    • check-skipped = @github-actions/gates (windows)
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-success = @github-actions/red-first
    • check-neutral = @github-actions/red-first
    • check-skipped = @github-actions/red-first
  • any of [🛡 GitHub repository ruleset rule main-pr-required-checks]:
    • check-neutral = @mergify/Mergify Merge Protections
    • check-skipped = @mergify/Mergify Merge Protections
    • check-success = @mergify/Mergify Merge Protections

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

review-ok Pipeline: review disposition complete, no open high finding

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant