## Outcome: **Not approved — 3 release blockers** ### Blockers 1. **Planned captures lose the verified plan snapshot** - `scripts/health/health_dashboard_action_worker.py:1250-1265` - The v2 worker writes only `actual_quantity_value`, `actual_dosage_form`, and `actual_strength`. Even in `mode="planned"`, the new `planned_quantity_value`, `planned_dosage_form`, and `planned_strength` columns remain `NULL`. - Deterministic probe returned: - planned: `(None, None, None)` - actual: `('2', 'Tablette', '20 mg')` - This defeats the revision-safe plan-versus-actual data model. Snapshot the resolved plan values into the administration row and add a regression test. 2. **Verified preset migration silently selects one of duplicate medication masters** - `scripts/health/dashboard_v5/medication_schema.py:133-166` - `_install_verified_presets()` uses an unconstrained exact-name query followed by `fetchone()`. `medikament_name` is not unique. - Counterexample with two exact `Hyrimoz / Adalimumab` rows left one preset-populated and one unpopulated without raising: - `[(4, True), (6, False)]` - This can bind the verified preset to an arbitrary legacy master. Require exactly one eligible immutable row—or bind the accepted preset to an explicitly verified stable identity—and fail closed otherwise. 3. **Schema triggers do not enforce the new v2 structured-field invariants** - `scripts/health/dashboard_v5/medication_schema.py:353-389` - `trg_medication_event_validate_insert` validates relation/status/revision but does not require the v2 actual quantity/form/strength fields, nor planned snapshots for plan-linked administrations. - A row with `source='dashboard_v5_medication_action_v2'`, valid `business_revision`, and all three actual fields `NULL` was accepted. - Extend the managed trigger contract with v2 field completeness/all-or-none rules and tests for malformed direct/legacy-writer inserts. ### Verified evidence - Focused suites: **21 passed** - `tests/test_dashboard_v5_sprint7c_f.py` - `tests/test_dashboard_v5_sprint7c_f1.py` - `git diff --check` and changed Python compilation passed. - Copy-first backup, real restore-copy verification, legacy logical snapshots, private artifacts, and second-invocation idempotence are implemented; no separate blocker found in that path. - Exact action replay is correctly short-circuited through `capture_action_log`. ### Workspace - **Files modified by me:** none; review was read-only. - A concurrent modification to `dashboard-v5-capture.js` appeared during the audit. It was absent from the starting status and was not inspected or attributed to Sprint 7C-F1.