\section*{Reproducibility statement}\addcontentsline{toc}{section}{Reproducibility statement} The analysis is a deterministic pipeline (seed 20261101) run from a single \texttt{Makefile}: \texttt{make ingest clean match validate features models robust tables figures paper}, with \texttt{make test} running the invariant tests on the cleaned panel. The raw snapshot is an owner-authorised, read-only copy of the Fabri-Ka database taken with \texttt{sqlite3.Connection.backup()} on 2026-11-01T17:38:30Z (SHA-256 \texttt{8d963ba9\ldots98fb}); the two tables containing personal data were dropped on the production node before transfer and nothing in production was modified. The snapshot is not redistributed (it contains merchant catalogues that belong to the merchants); the data dictionary, the sample-flow table, every experiment summary (\texttt{experiments/}, \texttt{experiments\_model/}), the labelled audit and training samples (CSV), the external-data manifest with URLs, licences, vintages and checksums, the run ledger with every API call, its labelling and its token usage, and the SHA-256 of every intermediate output are committed; the intermediate parquet files themselves are regenerated by the pipeline and are not committed because they contain merchant-level data. LLM annotations (two independent models for the category audit and the matching validation; one model for the classifier training labels) are stored as CSV files so that the pipeline runs without API access; no empirical result depends on a live model call, although the primary category labelling is a classifier trained on cached model annotations (Amendment A-002) and the preregistered rule labelling is reported throughout as the alternative. Dependencies are pinned in \texttt{pyproject.toml} (Python 3.12).