Skip to content

feat(design): DS-X-27 tooltip and banner - #1716

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

mergify[bot] merged 6 commits into
mainfrom
claude/ds-x-27

Conversation

@Cuarroc

@Cuarroc Cuarroc commented Oct 18, 2026 •

Copy link
Copy Markdown
Owner

Dieses Paket baut zwei neue Bausteine: einen Tooltip (kurzer Hilfetext, der bei Tastaturfokus und beim Überfahren erscheint) und ein Banner mit den Arten Info, Erfolg, Achtung und Fehler. Drei der vier eigenen Hinweisboxen (Agentenkarte, Tresor, Agent starten) nutzen jetzt das Banner; die anderen beiden bleiben, weil ein Tausch ihr Verhalten ändern würde. Du musst nichts entscheiden; der Review wird von Root beauftragt.

Report

Plan-ID: DS-X-27

Änderung

  • src/design/layout/Tooltip.tsx: öffnet bei Fokus sofort, beim Überfahren nach der Verzögerung aus --g-dur-4 (gelesen aus dem CSS-Token, keine feste Millisekundenzahl im Code); schließt mit Esc (Esc geht nur dann nicht weiter nach oben, wenn der Tooltip offen war), Blur und Verlassen; aria-describedby nur solange offen; keine Animation, also statisch bei reduzierter Bewegung und Modus Aus.
  • src/design/layout/useFlip.ts: die Klapp-Messung aus dem Popover (einmal beim Öffnen), jetzt von Popover und Tooltip geteilt; Popover-Verhalten unverändert (alle Popover-Tests grün).
  • src/design/layout/Banner.tsx: Arten info/ok/warn/bad; bad ist role="alert", die anderen role="status"; das Zustandswort steht als Text davor (banner.* in src/i18n/de.ts), Farbe allein trägt nichts. CSS in layout.css.
  • Register-Einträge Banner und Tooltip; PLAN-Zeile DS-X-27.
  • Umgestellt (reiner Markup-Tausch, gleiche Rolle): .ls-err in AgentCard (alert), .tr-alert in TresorPanel (alert), .wg-warning in WegWahl (status/polite). Die toten CSS-Regeln .tr-alert und .wg-warning sind entfernt. Sichtbare Abweichung: das Zustandswort steht jetzt vor dem Text, und Rahmen, Fläche und Textfarbe folgen dem Banner.
  • NICHT umgestellt (Folgearbeit): .g-hdr-stop in StopBand (Rolle status bei roter Optik, dazu Knopf und eingebetteter Fehler; ein bad-Banner wäre ein alert) und .ls-err in LeitstandRoute (Rolle status; der Wechsel auf alert ändert die Ansage). Beide brauchen eine Entscheidung zur Rolle oder einen role-Parameter am Banner.
  • Kein Tooltip an einer bestehenden Stelle eingebaut (Nicht-Ziel: kein Austausch der title).

Red → grün

  • Red test: tooltip.test.tsx::opens on focus and closes on Escape und banner.test.tsx::bad uses role alert and info uses status; Commit 2bd2e5f mit Stubs, damit der Typecheck-Hook durchläuft: 5 Tests rot (Komponenten geben nichts aus). Am Kopf grün.
  • Abweichung vom Auftrag: der Testname bad uses role alert, info uses status mit Komma lehnt der commit-msg-Hook als „Liste“ ab; er heißt jetzt bad uses role alert and info uses status.
  • bash scripts/ci/red-first.sh → Exit 0.

Belege (Befehl → Exit)

  • npx vitest run src/design src/screens src/shell → 0 (108 Dateien, 862 Tests)
  • npm run typecheck → 0; node scripts/contrast-check.mjs → 0; node scripts/plan-check.mjs --offline → 0
  • bash scripts/ci/gates.sh lane prepush (eigener Arbeitsbaum, Slot 3) → 0, ungefiltert
  • Push geprüft mit git ls-remote: Kopf adc3de7
  • Umfang: 235 Zeilen hinzugefügt, 19 entfernt (Basis origin/main), unter 300.
  • Bildschirmfotos (Vite mit Browser, Playwright, nie die Desktop-App; angesehen): offener Tooltip und alle vier Banner-Arten, hell und dunkel, ds-x-27-banner-tooltip-{light,dark}.png im Berichtsordner des Orchestrators. Die Fotos zeigen die Bausteine auf einer Testseite, nicht die drei umgestellten Stellen in der echten App.

Architecture drift: keine neuen Funde.

NICHT ABGEDECKT

  • Die Windows-Hälfte (#[cfg(windows)]-Tests, ConPTY/DPAPI); die Windows-Bahn läuft in der Merge-Queue.
  • Die echte Desktop-App/WebView wurde nie gestartet; die Fotos stammen aus Chromium.
  • Die drei umgestellten Stellen (AgentCard-Fehler, Tresor-Fehler, Wegwahl-Warnung) wurden nicht in der laufenden App angesehen, nur ihre bestehenden Tests laufen grün.
  • Die Klappmessung des Tooltips ist nur über die geteilte Popover-Messung (jsdom mit Geometrie-Mock) belegt, nicht in einem echten kleinen Fenster; der Tooltip ist mittig unter dem Auslöser und kann am linken Fensterrand abgeschnitten werden (kein Randausgleich).
  • Hover-Verzögerung setzt ein Token in Millisekunden voraus; fehlt das Token, gibt es keine Verzögerung (im Code als Kurzschluss vermerkt).
  • Kein Test für Touch-Geräte.

Review: ausstehend (Stufe B, Root beauftragt)

🤖 Generated with Claude Code on the ProjectA server worker

Conflict fix (Codex, 2026-10-20)

Stage: BLOCKED before push. The authorized merge is committed locally; the required prepush lane failed. No retry was made because the failure is not the one SessionProvider timeout allowed by the brief. Root owns the next decision; resume after explicit authorization for the boot-smoke failure path (diagnosis/fix or a bounded rerun). Product behavior changes and review fixes remain outside this package.

  • Observed model: gpt-6.1-sol, effort high, from this session's turn_context (2026-10-20T12:22:50Z); harness weekly usage observed at 3% used. Native goal was created for this bounded conflict task and remains unmet pending green prepush, push and remote verification.
  • Original head: adc3de7de38378e0d70a998ae3bf171e097856b4.
  • Merged main: 9f33f721d52a3a9188a3129118b52bab2cf1bfcd.
  • Local merge head: 05d615cbd7aba1ae2fdbfb81636e73430f0311a5 (parents: original head and merged main). The requested identity, message, No-Test trailer and observed-model Co-Authored-By trailer are present.
  • Remote head after the blocked run: adc3de7de38378e0d70a998ae3bf171e097856b4, verified with git ls-remote origin refs/heads/claude/ds-x-27 (exit 0). No push was attempted.

Resolution

  • docs/PLAN.md: retained main exactly and inserted the branch-only DS-X-27 row once; no other branch-only row exists; offline check reports 0 findings.
  • src/design/registry.ts: retained every main entry verbatim, including ConfirmDialog, and added only the branch's original Banner and Tooltip entries (12 lines).
  • An inline Node assertion compared the old and merged PR diffs: all 15 file names and every added/deleted line are identical to the original PR (exit 0). There are no unresolved conflicts and no extra product edits.

Evidence (command -> exit code)
Worktree: C:/Users/Cuarr/orca/ProjectA/.claude/worktrees/codex-dsx27; CARGO_TARGET_DIR=C:/Users/Cuarr/cargo-targets/projecta-b, CARGO_BUILD_JOBS=1; no CARGO_PROFILE overrides set. node_modules already existed.

  • bash scripts/sync.sh start -> 0; initial status clean.
  • npm run dev:start-check -> 0 before commit and prepush; immediately before prepush: 4.5 GB free, 0 cargo builds. Provider usage was observed separately from the harness, not supplied via --usage.
  • git fetch origin -> 0; git merge origin/main -> 1 (expected: only the two authorized files conflicted).
  • git diff --cached --check -> 0; preservation assertions -> 0.
  • node scripts/plan-check.mjs --offline -> 0, 0 findings (also rechecked after the failed lane).
  • bash scripts/ci/secret-scan.sh -> 0, no leaks; precommit hook -> 0 (14 green gates).
  • git -c user.name=Cuarroc -c user.email=47299143+Cuarroc@users.noreply.github.com commit -F <temporary message file> -> 0.
  • git diff origin/main...HEAD --stat -> 0: original 15 files, 235 insertions and 19 deletions, including only one PLAN row.
  • git merge-base --is-ancestor origin/main HEAD -> 0.
  • bash scripts/ci/gates.sh lane prepush -> 1, first and only run, bound to 05d615cb: fe-test failed; 230/231 files and 1692/1693 tests passed. src/__tests__/boot.smoke.test.tsx:53, renders the workspace when every boot command is mocked, expected list_projects, observed 0 invoke calls. No cause is established. No SessionProvider failure was reported.
  • Logs retained outside the repository: C:/Users/Cuarr/AppData/Local/Temp/dsx27-conflict-20261020/{commit,prepush-1}.log. Worktree is clean; local merge remains available for Root's next step.

NICHT ABGEDECKT

  • Prepush stopped at fe-test; hq-test, denkraum, clippy and rust-suite did not run in that lane. Precommit separately passed cargo check and denkraum, which does not replace prepush.
  • Windows host: #[cfg(unix)] tests and Linux clippy arms are not covered (KI-7); no Linux lane was run.
  • shellcheck and actionlint are absent locally and were explicitly skipped by their gates.
  • Browser smoke, frontend build and workflow gates belong to the Linux lane; external service state is not covered.
  • No new visual inspection or desktop launch; no claim of new visual verification. Offline plan-check excludes GitHub/age reconciliation and running-job checks.
  • Independent review/Root acceptance remains outstanding; this conflict task did not commission reviews or change PR readiness, labels or queue state.

Review fix R1716-C1 (Codex, 2026-10-20)

Stage: implemented, checked and pushed; independent delta review and Root acceptance pending. This entry supersedes the earlier conflict-fix blocked status. The existing PR text is preserved. No readiness, label, merge or queue action was performed.

  • Authority: Root's DS-X-27 review-fix brief, finding R1716-C1 (medium, accepted).
  • Observed model: gpt-6.1-sol, effort high, from this session's turn_context dated 2026-10-20T13:11:50Z. Harness weekly usage observed at 4% used; the start-check itself did not check provider usage because no usage file was supplied.
  • Old remote head: 05d615cbd7aba1ae2fdbfb81636e73430f0311a5.
  • Test-only commit: 7b50cd3b2c6e9d0f9c5c3771e9fae87f943c6cac.
  • Fix/new remote head: d07f7bead73d2357269848043c4a59c701191b70.
  • Both commits use the required author identity, the same exact Test-First trailer and an observed-model Co-Authored-By final line.

Change and test boundary

  • Only src/design/layout/Tooltip.tsx and src/design/layout/tooltip.test.tsx changed from the assigned base (13 additions/7 deletions and 16 additions respectively).
  • While open, Tooltip installs a document keydown listener in the capture phase. Escape cancels its pending timer, closes it and stops propagation before ancestor React handlers run; other keys pass through. Closing/unmount removes the listener. The redundant wrapper handler is removed.
  • The regression uses the public DOM: focus another button, hover the trigger, press Escape there, and assert the tooltip and aria-describedby disappear, focus stays put, the first Escape is contained and the next Escape reaches the parent. The existing focus, blur, hover-delay and early-leave tests also pass.
  • No Banner/useFlip/Popover changes, refactor, rebase or new PR.

Evidence (command -> exit code)
Worktree: C:/Users/Cuarr/orca/ProjectA/.claude/worktrees/codex-dsx27; CARGO_TARGET_DIR=C:/Users/Cuarr/cargo-targets/projecta-b, CARGO_BUILD_JOBS=1; no CARGO_PROFILE overrides.

  • git rev-parse HEAD at start -> 0: exact assigned base 05d615cb; status clean. git ls-remote origin refs/heads/claude/ds-x-27 before work -> 0: same full old SHA above.
  • bash scripts/sync.sh start -> 0; git fetch origin -> 0; live PR and origin/main inspected. The lage-jetzt mirror and AgentsRoom memory tools were unavailable here.
  • npm run dev:start-check -> 0 before commits and gate runs; before explicit prepush: 4.5 GB free, 0 cargo builds; before push: 4.1 GB free, 0 cargo builds.
  • npx vitest run src/design/layout/tooltip.test.tsx -t 'Escape closes a hover-opened tooltip while focus is elsewhere' -> 1 on original Tooltip at the base and again at test-only commit 7b50cd3b: compiling test fails at line 40 because the tooltip remains present. Same command at fix commit d07f7bea -> 0 (1 selected test passes).
  • npx vitest run src/design/layout/tooltip.test.tsx -> 0 (5 tests).
  • npx vitest run src/design -> 0 (59 files, 281 tests; final committed source is identical to the tested tree).
  • bash scripts/ci/secret-scan.sh -> 0 before each commit; both commit commands and their precommit hooks -> 0.
  • bash scripts/ci/gates.sh lane prepush -> 0, first run, bound to d07f7bea in this worktree: 231 frontend files/1694 tests passed; clippy passed; 2319 Rust tests passed, 20 skipped; HQ and Denkraum passed.
  • git push origin HEAD:claude/ds-x-27 -> 0; its unchanged hook ran the full prepush lane again -> 0 (231 frontend files/1694 tests; 2319 Rust tests passed, 20 skipped). No failed acceptance run or flake retry occurred in this fix task.
  • git ls-remote origin refs/heads/claude/ds-x-27 after push -> 0, new full SHA above.
  • git diff origin/main...HEAD --shortstat -> 0: 15 files, 257 insertions and 19 deletions = 276 total lines, within 300. Worktree clean after push.
  • Logs outside the repository: C:/Users/Cuarr/AppData/Local/Temp/dsx27-review-fix-20261020/{commit-fix,prepush-1,push}.log.

Disposition: R1716-C1 accepted and fixed by d07f7bea, regression introduced separately in 7b50cd3b. Independent fix-delta review remains with Root; this implementation does not count as its own independent review.

NICHT ABGEDECKT

  • Windows host: #[cfg(unix)] tests and Linux clippy arms were not compiled/run (KI-7); no Linux lane.
  • shellcheck and actionlint absent and explicitly skipped by their gates; jq-filter cases skipped because jq is absent. Existing test skips were not changed; the Rust suite reports 20 skipped tests. The separate Windows native-tests lane was not run.
  • The Linux-lane browser smoke, frontend build and workflow gates, external service state, and offline plan-check's GitHub/age/running-job reconciliation are not covered by these local lanes.
  • No new screenshot, manual browser or desktop/WebView inspection; this fix proves keyboard/DOM behavior in jsdom. No new visual claim.

Reviews and disposition (Root, 2026-10-20)

Author family: Anthropic (Claude). Tier B.

  • Conflict fix 05d615cb (Codex): union of both registry entries (Banner, ConfirmDialog) and both PLAN rows. The first Codex prepush failed only at the known load flake boot.smoke.test.tsx:53; the file passed alone (2/2), and the Root push-hook rerun was green (28 gates).
  • Codex review of 05d615cb (OpenAI, non-author): REQUEST CHANGES with R1716-C1.
  • NVIDIA Nemotron 3 Ultra review of 05d615cb and of d07f7bea (kilo free, non-author): APPROVE WITH CONDITIONS, all findings low.
  • Fix 7b50cd3b (test, red) + d07f7bea (fix, green) by Codex. Root delta review (Anthropic, non-author of the OpenAI delta): APPROVE. While the tooltip is open, a capture-phase keydown listener on document closes it on Escape and is removed on close or unmount. The first Escape closes only the tooltip, the second reaches outer handlers; the test asserts exactly this.
ID Source Severity Finding Disposition
R1716-C1 Codex medium hover-opened tooltip ignores Escape while focus is elsewhere (Tooltip.tsx:39-47) accepted: 7b50cd3b (red) + d07f7bea (fix)
N1-F1 NVIDIA medium (claimed) unused refs byPointer/returnFocus in Popover rejected: used at Popover.tsx:41-54
N1-F2 / N2-F2 NVIDIA medium/low Escape stopPropagation blocks parents rejected: intended layered dismissal (WCAG 1.4.13), only while open, covered by a test
N1-F3 / N2-S1 NVIDIA low GAP = 8 duplicated in CSS follow-up: gap token
N1-F4 / N2-F1 NVIDIA low hoverDelay() token parsing fragility follow-up; documented shortcut in code
N1-F5 NVIDIA low missing i18n fallback in Banner rejected: BannerKind keys are typed, so typecheck catches a missing key
N2-F3 NVIDIA low flip measured once on open follow-up; documented shortcut (inherited from Popover)
N2-F4 NVIDIA low Banner body span may wrap block content follow-up
N-S* NVIDIA smell naming / literal union no action

No open high finding. review-ok bound to head d07f7bead73d2357269848043c4a59c701191b70.

Cuarroc and others added 3 commits October 18, 2026 21:09
Failing tests plus stubs so the tree typechecks; the components follow.

Test-First: src/design/layout/tooltip.test.tsx::opens on focus and closes on Escape
Test-First: src/design/layout/banner.test.tsx::bad uses role alert and info uses status

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Tooltip opens on focus and hover (delay from --g-dur-4), Banner has the
kinds info/ok/warn/bad; AgentCard, TresorPanel and WegWahl use the Banner.
The flip measurement moves to useFlip, shared with Popover.

Test-First: src/design/layout/tooltip.test.tsx::opens on focus and closes on Escape
Test-First: src/design/layout/banner.test.tsx::bad uses role alert and info uses status

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 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, merge commit resolving main conflicts

Co-Authored-By: gpt-6.1-sol <noreply@openai.com>
@mergify mergify Bot removed the conflict label Oct 20, 2026
Cuarroc and others added 2 commits October 20, 2026 15:13
Test-First: src/design/layout/tooltip.test.tsx::Escape closes a hover-opened tooltip while focus is elsewhere

Co-Authored-By: gpt-6.1-sol <noreply@openai.com>
Test-First: src/design/layout/tooltip.test.tsx::Escape closes a hover-opened tooltip while focus is elsewhere

Co-Authored-By: gpt-6.1-sol <noreply@openai.com>
@Cuarroc
Cuarroc marked this pull request as ready for review October 20, 2026 13:38
@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:43:12.482105Z d07f7be 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: d07f7bead7

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

return (
<span
ref={root} className="g-tip"
onFocus={() => show(0)} onBlur={hide} onMouseEnter={() => show(hoverDelay())} onMouseLeave={hide}

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 Keep the tooltip open while its content is hovered

When a pointer user moves from the trigger toward the displayed tooltip, this unconditional onMouseLeave closes it immediately; .g-tip__bubble also has pointer-events: none, so the additional content can never be hovered. This breaks the expected hoverable-tooltip behavior for users who need to move the pointer over enlarged content; track trigger/bubble hover together and close only after the pointer has left both.

Useful? React with 👍 / 👎.

Comment thread docs/PLAN.md
| 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 | – |
| DS-X-32 | Datenfarben `--g-viz-1` bis `--g-viz-6` in `src/design/tokens.css` (hell und dunkel), eigene Farbtöne abseits der Zustandsfarben; `scripts/contrast-check.mjs` prüft jede Datenfarbe als Nicht-Text mit mindestens 3:1 auf Grund, Chrome und Glas (auch in allen Glas-Varianten), hält sie voneinander und von den Zustandsfarben auseinander und meldet „Token fehlt“; die Galerie-Seite Farben zeigt die sechs Farbfelder; keine Diagramm-Bausteine (das ist DS-X-33) | Implementierer · Claude; Root nimmt ab | DS-X-02; DS-Blueprint-Schnitt 16.10. (Zeile DS-X-32) | Server | B | Erledigt: #1702 (merged 2026-10-18), Branch `claude/ds-x-32`; die sechs Datenfarben stehen in `tokens.css`, `contrast-check` prüft sie und die Galerie-Seite Farben zeigt sie, Diagramm-Bausteine folgen mit DS-X-33 | red-first Gate-Tests in `scripts/lib/contrast-gate.test.mjs`; `contrast-check`, typecheck, `plan-check --offline` und prepush Exit 0; Bilder der Farben-Seite hell und dunkel; ein unabhängiger Stufe-B-Review (Root beauftragt) | – |
| DS-X-26 | Popover (Fabrik-Designsystem, Welle 4): `src/design/layout/Popover.tsx` setzt `aria-expanded`/`aria-controls` am Auslöser, schließt bei einem Pointerdown außerhalb genau einmal, mit Esc (Fokus zurück zum Auslöser) und beim Verlassen per Tab, misst einmal beim Öffnen, ob es nach oben klappt (keine CSS-Anker-Positionierung), und geht über den Austrittsübergang aus DS-X-07 (bei reduzierter Bewegung sofort); `ProjectPicker` und das kompakte Darstellungsmenü nutzen es mit unverändertem Verhalten und Aussehen; Eintrag im Register; kein Menü-Baustein, kein Tooltip (DS-X-27) | Implementierer · Claude; Root nimmt ab | DS-X-07 (#1683); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-26) | Server | B | Erledigt: #1705 (merged 2026-10-18); `ProjectPicker` und das kompakte Darstellungsmenü nutzen das Popover mit unverändertem Verhalten und Aussehen, kein Menü-Baustein und kein Tooltip (DS-X-27) | red-first Vitest-Tests (`popover.test.tsx`); die bestehenden Tests von `ProjectPicker` und Darstellungsmenü bleiben unverändert grün; `vitest run src/design src/shell`, typecheck, contrast-check, `plan-check --offline` und prepush Exit 0; Bildschirmfotos beider Menüs hell und dunkel; ein unabhängiger Stufe-B-Review (Root beauftragt) | – |
| DS-X-27 | Tooltip und Banner (Fabrik-Designsystem, Welle 4): `src/design/layout/Tooltip.tsx` öffnet bei Tastaturfokus sofort und beim Überfahren nach der Verzögerung aus dem Dauer-Token `--g-dur-4`, schließt mit Esc, beim Verlassen und bei Blur, setzt `aria-describedby` und bewegt sich nie; die Klapp-Messung teilt es sich mit dem Popover (`useFlip`); `Banner.tsx` hat die Arten info/ok/warn/bad (`bad` als `role="alert"`, die anderen als `status`) mit Zustandswort aus `src/i18n/de.ts`; `AgentCard`, `TresorPanel` und `WegWahl` nutzen das Banner statt `.ls-err`, `.tr-alert` und `.wg-warning`; `.g-hdr-stop` (Knopf, Rolle `status`) und das `.ls-err` in `LeitstandRoute` (Rolle `status`) bleiben, weil der Tausch ihre Rolle oder ihr Verhalten änderte; Register-Einträge; kein Austausch aller `title` | Implementierer · Claude; Root nimmt ab | DS-X-26 (#1705); DS-Blueprint-Schnitt 16.10. (Zeile DS-X-27) | Server | B | In Arbeit: Draft-PR | red-first Vitest-Tests (`tooltip.test.tsx`, `banner.test.tsx`); `vitest run src/design src/screens`, typecheck, contrast-check, `plan-check --offline` und prepush Exit 0; Bildschirmfotos eines offenen Tooltips und aller vier Banner-Arten hell und dunkel; 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 Mark DS-X-27 complete in the merge-state plan

The newly added Plan-ID row still says In Arbeit: Draft-PR, which becomes false as soon as this reviewed commit is merged; update it to the completed/merged state and include the resulting evidence. The repository explicitly requires a PR's PLAN row to describe what is true after merge and classifies a mismatch as a medium finding.

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

Useful? React with 👍 / 👎.

ref={root} className="g-tip"
onFocus={() => show(0)} onBlur={hide} onMouseEnter={() => show(hoverDelay())} onMouseLeave={hide}
>
{children({ "aria-describedby": open ? id : undefined })}

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 Preserve the trigger's existing accessible description

When this component wraps a control that already has aria-describedby, such as a Field control with hint or error IDs, no ordinary ordering of the documented {...props} spread retains both descriptions: this value either replaces the existing IDs with the tooltip ID (or undefined while closed), or is itself overwritten. Accept and merge the trigger's existing description IDs so opening a tooltip does not hide its hint or validation message from assistive technology.

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 c89ec55 into main Oct 20, 2026
25 checks passed
@mergify
mergify Bot deleted the claude/ds-x-27 branch October 20, 2026 13:56
@mergify

mergify Bot commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • ✅ Entered queue — 2026-10-20 13:45 UTC · Rule: default · triggered by merge protections
  • ✅ Checks passed · on draft merge queue: checking #1716 on main (fc51eb7) #1747
  • ✅ Merged — 2026-10-20 13:57 UTC · at c89ec558f1eac57df5abb10aa08ac3b49f9cfa97 · merge

This pull request spent 11 minutes 45 seconds in the queue, including 10 minutes 58 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