Verification checks (P4) — all run 2026-10-30 via python on out/ files
- Determinism: deleted results.json/analytic.csv/exclusions.csv, re-ran analysis.py; SHA-256 of all three identical — PASS
- analytic rows (1164) == n_analysed — PASS
- n_valid + n_unreadable == n_records_control (1164+36=1200) — PASS
- sum_price_valid + sum_price_unreadable_implied == sum_price_control — PASS
- analytic.csv price sum == sum_price_valid — PASS
- mean_price_valid == sum/n — PASS
- median_price_per_m2_valid recomputed from analytic.csv — PASS
- exclusions ledger: n_before − n_removed = n_after each row; chaining; starts at 1200 (n_input_rows) and ends at 1164 (n_analysed) — PASS
- sale_id unique in analytic set — PASS
- municipality gaps vs control are all ≥0 and sum to 36 — PASS
- Magnitude vs baseline: control mean 471287000/1200 = 392,739.17; valid mean 392,070.45 (−0.17%) — PASS
- feasibility = partial because 36 control records unanalysed — PASS
- data/ unchanged (SHA-256 re-verified after accidental creation and removal of a stray data/out/ directory) — PASS