1# Phase 2 — Research database construction and data-quality audit (WP38)23Generated by `src/reports/phase2_audit.py` from the pipeline outputs; snapshot 2026-11-01T17:38:30Z.45## 2.1 Sample flow67| step | listings |8|---|---:|9| DB product rows (all statuses all stores) | 465 388 |10| active = 1 and listing_status = 'published' | 390 108 |11| … of an enabled store with >= 1 published listing | 390 108 |12| … excluding store_kind = hors_mission | 390 074 |13| … keeping one representative per (store normalised title) and non-empty title | 370 828 |14| … excluding mirror domains of the same business (sibling stores non-representative) [ASSORTMENT SAMPLE] | 370 054 |15| … and CAD-priced store/listing | 369 325 |16| … and a positive listed price <= 50 000 CAD not on request [PRICE SAMPLE] | 359 612 |1718## 2.2 Within-store duplicates, mirror domains, exclusions1920- 19 245 listings were non-representative duplicates of a (store normalised title) pair — variants published as separate products; one representative (first seen) is kept.21- Mirror/sibling domains: 11 groups, 11 non-representative stores (774 listings) removed; rule = identical domain stem or title overlap ≥ 0.9 of the smaller catalogue (a 0.5 threshold wrongly captured seed resellers). Groups: potagermont-rouge.ca/erablieremont-rouge.ca; vinaigreriemcduff.com/vinaigreriemcduff.ca; cafewilliam.com/cafewilliamspartivento.com; centacres.ca/sucreriesdl.ca; aufindelice.ca/aufindelice.com; en.horacejewelry.com/horacejewelry.com; en.meemoza.ca/meemoza.ca; erablesdupatrimoinetheberge.com/tracemaple.com; greenbeaver.com/votregreenbeaver.com; lasultana.net/orera.ca; trisamare.ca/trisamare.com.22- Price sample exclusions: {"non_cad_listing_or_store": 729, "price_missing_or_on_request": 9635, "price_zero": 0, "price_gt_cap": 78}; price quantiles (CAD): {"0.001": 0.26, "0.01": 1.5, "0.1": 5.99, "0.5": 24.99, "0.9": 274.56, "0.99": 3700.0, "0.999": 18500.0}.2324## 2.3 Merchant geography2526- Live stores 1569; region source: {"db": 852 "city": 390 "unknown": 229 "pip": 82 "pip_transfer2021": 16}; unknown-region listings 71 692.27- Agreement of Fabri-Ka labels with the FSA-centroid point-in-polygon (official MERN layer V2026-10): 0.8906; municipality lookup vs point-in-polygon: 0.9593; conflicts flagged: None (69 % rural FSAs near borders). Rule and amendment A-001 in `research/decisions.md`.28- Phone numbers are shared by ≥ 3 stores for 250 stores (directory contact copied by the discovery pipeline: e.g. 212 stores carry the Les Produits du Québec switchboard) — phones are never used for geography.29- Stores per region (final): {"Montréal": 238, "Inconnue": 229, "Montérégie": 179, "Estrie": 167, "Capitale-Nationale": 126, "Chaudière-Appalaches": 105, "Laurentides": 99, "Saguenay–Lac-Saint-Jean": 97, "Lanaudière": 66, "Centre-du-Québec": 61, "Bas-Saint-Laurent": 39, "Outaouais": 37, "Mauricie": 31, "Gaspésie–Îles-de-la-Madeleine": 30, "Laval": 25, "Abitibi-Témiscamingue": 21, "Côte-Nord": 16, "Nord-du-Québec": 3}.3031## 2.4 Category labels (rule-based) — audit3233- 500-listing stratified sample (25 per category), two LLM annotators: agreement rule–A 0.452, rule–B 0.446, A–B 0.948; consensus on 95%; precision of the rule label against consensus 0.4599; 282 listings with any disagreement listed in `data/processed/category_audit_disagreements.csv`.34- Per-category precision (consensus n): erable 0.5 (24), epicerie 0.417 (24), cafe_the 0.348 (23), chocolat 0.625 (24), boulangerie 0.4 (25), viande_poisson 0.318 (22), fromage_laitier 0.583 (24), boissons 0.167 (24), alcool 0.28 (25), sante_beaute 0.625 (24), maison 0.364 (22), mode 0.72 (25), bijoux 0.8 (25), art 0.52 (25), enfants 0.619 (21), animaux 0.292 (24), plein_air 0.316 (19), jardin 0.84 (25), industriel 0.417 (24), autre 0.0 (25).3536## 2.5 Cross-merchant matching3738- Universe 359 612 price-sample listings in 1487 stores; SKU present for 260 406 brand for 274 901.39- Candidate pairs by tier {"D": 2713, "A": 1837, "B": 457, "C": 446}; comparable-variant pairs {"D": 1804, "A": 1683, "B": 381, "C": 324}; median |log gap| by tier {"A": 0.0007, "B": 0.0011, "C": 0.0077, "D": 0.2585}; share of zero gaps {"A": 0.4306, "B": 0.4398, "C": 0.4193, "D": 0.0844}.40- Groups over tiers A–C: 2247 (4832 listings, 209 stores).4142- Validation sample (60 pairs per tier): annotator agreement 0.875, consensus 88%; share 'same product' by tier: A 0.982 (n=56), B 1.0 (n=54), C 0.885 (n=52), D 0.208 (n=48); comparable-only: {"A": 0.979, "B": 1.0, "C": 0.85, "D": 0.226}.4344## 2.6 Temporal coverage4546- Listings observed 2026-08-12 → 2026-11-01; store onboarding ended 2026-08-24 (ISO weeks 32–33); sync cadence median 6.3 h; inactive after two misses. No price history exists in the source (see `reports/00_source_audit.md`).4748## 2.7 Known limitations carried to the paper4950- Region unknown for 229 live stores (71 692 listings), concentrated in search-sweep and gift-directory discoveries and including the largest catalogues; reported separately, excluded from regional inference.51- Category labels are rule-based; precision estimates from §2.4 propagate to a reassignment robustness run.52- Origin class is a store-level prior; no product-level provenance (H6 untestable).53- Posted prices, minimum variant price per listing; no shipping, taxes or transactions.