## Verdict: **CHANGES REQUIRED** ### P0 — 0 ### P1 — 3 1. **Preview hash is transmitted but never validated by the worker.** `scripts/health/health_dashboard_action_worker.py:449-458,1832-1840` The worker validates `expected_candidate_revision`, but never recomputes or compares `preview_revision`, although the UI claims a revisions-bound preview (`dashboard-v5-record.js:593-601,634`). **Counterexample:** after displaying a CRP preview, I changed only `document_candidate_matches.reference_text` and `comparison_digest`, leaving `candidate_revision=1`. The worker accepted the old preview hash and staged the changed reference: - displayed reference: `null` - staged reference: `9–10 mg/L` - candidate revision remained `1` Existing coverage only changes `candidate_revision` (`tests/test_dashboard_v5_sprint7c_e_labs.py:227-240`) or checks that a hash was queued (`tests/browser/dashboard_v5_sprint7c_e.spec.js:71-74`), so it misses this case. 2. **The 390px/200%-text dialog fails the required accessible-control and naming contract.** `scripts/health/assets/health-assets/dashboard-v5-record.js:579-588` `scripts/health/assets/health-assets/dashboard-v5.css:514-517` **Runtime counterexample at 390×844 with 200% root text:** - dialog accessible name: empty—no `aria-label` or `aria-labelledby`; - **Abbrechen** button: `80.47×21px`, below the required `44×44`; - dialog correctly used internal vertical scrolling and Escape restored focus to **Vorschau erstellen**. The browser test queries controls only inside `#lab-review`, while the dialog is appended to `document.body`, so its green 44px assertion cannot see dialog controls (`tests/browser/dashboard_v5_sprint7c_e.spec.js:77-87`). 3. **The Reviewstatus filter cannot select all required/implemented states.** `scripts/health/assets/health-assets/dashboard-v5-record.js:623,658-661` `scripts/health/dashboard_v5/read_api.py:4388-4392` The API and card labels support `extracted`, `suggestion_available`, `needs_review`, `rejected`, and `incomplete`, but the UI offers only Offen, Konflikte, Duplikate, Zurückgestellt, Bestätigt, and Alle. **Counterexample:** the synthetic page visibly reports and renders incomplete candidates, and `status=incomplete` is accepted server-side, but users cannot choose **Unvollständig** in the filter. The browser suite checks only `open` and `all` (`tests/browser/dashboard_v5_sprint7c_e.spec.js:33-48`). ### P2 — 1 1. **Grouping implementation and tests exceed the documented catalog-backed grouping boundary.** `scripts/health/dashboard_v5/lab_review.py:74-92` `tests/test_dashboard_v5_sprint7c_e_labs.py:162-166` `docs/sprint7c-e-lab-inventory.md:114-116` The inventory authorizes Blutbild, Entzündung, Gerinnung, and Vitamine und Mineralstoffe until the catalog explicitly expands. `_group()` instead infers additional medical groups from parameter-name keywords, and the test blesses Leber, Niere/Elektrolyte, Stoffwechsel/Blutfette, and Immunologie. **Counterexample:** an `ANA` label is classified as **Immunologie** solely by keyword, without a versioned catalog grouping assignment. ## Positively verified - Focused Playwright 7C-E suite: **5/5 passed**. - `git diff --check`: passed. - Compact Akte → Labor workspace, progressive `
` disclosure, required initial preview fields, button cancellation with no queue, server-side durable filters, and no private path display are present. - Escape cancellation restored opener focus and queued nothing. - No new navigation item: existing six-item navigation remains unchanged. - Synthetic Today bundle contained exactly three tasks and only one document-review task—no duplicate laboratory task. - Coverage copy says **Bestätigte Laborabdeckung** and explicitly disclaims medical completeness. ## Review hygiene - Reviewed the complete worktree against `96df2a255dcfb73ea56257997a15e64d58824d64`, including all untracked files. - No repository files created or modified; temporary synthetic probe files were removed and final Git status matched the initial candidate. - Python unit execution was blocked because `pytest` is not installed in the available shell environment; source and focused browser coverage were still inspected.