# Leakage audit — WP23 | Item (protocol §7.3) | Check | Where | |---|---|---| | Hedonic coefficient estimation | Task A models are fitted on sales ≤ origin; Task B predictors come from WP22 vintages whose stage-1 hedonic was re-estimated at each publication date | `data.task_a_sets`, WP22 `40_vintages.py` | | Geographic clustering | WP22 location partition rebuilt per vintage; Task A uses raw coordinates and kNN over past sales only | `data.knn_features_at` filters `month ≤ origin` | | Normalisation | standardisation constants from training rows (`fit`) | `models_*` | | Feature selection | fixed lists `FEATURES_HEDONIC/MARKET/B` | `data.py`, `data_b.py` | | Imputation | WP22 conditional medians (no price); indicators time-stable | WP22 `hedonic.build_features` | | Target encoding | none; one-hot with training categories (`cats` passed to test design) | `data.design` | | Spatial graph | DSGFN adjacency from centroids and the real-time history at the origin | `models_b_torch.DSGFN._adjacency` | | Hyper-parameter tuning | none on test origins | `tab_hyper` | | Index revisions | predictors = vintage for the origin; target = final; `target_vs_rt` stored to decompose | `data_b.build_panel` | | Regime inference (RAREF) | HMM fitted on provincial growth rates taken from past origins' own vintages (≤ origin) | `models_b.RAREF._growth_series` | | Partial last month | October 2026 excluded (`LAST_MONTH = 2026-09`) | `config.py` | | Random splits | never used | `10_task_a.py`, `20_task_b.py` | | Test: features ≤ origin | `tests/test_wp23.py::test_task_a_features_use_only_past` | — |