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 |