\section{Institutional context: Quebec grocery retail and the Food-Ka source}\label{sec:inst} \paragraph{Market structure.} Grocery retail in Quebec is dominated by three vertically integrated companies operating several banners each: Metro Inc.\ (Metro, Super~C, Marché Adonis, the affiliated Richelieu, Marché Ami and Axep banners, and the Jean Coutu and Brunet pharmacies), Loblaw Companies (Maxi, Provigo, Club Entrepôt, Pharmaprix, T\&T Supermarket, and affiliated Inter-Marché stores) and Sobeys/Empire (IGA, Les Marchés Tradition, Marché Bonichoix, Rachelle-Béry). Walmart Canada and Costco add mass-merchant and warehouse-club formats; Giant Tiger is a discount general merchandiser with a large food assortment; a long tail of independent, ethnic, health-food and online-only grocers completes the market. The Société des alcools du Québec (SAQ) is a provincial monopoly with uniform posted prices and is excluded from all grocery analyses. Company affiliations used in the paper are recorded feed by feed in the \texttt{retailers} table with the basis for each attribution (public corporate information or the Food-Ka registry); they are descriptive and do not affect any estimate except the same-company/cross-company split. \paragraph{Channels.} Each large banner is present in Food-Ka through two \emph{feeds}: an online storefront (the e-commerce catalogue, read every $\approx$7 hours) and a weekly circular (read from the Flipp platform for the Montréal postal code H2X 1Y4, with validity dates, regular price and fine print). Smaller independents are present only through circulars; online-only grocers only through storefronts. Treating the 54 feeds as 54 retailers would therefore double count the large chains and conflate two very different price-setting objects: a catalogue price that applies to whatever store the site assigned to the session, and an advertised weekly promotion with an explicit regular price. We keep the two channels apart throughout. \paragraph{The Food-Ka source.} Food-Ka (\url{https://www.food-ka.com}) is an independent, non-commercial aggregator operated by the author. It maintains one connector per feed, normalises each listing to a common schema (name, brand, category, package label, price, regular price, unit price), computes a content hash and, at every pass, classifies each listing as new, modified or missing. Every change of the displayed price is appended to a log; a listing missing for two consecutive passes is deactivated. The public home page on 1 November 2026 reported 50{,}760 products, 54 banners and 8{,}631 products on promotion; we verified that these equal the number of \emph{active listings}, feeds with active listings and listings flagged on sale in the snapshot, and we stress that they are counts of source-feed listings, not of unique products: the same Coca-Cola 12-pack appears once per feed that carries it. \paragraph{What the source does and does not record.} Food-Ka was built to compare current prices, not to study price dynamics. Three consequences shape everything below. (i) It logs \emph{changes}, not observations: between two logged events a listing kept its price and was re-observed at every pass, but the pass-level presence of each listing is not stored. (ii) It historises the \emph{current} price only: regular prices, promotion flags and stock status are overwritten at each pass, so the promotion state of a storefront listing in the past must be inferred from its price path, while circular items carry an explicit regular price for their validity week. (iii) It has no store dimension: storefront connectors browse without selecting a store, and circulars are pulled for one postal code. These are the facts; the research design (Section~\ref{sec:methods}) is built around them rather than against them.