← back to Sanderson Onboard
tk10873/price_source_verification.md
55 lines
# TK-10873 cycle 4 — price-source ground-truth verification (real-world)
**Decision:** Steve ruled the S1 feed canonical (2026-08-30). Before mass-applying, I
ground-truthed against real Zoffany US retail (VERIFY-BEFORE-ACTING). Result: **the feed
is CORRECT; `zoffany_catalog.price_retail` is the wrong source (GBP RRP stored as USD,
~2.5–2.8× too low).** The 209 discrepant products are genuinely underpriced in the draft.
## Evidence (two independent SKUs, real web prices)
| pattern | mfr_sku | zoffany_catalog (draft) | feed retail_usd | feed ssp_usd | real-world price | conclusion |
|---|---|---|---|---|---|---|
| Romey's Garden (Sea Green) | ZOW0014-02 | **$176** | $447.06 | **$494** | **Official Zoffany US $494/roll**; UK £176; other US retailers $414–434 | feed ssp **exactly matches** official US $494; zc $176 = the £176 GBP number stored as USD → WRONG |
| Arcadian Thames (Wedgwood Blue) | ZOW0126-01 | $422 | $1073.30 | $1186 | UK £422/roll; US ≈ £422 × ~2.8 ≈ $1181 | feed ssp $1186 ≈ real US price; zc $422 = the £422 GBP number as USD → WRONG |
Key: Zoffany's **US retail is ~2.8× the GBP RRP** (not a 1.27 currency conversion). The
S1 feed captured real US pricing; `zoffany_catalog` captured the GBP number un-converted.
My initial "feed looks 2.5× too high" alarm was an apples-to-oranges error (comparing the
US feed price to the UK RRP); the official-US-price match on Romey's Garden corrected it.
## Consequence
- The 209 DISCREPANT_UNIT_2_5X REPRICE rows must be repriced OFF THE FEED (`retail_usd`),
not `zoffany_catalog`. Using the draft values would underprice ~2.5×.
- The 30 CONFIRMED rows already match the feed — unchanged.
- The 89 UNVERIFIABLE rows have no feed retail — stay on `zoffany_catalog` value, flagged
as un-cross-checked (a smaller residual risk; likely also GBP-as-USD but unconfirmed).
## Which feed field is the sellable price (Cody cycle-4)
The Option-A contract is **retail = trade/0.65/0.85**. The feed's `retail_usd` IS exactly that
(verified: 247/0.65/0.85 = 447.06), so the sellable variant price = **`feed.retail_usd`**, NOT
`ssp_usd` (which is the MSRP/RRP, e.g. $494). Selling at `retail_usd` lands just below MSRP,
as intended. The reconciliation uses `retail_usd` throughout.
## The 89 UNVERIFIED are EXCLUDED from reprice (Cody cycle-4)
Rows with no feed retail keep a likely-GBP-as-USD (~2.5× low) `zoffany_catalog` value, so they
are RECLASSIFIED out of REPRICE → `HELD_UNVERIFIED`. Reprice-now set = **239 feed-verified only**;
the 89 wait for a 2nd source (a proper US-retail harvest) before any reprice.
## Cycle-5 spot-check of the PROMOTED 38 (Cody FIX-FIRST — circular-consistency guard)
Cody flagged that `retail == trade/0.65/0.85` is CIRCULAR (zoffany_catalog computed retail FROM
trade with that same formula), so it proves self-consistency, not that `price_trade` is USD (vs
GBP-as-USD like the 209). Ran the dispositive web spot-check on 2 promoted SKUs:
| pattern | mfr_sku | promoted (trade/0.65/0.85) | real US retail | verdict |
|---|---|---|---|---|
| Hawksmoor (Greystone) | ZOW0036-02 | $465.16 (trade $257) | **$562/roll** (Greystone on-sale $514) | ✓ USD trade; DW retail just below MSRP |
| Malmaison Damask (Old Gold) | ZCON311996 | $320.36 (trade $177) | **$354** (or $310 Jane Clayton) | ✓ USD trade; correct |
**Conclusion: the 38's `price_trade` are genuine USD — promotion to REPRICE is SOUND.** This also
retroactively validates the original 68 trade-backed REPRICE rows (same basis). The ZOW0036-02
"$43 below siblings" anomaly is a real colorway/on-sale tier ($514 vs $562 MSRP), not corruption.
## Restore-map naming (Cody FIX)
`promote_restore_map.json` records only the ACTION delta (HELD_UNVERIFIED→REPRICE); it is an
action-delta log, NOT a full row snapshot. The TRUE revert of v3 is the intact prior file
`zoffany_optionA_draft_feedreconciled.json` (v2). git revert of the commit is the canonical undo.
Sources: zoffany.design/us/wallpaper · wallpaperdirect.com · tm-interiors.co.uk · decoratorsbest.com · janeclayton.com