← 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.)