1\appendix2\section{Supplementary material}\label{app:supp}34\subsection{Matching rules in detail}5Cleaned name key: strip accents, lower-case, remove size tokens (a quantity, an optional multiplier and a unit among kg, g, mg, lb, oz, ml, cl, l, un, ea, pk, ch), punctuation, stop words (de, du, des, la, le, les, et, à, pour, the, of, and, with, un, une, sans, avec, ou, or) and the brand's own tokens; append the residual of the package label (e.g.\ ``calibre 21-25'') after removing deposit and unit-price fragments; sort tokens. Numeric tokens must be identical. Package key: total quantity in base unit rounded to 0.1 and multipack count. Tier~B: identical token sets; tier~C: rapidfuzz \texttt{token\_sort\_ratio} $\ge 0.90$; tier~D: identical full-name token sets with brand tokens present. The calibration table over scorers and thresholds, the recall analysis against UPC truth, the three validation samples (the rejected token-set version, round 1 and round 2) and the LLM prompts are in the replication package.67\subsection{Preregistered hypotheses (abridged)}8H1: median within-group max--min log gap $\ge 0.05$ and AR(1) of banner-pair gaps $\ge 0.5$, placebo by label permutation. H2: ratio of raw to reference weekly volatility $\ne 1$, bootstrap over listings; falsification on single-store shops. H3: mean change of the reference price after promotion episodes $= 0$ (null), direction left to the data; event study with pretrend test, censoring and overlap rules; placebo at random dates. H4: distributed lags 0--3 with leads as placebo; geography untestable. H5: naive mean vs.\ matched-model gap $= 0$ (null), bootstrap; StatCan coherence check. H6: $S(\infty)-S(2)=0$ (null) on a 30-item basket fixed before computation. Full text, estimands, clustering and missingness rules: \texttt{research/preregistration.md} (SHA-256 in \texttt{research/decisions.md}).910\subsection{Additional tables}11Per-feed coverage for all 54 feeds, category-level gaps with Holm-corrected sign tests, volatility ratios by banner and category, index changes by banner and category, basket item coverage, block sensitivity, the travel-cost grid, and per-origin forecast errors are provided as CSV files in \texttt{data/processed/} and as JSON summaries in \texttt{experiments/}.12