Skip to content

test(shell): record narrow v2 acceptance and keyboard coverage (V2-ACC1b) - #1540

Closed
Cuarroc wants to merge 1 commit into
mainfrom
codex/v2-acc1b
Closed

Cuarroc wants to merge 1 commit into
mainfrom
codex/v2-acc1b

Conversation

@Cuarroc

@Cuarroc Cuarroc commented Oct 15, 2026 •

Copy link
Copy Markdown
Owner

Dieser PR ergänzt Tastatur- und Not-Aus-Tests für zwölf erreichbare Routen der Hülle und des Leitstands.
Die lokalen Prüfungen bestehen, aber Kriterium 4 ist auf der vorgegebenen Basis nicht erfüllt, weil dort der Zustandszähler samt Obergrenze fehlt.
Die Bildabnahme, die Release-Prüfung und die persönliche Klick-Abnahme bleiben beim Nutzer.

Report

Package: V2-ACC1b · Operator: UMSETZEN · Review tier: B, as commissioned.
Candidate: 666c0a9f16c571c59d6c40ecc6234d903607d1fe.
Base: claude/v2-scope-1-sidebar / #1499 at 91cba1f3e3bbef612ad7a0098c4c330fd3c6bbca, itself stacked on #1484.
Observed: 2026-10-15, Linux. Acceptance applies to this stack, not current main.

Goal, scope and changes

Bounded worker goal: test shell + Leitstand with D1 on, document criteria 1/2-list/3/4/5/6-shell/8/9, and hand over this draft. Parent: v2.0 narrow acceptance, section 10.1 of docs/plan/v2.0/plan.md; execution owner: assigned V2-ACC1b worker; acceptance/integration owner: Root.
Native get_goal returned no goal initially; create_goal returned this bounded goal as active, and the milestone get_goal confirmed it active. The parent acceptance remains open because criterion 4 fails.

  • 127 added lines in three files, all under src/shell/acceptance/; no product change.
  • Twelve real Chromium Tab/Tab/Shift+Tab tests load the app with the existing Tauri browser mock, D1 on and weitere_bereiche off. They check entry into the shell and return between the two visible navigation links, at 1440×900. Vite uses an allocated local port; browser and server are awaited and closed by the test run.
  • Twelve active StopBand tests render the real Shell with only the Tauri boundary mocked; they check the status band, its resume button and the persistent emergency-stop control. One additional test pins default flags and registry coverage.
  • routes.ts is the unavoidable 15-line test-only route fixture, used to check all registry paths and document the extra mounted paths. No helper outside the assigned directory, dependencies, screenshots, Rust, seams, flag or route-registry changes.

Kriterium → Befehl → Exit-Code → Ergebnis

Kriterium Befehl Exit-Code Ergebnis
1 — scope + board data source npx --no-install vitest run src/shell src/screens/leitstand; store proof in bash scripts/ci/gates.sh lane prepush 0; 0 PASS with layered evidence: 34 files / 276 tests; sidebar is Leitstand + Einstellungen, palette also retains Ersteinrichtung. Existing real-store test and frontend boundary test named below.
2 — image list only npx --no-install vitest run src/shell/acceptance --reporter=verbose; source inspection of src/shell/routes.ts and mounted links 0 PASS for inventory only: twelve paths below. Image comparison remains unperformed.
3 — contrast + keyboard node scripts/contrast-check.mjs; npx --no-install vitest run src/shell/acceptance --reporter=verbose 0; 0 PASS: 704 contrast pairs; twelve browser keyboard tests. The contrast command is the existing build step (there is no scripts/ci/contrast-check.mjs on this base).
4 — one state dictionary with decreasing legacy ceiling node scripts/ci/ratchet.mjs check; rg -c -- '--state-' src/styles.css 0; 0 FAIL: the successful ratchet does not measure this criterion. scripts/ci/ratchet.mjs:8 registers only four unrelated counters, and scripts/ci/ratchets.json:1 has no state ceiling. src/styles.css:215 still defines legacy state colors independently. Current scan: 164 matching lines, 181 occurrences; state-alias counter and ceiling: absent, not zero. No fix attempted.
5 — dictionary npx --no-install vitest run src/i18n 0 PASS: hardcoded.test.ts, 15 tests.
6 — shell stop control npx --no-install vitest run src/shell/acceptance --reporter=verbose 0 PASS: active StopBand and emergency-stop control checked on all twelve paths. StopBand correctly renders only while stop is active; no server-worker stop claim.
8 — local gates bash scripts/ci/gates.sh lane prepush 0 PASS at candidate HEAD: 1,409 frontend tests; 2,271 Rust tests passed, 7 skipped; Clippy green. Full lane: 284 s. Push hook repeated the full lane successfully in 159 s.
9 — continuous stays off rg -n 'continuousScheduler' src-tauri/src/main.rs src-tauri/src/store/continuous.rs src-tauri/src/api/tests/resume_closed_tests.rs; git diff -G continuousScheduler "$(git merge-base origin/main HEAD)" HEAD -- src src-tauri 0; 0 PASS, static evidence: src-tauri/src/main.rs:2741 has "continuousScheduler": false; store effective limits are also false; the existing test asserts false. The stack diff is empty for this property, and the feature flag registry has no scheduler switch.

Criterion 4 uses the approved wording: „Keine zweite Definition der sechs Zustände außerhalb von src/design/, außer den gezählten Alt-Aliasen; die Obergrenze sinkt nur.“ The required #1494 change is absent from the prescribed predecessor snapshot. The existing ratchet prints ts-suppress: 0 = 0, eslint-disable: 0 = 0, rust-allow: 221 = 221, ts-any: 2 = 2. These are not state counters. Root must arrange an updated predecessor containing the state ratchet, then commission a new acceptance run; this package does not merge main or modify the predecessor.

Data-source evidence and test boundaries

  • Existing real source proof: src-tauri/src/web_interface.rs::the_real_backend_puts_live_workers_on_the_board (:1851), observed PASS in the full Rust suite. It opens a real Store, inserts workers, starts the real board backend, and checks /board.json for project/worker/state data.
  • App wiring: src-tauri/src/main.rs:1689 (get_board_state) reads store.list_workers and passes those workers to the status engine. src/screens/leitstand/LeitstandRoute.tsx uses useBoard and useQuestions.
  • Existing frontend boundary proof: src/screens/leitstand/LeitstandRoute.test.tsx::shows the cards and the Braucht dich list from the real board and question data at /leitstand. Despite its name, this frontend test mocks Tauri invoke. It proves rendering/wiring, not a real Store-to-DOM end-to-end run; the separate native test supplies the real-store evidence.

Image inventory for V2-SHOT-BASE

Capture each path in light and dark, 1440×900: 24 images total, outside Git. Titles below are navigation/view labels, not claims that a screenshot was inspected. Include the registry paths exposed by the palette and the extra paths reachable from mounted screens.

Path Title / view Entry point
/leitstand Leitstand · Haupt Sidebar, palette
/leitstand/verlauf Leitstand · Verlauf Palette
/leitstand/betrieb Leitstand · Betrieb Leitstand tabs
/leitstand/klassisch Leitstand · Klassisch Leitstand tabs
/leitstand/werkzeuge Leitstand · Werkzeuge Leitstand tabs
/leitstand/terminal Leitstand · Terminal Agent card; populated case uses ?worker=<id>
/einstellungen Einstellungen · Allgemein Sidebar, palette
/einstellungen/mcp Einstellungen · MCP & Tresor Palette
/einstellungen/benachrichtigungen Einstellungen · Benachrichtigungen Palette, header bell
/einstellungen/projekt Einstellungen · Projekt Palette
/einstellungen/klassisch Weitere Einstellungen / classic settings Settings button
/start Ersteinrichtung Direct route, palette; no sidebar entry

Verlauf is exposed with the scope flag off: src/shell/routes.ts:26 registers it under Leitstand, :51 keeps that entire area in scope, and src/shell/header/CommandPalette.tsx:15 includes every tab of each visible area. It is not a tab in the new Leitstand's own tab row (src/screens/leitstand/LeitstandRoute.tsx:23). Its direct path renders the legacy panel according to src/shell/mount/ShellMount.tsx:61. The distinction between registry labels and the mounted legacy content needs visual inspection; this PR claims neither a new Verlauf screen nor a visual match.

Regression probe and additional evidence

The uncommitted probe removed the first sidebar link from keyboard navigation with first.evaluate(element => element.setAttribute("tabindex", "-1")) immediately before the first Tab. Product files were never modified. The probe was restored before committing.

Command / condition Exit code Observed result
npx --no-install vitest run src/shell/acceptance/keyboard.test.ts -t 'Tab enters the shell and Shift-Tab returns at /leitstand$', probe applied 1 One failing test: toBeFocused, expected focused, received inactive; locator resolved to the link with tabindex="-1".
Same command, probe restored 0 One passed, eleven filtered out.
RF_BASE_BRANCH=claude/v2-scope-1-sidebar bash scripts/ci/red-first.sh 0 All 25 new named tests absent at base and green at HEAD; red-first: OK. Base override is necessary for this stacked PR.
npm run typecheck 0 Also passed in both prepush runs.
npm run build 0 Repeated at committed HEAD; existing large-chunk warning only.
npm run lint 0 Also passed in both prepush runs.
git diff --check 0 Clean.
bash scripts/ci/secret-scan.sh 0 No leaks before commit.
git push -u origin codex/v2-acc1b 0 Foreground push with full hook.
git ls-remote origin refs/heads/codex/v2-acc1b 0 Remote matches candidate SHA.

The early trailer preflight rejected generated test titles because it requires literal names in the source. Tests were given explicit names before committing, and the final preflight and full red-first run passed. No pushed history was rewritten.

NICHT ABGEDECKT

Verbatim block from the successful prepush run:

--- NICHT ABGEDECKT von diesem Lauf ---
  Plattform Linux:
    - die #[cfg(windows)]-Tests (run_in_pty, npm_shim, ConPTY, DPAPI)
    - die Windows-Arme von clippy
  Dieser Lauf belegt die Linux-Haelfte, nicht die Windows-Haelfte.
  Windows-Haelfte: derselbe Befehl in Git-Bash auf dem Zielrechner.
  Bahn 'prepush' ist die schnelle Schleife: Browser-Smoke, Frontend-Build
  und die Workflow-Gates laufen erst in der Bahn 'linux'.
  Der Zustand externer Dienste (Updater-Endpoint, OmniRoute, Mirror)
  wird von keinem Gate geprueft — dafuer ist das Release-Verify da.
---------------------------------------

Windows runs in the merge queue. The separate build and twelve browser keyboard cases above were run, but they do not prove every browser-smoke scenario or every focus trap inside dialogs/content. No screenshot comparison, live desktop launch, real worker dispatch, server stop, release/update drill, key backup, or full Store-to-DOM test was performed. Criteria 2 (images), 11 and 13 remain with the user. Provider quota/model observation and the lage-jetzt mirror were unavailable; the read-only start check reported the missing quota input. RAM/build limits were observed and the worker waited for a free build slot.

Reviews, disposition and handover

Review: ausstehend (Stufe B). Author family: OpenAI; Root commissions one reviewer outside OpenAI. This worker did not commission a review, mark ready, set review-ok, or enqueue.

Finding Evidence Disposition / next owner
ACC1B-4: state criterion is not enforced on this base scripts/ci/ratchet.mjs:8, scripts/ci/ratchets.json:1, src/styles.css:215 Open; Root coordinates predecessor update and rerun. No product fix in this package.

Delivery state: implemented, locally tested and pushed; draft for review, not accepted, merged or released. The acceptance table deliberately remains FAIL for criterion 4. Merge order remains #1484 → #1499 → this PR; Root retargets after predecessor merges. Fabrik remains a separate package. No architecture allowlist changes or new licenses/dependencies.

Review disposition (Root, round 1)

Tier B (tests only, author family OpenAI / Codex gpt-6-astra). Reviewer google/gemini-3.8-flash (Google) at head 666c0a9f, diff against the stacked base claude/v2-scope-1-sidebar: REQUEST_CHANGES with 4 findings. Root adjudication at file:line:

ID Sev Finding Disposition
R1540-G1 Medium route.tabs.map may crash on routes without tabs (stopband.test.tsx:21) Rejected: ShellRoute.tabs is non-optional (src/shell/routes.ts:17) and defaults to [] (:21).
R1540-G2 Medium Tab pressed before nav is mounted (keyboard.test.ts:40-42) Rejected: the test waits for .g-shell visible and .g-shell-content non-empty first (:33-34); the nav is part of the shell. 12/12 green on Linux plus the push-hook rerun.
R1540-G3 Low 12 duplicated it(...) instead of it.each Rejected (style): explicit names are what the red-first trailers reference; no behaviour change.
R1540-G4 Low vitest test needs Chromium Rejected: Chromium is installed in setup-linux (playwright input default true, .github/actions/setup-linux/action.yml:20-23,129-131) and in setup-windows-release (action.yml:54); the Windows lane does not run fe-test (gates.sh --list: fe-test = prepush, branchpush, linux, release).

No accepted finding and no open high. Review gate tier B passed at 666c0a9f.

Criterion 4 on the integrated result (Root, BELEGEN)

The FAIL above is a property of the stacked snapshot, not of the product: #1494 (state ratchet) is on main, not on the stack base. A local scratch merge of origin/main (9938420 at the time) into 666c0a9f (merge commit 7f3df745, clean, never pushed), then node scripts/ci/ratchet.mjs check → exit 0, state-token: 191 = 191 (ceiling scripts/ci/ratchets.json:6). The merge queue re-runs the gates on top of main for each PR of the stack, so criterion 4 is checked again at merge time. Root accepts criterion 4 on that basis; no new acceptance run needed.

Merge order: #1484 → #1499 → this PR (Root retargets each to main after its base merges).

Exercise browser Tab traversal and the active stop band on twelve reachable
shell routes with D1 enabled and other areas disabled.

Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /leitstand
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /leitstand/verlauf
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /leitstand/betrieb
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /leitstand/klassisch
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /leitstand/werkzeuge
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /leitstand/terminal
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /einstellungen
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /einstellungen/mcp
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /einstellungen/benachrichtigungen
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /einstellungen/projekt
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /einstellungen/klassisch
Test-First: src/shell/acceptance/keyboard.test.ts::Tab enters the shell and Shift-Tab returns at /start
Test-First: src/shell/acceptance/stopband.test.tsx::covers every scope registry path with D1 on by default
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /leitstand
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /leitstand/verlauf
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /leitstand/betrieb
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /leitstand/klassisch
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /leitstand/werkzeuge
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /leitstand/terminal
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /einstellungen
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /einstellungen/mcp
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /einstellungen/benachrichtigungen
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /einstellungen/projekt
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /einstellungen/klassisch
Test-First: src/shell/acceptance/stopband.test.tsx::renders the active StopBand and stop control at /start
@Cuarroc

Cuarroc commented Oct 18, 2026

Copy link
Copy Markdown
Owner Author

Closed by Root on 2026-10-18 under Elias's focus stop (decision A, 18.10.): no commit for >48 h, and the v2 shell acceptance/click checklist must be redone against the new UI (single-author design system, in progress). Branch is kept; reopen or re-cut after the new UI lands.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant