## Findings 1. **Important — Canonical V4↔V5 parity count compares different identity spaces.** `scripts/health/lab_source_reconciliation.py:120-129,177-187,290-298` Workbook parameters retain normalized raw aliases such as `c_reaktives_protein_crp`, while canonical V5 rows use `crp`. Exact tuple comparison therefore reports valid canonical observations as missing. Synthetic probe: one matching CRP workbook/DB observation produced `raw_exact=1`, `canonical_exact=0`. Consequently, the published `12` canonical matches / `235` unmatched values in `docs/sprint6g-a2-laboratory-reconciliation.md:34-41` are not reliable until both sources map through the same lab allowlist before comparison. 2. **Important — `/record-labs` and `/series` diverge above 100 observations.** `scripts/health/dashboard_v5/read_api.py:2380-2400,2442-2448` History metadata counts all canonical rows, but `/record-labs` returns only `result[:RECORD_MAX_ROWS]`, while `/series` can return up to 3,660 points. Synthetic probe returned: `record_observations=100`, `history_count=106`, `series_points=106`, `record_truncated=true`. This violates the tested count-consistency assumption and makes the UI’s individual-observation count differ from its history/series count. 3. **Important — Exact-link migration safety checks occur after commit, and the claimed restore test does not restore anything.** `scripts/health/lab_source_reconciliation.py:379-405` The first update transaction commits before post-migration integrity and validation-digest checks. A failing check therefore raises without rolling back the link changes. The “restore test” merely opens the backup and runs `integrity_check`; it never restores into a disposable database or verifies restored state. This does not satisfy the migration guarantees claimed at `docs/sprint6g-a2-laboratory-reconciliation.md:80`. 4. **Moderate — Catalogued/not-catalogued reconciliation uses incompatible unit normalization.** `scripts/health/lab_source_reconciliation.py:147-149,235-252` `_catalogued()` applies `normalize_parameter()` to units before looking them up in `LAB_ALLOWLIST`. This converts `%` to an empty slug and mishandles micro-unit forms. Direct probes classified valid allowlisted `Faktor VIII/%` and `D-Dimer/µg/L` pairs as not catalogued. Therefore the documented `validiert, aber nicht katalogisiert = 103` count is also unreliable. 5. **Moderate — Staging plan omits the discrepancies the audit actually identified.** `scripts/health/lab_source_reconciliation.py:198-221,333-343` Candidates are generated only from `workbook_only`, defined as no raw DB row sharing parameter/date. Value conflicts, unit conflicts, and workbook values present in raw DB but absent from canonical V5 are excluded. With the documented real-data result `workbook_only=0`, the plan is empty despite 7 value conflicts, 1 unit conflict, and 235 claimed canonical differences. This is not an actionable reconciliation staging plan. ## PASS - Canonical API selection requires validated status, original verification, scanned-original reference provenance, allowlisted parameter/unit, finite numeric value, valid date, and unique parameter/unit/day: `read_api.py:490-590`. - Observation-specific reference ranges and missing-reference unknown state are preserved: `read_api.py:546-590,632-643`. - One-point series remain one point without an invented trend. - Document review status does not control canonical lab inclusion; it only controls document drill-down visibility: `read_api.py:568-609`. - Workbook/OCR-derived candidates are not automatically verified and do not receive `scanned_original`: `lab_source_reconciliation.py:333-343`. - Focused tests executed: **7 passed**. ## Review discipline - No production database, report, OCR content, or medical document was accessed. - No files were created or modified by this review. - The worktree was not frozen: an additional modification to `tests/browser/dashboard_v5.spec.js` appeared concurrently during review.