| Clean re-run (deleted outputs, re-ran analysis.py): SHA-256 of results.json, analytic.csv, exclusions.csv identical |
PASS |
| analytic.csv rows (1164) == n_analysed == n_valid_records |
PASS |
| n_valid_records + n_unreadable_records == n_records_control (1164+36=1200) |
PASS |
| n_input_rows (1200) == n_records_control (no extra/missing lines; only unreadable ones) |
PASS |
| sum of price_cad in analytic.csv == sum_price_valid |
PASS |
| sum_price_control − sum_price_valid == sum_price_unreadable_implied |
PASS |
| mean and median price/m² recomputed independently with pandas from analytic.csv |
PASS |
| exclusion ledger: n_before − n_removed = n_after each row; chained; starts at 1200, ends at 1164 |
PASS |
| sale_id unique in analytic dataset; price_cad integer dtype |
PASS |
| per-municipality control deficits sum to 36 = n_unreadable_records |
PASS |
| magnitude: implied mean of unreadable records 14,917,000/36 ≈ 414,361 CAD, same order as valid mean 392,070 CAD (plausible) |
PASS |
| no CIs/SEs produced (descriptive census totals) — n/a |
n/a |
| feasibility == "partial" since 36 control records not analysed |
PASS |