← back to Justin David Pricing 2026
CANARY-SKILL.md
66 lines
---
name: dw-losangeles-fabrics-canary
description: LIVE-feed price-integrity canary for the Justin David (customer-facing "Los Angeles Fabrics" / Phillipe Romano) per-yard fabric line on the DW Shopify store. Reads the live phillipe-romano collection products.json, filters to the DWLA SKUs, and checks each product's real variants against the expected per-yard retail staged in dw_unified.justin_david_pricing_2026 (JD Jan-2026 list, 15% trade discount, DW-standard markup + flat tariff pass-through). Flags per-yard variants priced OFF the expected retail (price_drift), the $4.25 memo leaking as the sellable price (sample_as_sell → GMC risk), growth of the sample-only "no per-yard variant yet" backlog (baseline-aware), and any leak of the real mill name "Justin David" customer-facing. READ-ONLY. Alerts to CNCP + George only on FAIL/WARN-growth; clean is silent. Use when Steve says "/dw-losangeles-fabrics-canary", "LA fabrics canary", "are the Justin David prices right", "did a per-yard price drift", "is the fabric per-yard variant priced", or it runs on schedule (com.steve.dw-losangeles-fabrics-canary, daily).
---
# Los Angeles Fabrics (Justin David) Per-Yard Price Canary
Guards the 2026-07 per-yard pricing onboard of the **Justin David** commercial-fabric
line — sold customer-facing as **"Los Angeles Fabrics" / Phillipe Romano** (SKU prefix
`DWLA-`, product_type Commercial Fabric/Drapery/Wallcovering). The mill is Justin David
Textiles | Hospitality Solutions (justindavid.com); "Justin David" must NEVER be
customer-facing.
## Why this is a LIVE-feed canary (not a DB one)
The `dw_unified` mirror does **not** carry the per-yard variant price for this line —
`price`/`retail_price` are null even on products that already have a `-Yard` variant, and
`min_variant_price` only reflects the $4.25 memo sample. So the DB can't judge the sell
price. The **public Shopify feed can** — this reads the `phillipe-romano` collection
`products.json`, keeps only the `DWLA-` products, and reads their real variant prices.
(Contrast `dw-map-auditor`, which is a DB-side check where the mirror DOES hold price.)
## Expected pricing model (Steve, 2026-07-16)
- our cost/yd = JD list × 0.85 (15% trade discount) **+ tariff** (flat pass-through)
- retail/yd = cost ÷ 0.65 ÷ 0.85 **+ tariff** (DW standard) — the ×0.85 and ÷0.85 cancel,
so **retail == JD list ÷ 0.65 + tariff** (~1.54× list).
- Expected retail per SKU lives in `dw_unified.justin_david_pricing_2026` (staged from the
JD Jan-2026 price list: PDF + xlsx, 525 patterns, built by ~/Projects/justin-david-pricing-2026).
## The four checks
1. **FAIL · `price_drift`** — a product that HAS a per-yard variant (>$5) whose LIVE price
deviates > max($0.50, 2%) from the expected `retail_yd`. Mispriced onboard or later drift.
2. **WARN · `sample_as_sell`** — a non-sample variant priced ≤ $5 (the $4.25 memo leaking as
the sellable price → the GMC $4.25-feed disapproval risk).
3. **WARN · `peryard_backlog_growth`** — an ACTIVE priced DWLA product still sample-only (no
variant > $5). **BASELINE-AWARE**: the pre-onboard floor is captured once in
`data/baseline.json`; it alerts only when the backlog GROWS above the floor (a priced
product lost / never got its per-yard variant), never on the known backlog being
remediated. Same philosophy as `dw-five-field-canary`.
4. **FAIL · `jd_name_leak`** — the real mill "Justin David" appearing in any live title /
handle / tags (private-label leak guard, like `dw-leak-scanner`).
## Run
```bash
node ~/.claude/skills/dw-losangeles-fabrics-canary/canary.mjs # scan only (prints verdict)
bash ~/.claude/skills/dw-losangeles-fabrics-canary/run.sh # scan → CNCP + George on FAIL/WARN
```
- `canary.mjs` pages the live collection (1.5s throttle — the store 429s on rapid paging),
joins the staging table read-only, writes `data/audit-<ts>.json` + `data/latest.json`,
prints the verdict. `PASS`/`UNKNOWN`(transient feed blip) are silent.
- `run.sh`, only on FAIL / WARN-growth: posts a CNCP parking-lot card + emails Steve via
George (steve-office). Env: `DW_UNIFIED_URL`, `DW_STORE`, `CNCP_URL`, `LAFAB_CANARY_TO`.
## Baseline / heartbeat
- `data/baseline.json` — the pre-onboard sample-only backlog floor (auto-captured first run;
delete it to re-baseline after the onboard lands so the floor tracks 0).
- `data/latest.json` — per-run output; its mtime is the `dw-canary-meta-watchdog` heartbeat.
`inputs_verified` is false (blind) if the staging table is empty or the feed is unreadable.
## Schedule (Steve-paste bootstrap — classifier blocks autonomous launchd installs)
```bash
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.steve.dw-losangeles-fabrics-canary.plist
```
(plist drafted alongside this skill; runs daily. Depends on the pricing onboard having
landed so `price_drift` has priced variants to judge — pre-onboard it just tracks the
backlog floor.)