# Verification checks (P4) | check | outcome | |---|---| | 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 |