Sanderson Onboard
Search the build
-
4ddb0bd2026-09-26 auto-data-snapshot: 2026-09-26T07:48:27 (4 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/manifest-morris.json pilot/queue-today.json -
507de412026-09-26 auto-data-snapshot: 2026-09-26T06:47:29 (3 data files) — pilot/cadence.log pilot/manifest-harlequin.json pilot/manifest-zoffany.json -
9bac9252026-09-26 auto-data-snapshot: 2026-09-26T05:45:52 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json -
1bd87b12026-09-26 auto-data-snapshot: 2026-09-26T04:44:27 (1 data files) — pilot/cadence.log -
f6b719e2026-09-24 auto-data-snapshot: 2026-09-24T07:37:57 (4 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/manifest-morris.json pilot/queue-today.json -
7bd08e82026-09-24 auto-data-snapshot: 2026-09-24T07:06:26 (2 data files) — pilot/cadence.log pilot/manifest-zoffany.json -
a759ec92026-09-24 auto-data-snapshot: 2026-09-24T06:34:34 (2 data files) — pilot/cadence.log pilot/manifest-harlequin.json -
bc631ac2026-09-24 auto-data-snapshot: 2026-09-24T05:30:55 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json -
319c4a62026-09-24 auto-data-snapshot: 2026-09-24T04:59:33 (1 data files) — pilot/cadence.log -
e1c69d42026-09-23 auto-data-snapshot: 2026-09-23T07:56:48 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
960bf422026-09-23 auto-data-snapshot: 2026-09-23T07:25:20 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/manifest-morris.json pilot/queue-today.json pilot/restore-map.jsonl -
f5e8cb42026-09-23 auto-data-snapshot: 2026-09-23T06:53:48 (3 data files) — pilot/cadence.log pilot/manifest-harlequin.json pilot/manifest-zoffany.json -
898789f2026-09-23 auto-data-snapshot: 2026-09-23T05:50:13 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json -
1db0c562026-09-23 auto-data-snapshot: 2026-09-23T04:47:26 (1 data files) — pilot/cadence.log -
990fe422026-09-22 Fix: replace hardcoded-path shim with portable resolution (TK-11786) -
f62ba402026-09-22 auto-data-snapshot: 2026-09-22T11:43:24 (1 data files) — scripts/lib/inventory-stamp-guard.mjs.pre-shared-lift -
39285ca2026-09-21 auto-data-snapshot: 2026-09-21T05:33:35 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
9c0fa3f2026-09-21 auto-data-snapshot: 2026-09-21T05:01:17 (4 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today.json pilot/restore-map.jsonl -
68b14c42026-09-20 auto-data-snapshot: 2026-09-20T05:34:32 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
cd91a5f2026-09-20 auto-data-snapshot: 2026-09-20T05:01:07 (7 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/manifest-harlequin.json pilot/manifest-sanderson.json pilot/manifest-zoffany.json -
0229d9e2026-09-20 TK-11829: add Morris & Co SDG mfr_sku backfill scripts -
dc867b32026-09-19 auto-data-snapshot: 2026-09-19T09:59:20 (6 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/manifest-morris.json pilot/queue-today-vision-blocked.json pilot/queue-today.json -
b059fb92026-09-19 auto-data-snapshot: 2026-09-19T08:23:45 (2 data files) — pilot/cadence.log pilot/manifest-zoffany.json -
7461cac2026-09-19 auto-data-snapshot: 2026-09-19T06:48:50 (2 data files) — pilot/cadence.log pilot/manifest-harlequin.json -
905d6d52026-09-19 auto-data-snapshot: 2026-09-19T05:44:32 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json -
1b146ef2026-09-19 auto-data-snapshot: 2026-09-19T04:40:20 (1 data files) — pilot/cadence.log -
acd34d82026-09-18 auto-data-snapshot: 2026-09-18T08:22:45 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
fe5d8452026-09-18 auto-data-snapshot: 2026-09-18T07:49:41 (6 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/manifest-morris.json pilot/queue-today-vision-blocked.json pilot/queue-today.json -
19664fc2026-09-18 auto-data-snapshot: 2026-09-18T06:45:31 (3 data files) — pilot/cadence.log pilot/manifest-harlequin.json pilot/manifest-zoffany.json -
2b2c0bd2026-09-18 auto-data-snapshot: 2026-09-18T05:41:24 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json -
7c76ee72026-09-18 auto-data-snapshot: 2026-09-18T04:37:40 (1 data files) — pilot/cadence.log -
4e40f362026-09-17 auto-data-snapshot: 2026-09-17T05:36:32 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today-vision-blocked.json pilot/queue-today.json pilot/restore-map.jsonl -
08ea60a2026-09-17 auto-data-snapshot: 2026-09-17T05:03:29 (2 data files) — pilot/cadence.log pilot/queue-today.json -
49f73ae2026-09-17 auto-data-snapshot: 2026-09-17T04:30:36 (1 data files) — pilot/cadence.log -
c069ecd2026-09-16 reauth.sh: mark executable so a bare path runs (no 'bash' prefix needed) -
e269e662026-09-16 auto-data-snapshot: 2026-09-16T05:44:01 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
971dfbd2026-09-16 auto-data-snapshot: 2026-09-16T05:12:15 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today-vision-blocked.json pilot/queue-today.json pilot/restore-map.jsonl -
a590ea72026-09-16 auto-data-snapshot: 2026-09-16T04:39:34 (1 data files) — pilot/cadence.log -
621a6042026-09-15 auto-data-snapshot: 2026-09-15T06:37:28 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
cb4633e2026-09-15 auto-data-snapshot: 2026-09-15T06:04:48 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today-vision-blocked.json pilot/queue-today.json pilot/restore-map.jsonl -
7a19e652026-09-15 auto-data-snapshot: 2026-09-15T05:32:03 (5 data files) — pilot/cadence.log pilot/manifest-harlequin.json pilot/manifest-sanderson.json pilot/manifest-zoffany.json pilot/queue-today.json -
4726f6b2026-09-15 auto-data-snapshot: 2026-09-15T04:59:55 (1 data files) — pilot/cadence.log -
2c6aabf2026-09-14 auto-data-snapshot: 2026-09-14T07:18:26 (2 data files) — pilot/cadence.log pilot/manifest-zoffany.json -
ffcb4e42026-09-14 auto-data-snapshot: 2026-09-14T06:45:42 (2 data files) — pilot/cadence.log pilot/manifest-harlequin.json -
89aaf962026-09-14 auto-data-snapshot: 2026-09-14T05:41:34 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json -
adc1dfb2026-09-14 auto-data-snapshot: 2026-09-14T04:37:30 (1 data files) — pilot/cadence.log -
24b4cfc2026-09-13 auto-data-snapshot: 2026-09-13T05:55:37 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
64593e32026-09-13 auto-data-snapshot: 2026-09-13T05:22:51 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today-vision-blocked.json pilot/queue-today.json pilot/restore-map.jsonl -
10b1e932026-09-13 auto-data-snapshot: 2026-09-13T04:48:57 (2 data files) — pilot/cadence.log pilot/queue-today.json -
bdbbf262026-09-12 chore: v1.1.2 (TK-11471 session close — per-run cadence weight proof + verified heal) -
627ad5c2026-09-12 auto-data-snapshot: 2026-09-12T05:38:11 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today-vision-blocked.json pilot/queue-today.json pilot/restore-map.jsonl -
126b4bc2026-09-12 auto-data-snapshot: 2026-09-12T05:03:08 (2 data files) — pilot/cadence.log pilot/queue-today.json -
d9e8fa82026-09-11 TK-11471: verify the SDG weight heal, and stop the verifier reading green on a pre-fix run -
55073512026-09-11 TK-11471: per-RUN weight proof for the SDG publish cadence -
8d09eed2026-09-11 TK-11414: stop the SDG weight leak at the source (create_sdg.mjs) -
1fe3fca2026-09-11 auto-data-snapshot: 2026-09-11T05:32:16 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today-vision-blocked.json pilot/queue-today.json pilot/restore-map.jsonl -
928bb572026-09-11 auto-data-snapshot: 2026-09-11T04:57:32 (2 data files) — pilot/cadence.log pilot/queue-today.json -
5c8dbdf2026-09-11 auto-data-snapshot: 2026-09-11T01:40:13 (1 data files) — data/NEEDS_REAUTH -
edc210b2026-09-10 TK-11357 Fix D: route create_sdg's inventory stamp through the shared $0 guard (defence-in-depth) -
f7d24262026-09-10 auto-data-snapshot: 2026-09-10T05:55:20 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
d4db0642026-09-10 auto-data-snapshot: 2026-09-10T05:23:03 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today-vision-blocked.json pilot/queue-today.json pilot/restore-map.jsonl -
fa4d39b2026-09-10 auto-data-snapshot: 2026-09-10T04:50:00 (2 data files) — pilot/cadence.log pilot/queue-today.json -
65a8c0b2026-09-09 auto-data-snapshot: 2026-09-09T05:45:52 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
ef454d32026-09-09 auto-data-snapshot: 2026-09-09T05:13:58 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today-vision-blocked.json pilot/queue-today.json pilot/restore-map.jsonl -
90151ab2026-09-09 auto-data-snapshot: 2026-09-09T04:40:57 (1 data files) — pilot/cadence.log -
b2477572026-09-08 auto-data-snapshot: 2026-09-08T05:12:15 (4 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today.json pilot/restore-map.jsonl -
4ff36bf2026-09-08 auto-data-snapshot: 2026-09-08T04:33:12 (1 data files) — pilot/cadence.log -
f999a3c2026-09-07 auto-data-snapshot: 2026-09-07T05:33:36 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
fcf42402026-09-07 auto-data-snapshot: 2026-09-07T04:54:58 (4 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today.json pilot/restore-map.jsonl -
d3776622026-09-06 auto-data-snapshot: 2026-09-06T05:13:44 (4 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today.json pilot/restore-map.jsonl -
aef82552026-09-06 auto-data-snapshot: 2026-09-06T04:34:41 (2 data files) — pilot/cadence.log pilot/queue-today.json -
a70d7a92026-09-05 auto-data-snapshot: 2026-09-05T05:34:51 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
d3f540c2026-09-05 auto-data-snapshot: 2026-09-05T04:56:24 (4 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today.json pilot/restore-map.jsonl -
4eb1f7d2026-09-04 TK-11256: fix gallery-image cross-contamination in Sanderson extractor -
a7218052026-09-04 auto-data-snapshot: 2026-09-04T05:15:13 (5 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/queue-today-vision-blocked.json pilot/queue-today.json pilot/restore-map.jsonl -
0333af72026-09-04 auto-data-snapshot: 2026-09-04T04:33:28 (1 data files) — pilot/cadence.log -
1cbf0ec2026-09-03 auto-data-snapshot: 2026-09-03T07:56:56 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl -
7267fb82026-09-03 auto-data-snapshot: 2026-09-03T07:17:12 (17 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/held-harlequin.json pilot/held-morris.json pilot/held-sanderson.json -
f446fd52026-09-03 auto-data-snapshot: 2026-09-03T04:44:57 (3 data files) — pilot/cadence.launchd.err.log pilot/cadence.launchd.out.log pilot/cadence.log -
cb01bb12026-09-02 auto-data-snapshot: 2026-09-02T11:28:31 (6 data files) — .playwright-mcp/console-2026-09-02T18-19-37-214Z.log .playwright-mcp/page-2026-09-02T18-19-38-930Z.yml pilot/build_manifest_morris_verify.log pilot/manifest-morris.FINALIZED-20260902T181058Z.json.bak pilot/morris_image_backfill.sql -
be278d02026-09-02 TK-10881: Morris & Co image re-harvest -> 1152/1162 (99.1%) verified images staged to manifest-morris.json -
43ac3dd2026-09-02 auto-data-snapshot: 2026-09-02T10:48:45 (17 data files) — pilot/manifest-morris.json pilot/morris-image-restore-map.json pilot/morris-image-source-finding.md pilot/morris_image_harvest.jsonl pilot/morris_image_qa_flags.json -
4cc645e2026-09-02 auto-data-snapshot: 2026-09-02T10:09:29 (2 data files) — pilot/morris-image-match-preview.jsonl pilot/morris-image-source-finding.md -
3bf4d842026-08-31 TK-10881: activated the final 2 fresh SDG products (DWXH-600067/68) — validateBeforeActivate PASS, 192 already active; 194/194 complete -
83f5d7b2026-08-31 auto-data-snapshot: 2026-08-31T11:55:57 (2 data files) — pilot/create-audit.jsonl pilot/restore-map.jsonl -
da24f012026-08-31 route rollback_sdg undo path to SHOPIFY_FULL_ACCESS_TOKEN to match forward path (TK-10979 DTD-A) -
37e845d2026-08-31 auto-data-snapshot: 2026-08-31T11:17:15 (2 data files) — pilot/create-audit.jsonl pilot/restore-map.jsonl -
461a34a2026-08-31 TK-00058: pre-reprice snapshot (Sanderson +10% UK duty rollback source) -
cc802e12026-08-31 route create_sdg to SHOPIFY_FULL_ACCESS_TOKEN for write_inventory (TK-10979 DTD-A bridge) -
79bbeca2026-08-31 auto-data-snapshot: 2026-08-31T10:06:07 (3 data files) — tk10873/apply_labeling.live_plan.json tk10873/apply_labeling.restore_map.preview.json tk10873/retire_dupes.restore_map.preview.json -
494134f2026-08-31 chore: lint (1 dead-var removed) + refactor (named consts, toRestoreRows helper, revert-map guards — behavior-preserving), v1.1.2 → v1.2.0 (session close) -
2d6ad382026-08-31 TK-10873: record live labeling restore map (44 rows) — the shipped-labeling undo artifact -
7fdd9d82026-08-31 auto-data-snapshot: 2026-08-31T09:29:05 (4 data files) — tk10873/retire_dupes.restore_map.live.json tk10873/zoffany_fabric_ZAQF322696.restore_map.live.json tk10873/zoffany_optionA_promotions_v7.restore_map.live.json tk10873/zoffany_roll_ZDAR312861_highclere.restore_map.live.json -
7fd63042026-08-31 TK-10873: apply_labeling.mjs dry-run 44/44 clean (dropped retired ZDAR312884 orphan) — renames sellable value 'Sold Per Roll'/'Default Title'->'Per Yard' + appends per-yard coverage copy; restore-map-first, self-ledgered; one keystroke on approval -
b7e94de2026-08-31 TK-10873: add restore-map-first apply_labeling.mjs (dry-run verified, gated) -
c12e7022026-08-31 TK-10873: build retire_dupes.mjs (restore-map-first, reversible) — dry-run 2/2 clean; DUPES card now one-keystroke (retire Tigers Eye + Papaver orphans ACTIVE->DRAFT) -
9b37d1b2026-08-31 TK-10873: record 313114 resolution in decisions doc — mapping confirmed via image cross-ref, sample-only dupe of ZOW0146-01, DM moot; every held item now closed -
7da95c22026-08-31 TK-10873: Highclere Paris Grey RESOLVED — standard roll at $148 (£-as-USD, held out of 277 fix); gated reprice card at conservative $382; LAST held item closed -
cc12cba2026-08-31 TK-10873: unit-labeling spec for the 45 v7 wide-width SKUs (variant->Per Yard + coverage copy); gated pair to the reprice, closes the coverage-confusion risk -
a38bad02026-08-31 TK-10873: ZAQF322696 fabric RESOLVED — structure correct (per-yard $132 + sample), but $132 is £-as-USD; US list $370/yd (2 sources); gated reprice card drafted (+180%); only 1 Zoffany fabric so bounded -
bcd3bc52026-08-31 TK-10873: Tier-2 2nd-source CORRECTS the big movers (Eleonora $799->$522, Elswick $768->$522, Henrietta $500->$326, Italian Garden $1008->over); v7 consolidates 45 high-conf reprices (~+$2148), dry-run 45/45; v6 superseded -
8501ce72026-08-31 TK-10873: v6 reprice card ready — 37 high-conf wide-width SKUs UP to Zoffany US per-yard list (~+$1807 margin, unit=yard confirmed); dry-run 37/37; Tier2/3 held -
356878b2026-08-31 TK-10873: Zoffany per-yard price list scraped (37 patterns, $0) -> reprice draft; alarm INVERTS: 52/71 UNDERpriced vs US list (up to +69%), 16 slightly over; gated on confirming 1 unit = 1 yard -
f9f4a132026-08-31 TK-10873: $/m spot-check — 23 in-band (labeling-only), ~28 out-of-band candidates + 22 no-dimension need a Zoffany per-metre price-list scrape; dupe resolution drafted (keep ZOW0075-03 set member) -
ab67f432026-08-31 TK-10873: verify-first result — Zoffany wide-width sold by-the-metre; 74 are NOT gross misprices (3 correct panels + 71 defensible per-metre w/ labeling risk + 1 dupe); mass-revert no longer recommended; held-list reconciled -
14801cd2026-08-31 TK-10873: sweep finds 74 wide-width Zoffany products live at flat roll prices (unit-mislabel class + ZOW/Z-code dupe root cause); full list + revert data captured -
19befb62026-08-31 TK-10873: re-verify 3 held Darnley rows — confirm Mitford $416, catch Tigers Eye live unit-mislabel, tighten Highclere -
e45a55d2026-08-31 auto-data-snapshot: 2026-08-31T02:39:25 (1 data files) — tk10873/VERSION -
590425c2026-08-31 chore: lint (1 regex fix), refactor (shadow rename), v1.1.2 + reversibility maps (session close) -
3f77c492026-08-31 tk10873: stage v5 local artifact (Darnley+Mitford verified at 416) -
35b8a8b2026-08-31 TK-10873: decisions doc — 42 ship / 2 hold after DTD refine + Ebru II price fix -
01e2bc02026-08-31 TK-10873: fix — Ebru II ships at VERIFIED $342, not the stale $230 scrape (verified-price override) -
7e2cada2026-08-31 TK-10873: DTD+Cody refine — ship Ebru II (pinned) into v4 (42), hold Darnley+Mitford as Darnley-collection confirm -
6dedf492026-08-31 TK-10873 follow-up: 41 web-verified harvested promotions (v4), 3 held below-list, Domino dropped; decisions doc -
fc1b4672026-08-31 auto-data-snapshot: 2026-08-31T01:22:16 (1 data files) — tk10873/reprice_restore_map.live.json -
64930472026-08-31 TK-10873: restore-map-first live reprice runbook (277 rows, Cody-hardened) + run card -
c27e3d82026-08-30 chore: lint (0 fixes) + refactor (dedup isVerified in reconcile_from_feed) + v1.1.1 (session close, TK-10873) -
42a6e252026-08-30 TK-10873: final handoff / decision package — consolidates 9 cycles into one gated-decision doc for Steve -
7c700572026-08-30 TK-10873 cycle9: read-only cross-brand diagnostic — the GBP-as-USD bug is Zoffany-specific, NOT fleet-wide (Harlequin 726/726 match its S1 feed, 0 discrepant); Morris inconclusive (key mismatch). De-risks the epic -
ba4d03e2026-08-30 TK-10873 cycle8: batch-3 harvest completes all 51 held (Palladio $494-530 tier vs Folio $342; Phaedra/Pangolins murals held). Autonomous harvest DONE -
b80844e2026-08-30 TK-10873 cycle7: batch-2 US-retail harvest (15 Folio-collection colorways, all $342/11yd-roll confirmed vs zc $122 GBP-as-USD; Verdure per-metre held). 29/51 harvested, 22 remaining. Proposals only -
a72761f2026-08-30 TK-10873 cycle6: batch-1 US-retail harvest for 14 of the 51 held rows (8 firm PROPOSE, e.g. Ajanta $342/French Marble $382 — confirms zc was GBP-as-USD low; 3 per-metre POR held; 1 unit-review; 1 low-conf). DATA FLAG: Desert Flower II ZAQF322696 is a FABRIC (per-yard $133), misclassified as wallpaper -> RECLASSIFY. Proposals only, nothing promoted. +7 tests -
2d6980f2026-08-30 TK-10873 cycle5 Cody-fix: web spot-check clears the circular-consistency concern on the 38 promoted rows (Hawksmoor $465 vs real US $562; Malmaison $320 vs $354 — trade values are genuine USD, promotion sound + retroactively validates the 68 trade-backed rows); clarify promote_restore_map is an action-delta (v2 is true revert) -
0861b882026-08-30 TK-10873 cycle5: refine the 89 held rows — promote 38 trade-verified (retail==trade/0.65/0.85, Option-A valid) to REPRICE (reprice-now 239->277); keep 51 no-trade held (web spot-check: GBP-as-USD-ish but non-standard units, blanket multiple unsafe -> flag for targeted US-retail harvest). +7 tests, restore-map v3->v2 -
6bc0c252026-08-30 TK-10873 cycle4 Cody-fix: exclude 89 unverified rows from REPRICE (->HELD_UNVERIFIED, reprice-now=239 feed-verified only); document sellable price = feed.retail_usd (trade/0.65/0.85 contract), NOT ssp/MSRP -
a08d3c62026-08-30 TK-10873 cycle4: web-verified feed is canonical (Zoffany US retail matches feed ssp; zoffany_catalog was GBP-as-USD ~2.5x low), reconcile 209 REPRICE prices off S1 feed (median $176->$376) with restore-map v2->v1; +verification doc. No live writes. -
b68c0642026-08-30 TK-10873 cycle4: cross-validate REPRICE prices vs independent S1 feed — CRITICAL: 209/328 are ~2.54x BELOW the S1 feed (systematic double-roll x GBP->USD mismatch); only 30 CONFIRMED, 89 unverifiable. Reprice of the 209 BLOCKED pending canonical-source ruling. +10 tests -
55fb1212026-08-30 TK-10873 cycle3 Cody-hardening: restore-map is a labeled TEMPLATE (not a populated map), add our_price deviation cross-check (22 rows, 0 flagged), honest validation-scope in sanity report (68 invariant-validated / 238 legibility-only), id-resolution disclosure; +13 tests (41/41) -
2007d572026-08-30 TK-10873 cycle3: DRY-RUN reprice runbook + independent sanity gate for Zoffany Option-A (328 REPRICE) -
5be93252026-08-30 TK-10873 validate deterministic Zoffany Option-A draft -
98e4c8e2026-08-30 TK-10873 cycle1: HELD price-recovery findings (3 rows stay held; 313114 image-code candidate flagged, ZFOW312943 source-conflict documented) -
a910c502026-08-30 TK-10873: Zoffany Option-A sample-add + price draft artifacts (read-only, no live writes) -
87c64c12026-08-26 SDG: wire settlement image-vision gate into cadence; batch-1 queue 194 vision-clean+0 blocked (TK-10881) -
8b984cb2026-08-26 SDG contrarian FIX-FIRST: fabric descriptions now say 'fabric' not 'wallcovering' (184 fixed); add settlement_vision.mjs image-side legal gate (qwen2.5vl $0) per binding post-gen-vision requirement (TK-10881) -
0d235c32026-08-26 SDG: title-case fix for color/, graceful write_inventory-scope-missing handling (record DRAFT_PENDING_INVENTORY + finish-pending resume), settlement gate false-positive fix (dove-grey colorway) (TK-10881) -
7ff6f002026-08-26 SDG go-live pipeline: enrich($0 ollama)->dw_sku->settlement gate->6-field gate->create+golive(both variants,qty=2026,sample$4.25); cadence + rollback + healthcheck (TK-10881) -
c6d97042026-08-26 TK-10877: harvest Morris & Co full catalog (wp+fabric) from SDG US trade portal -
55f6f952026-08-26 auto-data-snapshot: 2026-08-26T10:15:42 (8 data files) — data/NEEDS_REAUTH pilot/harlequin_enum.json pilot/harlequin_feed_harvest.log pilot/morris_portal_harvest.jsonl pilot/sanderson_enum.json -
3683ffb2026-08-26 TK-10877: full SDG feed harvest complete — Sanderson/Harlequin/Zoffany wp+fabric trade+retail staged to *_feed_pricing (5400 rows, 4869 priced, invariant 100% clean) -
6d6f3822026-08-26 TK-10877: fix harvester — enumerate PATTERN codes, expand via CN_<pattern> to ALL priced colorways (recovers wallpaper universe the flat colorway-only enum missed) -
e99ff7c2026-08-26 auto-data-snapshot: 2026-08-26T09:38:32 (9 data files) — pilot/harlequin_enum.json pilot/harlequin_feed_harvest.jsonl pilot/harlequin_feed_harvest.log pilot/sanderson_enum.json pilot/sanderson_feed_harvest.jsonl -
5516c542026-08-26 TK-10877: feed-pricing staging tables (wp+fabric, trade+retail, distinct from legacy catalogs) -
004cd212026-08-26 TK-10877: generalized SDG feed harvester (full wp+fabric enumeration, SSP/2 trade, retail derive, checkpointed) -
30396812026-08-26 Harlequin pricing pilot: feed-first trade harvest (732/842) + retail backfill + DWHF reconcile + pilot memo (TK-10874) -
fa6fd8a2026-08-25 auto-data-snapshot: 2026-08-25T12:06:42 (1 data files) — data/NEEDS_REAUTH -
b6255862026-08-25 auto-data-snapshot: 2026-08-25T11:28:19 (1 data files) — data/pattern_map.tsv -
1230f7f2026-08-12 auto-data-snapshot: 2026-08-12T04:46:32 (1 data files) — data/pattern_map.tsv -
bb60bb72026-08-11 auto-data-snapshot: 2026-08-11T05:32:12 (1 data files) — data/sanderson_fabric_raw.txt.tmp -
d6f5ac32026-08-11 auto-data-snapshot: 2026-08-11T05:01:24 (1 data files) — data/sanderson_fabric_raw.txt.tmp -
e9c105a2026-08-10 chore: harvest_width.js refactor (hoist fs require) + v1.0.1→1.1.0 (session close) -
fa05ca12026-08-10 Sanderson: harvest product width from public retail API ($0, no auth) into sanderson_catalog.width -
c895b562026-08-10 TK-10400 Cody-gate fixes: reauth->openclaw, tab-race, freshness gate (kill silent stale reload) -
d174e0d2026-08-10 openclaw real-Chrome trade-harvester: crash-safe cumulative Load-More PLP harvest (defeats SDG bot-wall that blocked headless since 07-25) -
cc268fd2026-08-10 TK-10400: durable Sanderson trade harvest via openclaw (kills daily puppeteer bot-block) -
85f21032026-08-10 auto-data-snapshot: 2026-08-10T08:54:43 (1 data files) — data/NEEDS_REAUTH -
094ac9e2026-08-10 auto-data-snapshot: 2026-08-10T04:47:23 (1 data files) — data/NEEDS_REAUTH -
d3746aa2026-08-09 auto-data-snapshot: 2026-08-09T05:08:26 (1 data files) — data/NEEDS_REAUTH -
f8ce5bc2026-08-07 auto-data-snapshot: 2026-08-07T04:54:46 (2 data files) — data/NEEDS_REAUTH data/pattern_map.tsv -
b3d05a92026-08-06 auto-save: 2026-08-06T04:48:33 (2 files) — data/NEEDS_REAUTH data/pattern_map.tsv -
4aab8672026-08-05 auto-save: 2026-08-05T05:39:25 (1 files) — data/NEEDS_REAUTH -
1826b062026-08-05 auto-save: 2026-08-05T04:39:04 (1 files) — data/pattern_map.tsv -
6c41f9b2026-08-04 auto-save: 2026-08-04T04:59:56 (1 files) — data/NEEDS_REAUTH -
c8324862026-08-03 auto-save: 2026-08-03T04:50:22 (1 files) — data/NEEDS_REAUTH -
ee3b8ca2026-08-02 auto-save: 2026-08-02T05:12:23 (1 files) — data/NEEDS_REAUTH -
a95c17d2026-08-01 auto-save: 2026-08-01T05:03:35 (2 files) — data/NEEDS_REAUTH data/pattern_map.tsv -
253d8c62026-08-01 auto-save: 2026-08-01T04:33:25 (1 files) — data/pattern_map.tsv -
f7298882026-07-31 auto-save: 2026-07-31T04:53:53 (1 files) — data/NEEDS_REAUTH -
917df532026-07-30 auto-save: 2026-07-30T05:14:49 (1 files) — data/NEEDS_REAUTH -
eb3cce92026-07-29 auto-save: 2026-07-29T05:06:01 (1 files) — data/NEEDS_REAUTH -
2dc42c32026-07-28 auto-save: 2026-07-28T04:57:26 (1 files) — data/NEEDS_REAUTH -
e7a15872026-07-27 auto-save: 2026-07-27T04:48:02 (1 files) — data/NEEDS_REAUTH -
7023ff82026-07-26 auto-save: 2026-07-26T05:10:45 (1 files) — data/NEEDS_REAUTH -
f9c91752026-07-25 auto-save: 2026-07-25T05:03:47 (2 files) — data/NEEDS_REAUTH data/pattern_map.tsv -
5c3b4fe2026-07-25 auto-save: 2026-07-25T04:33:37 (1 files) — data/pattern_map.tsv -
678101f2026-07-24 auto-save: 2026-07-24T04:55:26 (2 files) — data/NEEDS_REAUTH data/pattern_map.tsv -
78e0a172026-07-23 auto-save: 2026-07-23T05:48:54 (1 files) — data/NEEDS_REAUTH -
1ee39982026-07-23 auto-save: 2026-07-23T04:48:39 (1 files) — data/pattern_map.tsv -
846688e2026-07-22 chore: lint, refactor (file-handle hygiene), v1.0.1 (session close) -
1c623a52026-07-22 Sanderson daily-cadence staging pipeline (retail feed-first + best-effort trade portal)
Authors
- auto-commit-fleet90
- Steve89
Agents used
Skills used
- /cadence71
- /create-audit35
- /restore-map29
- /queue-today26
- /queue-today-vision-blocked11
- /manifest-harlequin8
- /manifest-zoffany8
- /manifest-sanderson8
- /manifest-morris7
- /claude5
- /code5
- /inventory-stamp-guard2
- /morris-image-source-finding2
- /macstudio31
- /dw-guards1
- /status1
- /weight-guard1
- /needs-price1
- /contact-for-price1
- /shopify1
- /scripts1
- /tk11357-source-fix-proof1
- /predicate-proof1
- /media1
- /catalog1
- /product1
- /detail1
- /held-harlequin1
- /held-morris1
- /held-sanderson1
Creative ideas + design notes
990fe42 · 2026-09-22 · Fix: replace hardcoded-path shim with portable resolution (TK-11786)
The inventory-stamp-guard.mjs shim now resolves via DW_SHARED_GUARDS env or home-dir fallback instead of hardcoded /Users/macstudio3 path. This enables the guard to work on Kamatera (/root), Mac1, and any other machine. ESM consumers (import) work correctly. CJS consumers (require) fail safely with ERR_REQUIRE_ASYNC_MODULE, preventing silent bad defaults on inventory stamps. Original vendored copy preserved as inventory-stamp-guard.mjs.pre-shared-lift. The $0-orderable guard (TK-11357) now has ONE source of truth at ~/Projects/_shared/dw-guards/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WoD95uATtwJXUZvQ7PNPsB
0229d9e · 2026-09-20 · TK-11829: add Morris & Co SDG mfr_sku backfill scripts
- backfill_morris_catalog_sdg.sql: upserts 1087 DWWM-600xxx products
from manifest-morris.json into william_morris_catalog (Mac2-canonical)
- william_morris_catalog_restore_map_pre_sdg_backfill.csv: 339-row
pre-backfill restore snapshot
Applied: 1087 rows inserted, 878 with shopify_product_id (on_shopify=TRUE)
Undo: DELETE FROM william_morris_catalog WHERE dw_sku LIKE 'DWWM-6%'
AND created_at > NOW() - INTERVAL '1 hour';
c069ecd · 2026-09-16 · reauth.sh: mark executable so a bare path runs (no 'bash' prefix needed)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HHf4p8mm5kYdVRQJuh6Cwu
bdbbf26 · 2026-09-12 · chore: v1.1.2 (TK-11471 session close — per-run cadence weight proof + verified heal)
Patch: the heal now verifies itself and the verifier no longer reports a top-level PASS on a run it admits proves nothing. No API change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
d9e8fa8 · 2026-09-11 · TK-11471: verify the SDG weight heal, and stop the verifier reading green on a pre-fix run
Two findings from an independent red-team of this ticket's own work.
1. THE REFERENCE IMPLEMENTATION DIDN'T VERIFY ITSELF. create_sdg.mjs goLive() — the code
every other site's self-heal-then-verify design was modeled on — fired
`await gql(M_WEIGHT, ...)` and DISCARDED the result: no userErrors check, no re-query,
straight into M_ACT/M_QTY/M_PUB/M_ACTIVE. A heal that silently failed (a userError, a
token without write_inventory, a throttle) published the product ACTIVE at zero weight
anyway — the exact leak the guard was added to stop. The mutation's own 200 is not
evidence the weight is set; only re-reading it is.
Now: userErrors are inspected, the live product is RE-QUERIED after the heal, and any
variant still zero — or an empty re-verify, which is unmeasured, not clean — returns
{ gated: 'weight>0' } and the product stays DRAFT.
The caller needed the same fix one level up: it did not branch on the hold, so a held
product fell through and was recorded action:'CREATED' with status:undefined and logged
as a ✓, counting a hold as a success. It now records HELD_DRAFT and increments `held`.
(The finish-pending path was already safe — it gates on status === 'ACTIVE'.)
2. THE VERIFIER SHIPPED A TOP-LEVEL PASS ON A RUN IT ADMITS PROVES NOTHING.
verify_cadence_weights.mjs emitted verdict/status PASS for a post_fix:false run with the
caveat buried in `detail`. fleet-health-rollup renders the panel dot from the top-level
verdict, so a glance-only reader saw GREEN on evidence the code itself says is not
evidence — the false green this skill exists to prevent. Per CLAUDE.md TK-11431
amendment 1 (an unmeasured input is never PASS), a pre-fix run is now downgraded to
UNKNOWN/WARN with the domain word kept in domain_verdict. Confirmed at the consumer:
the rollup row for sdg-cadence-weight-verify now reads WARN, not green.
Tests: create_sdg_weight_heal.test.mjs 8/8, verify_cadence_weights.test.mjs 7/7 — both run.
Mutation-verified RED on scratch copies: revert the heal to fire-and-forget -> 4 failures;
caller stops branching on gl.gated -> 1; Q_V stops selecting weight -> 1.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FJHxAzaEMMxado57mFjiCk
5507351 · 2026-09-11 · TK-11471: per-RUN weight proof for the SDG publish cadence
TK-11414 fixed create_sdg.mjs (8d09eed) so the SDG cadence stops shipping zero-weight products live, but "the fix is committed" is not "the fix works in a real run" — and the cadence is the thing that put 385 zero-weight ACTIVE variants live overnight. - verify_cadence_weights.mjs: READ-ONLY. Resolves the inventoryItem ids of exactly the products a given cadence run created (pilot/cadence.log run headers x create-audit.jsonl) and asserts weight>0 on each against live Shopify, so an offender is attributable to the RUN. dw-active-weight-canary cannot do this — it counts catalog-wide rows with no provenance, so a clean catalog with a still-broken producer looks identical to a fixed one. Fails CLOSED: an unreadable variant is UNMEASURED => UNKNOWN/WARN, never PASS. Owns its own --heartbeat and writes a verdict on EVERY exit path including an uncaught throw, so a dead verifier reports WARN instead of leaving no row on the morning panel. Carries post_fix, and a PASS on a pre-fix run says in its own detail that it is evidence of the backfill healing the run after the fact, NOT of the fix holding. - verify_cadence_weights.test.mjs: the negative test (7/7 PASS). Drives the pure classify() with injected faults — zero-weight sellable, zero-weight SAMPLE (samples count; the canary FAILs on them too), null measurement, unreadable id, empty read, negative, NaN — and asserts each goes RED. Live history cannot supply a red case because the TK-11414 backfill already healed every pre-fix run, so faults are injected instead. - cadence_resume.sh: runs the verify as step 5, so every daily run self-proves. `|| VRC=$?` because the script runs under `set -e` and a bare call would abort the cadence the first time verification reported FAIL; verified non-fatal on exit 1 and 2. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FJHxAzaEMMxado57mFjiCk
8d09eed · 2026-09-11 · TK-11414: stop the SDG weight leak at the source (create_sdg.mjs)
SDG publish cadence shipped every variant with NO weight -> 385 went live zero-weight overnight. - vendored lib/weight-guard.mjs - create payload: sellable + Sample carry weight (per-type default / 0.25lb) - goLive: sets default weight on any zero-weight variant before activating (enforces the rule + self-heals the finish-pending backlog). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
edc210b · 2026-09-10 · TK-11357 Fix D: route create_sdg's inventory stamp through the shared $0 guard (defence-in-depth)
NOT a live-risk closure — stated plainly. create_sdg.mjs is ALREADY effectively guarded:
gate() pushes 'no-price' when !(parseFloat(it.retail_usd) > 0) and the caller `continue`s on
SKIP-HELD before any product create or inventory mutation; and it is CREATE-ONLY and
manifest-bounded (manifest-{harlequin,morris,sanderson,zoffany}.json = 5,655 items, ZERO
Phillipe Romano, no productByHandle / no products(first: sweep), so it only writes to pids it
created and cannot re-inflate a pre-existing cohort). Verified, not assumed.
What it lacked was the guarantee AT THE WRITE SITE. goLive() re-reads the product and stamped
TARGET_QTY on every variant, and the finish-pending path calls goLive() on drafts created by an
EARLIER run whose live prices it never re-checks. The stamp now goes through the shared guard
(lib/inventory-stamp-guard.mjs, vendored) so the invariant holds at the mutation itself rather
than only in an upstream manifest field.
Q_V now also selects variant title+price and product vendor+tags. Confirmed empirically safe for
this cadence: all 4 manifests carry ZERO quote/needs-price/contact-for-price tags and no vendor
is a price-suppressed line, so the guard's quote-only branch cannot fire and this is a strict
no-op for today's population — it only changes behaviour if a $0 variant ever reaches the stamp.
This matters because com.steve.sdg-publish-cadence is LOADED and runs cadence_resume.sh daily
at 04:30 PDT, so the write site is unattended.
Proven by Designer-Wallcoverings/shopify/scripts/tk11357-source-fix-proof/predicate-proof.mjs:
4/4 required + 3/3 regression on the predicate EXTRACTED from this file.
SOURCE-ONLY: nothing run with --apply, no Shopify write. Reversible: git revert.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
4eb1f7d · 2026-09-04 · TK-11256: fix gallery-image cross-contamination in Sanderson extractor
Root cause of dw-image-identity-canary FAIL (Sanderson foreign_products 6 -> 24, foreign_imgs 6 -> 41): the gallery extractor swept EVERY static/media/catalog/product/*.jpg URL anywhere on the raw PDP HTML (IMG.findall(h) over the whole page) into that product's gallery_images. Sanderson's PDP always embeds a 'shop other colourways' swatch carousel (other SKUs' hero images at 64w) plus cross-sell 'shop the room' panels (other products' images at 1080w) on every product page, so those foreign images got written into the wrong SKU's gallery on the next re-scrape. Verified live against 3 real PDPs (SAW0094-01, SAW0094-03, SAW0224-01, SAW0079-02): the product's OWN real gallery/detail shots consistently render at srcset max-width 2560 (often with the SKU literally embedded in the filename, e.g. ..._SAW0224_01_SANDERSON_Carpet_Garden_WALLPAPER...), while every foreign image tops out at 1080w or 64w -- a clean, reproducible separation. New own_gallery() scopes extraction to >=1500w srcset entries only; falls back to the single primary image (never the old whole-page sweep) if no such image is found on a PDP shape variant. Code-only -- no scrape run, no dw_unified/Shopify writes. The 24 already- live contaminated products need a gallery-image correction on Shopify -- gated, see pending-approval memo.
be278d0 · 2026-09-02 · TK-10881: Morris & Co image re-harvest -> 1152/1162 (99.1%) verified images staged to manifest-morris.json
Source = wmorrisandco.com (Magento2, Cloudflare-gated) via openclaw real-Chrome in-page fetch of sitemap + PDP og:image. Every image HTTP-200 image/* validated on the un-challenged media CDN ($0). Title-parse QA gate guards against wrong-colorway joins. Manifest staging only -- no Shopify/DB/launchd. Settlement gate flagged mandatory before publish (Morris is botanical/floral-heavy). 10 still-missing documented (US-discontinued / not-on-site). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016v9v4criKkzfiaNWRNrvxp
b7e94de · 2026-08-31 · TK-10873: add restore-map-first apply_labeling.mjs (dry-run verified, gated)
Dry-run resolves 45/45 wide-width Zoffany SKUs live. Real pre-state: 43 carry 'Sold Per Roll' (mislabeled as roll for per-yard goods), 2 carry 'Default Title' — all rename to 'Per Yard' + append per-yard PDP line. Sample variant/value/$4.25 never in any write set. Mirrors reprice_live_runbook.mjs safety pattern: restore-map-first, fail-closed, --apply guarded by --i-understand-this-is-live, --revert, ledgered. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2007d57 · 2026-08-30 · TK-10873 cycle3: DRY-RUN reprice runbook + independent sanity gate for Zoffany Option-A (328 REPRICE)
reprice_runbook.mjs emits 328 plan records (dw_sku, mfr_sku, proposed price, sample 4.25, would_run productVariantsBulkUpdate shape w/ VARIANT_ID placeholder, restore_map schema) to reprice_runbook_dryrun.json. NO http/fetch/graphql-send path; --apply prints a gate notice and exits 0 (live run is a separate Steve-gated tool). reprice_sanity.mjs re-derives from the draft (not the runbook): every proposed price positive, > sample, >= staged_trade; band $20-2000 outliers are WARN not FAIL. PASS: 0 hard fails, 0 outliers, min 100 / median 176 / max 1073.30, 68 trade-backed + 260 retail-harvest. 28 new unit tests in test_reprice.mjs. Read-only + local only. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a910c50 · 2026-08-30 · TK-10873: Zoffany Option-A sample-add + price draft artifacts (read-only, no live writes)
Read-only draft/staging prep for Stage S3 of EPIC TK-10874 (SDG family onboard). build_zoffany_optionA_draft.mjs pulls all 331 ACTIVE Zoffany products, LEFT JOINs zoffany_catalog on mfr_sku, and classifies each into REPRICE (328) / SELLABLE_ADD (0) / HELD_NEEDS_PRICE (3). Emits draft JSON+CSV+summary. lib.mjs holds pure pricing (retail=trade/0.65/0.85) + classification. test_optionA.mjs (28 tests) + validate_draft.mjs (the gate) both pass. Contrarian panel: SHIP IT; the our_price 2-row fork escalated to CLARIFY, not folded in silently. No Shopify/dw_unified writes; live publish is Steve-gated (scripts/create_sdg.mjs). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c6d9704 · 2026-08-26 · TK-10877: harvest Morris & Co full catalog (wp+fabric) from SDG US trade portal
- New brand-parameterized harvester (openclaw_harvest_brand_cat.sh) with scroll-hydrate step so lazy-loaded per-card $SSP/$Trade prices render before innerText snapshot. - New parser (parse_brand_portal.py) matching current SDG PLP block format; trade portal -> trade_usd = displayed trade price, retail_usd = trade/0.65/0.85, ssp_usd recorded. - Loaded 1162 Morris rows to morris_feed_pricing (473 wallcovering + 689 fabric), 100% priced, SSP=2xTrade invariant held on all 1162, zero NULL prices. - Scion verified NOT distributed on US trade portal (0/0 on all paths incl. real Scion collection slug; all-brands lists only 4 brands) -> scion_feed_pricing stays empty. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fa05ca1 · 2026-08-10 · Sanderson: harvest product width from public retail API ($0, no auth) into sanderson_catalog.width
The trade portal carries price but not width (original TK-00058 Tier-1 blocker).
Width lives on www.sanderson.design product records; one call per SKU via
/api/n/find?type=product&filter={sku} → sdb_usable_width_inches/sdb_useable_width,
stored in the DW sibling convention '20.47 in (52 cm)'.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c895b56 · 2026-08-10 · TK-10400 Cody-gate fixes: reauth->openclaw, tab-race, freshness gate (kill silent stale reload)
- HOLE 1 (critical): reauth.sh was logging into the DEAD puppeteer chrome-profile, not the openclaw session the harvester now uses -> reauth theater. Rewrote reauth.sh to open the SDG login in the openclaw Chrome + confirm via openclaw evaluate. - HOLE 2: collapsed the two racing comm -13 tab diffs into one (was closing a tab it didn't open). - HOLE 3 (silent data corruption): the dump guard only overwrites when the new dump is bigger, so an expired session left the prior full raw file untouched and a naive summary reloaded stale prices. Added an mtime freshness gate: a category is trusted ONLY if its raw file was written THIS run; 0 fresh -> NEEDS_REAUTH, stale never reloaded. Auth-signal-independent (also covers HOLE 4's unverified public-teaser-PLP assumption). - Verified: cap=6 empty-slate run writes fresh files + passes the gate (no false reauth); cap=2 (no dump) correctly writes NEEDS_REAUTH; openclaw evaluate reads a fresh light PLP fine. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cc268fd · 2026-08-10 · TK-10400: durable Sanderson trade harvest via openclaw (kills daily puppeteer bot-block)
harvest_trade_openclaw.sh drives the persistent authed openclaw real-Chrome session (SDG anti-bot wall lets it through) instead of bundled puppeteer (fingerprint-flagged every unattended run -> daily NEEDS_REAUTH). Same output contract (data/*_raw.txt + trade_summary.json) so parse_trade.py -> load_trade.sql -> reconcile.sql is unchanged. Fresh-tab auth (avoids the heavy-PLP innerText gateway timeout), data-driven reauth detection (0 products both cats), self-contained PATH for cron. refresh.sh Phase B now openclaw-primary + puppeteer auto-fallback. Verified live: wallpaper 2433/2433 harvested, parse parsed 615 rows. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
File tree
- .gitignore
- .playwright-mcp/console-2026-09-02T18-19-37-214Z.log
- .playwright-mcp/page-2026-09-02T18-19-38-930Z.yml
- VERSION
- _resolved/sanderson-reprice-before-20260831-104938.csv
- com.steve.sanderson-refresh.plist
- com.steve.sdg-publish-cadence.plist
- data/NEEDS_REAUTH
- data/pattern_map.tsv
- pilot/backfill_price_retail.sql
- pilot/backfill_price_trade.sql
- pilot/build_manifest_morris_verify.log
- pilot/cadence.launchd.err.log
- pilot/cadence.launchd.out.log
- pilot/cadence.log
- pilot/create-audit.jsonl
- pilot/harlequin_enum.json
- pilot/harlequin_feed_harvest.jsonl
- pilot/harlequin_feed_harvest.log
- pilot/harlequin_trade_harvest.jsonl
- pilot/held-harlequin.json
- pilot/held-morris.json
- pilot/held-sanderson.json
- pilot/held-zoffany.json
- pilot/hq_mertex_bridge.jsonl
- pilot/manifest-harlequin.json
- pilot/manifest-morris.FINALIZED-20260902T181058Z.json.bak
- pilot/manifest-morris.SETTLEMENT-REQUIRED.json
- pilot/manifest-morris.json
- pilot/manifest-sanderson.json
- pilot/manifest-zoffany.json
- pilot/morris-image-COVERAGE-REPORT.md
- pilot/morris-image-match-preview.jsonl
- pilot/morris-image-restore-map.json
- pilot/morris-image-source-finding.md
- pilot/morris_feed_harvest.jsonl
- pilot/morris_image_backfill.sql
- pilot/morris_image_backfill_restore.sql
- pilot/morris_image_harvest.jsonl
- pilot/morris_image_qa_flags.json
- pilot/morris_image_validated.jsonl
- pilot/morris_portal_harvest.jsonl
- pilot/morris_prob_candidates.json
- pilot/morris_prob_harvest.jsonl
- pilot/morris_prob_harvest2.jsonl
- pilot/morris_prob_harvest3.jsonl
- pilot/morris_prob_harvest4.jsonl
- pilot/morris_prob_harvest5.jsonl
- pilot/morris_problem_set.json
- pilot/morris_remaining.json
- pilot/morris_search_pool.txt
- pilot/morris_search_terms_done.txt
- pilot/morris_sitemap_urls.txt
- pilot/morris_sku_url_map.json
- pilot/morris_still_after_pool.json
- pilot/morris_still_missing.json
- pilot/morris_unmatched_skus.json
- pilot/queue-today-vision-blocked.json
- pilot/queue-today.json
- pilot/restore-map.jsonl
- pilot/restore_map_price_retail.json
- pilot/restore_map_price_trade.json
- pilot/sanderson_enum.json
- pilot/sanderson_feed_harvest.jsonl
- pilot/sanderson_harvest.log
- pilot/settlement-blocked-harlequin.json
- pilot/settlement-blocked-morris.json
- pilot/settlement-blocked-sanderson.json
- pilot/settlement-blocked-zoffany.json
- pilot/william_morris_catalog_restore_map_pre_sdg_backfill.csv
- pilot/zoffany_enum.json
- pilot/zoffany_feed_harvest.jsonl
- pilot/zoffany_harvest.log
- refresh.sh
- scripts/__pycache__/extract.cpython-314.pyc
- scripts/__pycache__/palette.cpython-314.pyc
- scripts/__pycache__/parse_trade.cpython-314.pyc
- scripts/assemble_queue.mjs
- scripts/backfill_morris_catalog_sdg.sql
- scripts/build_manifest.mjs
- scripts/cadence_healthcheck.mjs
- scripts/cadence_resume.sh
- scripts/create_feed_pricing_tables.sql
- scripts/create_sdg.mjs
- scripts/create_sdg_weight_heal.test.mjs
- scripts/extract.py
- scripts/finalize_morris_manifest.mjs
- scripts/harvest_harlequin_trade.mjs
- scripts/harvest_hq_mertex.mjs
- scripts/harvest_morris_images.mjs
- scripts/harvest_retail.sh
- scripts/harvest_sdg_feed.mjs
- scripts/harvest_trade.js
- scripts/harvest_trade_openclaw.sh
- scripts/harvest_width.js
- scripts/lib/inventory-stamp-guard.mjs
- scripts/lib/inventory-stamp-guard.mjs.pre-shared-lift
- scripts/lib/weight-guard.mjs
- scripts/load.sql
- scripts/load_feed_pricing.mjs
- scripts/load_trade.sql
- scripts/openclaw_harvest_brand_cat.sh
- scripts/openclaw_harvest_cat.sh
- scripts/palette.py
- scripts/parse_brand_portal.py
- scripts/parse_trade.py
- scripts/pool_morris_search.mjs
- scripts/reauth.sh
- scripts/reconcile.sql
- scripts/rollback_sdg.mjs
- scripts/settlement_gate.mjs
- scripts/settlement_vision.mjs
- scripts/validate_stage_morris.mjs
- scripts/verify_cadence_weights.mjs
- scripts/verify_cadence_weights.test.mjs
- tk10873/FOLLOWUP_DECISIONS.md
- tk10873/HANDOFF.md
- tk10873/README.md
- tk10873/RUN_LIVE.md
- tk10873/RUN_LIVE_fabric_ZAQF322696.md
- tk10873/RUN_LIVE_highclere_ZDAR312861.md
- tk10873/RUN_LIVE_v6.md
- tk10873/RUN_LIVE_v7.md
- tk10873/RUN_labeling_widewidth.md
- tk10873/VERSION
- tk10873/apply_labeling.live_plan.json
- tk10873/apply_labeling.mjs
- tk10873/apply_labeling.restore_map.live.json
- tk10873/apply_labeling.restore_map.preview.json
- tk10873/build_harvest_proposals.mjs
- tk10873/build_v4_promotions.mjs
- tk10873/build_zoffany_optionA_draft.mjs
- tk10873/cross_brand_gbp_check.md
- tk10873/cross_validate_feed.json
- tk10873/cross_validate_feed.md
- tk10873/cross_validate_feed.mjs
- tk10873/harvest_batch1.json
- tk10873/harvest_batch2.json
- tk10873/harvest_batch3.json
- tk10873/held_price_proposals.json
- tk10873/held_price_proposals.md
- tk10873/held_price_recovery_findings.md
- tk10873/lib.mjs
- tk10873/price_source_verification.md
- tk10873/promote_restore_map.json
- tk10873/promote_summary.json
- tk10873/promote_trade_verified.mjs
- tk10873/reconcile_from_feed.mjs
- tk10873/reconcile_restore_map.json
- tk10873/reconcile_summary.json
- tk10873/reprice_lib.mjs
- tk10873/reprice_live_plan.json
- tk10873/reprice_live_runbook.mjs
- tk10873/reprice_restore_map.live.json
- tk10873/reprice_restore_map.preview.json
- tk10873/reprice_runbook.mjs
- tk10873/reprice_runbook_dryrun.json
- tk10873/reprice_sanity.json
- tk10873/reprice_sanity.md
- tk10873/reprice_sanity.mjs
- tk10873/retire_dupes.mjs
- tk10873/retire_dupes.restore_map.live.json
- tk10873/retire_dupes.restore_map.preview.json
- tk10873/test_cross_validate.mjs
- tk10873/test_optionA.mjs
- tk10873/test_promote.mjs
- tk10873/test_proposals.mjs
- tk10873/test_reprice.mjs
- tk10873/validate_draft.mjs
- tk10873/verification/e2e-proof.json
- tk10873/zoffany_fabric_ZAQF322696.json
- tk10873/zoffany_fabric_ZAQF322696.live_plan.json
- tk10873/zoffany_fabric_ZAQF322696.restore_map.live.json
- tk10873/zoffany_fabric_ZAQF322696.restore_map.preview.json
- tk10873/zoffany_optionA_draft.csv
- tk10873/zoffany_optionA_draft.json
- tk10873/zoffany_optionA_draft_feedreconciled.json
- tk10873/zoffany_optionA_draft_v3.json
- tk10873/zoffany_optionA_promotions_v4.json
- tk10873/zoffany_optionA_promotions_v4.live_plan.json
- tk10873/zoffany_optionA_promotions_v4.restore_map.live.json
- tk10873/zoffany_optionA_promotions_v4.restore_map.preview.json
- tk10873/zoffany_optionA_promotions_v5.json
- tk10873/zoffany_optionA_promotions_v5.live_plan.json
- tk10873/zoffany_optionA_promotions_v5.restore_map.live.json
- tk10873/zoffany_optionA_promotions_v5.restore_map.preview.json
- tk10873/zoffany_optionA_promotions_v6.json
- tk10873/zoffany_optionA_promotions_v6.live_plan.json
- tk10873/zoffany_optionA_promotions_v6.restore_map.preview.json
- tk10873/zoffany_optionA_promotions_v7.json
- tk10873/zoffany_optionA_promotions_v7.live_plan.json
- tk10873/zoffany_optionA_promotions_v7.restore_map.live.json
- tk10873/zoffany_optionA_promotions_v7.restore_map.preview.json
- tk10873/zoffany_optionA_summary.json
- tk10873/zoffany_roll_ZDAR312861_highclere.json
- tk10873/zoffany_roll_ZDAR312861_highclere.live_plan.json
- tk10873/zoffany_roll_ZDAR312861_highclere.restore_map.live.json
- tk10873/zoffany_roll_ZDAR312861_highclere.restore_map.preview.json
- tk10873/zoffany_widewidth_VERIFIED.md
- tk10873/zoffany_widewidth_labeling_spec.json
- tk10873/zoffany_widewidth_mislabel_suspects.json
- tk10873/zoffany_widewidth_reprice_draft.json