Skip to content

fix(design): DS-T-04 compact search keeps its accessible name - #1609

Merged
mergify[bot] merged 4 commits into
mainfrom
claude/ds-t-04
Oct 16, 2026
Merged

mergify[bot] merged 4 commits into
mainfrom
claude/ds-t-04

Conversation

@Cuarroc

@Cuarroc Cuarroc commented Oct 16, 2026 •

Copy link
Copy Markdown
Owner

Die kompakte Suche oben in der Kopfzeile behält jetzt immer ihren Namen „Seiten und Befehle suchen“, auch wenn bei wenig Platz Text und Tastenkürzel ausgeblendet werden. Vorher war der Knopf in diesem Zustand für Bildschirmleser namenlos; jetzt trägt er denselben Namen wie seine sichtbare Beschriftung. Optisch ändert sich nichts, und du musst nichts entscheiden.

Report

Plan-ID: DS-T-04

Package: DS-T-04 (P1-c from the DS blueprint cut, 16.10.) · Review tier: B (AGENTS.md, rule 5)

Goal / benefit: the header search trigger keeps a non-empty accessible name at every width (WCAG 2.5.3 Label in Name). · Parent / ticket / owner: design trust fixes DS-T-01…05, Root accepts.
Scope / limits / dependencies / acceptance: only CommandPalette.tsx + header.test.tsx (+ PLAN row); no seam, no new dependency, no visual change, no CSS change. Base origin/main @ e21710de.

What changed

  • src/shell/header/CommandPalette.tsx: one constant SEARCH_LABEL feeds both the visible <span> and a new aria-label on the trigger button. Before, the button's name came only from the <span> and the <kbd> chip, and header.css:11-12 hides both through container queries (≤239 px chip, ≤119 px text), which left the button without a name. One constant instead of two literals, so the src/i18n/hardcoded.test.ts ratchet does not grow (the baseline already lists this string).
  • src/shell/header/header.test.tsx: new test search trigger keeps a permanent accessible name. It renders <CommandPalette />, checks aria-label, then sets display: none on the span and kbd (what header.css does) and finds the button by its exact name.
  • docs/PLAN.md: one DS-T-04 row in the Z2 table next to the other DS rows, worded as true after merge.

Commits: 7f1d3cde (red test, Test-First:), 431b967a (fix, Regression-For: 7f1d3cde…), f32550f0 (PLAN row, No-Test:). Diff: 3 files, +15/−2.

Evidence

Command Exit code
npx vitest run src/shell/header/header.test.tsx -t "permanent accessible name" at 7f1d3cde (before the fix): fails, aria-label is null 1 (expected red)
same, with the aria-label assertion removed temporarily (not committed): Unable to find an accessible element with the role "button" and name "Seiten und Befehle suchen". The name check alone is red too, so jsdom honours display:none here 1 (expected red)
npx vitest run src/shell/header/ src/shell/scope.test.tsx src/i18n/hardcoded.test.ts after the fix: 7 files, 55 tests 0
bash scripts/ci/red-first.sh (base e21710de, head 431b967a): red/missing at the merge base, green at head, red-first: OK 0
bash scripts/ci/gates.sh lane prepush at f32550f0: all 27 gates green (incl. typecheck, lint, fe-test, clippy, rust-suite, red-first-plan) 0
npm run typecheck 0
node scripts/contrast-check.mjs: all 712 pairs pass 0
git ls-remote origin claude/ds-t-04 → f32550f0077d0ba24c52def96afcb389f6157e98 0

Visual: there is no visual claim. aria-label does not render, and no CSS changed, so there is no screenshot.

Process note: the start check right before the prepush run reported 2 other cargo builds running on the server (STOPP cargo), and the lane still started because it was chained in the same command. It finished with exit 0. RAM was 9.5 GB free.

npm run plan:check exits 1. Its findings for this row: DS-T-04 #1609: done / GitHub OPEN, which is expected because the row states the post-merge truth as ordered. The other findings (PLAN-CLEAN-1/2, open DS PRs without rows) were already there before this change. This is not a gate.

NICHT ABGEDECKT

  • Windows half: the #[cfg(windows)] tests and the Windows arms of clippy did not run (Linux server). The Windows lane runs in the merge queue. This package changes no Rust.
  • The prepush lane does not cover the browser smoke, the frontend build or the workflow gates (lane linux, CI).
  • Real layout: jsdom has no layout, so the width at which the search reaches ≤119 px is still unknown. The test simulates the container-query result with display:none. Follow-up (not in this package, per the cut): a Playwright case in e2e/glass-layout.spec.ts with locator.boundingBox() after fix(layout): DS-X-01 settings tab strip, settings grid, empty Betrieb, header breakpoint below 1440 #1604 merges, because fix(layout): DS-X-01 settings tab strip, settings grid, empty Betrieb, header breakpoint below 1440 #1604 changes that file.
  • The accessible name no longer includes the shortcut text ("Strg K" / "⌘ K") at wide widths, because aria-label overrides content. aria-keyshortcuts was not added: its literal would grow the hardcoded-string ratchet. The chip stays visible and is unchanged.
  • No screen-reader run (NVDA/VoiceOver). The name is checked through dom-accessibility-api (Testing Library getByRole).

Reviews and disposition

Review: pending (tier B), Root commissions. Two non-Anthropic reviewers from different families; the author is Claude.

ID Source Severity Finding Disposition
– – – – –

Open points

  • State: implemented, tested (local prepush). Not reviewed, accepted or merged.
  • Handover: candidate f32550f0 on base e21710de. Next step: Root commissions the tier-B reviews.

🤖 Generated with Claude Code on the ProjectA server worker

Root acceptance (16.10.2026 ~04:20 MESZ)

Reviewer Family Head Verdict Disposition
Codex gpt-6.1-sol (server) OpenAI f32550f APPROVE no findings
OpenRouter google/gemini-3.8-flash Google f32550f (full diff) APPROVE no findings
Tier B: two families other than the author's (Anthropic).
Root accepts head f32550f.

Conflict resolution (16.10.)

Mergify labelled the PR conflict after #1596/#1597/#1598/#1601 and later PRs merged. Resolved with a merge commit (no rebase, no force-push); the Root acceptance above is bound to f32550f0, so the delta below needs its own review (Root commissions it, non-Anthropic family).

  • Merged main: c6516d4e547ea00c9cbce6f8034484c3f30983ab (origin/main after fix(store): Z4-M4B-0 in-transaction planning authority check #1607).
  • Conflict: one hunk, only in docs/PLAN.md (Z2 table, both sides added a row at the same place). Resolution: both rows kept, wording unchanged (DS-T-04 from this PR first, DS-X-02 from main second); only the three conflict marker lines were removed. No other edit.
  • Files touched by the resolution: docs/PLAN.md only. Check: the resolved file differs from origin/main:docs/PLAN.md by exactly the one DS-T-04 row, and both rows are byte-identical to their sources (diff of each row, exit 0).
  • New head: 1de6ed78a05507d3738590aeeffaad03a43dabbb (merge commit, parents f32550f0 and c6516d4e; trailer No-Test: merge of main, conflict resolution only).
Command Exit code
git merge origin/main (conflict in docs/PLAN.md only) 1 (expected, then resolved)
git diff origin/main...HEAD --stat: only docs/PLAN.md (+1), src/shell/header/CommandPalette.tsx, src/shell/header/header.test.tsx (3 files, +15/−2, same as before the merge) 0
npm run plan:check after the merge: 12 findings (19 before the merge); for this row still only DS-T-04 #1609: done / GitHub OPEN (expected, unchanged); no new finding for this row; the rest belong to other PRs 1 (same finding as before)
bash scripts/ci/secret-scan.sh 0
bash scripts/ci/gates.sh lane prepush at 1de6ed78: all 27 gates green (incl. typecheck, lint, fe-test, clippy, rust-suite, red-first-plan) 0
git push -u origin claude/ds-t-04 (fast-forward f32550f0..1de6ed78, pre-push hook ran the lane again) 0
git ls-remote origin claude/ds-t-04 → 1de6ed78a05507d3738590aeeffaad03a43dabbb 0

NICHT ABGEDECKT (delta): the Windows half (#[cfg(windows)] tests, Windows clippy arms) did not run on this Linux server; the Windows lane runs in the merge queue. Not set: ready, labels, merge.

🤖 Generated with Claude Code on the ProjectA server worker

Root re-acceptance after conflict merge (16.10.2026 ~07:20 MESZ)

Conflict resolution 1de6ed7 (merge of main c6516d4; PR diff vs main: docs/PLAN.md +1 own DS-T-04 row, CommandPalette.tsx, header.test.tsx). Delta/full-diff review: OpenRouter google/gemini-3.8-flash (Google) at 1de6ed7: APPROVE, no findings. Required checks pass on 1de6ed7. Root accepts head 1de6ed7.

Cuarroc and others added 3 commits October 16, 2026 03:20
…ed, DS-T-04)

The header search button has no aria-label; its name comes only from the
visible span and the shortcut chip, which header.css hides with container
queries as the search shrinks. With both hidden, the button has no name.

Test-First: src/shell/header/header.test.tsx::search trigger keeps a permanent accessible name

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The header search button now carries aria-label with the same text as its
visible label (WCAG 2.5.3 Label in Name). One constant feeds both, so the
hardcoded-string ratchet does not grow. header.css may still hide the text
and the shortcut chip as the search shrinks; the name stays.

Regression-For: 7f1d3cd

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
No-Test: plan status row

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Cuarroc
Cuarroc marked this pull request as ready for review October 16, 2026 02:16
@Cuarroc Cuarroc added the review-ok Pipeline: review disposition complete, no open high finding label Oct 16, 2026
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 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-16T05:15:43.678775Z 1de6ed7 New commits
ℹ️ 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.

@mergify

mergify Bot commented Oct 16, 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 16, 2026
@Cuarroc Cuarroc removed the review-ok Pipeline: review disposition complete, no open high finding label Oct 16, 2026
…ict)

Both table rows are kept unchanged: the DS-T-04 row of this PR and the
DS-X-02 row that arrived with main. No other edit.

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 16, 2026
@Cuarroc Cuarroc added the review-ok Pipeline: review disposition complete, no open high finding label Oct 16, 2026
@Cuarroc

Cuarroc commented Oct 16, 2026

Copy link
Copy Markdown
Owner Author

Root auto-queue: head 1de6ed7 unchanged since review-ok, all checks green. @Mergifyio queue

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

mergify Bot commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • ✅ Entered queue — 2026-10-16 05:24 UTC · Rule: default · triggered by merge protections
  • ✅ Checks passed · on draft merge queue: checking #1609 on main (c6516d4) #1617
  • ✅ Merged — 2026-10-16 05:37 UTC · at cc224435c14e06ff7880fdf7c23aaaf3bf7f6a41 · merge

This pull request spent 12 minutes 22 seconds in the queue, including 11 minutes 59 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