Skip to content

feat(design): DS-X-21 icon set - #1701

Merged
mergify[bot] merged 10 commits into
mainfrom
claude/ds-x-21
Oct 20, 2026
Merged

mergify[bot] merged 10 commits into
mainfrom
claude/ds-x-21

Conversation

@Cuarroc

@Cuarroc Cuarroc commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

Das Designsystem hat jetzt einen einzigen Symbolsatz: 24 Lucide-Symbole auf einem 20-Pixel-Raster, mit einer Icon-Komponente, die ohne Beschriftung für Vorlese-Hilfen verborgen ist. Die Symbole stehen als kopierte Pfade im Code (kein Paket installiert), der Lizenztext liegt daneben und ist in den Drittanbieter-Hinweisen eingetragen. Keine Ansicht wurde umgestellt; die alte Icon-Komponente bleibt bis KR-15, und die Galerie zeigt den Satz unter „Symbole“.

Report

Plan-ID: DS-X-21

Change

  • src/design/icons/Icon.tsx: one Icon (20 px, Lucide's 24-unit viewBox, stroke currentColor). No label: aria-hidden. With label: role="img" and aria-label. An empty label stays hidden.
  • src/design/icons/glyphs.ts: 24 Lucide paths as data (each glyph an array of path strings; rect, circle and line turned into paths), plus CLASSIC_GLYPH (14 classic glyphs of src/components/Icon.tsx) and ROUTE_GLYPH (the 10 sidebar glyphs of src/shell/routes.ts, one more than the brief's nine: leitstand, eingang, beweise, betrieb, team, automatik, core, steuerung, gedaechtnis, einstellungen). The Select chevron is chevron-down.
  • Glyphs: panel-left, columns-2, maximize-2, refresh-cw, settings, x, chevron-left, chevron-right, chevron-down, chevron-up, plug, external-link, check, ellipsis, gauge, flag, shield-check, list, users, zap, hexagon, timer, book-open, sliders-horizontal.
  • Licence: src/design/icons/LUCIDE-LIZENZ.txt is the unmodified Lucide LICENSE (ISC, "Copyright (c) 2026 Lucide Icons and Contributors", plus the Feather MIT notice, Cole Bemis), fetched from https://raw.githubusercontent.com/lucide-icons/lucide/main/LICENSE (https://github.com/lucide-icons/lucide/blob/main/LICENSE). Entry under "Required notices" in docs/THIRD_PARTY_NOTICES.md. Paths copied from icons/<name>.svg in the same repository.
  • Registry entry Icon (new family icons, gallery.family.icons = "Symbole" in de.ts); the gallery family page "Symbole" shows all glyphs with their names (5 lines in Gallery.tsx, 1 CSS line).
  • docs/PLAN.md: one row DS-X-21.
  • Non-goals kept: no caller migrated, no npm install, no new dependency, no redesign.

Red → green

  • Commit 97a788a9 (compiling stubs plus tests): 4 of 4 tests failed (npx vitest run src/design/icons). Commit 738254a3 makes them green.
  • Deviation: the brief's test name every registered icon renders a 20 px svg, hidden unless labelled contains a comma, which the commit-msg hook rejects in a Test-First trailer. The test is named ... renders a 20 px svg and is hidden unless labelled.

Evidence (all unmasked)

  • npx vitest run src/design src/i18n: 46 files, 238 tests, exit 0.
  • npm run typecheck: exit 0.
  • node scripts/contrast-check.mjs: 760 pairs passed, exit 0.
  • node scripts/plan-check.mjs --offline: 0 findings, exit 0.
  • bash scripts/ci/red-first.sh: exit 0.
  • bash scripts/ci/license-check.sh: exit 0 (12 production packages, all on the allowlist; the gate does not see copied paths, hence the notice entry).
  • bash scripts/ci/gates.sh lane prepush (own worktree, CARGO_TARGET_DIR slot2, CARGO_BUILD_JOBS=1): exit 0, all 28 gates green.
  • Push verified: git ls-remote origin claude/ds-x-21 = dbe5dc9f.
  • Diff size: 200 lines incl. tests and the licence text (limit 300).
  • Screenshots (Vite dev server via its API plus Playwright on #/designsystem › Symbole, scratch script outside the repo; looked at, all 24 glyphs sharp in both): /home/pa/pa-orch/reports/ds-x-21-light.png, /home/pa/pa-orch/reports/ds-x-21-dark.png.

Architecture drift: no new finding, nothing allowlisted. No seam touched.

NICHT ABGEDECKT

  • The #[cfg(windows)] tests and the Windows arms of clippy (Linux run only); the Windows lane runs in the merge queue.
  • Browser smoke and frontend build (lane linux, CI).
  • Stroke weight: Lucide's stroke 2 on 24 units is drawn at 20 px (about 1.67 px); the classic 1.5-on-16 look is not reproduced. Judged by eye only in the two screenshots, no measurement.
  • Hover, focus and forced-colours rendering were not captured; no caller uses the new Icon yet.
  • Licence reading is mine; Root checks the notice.

Review: pending, Root commissions (tier B plus licence check, one independent non-Anthropic reviewer).

🤖 Generated with Claude Code on the ProjectA server worker

Conflict resolution (18.10.)

  • Merged origin/main at f3fb146b into claude/ds-x-21 (merge commit, no rebase, no force-push). New head: 7288411d.
  • Files with conflicts, both sides kept, each entry exactly once, wording unchanged: docs/PLAN.md (rows DS-X-21 and DS-X-09), src/design/gallery/Gallery.tsx (icons page and hall probe-hall page; imports of both), src/i18n/de.ts (probe-hall keys from main plus gallery.family.icons). No other edit.
  • Evidence (all in the PR worktree, exit codes unmasked):
    • npx vitest run src/design src/i18n → 0 (49 files, 252 tests)
    • npm run typecheck → 0
    • node scripts/contrast-check.mjs → 0
    • node scripts/plan-check.mjs --offline → 0
    • git diff origin/main...HEAD --stat → only this PR's 11 files
    • bash scripts/ci/gates.sh lane prepush → 0 (third run)
    • push verified: git ls-remote origin claude/ds-x-21 → 7288411d
  • Note: the first two prepush runs failed in fe-test only on time limits under heavy server load (load average 40+ on 8 cores): boot.smoke.test.tsx (1 s waitFor on the cold first import), Shell.test.tsx, renderBudget.test.tsx. boot.smoke fails the same way on a pristine origin/main checkout and passes once the load drops; no test or timeout was changed.
  • NICHT ABGEDECKT: the #[cfg(windows)] tests and the Windows clippy arms (Windows lane runs in the merge queue). Review: pending, Root commissions (delta check of the resolution).

Review round 1 (18.10.)

Review: Codex gpt-6-astra (OpenAI), verdict "approve with conditions". Delta check of the fix: pending, Root commissions (tier B).

ID source severity finding disposition
R1701-ROOT1 Root delta check of the conflict merge low default: branch in Body of Gallery.tsx lost its indentation accepted, b3c4900 (indentation restored, no behaviour change)
R1701-F1 Codex review medium icons gallery page has no test accepted, b3c4900 (new test "the icons page lists every registered glyph": select "Symbole", cell count equals Object.keys(GLYPHS).length, each cell has an svg). The test was green at once (existing behaviour), so it carries a No-Test trailer on the commit
  • New head: b3c4900d59519fe71d5557a500bb2851953a80cc (verified with git ls-remote origin claude/ds-x-21)
  • Size: git diff origin/main...HEAD --shortstat → 12 files, 210 insertions, 1 deletion (≤400)
  • npx vitest run src/design/gallery → 0 (11 tests)
  • npm run typecheck → 0; node scripts/contrast-check.mjs → 0; node scripts/plan-check.mjs --offline → 0; bash scripts/ci/secret-scan.sh → 0
  • bash scripts/ci/gates.sh lane prepush → 0 (532 s, unmasked); push hook green, git push → 0
  • NICHT ABGEDECKT: the #[cfg(windows)] tests and the Windows clippy arms (Windows lane runs in the merge queue).

Review round 2 (18.10.)

ID Source Severity Finding Disposition
R1701-L1 independent Codex review (head b3c4900) medium A Vite production build contains the Lucide glyph paths but neither copyright line nor the ISC/MIT text, so the distributed app omits notices the licence requires. Accepted. Test commit 77c3cfbd (red), fix commit 3b3a3abd: the full notice from LUCIDE-LIZENZ.txt is a /*! … */ legal comment above GLYPHS in src/design/icons/glyphs.ts. Smallest robust way: no new file, no config change; the bundler keeps /*! comments next to the glyph chunk, and the test proves it. vite.config.ts and tauri.conf.json are untouched.
R1701-P1 independent Codex review – PLAN status wording and "two reviews Subscription + OpenRouter" Rejected: no "Erledigt" before the merge (PLAN-CLEAN-5 #1708 / plan:sync flips rows); tier B needs one non-author review; OpenRouter is not used.
R1701-P2 independent Codex review – DS-X-09 row in PLAN Rejected: same reason as P1.
  • Red first: src/design/icons/icons.notice.test.ts "a Vite build ships the glyph paths together with both copyright notices" runs npx vite build --outDir <tmp> and requires M9.671 4.136a2.34, Lucide Icons and Contributors and Cole Bemis in the output. npx vitest run src/design/icons/icons.notice.test.ts → exit 1 on b3c4900d, exit 0 after the fix. The first test also checks that the comment in glyphs.ts repeats LUCIDE-LIZENZ.txt line for line (no drift).
  • main had moved and the PR was CONFLICTING (only docs/PLAN.md, the DS-X-32 row next to DS-X-21): merged origin/main (merge commit, both rows kept).
  • New head: 603834a17b37450d8b603c1e355e8c75b080f097 (verified with git ls-remote origin claude/ds-x-21).
  • Size: git diff origin/main...HEAD --shortstat → 12 files, 280 insertions, 1 deletion (≤400, forced fix round; L1 added about 70 lines incl. the notice comment and test).
  • npx vitest run src/design → 0 (48 files, 239 tests); npm run typecheck → 0; node scripts/plan-check.mjs --offline → 0; bash scripts/ci/secret-scan.sh → 0.
  • bash scripts/ci/gates.sh lane prepush on the merged head → 0 (434 s, unmasked); git push → 0.
  • NICHT ABGEDECKT: the #[cfg(windows)] tests and the Windows clippy arms (Windows lane runs in the merge queue); the build check ran on Linux only; the Tauri installer bundle itself was not built (only the Vite output).
  • Review: ausstehend (Stufe B, delta review by Root).

🤖 Generated with Claude Code on the ProjectA server worker

Review round 3 (18.10.)

ID Source Severity Finding Disposition
R1701-T1 independent Codex review (head 603834a) medium The round-2 licence test starts npx via execFileSync without a shell; on Windows the npx.cmd wrapper cannot be started that way, so Windows prepush fe-test fails before the licence is checked. Accepted. Commit 2f0c300d: the test now starts process.execPath with node_modules/vite/bin/vite.js and the same arguments (no npx, no shell). Marked as a regression fix of the round-2 test commit 77c3cfbd.
R1701-P (repeat) independent Codex review – PLAN rows should already say "Erledigt", demand two first reviews, fix other packages' rows Rejected, unchanged: no row claims "Erledigt" before the merge (PLAN-CLEAN-5 #1708 / plan:sync flips rows after merge); tier B needs one non-author review; OpenRouter is not used; other rows are out of scope.
  • Fix scope: one test file, src/design/icons/icons.notice.test.ts, +3 / -1 lines; L1 stays confirmed fixed.
  • New head: 2f0c300d7f5d74bf3a69cca5a351c94dc8683887 (verified with git ls-remote origin claude/ds-x-21).
  • Size: git diff origin/main...HEAD --shortstat → 12 files, 282 insertions, 1 deletion. The PR was MERGEABLE, so no merge of main was needed.
  • npx vitest run src/design/icons/icons.notice.test.ts → 0 (2 tests); npm run typecheck → 0; node scripts/contrast-check.mjs → 0; node scripts/plan-check.mjs --offline → 0; bash scripts/ci/secret-scan.sh → 0.
  • bash scripts/ci/gates.sh lane prepush → 0 (221 files, 1644 tests, unmasked). The first run exited 1: src/screens/leitstand/perf/renderBudget.test.tsx hit its 5000 ms timeout while the server load average was about 35 on 8 cores; alone the file passes (exit 0, 1 s). The second run, with no test or code change, was green. git push → 0 (the pre-push hook ran).
  • Environment note: the pre-commit gate crlf-source-compare scans git-ignored folders under .pa/ and flagged an old review checkout (review-pr1701-red-77c3cfbd) inside this worktree. It was moved, not deleted and not modified, to a sibling folder outside the repo; the other two folders under .pa/ were left in place.
  • NICHT ABGEDECKT: the changed test was run on Linux only. The Windows behaviour (starting node with vite.js) was not run here; the Windows lane runs in the merge queue. Also not covered: the #[cfg(windows)] tests and the Windows clippy arms; the Tauri installer bundle was not built.
  • Review: ausstehend (Stufe B, Root checks the delta; after round 2 no new review round, AGENTS.md rule 5).

🤖 Generated with Claude Code on the ProjectA server worker

Conflict fix (Codex, 2026-10-20)

  • Authority/scope: Root conflict-fix brief, NACHBESSERN. Merged origin/main at a4ef7057699afa559e14028ef200432b3459e7b2; no rebase, force-push, product edits or review fixes.
  • Old head: 2f0c300d7f5d74bf3a69cca5a351c94dc8683887. Merge/new remote head: d2ab6aadb8ef7be7cca02b0c0b6377cd5021711e.
  • docs/PLAN.md was the only conflicted file. Kept the entire main PLAN byte-for-byte and inserted the exact branch-only DS-X-21 row once. An assertion-based comparison also confirmed unchanged added/deleted lines for every original PR file (exit 0). No seam touched.
  • Commit identity: Cuarroc; No-Test: merge commit, docs/PLAN.md conflict only; co-author GPT-6 (system-provided identity; a more specific harness model ID is not exposed in this session).

Evidence (2026-10-20, exit codes preserved)

  • git rev-parse HEAD before work: exit 0, old head above; clean worktree.
  • git fetch origin: exit 0. git merge origin/main: exit 1 for the expected PLAN-only conflict; resolved and committed using the exact requested merge message and identity, exit 0. The commit hook passed all 14 precommit gates (94 s).
  • npm ci: exit 0 (node_modules was absent).
  • node scripts/plan-check.mjs --offline: exit 0, 0 Befunde.
  • git diff origin/main...HEAD --stat: exit 0; the same original 12 PR files, 282 insertions / 1 deletion, including exactly one added PLAN row.
  • bash scripts/ci/secret-scan.sh before commit: exit 0, no leaks; also passed in the commit hook.
  • bash scripts/ci/gates.sh lane prepush: exit 0 on the first run, 536 s, in C:/Users/Cuarr/orca/ProjectA/.claude/worktrees/codex-dsx21, HEAD d2ab6aad. CARGO_TARGET_DIR=C:/Users/Cuarr/cargo-targets/projecta-b, CARGO_BUILD_JOBS=1; no CARGO_PROFILE override. Frontend: 225 files / 1674 tests passed. Rust: 2319 passed, 20 skipped.
  • No failure retry was needed. The mandatory push hook ran the full prepush lane again and passed, 366 s, same HEAD; frontend and Rust counts unchanged.
  • git push origin HEAD:claude/ds-x-21: exit 0. git ls-remote origin refs/heads/claude/ds-x-21: exit 0, full new head above.
  • gh pr view 1701 --json headRefOid,mergeable,mergeStateStatus,isDraft,labels,url: exit 0; new head confirmed, MERGEABLE, draft remains true. The existing conflict label was still present at this observation; labels were not changed.

NICHT ABGEDECKT

  • Windows run only: no #[cfg(unix)] tests (file permissions / process-group kill) or Linux clippy arms. Existing platform/capability skips remain; no skip, assertion, retry or timeout was changed.
  • shellcheck and actionlint are not installed locally; the gates explicitly skipped them. This run does not prove those checks.
  • The full Linux lane, app browser smoke, frontend build gate and workflow gates were not run here. The licence test does execute its own Vite build as part of the passing frontend suite. No Tauri installer or new visual inspection.
  • External services (updater endpoint, OmniRoute, mirror) are not checked by this lane. Offline plan-check does not validate GitHub PR status, plan age or running jobs.

Disposition / handover: conflict-fix acceptance passed and push verified. Existing reviews are unchanged; Root owns any remaining acceptance/integration. No ready/draft transition, label edit, merge or Mergify queue comment was performed. Native bounded goal was created after get_goal returned null; parent integration remains with Root.

Root acceptance after conflict fix (Root, 2026-10-20)

Head d2ab6aad = round-3 head 2f0c300d + merge of origin/main (docs/PLAN.md only). Root check: product diff vs main excluding docs/PLAN.md is line-for-line identical to 2f0c300d (PRODUCT-DIFF-IDENTICAL); plan-check 0 Befunde; Codex prepush exit 0 (536 s) and push hook exit 0.
Round-3 delta (icons.notice.test.ts +3/−1, Claude-authored) was still owed a non-author review; it is covered by the full-PR review below.
Second non-author family (author Anthropic): NVIDIA nemotron-3-ultra (free kilo lane) on d2ab6aad: APPROVE WITH CONDITIONS.

ID Sev Finding Disposition
N-F1 med licence test compares raw lines; a comment-style change would break it follow-up: robustness only; a break fails loudly and cannot hide a missing notice
N-F2 low vite build inside the unit suite is heavy follow-up
N-F3/F4 low DOM query style, inline ternary no action

Decision: families OpenAI (server Codex, rounds 1–3) and NVIDIA have reviewed; no open high finding. review-ok bound to d2ab6aad.

Cuarroc and others added 3 commits October 17, 2026 07:19
The brief's test name has a comma, which the commit-msg hook rejects in a
Test-First trailer; the test reads 'and is hidden' instead.

Test-First: src/design/icons/icon.test.tsx::every registered icon renders a 20 px svg and is hidden unless labelled
Test-First: src/design/icons/icon.test.tsx::an empty label stays hidden
Test-First: src/design/icons/icon.test.tsx::has an equivalent for every classic glyph and every route glyph
Test-First: src/design/icons/icons.notice.test.ts::THIRD_PARTY_NOTICES lists Lucide and the licence file exists

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Icon renders 24 Lucide paths copied as data (ISC and Feather MIT notice
shipped as LUCIDE-LIZENZ.txt), with stand-ins for the classic, route and
Select glyphs. No caller migrates; the classic Icon stays until KR-15.

Test-First: src/design/icons/icon.test.tsx::every registered icon renders a 20 px svg and is hidden unless labelled
Test-First: src/design/icons/icon.test.tsx::an empty label stays hidden
Test-First: src/design/icons/icon.test.tsx::has an equivalent for every classic glyph and every route glyph
Test-First: src/design/icons/icons.notice.test.ts::THIRD_PARTY_NOTICES lists Lucide and the licence file exists

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No-Test: plan text only

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@mergify

mergify Bot commented Oct 17, 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 17, 2026
No-Test: merge of main, conflict resolution only

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@mergify mergify Bot removed the conflict label Oct 18, 2026
…ns page (R1701-ROOT1, R1701-F1)

No-Test: adds coverage for existing behaviour (review R1701-F1)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.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
…t (R1701-L1)

Test-First: src/design/icons/icons.notice.test.ts::a Vite build ships the glyph paths together with both copyright notices

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Cuarroc and others added 2 commits October 18, 2026 20:36
…s a legal comment (R1701-L1)

Regression-For: 77c3cfb

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
# Conflicts:
#	docs/PLAN.md
@mergify mergify Bot removed the conflict label Oct 18, 2026
… runs on Windows (R1701-T1)

execFileSync("npx") without a shell cannot start the npx.cmd wrapper on
Windows. Run process.execPath with node_modules/vite/bin/vite.js instead.

Regression-For: 77c3cfb

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.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.

No-Test: merge commit, docs/PLAN.md conflict only

Co-Authored-By: GPT-6 <noreply@openai.com>
@mergify mergify Bot removed the conflict label Oct 20, 2026
@Cuarroc
Cuarroc marked this pull request as ready for review October 20, 2026 11:32
@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-20T11:37:10.357504Z d2ab6aa 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: d2ab6aadb8

ℹ️ 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 docs/PLAN.md
| DS-X-08 | Bestätigungsdialog `ConfirmDialog` (`role="alertdialog"`, Fokus zuerst auf Abbrechen, Esc bricht ab, ein Klick auf den Hintergrund schließt nicht, Bestätigen löst nur einmal aus, Gefahr-Ton über `Button` „danger“) und `Sheet` mit Größe (`sm`/`md`/`lg`) sowie Beschriftungs- und Beschreibungs-Kennungen; bestehende `Sheet`-Aufrufer bleiben unverändert; noch an keine Ansicht angeschlossen (jedes Paket, das ihn an Löschen, Zusammenführen oder Überschreiben hängt, ist Stufe A) | Implementierer · Claude; Root nimmt ab | DS-X-07 (#1683); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-08) | Server | B | In Arbeit: Draft-PR `claude/ds-x-08` | red-first Vitest-Tests; `vitest run src/design`, typecheck, `contrast-check`, `plan-check --offline` und prepush Exit 0; Bildschirmfotos hell/dunkel; ein unabhängiger Stufe-B-Review einer Nicht-Anthropic-Familie (Root beauftragt) | – |
| DS-X-09 | Tabelle v2 (Fabrik-Designsystem, Welle 1): `src/design/data/Table.tsx` bekommt sortierbare Spaltenköpfe (`aria-sort`, Enter und Leertaste), optionale Zeilenauswahl mit dem Ankreuzfeld (Kopf-Feld „teils“, Anzahl wird angesagt), eine feststehende Kopfzeile sowie Platzhalter für leer und lädt über `HonestState`; bestehende Aufrufer bleiben unverändert | Implementierer · Claude; Root nimmt ab | DS-X-05 (#1678); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-09) | Server | B | Erledigt: #1692 (merged 2026-10-17); keine Ansicht umgestellt (KR-07*, 10e folgen) | Tests rot→grün (`red-first.sh` Exit 0); `vitest run src/design`, typecheck, `contrast-check`, `plan-check --offline` und prepush Exit 0; Bildschirmfotos hell/dunkel; ein Stufe-B-Review einer Nicht-Anthropic-Familie, Root kommissioniert | – |
| DS-X-12 | Bewegungstoken angewendet: ein Druck-Token (`--g-press-scale`) für Knöpfe, Filterchips, Segmente und Tabs; der Füllbalken wächst per `transform: scaleX()` statt über die Breite, die Erlaubnisliste für Layout-Animation in `motion.test.ts` ist leer; der Lauf-Ring atmet nur unter `--g-ambient-play` (Lebendig), in Ruhig steht er still und ein Zustandswechsel gibt einen einmaligen Ping (`usePulseOnChange`); eine dokumentierte Regel für reduzierte Bewegung am Kopf von `motion.css`; das doppelte `g-enter` entfällt | Implementierer · Claude; Root nimmt ab | DS-X-03 (#1606), DS-X-07 (#1683); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-12) | Server | B | Erledigt: #1693 (merged 2026-10-18) | red-first Vitest-Tests; `vitest run src/design`, typecheck, contrast-check, `plan-check --offline` und prepush Exit 0; ein unabhängiger Stufe-B-Review (Root beauftragt) | – |
| DS-X-21 | Ein Symbolsatz auf 20-px-Raster: `Icon` in `src/design/icons/` (ohne Beschriftung für Hilfstechnik verborgen, mit `label` als `role="img"`, Farbe über `currentColor`) und 24 Lucide-Pfade als Daten (`glyphs.ts`), dazu Entsprechungen für die 14 klassischen Symbole, die Seitenleisten-Symbole und den Auswahl-Pfeil; Lizenztext `LUCIDE-LIZENZ.txt` neben den Symbolen und Eintrag in `docs/THIRD_PARTY_NOTICES.md` | Implementierer · Claude; Root nimmt ab | DS-Blueprint-Schnitt 16.10. (DS-X-21), Root-Entscheidung 17.10.: Pfade kopieren, kein Paket | Server | B + Lizenzprüfung | Entwurfs-PR offen (17.10.): kein Aufrufer umgestellt, `src/components/Icon.tsx` bleibt bis KR-15; Galerie zeigt den Satz unter „Symbole“ | Tests rot→grün; `vitest run src/design`, typecheck, `contrast-check`, `plan-check --offline` und prepush Exit 0; Bilder der Galerie hell und dunkel; ein Stufe-B-Review einer Nicht-Anthropic-Familie, Root prüft den Lizenzhinweis | – |

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Require both tier-B reviewer paths

For this frontend TypeScript package, the acceptance field requires only one non-author review, so following the newly added row can grant review-ok with only half of the required coverage. Tier B requires two different non-author families—one subscription reviewer and one eligible OpenRouter reviewer—and free feedback does not count; update the row and obtain both qualifying verdicts before acceptance.

AGENTS.md reference: AGENTS.md:L320-L326

Useful? React with 👍 / 👎.

Comment thread docs/PLAN.md
| DS-X-08 | Bestätigungsdialog `ConfirmDialog` (`role="alertdialog"`, Fokus zuerst auf Abbrechen, Esc bricht ab, ein Klick auf den Hintergrund schließt nicht, Bestätigen löst nur einmal aus, Gefahr-Ton über `Button` „danger“) und `Sheet` mit Größe (`sm`/`md`/`lg`) sowie Beschriftungs- und Beschreibungs-Kennungen; bestehende `Sheet`-Aufrufer bleiben unverändert; noch an keine Ansicht angeschlossen (jedes Paket, das ihn an Löschen, Zusammenführen oder Überschreiben hängt, ist Stufe A) | Implementierer · Claude; Root nimmt ab | DS-X-07 (#1683); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-08) | Server | B | In Arbeit: Draft-PR `claude/ds-x-08` | red-first Vitest-Tests; `vitest run src/design`, typecheck, `contrast-check`, `plan-check --offline` und prepush Exit 0; Bildschirmfotos hell/dunkel; ein unabhängiger Stufe-B-Review einer Nicht-Anthropic-Familie (Root beauftragt) | – |
| DS-X-09 | Tabelle v2 (Fabrik-Designsystem, Welle 1): `src/design/data/Table.tsx` bekommt sortierbare Spaltenköpfe (`aria-sort`, Enter und Leertaste), optionale Zeilenauswahl mit dem Ankreuzfeld (Kopf-Feld „teils“, Anzahl wird angesagt), eine feststehende Kopfzeile sowie Platzhalter für leer und lädt über `HonestState`; bestehende Aufrufer bleiben unverändert | Implementierer · Claude; Root nimmt ab | DS-X-05 (#1678); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-09) | Server | B | Erledigt: #1692 (merged 2026-10-17); keine Ansicht umgestellt (KR-07*, 10e folgen) | Tests rot→grün (`red-first.sh` Exit 0); `vitest run src/design`, typecheck, `contrast-check`, `plan-check --offline` und prepush Exit 0; Bildschirmfotos hell/dunkel; ein Stufe-B-Review einer Nicht-Anthropic-Familie, Root kommissioniert | – |
| DS-X-12 | Bewegungstoken angewendet: ein Druck-Token (`--g-press-scale`) für Knöpfe, Filterchips, Segmente und Tabs; der Füllbalken wächst per `transform: scaleX()` statt über die Breite, die Erlaubnisliste für Layout-Animation in `motion.test.ts` ist leer; der Lauf-Ring atmet nur unter `--g-ambient-play` (Lebendig), in Ruhig steht er still und ein Zustandswechsel gibt einen einmaligen Ping (`usePulseOnChange`); eine dokumentierte Regel für reduzierte Bewegung am Kopf von `motion.css`; das doppelte `g-enter` entfällt | Implementierer · Claude; Root nimmt ab | DS-X-03 (#1606), DS-X-07 (#1683); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-12) | Server | B | Erledigt: #1693 (merged 2026-10-18) | red-first Vitest-Tests; `vitest run src/design`, typecheck, contrast-check, `plan-check --offline` und prepush Exit 0; ein unabhängiger Stufe-B-Review (Root beauftragt) | – |
| DS-X-21 | Ein Symbolsatz auf 20-px-Raster: `Icon` in `src/design/icons/` (ohne Beschriftung für Hilfstechnik verborgen, mit `label` als `role="img"`, Farbe über `currentColor`) und 24 Lucide-Pfade als Daten (`glyphs.ts`), dazu Entsprechungen für die 14 klassischen Symbole, die Seitenleisten-Symbole und den Auswahl-Pfeil; Lizenztext `LUCIDE-LIZENZ.txt` neben den Symbolen und Eintrag in `docs/THIRD_PARTY_NOTICES.md` | Implementierer · Claude; Root nimmt ab | DS-Blueprint-Schnitt 16.10. (DS-X-21), Root-Entscheidung 17.10.: Pfade kopieren, kein Paket | Server | B + Lizenzprüfung | Entwurfs-PR offen (17.10.): kein Aufrufer umgestellt, `src/components/Icon.tsx` bleibt bis KR-15; Galerie zeigt den Satz unter „Symbole“ | Tests rot→grün; `vitest run src/design`, typecheck, `contrast-check`, `plan-check --offline` und prepush Exit 0; Bilder der Galerie hell und dunkel; ein Stufe-B-Review einer Nicht-Anthropic-Familie, Root prüft den Lizenzhinweis | – |

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 Record the post-merge DS-X-21 status

At the reviewed head, this commit already delivers the icon set, yet its new plan row still says that the draft PR is open. That status becomes false as soon as the change merges, leaving the canonical plan stale; replace it with the delivered post-merge state and merge/PR reference.

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

Useful? React with 👍 / 👎.

Comment thread src/design/icons/Icon.tsx
focusable="false"
className={className}
style={{ display: "block", flexShrink: 0, ...style }}
{...rest}

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 Prevent callers from overriding fixed icon attributes

When a caller supplies an otherwise valid SVGProps field such as stroke, strokeWidth, viewBox, or fill, this late spread overwrites the component's fixed Lucide contract. For example, <Icon name="check" stroke="red" /> no longer follows currentColor, despite both the component documentation and registry promising that behavior; either spread rest before the fixed attributes or omit these fields from IconProps.

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 e2b0550 into main Oct 20, 2026
25 checks passed
@mergify
mergify Bot deleted the claude/ds-x-21 branch October 20, 2026 11:48
@mergify

mergify Bot commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • ✅ Entered queue — 2026-10-20 11:40 UTC · Rule: default · triggered by merge protections
  • ✅ Checks passed · on draft merge queue: checking #1701 on main (af10ef0) #1742
  • ✅ Merged — 2026-10-20 11:48 UTC · at e2b05503ba4be898ea742caae4f01feb64bc486c · merge

This pull request spent 8 minutes 40 seconds in the queue, including 7 minutes 55 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