1# Verification checks (P4)23| # | check | outcome |4|---|---|---|5| 1 | Input presence: data/firms.csv exists | **FAIL**: data/ is empty; recorded as a blocking limitation and not fixable within the rules |6| 2 | Clean re-run: deleted results.json/analytic.csv/exclusions.csv, re-ran analysis.py, compared SHA-256 | PASS: byte-identical |7| 3 | Exclusion ledger chain: n_before − n_removed = n_after, chained | PASS: one row, 0−0=0 |8| 4 | analytic.csv rows = n_analysed | PASS (vacuous): 0 data rows; n_analysed is null because nothing was analysed |9| 5 | Every estimate is null when infeasible, with no fabricated numbers | PASS |10| 6 | Data path of analysis.py, smoke test on a 5-row throwaway fixture in a temp dir (not task data, results discarded) | PASS: ledger chained 5→2, USD/MUSD conversions correct, unknown unit excluded |11| 7 | Gate run (see phases.json for receipts) | FAILS on non-nullable keys that are null; this cannot be fixed without fabricating values (see report) |12