# Verification checks (P4) — 2026-10-30 All checks run by code against out/results.json, out/analytic.csv, out/exclusions.csv. | check | outcome | |---|---| | Clean re-run (deleted outputs, re-ran analysis.py): results.json byte-identical, analytic.csv & exclusions.csv identical md5 | PASS | | n_valid_records + n_unreadable_records == n_records_control (1164+36=1200) | PASS | | n_analysed == n_valid_records == rows of analytic.csv (1164) | PASS | | sum_price_valid equals sum over analytic.csv | PASS | | sum_price_unreadable_implied == sum_price_control − sum_price_valid | PASS | | mean_price_valid and median_price_per_m2_valid recomputed independently from analytic.csv | PASS | | exclusion ledger: n_before − n_removed = n_after each row, chained, starts at n_input_rows (1200), ends at n_analysed (1164) | PASS | | sale_id unique in analytic dataset | PASS | | municipality shortfall vs control sums to n_unreadable_records (36) | PASS | | magnitude: implied mean of unreadable (414,361 CAD) lies within observed price range [92,000; 1,363,000] and near valid mean (392,070) | PASS | | price_cad numeric (integer) in analytic.csv | PASS | | feasibility = partial because n_unreadable_records > 0 | PASS | | Baseline (control totals) vs analysed: shortfall 36 records / 14,917,000 CAD — consistent | PASS | | Re-run after adding supplementary keys: byte-identical | PASS |