Sanderson Onboard

repo: ~/Projects/sanderson-onboard · 179 commits · 4 in last 24h, 21 in last 7d · ▄▃▂█▆ ▅

Search the build

179 commits indexed

  1. 4ddb0bd 2026-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
  2. 507de41 2026-09-26 auto-data-snapshot: 2026-09-26T06:47:29 (3 data files) — pilot/cadence.log pilot/manifest-harlequin.json pilot/manifest-zoffany.json
  3. 9bac925 2026-09-26 auto-data-snapshot: 2026-09-26T05:45:52 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json
  4. 1bd87b1 2026-09-26 auto-data-snapshot: 2026-09-26T04:44:27 (1 data files) — pilot/cadence.log
  5. f6b719e 2026-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
  6. 7bd08e8 2026-09-24 auto-data-snapshot: 2026-09-24T07:06:26 (2 data files) — pilot/cadence.log pilot/manifest-zoffany.json
  7. a759ec9 2026-09-24 auto-data-snapshot: 2026-09-24T06:34:34 (2 data files) — pilot/cadence.log pilot/manifest-harlequin.json
  8. bc631ac 2026-09-24 auto-data-snapshot: 2026-09-24T05:30:55 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json
  9. 319c4a6 2026-09-24 auto-data-snapshot: 2026-09-24T04:59:33 (1 data files) — pilot/cadence.log
  10. e1c69d4 2026-09-23 auto-data-snapshot: 2026-09-23T07:56:48 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  11. 960bf42 2026-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
  12. f5e8cb4 2026-09-23 auto-data-snapshot: 2026-09-23T06:53:48 (3 data files) — pilot/cadence.log pilot/manifest-harlequin.json pilot/manifest-zoffany.json
  13. 898789f 2026-09-23 auto-data-snapshot: 2026-09-23T05:50:13 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json
  14. 1db0c56 2026-09-23 auto-data-snapshot: 2026-09-23T04:47:26 (1 data files) — pilot/cadence.log
  15. 990fe42 2026-09-22 Fix: replace hardcoded-path shim with portable resolution (TK-11786)
  16. f62ba40 2026-09-22 auto-data-snapshot: 2026-09-22T11:43:24 (1 data files) — scripts/lib/inventory-stamp-guard.mjs.pre-shared-lift
  17. 39285ca 2026-09-21 auto-data-snapshot: 2026-09-21T05:33:35 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  18. 9c0fa3f 2026-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
  19. 68b14c4 2026-09-20 auto-data-snapshot: 2026-09-20T05:34:32 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  20. cd91a5f 2026-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
  21. 0229d9e 2026-09-20 TK-11829: add Morris & Co SDG mfr_sku backfill scripts
  22. dc867b3 2026-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
  23. b059fb9 2026-09-19 auto-data-snapshot: 2026-09-19T08:23:45 (2 data files) — pilot/cadence.log pilot/manifest-zoffany.json
  24. 7461cac 2026-09-19 auto-data-snapshot: 2026-09-19T06:48:50 (2 data files) — pilot/cadence.log pilot/manifest-harlequin.json
  25. 905d6d5 2026-09-19 auto-data-snapshot: 2026-09-19T05:44:32 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json
  26. 1b146ef 2026-09-19 auto-data-snapshot: 2026-09-19T04:40:20 (1 data files) — pilot/cadence.log
  27. acd34d8 2026-09-18 auto-data-snapshot: 2026-09-18T08:22:45 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  28. fe5d845 2026-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
  29. 19664fc 2026-09-18 auto-data-snapshot: 2026-09-18T06:45:31 (3 data files) — pilot/cadence.log pilot/manifest-harlequin.json pilot/manifest-zoffany.json
  30. 2b2c0bd 2026-09-18 auto-data-snapshot: 2026-09-18T05:41:24 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json
  31. 7c76ee7 2026-09-18 auto-data-snapshot: 2026-09-18T04:37:40 (1 data files) — pilot/cadence.log
  32. 4e40f36 2026-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
  33. 08ea60a 2026-09-17 auto-data-snapshot: 2026-09-17T05:03:29 (2 data files) — pilot/cadence.log pilot/queue-today.json
  34. 49f73ae 2026-09-17 auto-data-snapshot: 2026-09-17T04:30:36 (1 data files) — pilot/cadence.log
  35. c069ecd 2026-09-16 reauth.sh: mark executable so a bare path runs (no 'bash' prefix needed)
  36. e269e66 2026-09-16 auto-data-snapshot: 2026-09-16T05:44:01 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  37. 971dfbd 2026-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
  38. a590ea7 2026-09-16 auto-data-snapshot: 2026-09-16T04:39:34 (1 data files) — pilot/cadence.log
  39. 621a604 2026-09-15 auto-data-snapshot: 2026-09-15T06:37:28 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  40. cb4633e 2026-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
  41. 7a19e65 2026-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
  42. 4726f6b 2026-09-15 auto-data-snapshot: 2026-09-15T04:59:55 (1 data files) — pilot/cadence.log
  43. 2c6aabf 2026-09-14 auto-data-snapshot: 2026-09-14T07:18:26 (2 data files) — pilot/cadence.log pilot/manifest-zoffany.json
  44. ffcb4e4 2026-09-14 auto-data-snapshot: 2026-09-14T06:45:42 (2 data files) — pilot/cadence.log pilot/manifest-harlequin.json
  45. 89aaf96 2026-09-14 auto-data-snapshot: 2026-09-14T05:41:34 (2 data files) — pilot/cadence.log pilot/manifest-sanderson.json
  46. adc1dfb 2026-09-14 auto-data-snapshot: 2026-09-14T04:37:30 (1 data files) — pilot/cadence.log
  47. 24b4cfc 2026-09-13 auto-data-snapshot: 2026-09-13T05:55:37 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  48. 64593e3 2026-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
  49. 10b1e93 2026-09-13 auto-data-snapshot: 2026-09-13T04:48:57 (2 data files) — pilot/cadence.log pilot/queue-today.json
  50. bdbbf26 2026-09-12 chore: v1.1.2 (TK-11471 session close — per-run cadence weight proof + verified heal)
  51. 627ad5c 2026-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
  52. 126b4bc 2026-09-12 auto-data-snapshot: 2026-09-12T05:03:08 (2 data files) — pilot/cadence.log pilot/queue-today.json
  53. d9e8fa8 2026-09-11 TK-11471: verify the SDG weight heal, and stop the verifier reading green on a pre-fix run
  54. 5507351 2026-09-11 TK-11471: per-RUN weight proof for the SDG publish cadence
  55. 8d09eed 2026-09-11 TK-11414: stop the SDG weight leak at the source (create_sdg.mjs)
  56. 1fe3fca 2026-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
  57. 928bb57 2026-09-11 auto-data-snapshot: 2026-09-11T04:57:32 (2 data files) — pilot/cadence.log pilot/queue-today.json
  58. 5c8dbdf 2026-09-11 auto-data-snapshot: 2026-09-11T01:40:13 (1 data files) — data/NEEDS_REAUTH
  59. edc210b 2026-09-10 TK-11357 Fix D: route create_sdg's inventory stamp through the shared $0 guard (defence-in-depth)
  60. f7d2426 2026-09-10 auto-data-snapshot: 2026-09-10T05:55:20 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  61. d4db064 2026-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
  62. fa4d39b 2026-09-10 auto-data-snapshot: 2026-09-10T04:50:00 (2 data files) — pilot/cadence.log pilot/queue-today.json
  63. 65a8c0b 2026-09-09 auto-data-snapshot: 2026-09-09T05:45:52 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  64. ef454d3 2026-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
  65. 90151ab 2026-09-09 auto-data-snapshot: 2026-09-09T04:40:57 (1 data files) — pilot/cadence.log
  66. b247757 2026-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
  67. 4ff36bf 2026-09-08 auto-data-snapshot: 2026-09-08T04:33:12 (1 data files) — pilot/cadence.log
  68. f999a3c 2026-09-07 auto-data-snapshot: 2026-09-07T05:33:36 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  69. fcf4240 2026-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
  70. d377662 2026-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
  71. aef8255 2026-09-06 auto-data-snapshot: 2026-09-06T04:34:41 (2 data files) — pilot/cadence.log pilot/queue-today.json
  72. a70d7a9 2026-09-05 auto-data-snapshot: 2026-09-05T05:34:51 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  73. d3f540c 2026-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
  74. 4eb1f7d 2026-09-04 TK-11256: fix gallery-image cross-contamination in Sanderson extractor
  75. a721805 2026-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
  76. 0333af7 2026-09-04 auto-data-snapshot: 2026-09-04T04:33:28 (1 data files) — pilot/cadence.log
  77. 1cbf0ec 2026-09-03 auto-data-snapshot: 2026-09-03T07:56:56 (3 data files) — pilot/cadence.log pilot/create-audit.jsonl pilot/restore-map.jsonl
  78. 7267fb8 2026-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
  79. f446fd5 2026-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
  80. cb01bb1 2026-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
  81. be278d0 2026-09-02 TK-10881: Morris & Co image re-harvest -> 1152/1162 (99.1%) verified images staged to manifest-morris.json
  82. 43ac3dd 2026-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
  83. 4cc645e 2026-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
  84. 3bf4d84 2026-08-31 TK-10881: activated the final 2 fresh SDG products (DWXH-600067/68) — validateBeforeActivate PASS, 192 already active; 194/194 complete
  85. 83f5d7b 2026-08-31 auto-data-snapshot: 2026-08-31T11:55:57 (2 data files) — pilot/create-audit.jsonl pilot/restore-map.jsonl
  86. da24f01 2026-08-31 route rollback_sdg undo path to SHOPIFY_FULL_ACCESS_TOKEN to match forward path (TK-10979 DTD-A)
  87. 37e845d 2026-08-31 auto-data-snapshot: 2026-08-31T11:17:15 (2 data files) — pilot/create-audit.jsonl pilot/restore-map.jsonl
  88. 461a34a 2026-08-31 TK-00058: pre-reprice snapshot (Sanderson +10% UK duty rollback source)
  89. cc802e1 2026-08-31 route create_sdg to SHOPIFY_FULL_ACCESS_TOKEN for write_inventory (TK-10979 DTD-A bridge)
  90. 79bbeca 2026-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
  91. 494134f 2026-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)
  92. 2d6ad38 2026-08-31 TK-10873: record live labeling restore map (44 rows) — the shipped-labeling undo artifact
  93. 7fdd9d8 2026-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
  94. 7fd6304 2026-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
  95. b7e94de 2026-08-31 TK-10873: add restore-map-first apply_labeling.mjs (dry-run verified, gated)
  96. c12e702 2026-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)
  97. 9b37d1b 2026-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
  98. 7da95c2 2026-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
  99. cc12cba 2026-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
  100. a38bad0 2026-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
  101. bcd3bc5 2026-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
  102. 8501ce7 2026-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
  103. 356878b 2026-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
  104. f9f4a13 2026-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)
  105. ab67f43 2026-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
  106. 14801cd 2026-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
  107. 19befb6 2026-08-31 TK-10873: re-verify 3 held Darnley rows — confirm Mitford $416, catch Tigers Eye live unit-mislabel, tighten Highclere
  108. e45a55d 2026-08-31 auto-data-snapshot: 2026-08-31T02:39:25 (1 data files) — tk10873/VERSION
  109. 590425c 2026-08-31 chore: lint (1 regex fix), refactor (shadow rename), v1.1.2 + reversibility maps (session close)
  110. 3f77c49 2026-08-31 tk10873: stage v5 local artifact (Darnley+Mitford verified at 416)
  111. 35b8a8b 2026-08-31 TK-10873: decisions doc — 42 ship / 2 hold after DTD refine + Ebru II price fix
  112. 01e2bc0 2026-08-31 TK-10873: fix — Ebru II ships at VERIFIED $342, not the stale $230 scrape (verified-price override)
  113. 7e2cada 2026-08-31 TK-10873: DTD+Cody refine — ship Ebru II (pinned) into v4 (42), hold Darnley+Mitford as Darnley-collection confirm
  114. 6dedf49 2026-08-31 TK-10873 follow-up: 41 web-verified harvested promotions (v4), 3 held below-list, Domino dropped; decisions doc
  115. fc1b467 2026-08-31 auto-data-snapshot: 2026-08-31T01:22:16 (1 data files) — tk10873/reprice_restore_map.live.json
  116. 6493047 2026-08-31 TK-10873: restore-map-first live reprice runbook (277 rows, Cody-hardened) + run card
  117. c27e3d8 2026-08-30 chore: lint (0 fixes) + refactor (dedup isVerified in reconcile_from_feed) + v1.1.1 (session close, TK-10873)
  118. 42a6e25 2026-08-30 TK-10873: final handoff / decision package — consolidates 9 cycles into one gated-decision doc for Steve
  119. 7c70057 2026-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
  120. ba4d03e 2026-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
  121. b80844e 2026-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
  122. a72761f 2026-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
  123. 2d6980f 2026-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)
  124. 0861b88 2026-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
  125. 6bc0c25 2026-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
  126. a08d3c6 2026-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.
  127. b68c064 2026-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
  128. 55fb121 2026-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)
  129. 2007d57 2026-08-30 TK-10873 cycle3: DRY-RUN reprice runbook + independent sanity gate for Zoffany Option-A (328 REPRICE)
  130. 5be9325 2026-08-30 TK-10873 validate deterministic Zoffany Option-A draft
  131. 98e4c8e 2026-08-30 TK-10873 cycle1: HELD price-recovery findings (3 rows stay held; 313114 image-code candidate flagged, ZFOW312943 source-conflict documented)
  132. a910c50 2026-08-30 TK-10873: Zoffany Option-A sample-add + price draft artifacts (read-only, no live writes)
  133. 87c64c1 2026-08-26 SDG: wire settlement image-vision gate into cadence; batch-1 queue 194 vision-clean+0 blocked (TK-10881)
  134. 8b984cb 2026-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)
  135. 0d235c3 2026-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)
  136. 7ff6f00 2026-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)
  137. c6d9704 2026-08-26 TK-10877: harvest Morris & Co full catalog (wp+fabric) from SDG US trade portal
  138. 55f6f95 2026-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
  139. 3683ffb 2026-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)
  140. 6d6f382 2026-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)
  141. e99ff7c 2026-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
  142. 5516c54 2026-08-26 TK-10877: feed-pricing staging tables (wp+fabric, trade+retail, distinct from legacy catalogs)
  143. 004cd21 2026-08-26 TK-10877: generalized SDG feed harvester (full wp+fabric enumeration, SSP/2 trade, retail derive, checkpointed)
  144. 3039681 2026-08-26 Harlequin pricing pilot: feed-first trade harvest (732/842) + retail backfill + DWHF reconcile + pilot memo (TK-10874)
  145. fa6fd8a 2026-08-25 auto-data-snapshot: 2026-08-25T12:06:42 (1 data files) — data/NEEDS_REAUTH
  146. b625586 2026-08-25 auto-data-snapshot: 2026-08-25T11:28:19 (1 data files) — data/pattern_map.tsv
  147. 1230f7f 2026-08-12 auto-data-snapshot: 2026-08-12T04:46:32 (1 data files) — data/pattern_map.tsv
  148. bb60bb7 2026-08-11 auto-data-snapshot: 2026-08-11T05:32:12 (1 data files) — data/sanderson_fabric_raw.txt.tmp
  149. d6f5ac3 2026-08-11 auto-data-snapshot: 2026-08-11T05:01:24 (1 data files) — data/sanderson_fabric_raw.txt.tmp
  150. e9c105a 2026-08-10 chore: harvest_width.js refactor (hoist fs require) + v1.0.1→1.1.0 (session close)
  151. fa05ca1 2026-08-10 Sanderson: harvest product width from public retail API ($0, no auth) into sanderson_catalog.width
  152. c895b56 2026-08-10 TK-10400 Cody-gate fixes: reauth->openclaw, tab-race, freshness gate (kill silent stale reload)
  153. d174e0d 2026-08-10 openclaw real-Chrome trade-harvester: crash-safe cumulative Load-More PLP harvest (defeats SDG bot-wall that blocked headless since 07-25)
  154. cc268fd 2026-08-10 TK-10400: durable Sanderson trade harvest via openclaw (kills daily puppeteer bot-block)
  155. 85f2103 2026-08-10 auto-data-snapshot: 2026-08-10T08:54:43 (1 data files) — data/NEEDS_REAUTH
  156. 094ac9e 2026-08-10 auto-data-snapshot: 2026-08-10T04:47:23 (1 data files) — data/NEEDS_REAUTH
  157. d3746aa 2026-08-09 auto-data-snapshot: 2026-08-09T05:08:26 (1 data files) — data/NEEDS_REAUTH
  158. f8ce5bc 2026-08-07 auto-data-snapshot: 2026-08-07T04:54:46 (2 data files) — data/NEEDS_REAUTH data/pattern_map.tsv
  159. b3d05a9 2026-08-06 auto-save: 2026-08-06T04:48:33 (2 files) — data/NEEDS_REAUTH data/pattern_map.tsv
  160. 4aab867 2026-08-05 auto-save: 2026-08-05T05:39:25 (1 files) — data/NEEDS_REAUTH
  161. 1826b06 2026-08-05 auto-save: 2026-08-05T04:39:04 (1 files) — data/pattern_map.tsv
  162. 6c41f9b 2026-08-04 auto-save: 2026-08-04T04:59:56 (1 files) — data/NEEDS_REAUTH
  163. c832486 2026-08-03 auto-save: 2026-08-03T04:50:22 (1 files) — data/NEEDS_REAUTH
  164. ee3b8ca 2026-08-02 auto-save: 2026-08-02T05:12:23 (1 files) — data/NEEDS_REAUTH
  165. a95c17d 2026-08-01 auto-save: 2026-08-01T05:03:35 (2 files) — data/NEEDS_REAUTH data/pattern_map.tsv
  166. 253d8c6 2026-08-01 auto-save: 2026-08-01T04:33:25 (1 files) — data/pattern_map.tsv
  167. f729888 2026-07-31 auto-save: 2026-07-31T04:53:53 (1 files) — data/NEEDS_REAUTH
  168. 917df53 2026-07-30 auto-save: 2026-07-30T05:14:49 (1 files) — data/NEEDS_REAUTH
  169. eb3cce9 2026-07-29 auto-save: 2026-07-29T05:06:01 (1 files) — data/NEEDS_REAUTH
  170. 2dc42c3 2026-07-28 auto-save: 2026-07-28T04:57:26 (1 files) — data/NEEDS_REAUTH
  171. e7a1587 2026-07-27 auto-save: 2026-07-27T04:48:02 (1 files) — data/NEEDS_REAUTH
  172. 7023ff8 2026-07-26 auto-save: 2026-07-26T05:10:45 (1 files) — data/NEEDS_REAUTH
  173. f9c9175 2026-07-25 auto-save: 2026-07-25T05:03:47 (2 files) — data/NEEDS_REAUTH data/pattern_map.tsv
  174. 5c3b4fe 2026-07-25 auto-save: 2026-07-25T04:33:37 (1 files) — data/pattern_map.tsv
  175. 678101f 2026-07-24 auto-save: 2026-07-24T04:55:26 (2 files) — data/NEEDS_REAUTH data/pattern_map.tsv
  176. 78e0a17 2026-07-23 auto-save: 2026-07-23T05:48:54 (1 files) — data/NEEDS_REAUTH
  177. 1ee3998 2026-07-23 auto-save: 2026-07-23T04:48:39 (1 files) — data/pattern_map.tsv
  178. 846688e 2026-07-22 chore: lint, refactor (file-handle hygiene), v1.0.1 (session close)
  179. 1c623a5 2026-07-22 Sanderson daily-cadence staging pipeline (retail feed-first + best-effort trade portal)

Authors

Agents used

  • none detected

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

Commits with substantial prose (≥120 chars) — the rationale behind each move.

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

202 files tracked. Click any to browse the source at HEAD.

Other build journals

← Sample Followup Sweep  ·  all 4 projects  ·  Scarlet Riverboat Masquerade →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 4ms