\section{Introduction}\label{sec:intro} Food inflation in Canada has become a political object. Between 2022 and 2024 food purchased from stores rose faster than the all-items Consumer Price Index, parliamentary committees summoned grocery executives, and the Competition Bureau concluded that the sector ``needs more competition'' \citep{competitionbureau2023}. Yet the public debate rests on a thin empirical layer: a monthly official index, a handful of average retail prices for selected products, and anecdotes about ``shrinkflation'' and dubious promotions. What a household actually pays for a comparable basket depends on which banner it visits, whether the item is on promotion that week, which package it buys, and how far it is willing to travel. None of these margins is visible in an aggregate index. This paper asks a narrow, falsifiable set of questions about the \emph{architecture} of posted grocery prices in Quebec, using a data source that was not built for research but turns out to be unusually informative: Food-Ka, an independent price-comparison service that re-reads the public catalogues and weekly circulars of 57 grocery feeds every few hours and logs every price change it observes. We obtained a read-only copy of its production database on 1 November 2026. The copy contains 124{,}579 listings, 300{,}613 logged price events and 15{,}630 connector passes between 12 August and 1 November 2026. We treat this as what it is---eleven complete weeks of \emph{posted} prices from \emph{online} channels with no store identifiers, no transactions and no quantities---and we ask what can and cannot be learned from it. Our contribution is threefold. First, we document a measurement phenomenon that we believe is new to the literature on scraped prices \citep{cavallo2016,cavallo2017,cavallo2018,gorodnichenko2017}: storefronts of the large chains answer anonymous sessions with the price of a store they assign to the session, so a high-frequency scraper that does not fix a store records a mixture of store prices. The signature is unmistakable---a Metro listing of mayonnaise cycles between \$5.77, \$6.99, \$7.49, \$7.79 and \$7.99 within a single day, more than half of logged ``changes'' revert to the previous-but-one value, and the phenomenon is absent from single-store online shops (Section~\ref{sec:data}). We show how to extract a defensible weekly posted price from such data and how the oscillation amplitude itself bounds within-banner, across-store dispersion. Second, we build and validate a cross-banner matching procedure. Only the Metro Inc.\ feeds expose GS1-valid UPCs; everything else requires probabilistic linkage. We calibrate the text rules on 37{,}629 candidate pairs between Metro and Super~C whose shared UPC provides ground truth, obtaining a rule (identical brand, package and cleaned token set) with precision 0.93 and recall 0.98 on that labelled set, and we validate it on a 240-pair stratified sample reviewed pair by pair. A looser rule that a first version of the pipeline used (token-\emph{set} similarity) was rejected after validation; we report it. The result is 5{,}909 cross-banner product groups---a few per cent of all listings, which is the honest denominator for any ``price comparison'' claim about this market. Third, on this matched panel we estimate the preregistered hypotheses H1--H6 of our registration (frozen before estimation; Section~\ref{sec:methods}). On identical products in the same week the median across-banner log price gap is 0.154, dispersion is persistent (banner-pair gaps have an AR(1) coefficient of 0.66 against a permutation placebo of 0.00), and banner fixed effects span 32 log points. Inferred promotions are rare in storefront catalogues (4.6\% of listing-weeks) but deep (median 22\%), account for half of all weekly price changes and double measured volatility. Temporary sales return exactly to their pre-sale reference price---we find no reference-price drift within the window---while a pre-sale elevation of the posted price is largely a store-mixture artefact. Lead--lag associations between rivals' price changes are small, mostly within company, and fail a lead placebo for cross-company pairs; we therefore make no causal claim about competitive responses. Matched-model and naive indices agree closely at the market level over eleven weeks, but diverge by 10--30 points for individual banners with assortment turnover. A fixed-basket optimisation shows that unconstrained cheapest-banner shopping would save about 15\% relative to the best single banner and that two banners capture 85\% of that; travel costs and store access are unobserved and enter only as labelled assumptions. We assemble these pieces into a transparent five-component Quebec Grocery Price and Affordability Index (QGPAI) whose fifth component---access and affordability---is deliberately left empty. Throughout we separate what the data identify from what they suggest. Posted prices are not paid prices; a listing that disappears has not been sold; a ``sale'' tag is not a discount. The eleven-week window is too short for several of the registered tests (notably H3 on reference-price adjustment and the validation of QGPAI against official indices), and we say so rather than stretch the estimand. Section~\ref{sec:limits} and the prospective collection plan in Section~\ref{sec:repro} describe what a longer, store-identified panel would add. The remainder of the paper is organised as follows. Section~\ref{sec:lit} reviews the literature on price dispersion, sales and scraped prices; Section~\ref{sec:inst} describes the Quebec grocery sector and the Food-Ka source; Section~\ref{sec:data} audits the data and constructs the panel and the matches; Section~\ref{sec:theory} sets out a simple model whose observable implications we test; Section~\ref{sec:methods} states the preregistered designs; Sections~\ref{sec:results} and~\ref{sec:robust} report results and robustness; Sections~\ref{sec:policy}--\ref{sec:concl} discuss implications, limitations and conclusions; Section~\ref{sec:repro} documents reproducibility and data access.