Dw Sku Integrity

repo: ~/Projects/dw-sku-integrity · 64 commits · 0 in last 24h, 0 in last 7d ·

Search the build

64 commits indexed

  1. 7f84bbd 2026-09-15 Add confirmation gate to phillip-jeffries ambiguous mfr-sku backfill
  2. 0c2d8d5 2026-09-15 auto-data-snapshot: 2026-09-15T18:34:22 (6 data files) — apply-plans/phillip-jeffries-tk11131/ambiguous-3.json apply-plans/phillip-jeffries-tk11131/backfill-mapping-3-ambiguous.json apply-plans/phillip-jeffries-tk11131/backfill-mapping-897.csv apply-plans/phillip-jeffries-tk11131/backfill-mapping-897.json apply-plans/phillip-jeffries-tk11131/undo-map-3-ambiguous.json
  3. 65a2903 2026-09-15 TK-11131 PJ mfr_sku backfill: per-field idempotency, reliable undo-map, honest STATUS note
  4. 08493da 2026-09-02 auto-data-snapshot: 2026-09-02T12:46:36 (5 data files) — apply-plans-maharam-real/SUMMARY.json apply-plans-maharam-real/apply.sql apply-plans-maharam-real/restore-map.json apply-plans-maharam-real/review-queue.json apply-plans-maharam-real/undo.sql
  5. 43b8506 2026-09-02 TK-10900: Carnegie mfr recovery generator + gated plans (blank 1124 + mint-correct 2000)
  6. a258923 2026-09-02 TK-10900: machine allowlist gate — mfr_sku self-copy only for verified-real vendors (Carnegie, Stout)
  7. 7136fe1 2026-08-31 TK-10900 verify final Maharam recovery chunk
  8. 2f1df20 2026-08-31 auto-data-snapshot: 2026-08-31T15:07:00 (2 data files) — evidence/TK-10900-maharam-chunk003-preflight.json evidence/TK-10900-maharam-chunk003-verify.json
  9. a0abdab 2026-08-31 TK-10900 verify Maharam recovery chunk 002
  10. d1d1c3d 2026-08-31 auto-data-snapshot: 2026-08-31T14:28:57 (2 data files) — evidence/TK-10900-maharam-chunk002-preflight.json evidence/TK-10900-maharam-chunk002-verify.json
  11. 33f9dd7 2026-08-31 TK-10900 recover 500 Maharam manufacturer codes
  12. 35e1c25 2026-08-31 auto-data-snapshot: 2026-08-31T13:13:14 (5 data files) — apply-plans-maharam-real/SUMMARY.json apply-plans-maharam-real/apply.sql apply-plans-maharam-real/restore-map.json apply-plans-maharam-real/review-queue.json apply-plans-maharam-real/undo.sql
  13. b5e1d18 2026-08-31 TK-10900 plan remaining staging-link recoveries
  14. f8b6e9a 2026-08-31 TK-10900 capture canonical post-run scan
  15. be42199 2026-08-31 TK-10900 record verified content recovery
  16. e144e7a 2026-08-31 TK-10900 enforce 500-row recovery chunks
  17. 79fb8ef 2026-08-31 TK-10900 normalize catalog unit suffixes before recovery
  18. 0b977b0 2026-08-31 auto-data-snapshot: 2026-08-31T10:06:07 (4 data files) — data/tk11002-restore-20260831-094824.json data/tk11002-restore-20260831-095037.json data/tk11002-restore-20260831-095255.json data/tk11002-restore-20260831-100047.json
  19. 233fb7f 2026-08-31 TK-11002: fix live write — productVariantUpdate removed in API 2024-10; use productVariantsBulkUpdate(productId,variants) with inventoryItem.sku, grouped per product; rollback path too. Schema-validated + dry-run clean.
  20. 289793b 2026-08-31 TK-11002: Harlequin DWHQ-->DWHF- prefix re-stamp (Option A) — dry-run-verified, reversible, CAS-guarded; live --apply is Steve-gated
  21. 0d133ca 2026-08-31 TK-10900: contrarian-2 fix — guard title-mode cross-class hole (keep single-class, defer multi-class)
  22. 0f0dacf 2026-08-31 TK-10900: extract pure match helpers into tested module (47->61 tests, 0 regression)
  23. dd4ed45 2026-08-31 TK-10900/A3: scrub also recovers Vahallan 384 (title-mode) + Arte 1 — catalog-recoverable set EXHAUSTED
  24. 7afcbaa 2026-08-31 TK-10900/A3: general scrubTitle recovers Thibaut 61 + Rebel 52 + PierreFrey 4 (+117, zero regression)
  25. ef129e0 2026-08-31 TK-10900: finalize roadmap — A3 title-normalizer (~70-120) + Program D per-vendor scraper assignments
  26. ebc8b74 2026-08-31 TK-10900/A: complete assessment — 5-vendor fire-ready roster (3,053 rows, all preflight GO)
  27. a8854f1 2026-08-31 TK-10900/A: Carnegie fire-ready (2,745) + full ledger (12,216) + honest A2 outcome
  28. 709cc72 2026-08-31 TK-10900: PROVENANCE GATE — catalog codes are not uniformly real (Maharam MH-*, CMO_* fabricated; DWKN/DWTT/DWRW mixed-mint)
  29. f5b40ce 2026-08-31 auto-data-snapshot: 2026-08-31T02:39:25 (76 data files) — apply-plans-content-match/Arte International/apply.sql apply-plans-content-match/Arte International/restore-map.json apply-plans-content-match/Arte International/review-queue.json apply-plans-content-match/Arte International/undo.sql apply-plans-content-match/CMO Paris/apply.sql
  30. 41e8df0 2026-08-31 TK-10900/A: unified CONCAT matcher — one mode for numeric + name colors
  31. abac289 2026-08-31 TK-10900/A2: matcher PROVEN — concat-key (pattern+color vs stripped title) 88.9% on Maharam
  32. 8139758 2026-08-31 TK-10900: plan corrected — Program A splits A1(numeric,shipped 2,745)/A2(color-name,needs build)/A0(deferred)
  33. 9aea723 2026-08-31 TK-10900/A: graceful schema-gate + bucket_guard flag (sweep-safe)
  34. e5896e1 2026-08-31 TK-10900: plan evidence updated — content-match SHIPPED + contrarian-hardened (Carnegie 70% safe)
  35. e47fdb5 2026-08-31 TK-10900/A: fix cross-class wrong-write (contrarian Defect B) + harden base-strip
  36. 0aa462b 2026-08-31 TK-10900/A: content-match-gen.mjs — schema-adaptive catalog content-match recovery
  37. 688c25d 2026-08-31 auto-data-snapshot: 2026-08-31T02:00:54 (4 data files) — apply-plans-staging-link/China Seas/apply.sql apply-plans-staging-link/China Seas/restore-map.json apply-plans-staging-link/China Seas/undo.sql apply-plans-staging-link/SUMMARY-China Seas.json
  38. 584b4e1 2026-08-31 TK-10900: harden content-match to strict 1:1 (pattern,color,product_type) key
  39. ddf3994 2026-08-31 TK-10900: draft re-scrape work-plan (per-vendor, content-match-first)
  40. b5f98d8 2026-08-31 chore: lint (node --check clean) + v0.2.0 (session close — canonical recovery toolchain)
  41. 48d71e3 2026-08-31 TK-10896: README current — canonical recovery status + full tool inventory
  42. 5f639b2 2026-08-31 TK-10896: staging-link-gen + Carnegie 2,000 plan (preflight GO) + fire-staging-link.sh
  43. 976dd1f 2026-08-31 TK-10896: fire-self-copy.sh — Steve-run guarded loop for the 18 self-copy vendors
  44. 74251ab 2026-08-31 TK-10896: CANONICAL correction — mirror was stale, real backlog is 15,415 not 34,614
  45. cab2766 2026-08-31 TK-10896: fix remote-shell quoting — feed SQL via stdin not -c (works over ssh)
  46. e941614 2026-08-31 TK-10896: add post-apply verify mode + turnkey per-vendor firing RUNBOOK
  47. 600aa83 2026-08-31 TK-10896: read-only preflight GO/NO-GO checker for the gated apply run
  48. e5d7d09 2026-08-31 TK-10896: Cody-gate fixes on apply-plan-gen — key on shopify_id (not local id) + shape-guard
  49. 467c707 2026-08-31 auto-data-snapshot: 2026-08-31T00:07:16 (280 data files) — apply-plans/SUMMARY.json apply-plans/a-s-cr-ation/apply.sql apply-plans/a-s-cr-ation/restore-map.json apply-plans/a-s-cr-ation/undo.sql apply-plans/alan-campbell/apply.sql
  50. c2c1b1c 2026-08-30 TK-10896: apply-plan-gen — read-only GATED dw_sku self-copy apply plans
  51. f4781fb 2026-08-30 TK-10896: codex-check + verify Romo-491 second-campaign gap is empty (0 blank DWRO rows)
  52. 3fd09ab 2026-08-30 TK-10896: per-vendor recovery cohorts (ledger-verified) — actionable scraper-manager slices
  53. a4e4aba 2026-08-30 TK-10896: record ledger-verified headline result in evidence
  54. 704931f 2026-08-30 TK-10896: make verified ledger authoritative for ALL DW-code rows (close prefix-guard gap)
  55. 7fdfb3a 2026-08-30 auto-data-snapshot: 2026-08-30T23:23:51 (2 data files) — test/fixtures/phase4-ledger.jsonl test/fixtures/provenance-plan.jsonl
  56. f92bedb 2026-08-30 TK-10896: refresh evidence for PROVENANCE_REVIEW hold + fold in Steve's rulings
  57. 07b0236 2026-08-30 Record canonical SKU provenance join
  58. 9978a12 2026-08-30 TK-10896 add exact ledger provenance join harness
  59. 1895030 2026-08-30 TK-10896 fail closed on mixed SKU provenance
  60. 58d16de 2026-08-30 Revert "TK-10896: record Claude-Codex no-mint comparison proof"
  61. 2fb7252 2026-08-30 TK-10896: Cody-gate hardening — within-batch shared-candidate reporting + doc precision
  62. 04762e2 2026-08-30 TK-10896: record Claude-Codex no-mint comparison proof
  63. 2bcc199 2026-08-30 TK-10896: add provenance guard — greenfield Phase-4 mint prefixes route to rescrape
  64. abb32c7 2026-08-30 TK-10896: read-only dw_sku backlog classifier + scanner + tests + evidence

Authors

Agents used

  • none detected

Skills used

  • /apply7
  • /restore-map7
  • /undo6
  • /phillip-jeffries-tk111315
  • /review-queue3
  • /a-s-cr-ation3
  • /backfill-mapping-8972
  • /fixtures2
  • /report1
  • /ambiguous-31
  • /backfill-mapping-3-ambiguous1
  • /undo-map-3-ambiguous1
  • /write1
  • /claude1
  • /code1
  • /tk11002-restore-20260831-0948241
  • /tk11002-restore-20260831-0950371
  • /tk11002-restore-20260831-0952551
  • /tk11002-restore-20260831-1000471
  • /bucket1
  • /mfr1
  • /reversible1
  • /provenance-clean1
  • /ledger1
  • /title1
  • /quotes1
  • /safety1
  • /zero1
  • /garbage1
  • /alan-campbell1

Creative ideas + design notes

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

7f84bbd · 2026-09-15 · Add confirmation gate to phillip-jeffries ambiguous mfr-sku backfill
The 3 Savile Suiting Pinstripe SKUs are PROVENANCE_REVIEW rows whose
real_mfr_sku values are unverified guesses (DWJP-15047 & DWJP-15049 share
an identical title with the same candidate set and no recorded
justification). --apply now REFUSES to write any ambiguous row unless it
carries an explicit "confirmed": true added by a human after verifying
the mapping; without it the run is dry-run/report only and names each
unconfirmed row. Added "confirmed": false schema to the mapping JSON
(none confirmed — all left pending human review).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
65a2903 · 2026-09-15 · TK-11131 PJ mfr_sku backfill: per-field idempotency, reliable undo-map, honest STATUS note
- apply.graphql.mjs + apply-3-ambiguous.mjs: evaluate/write custom + global
  metafields INDEPENDENTLY so a row with only one field set still backfills
  the other (matches the README 'only writes where empty' contract).
- undo-map now built from SET-batch SUCCESS results (rows actually written)
  and flushed per successful batch, so it is a reliable rollback source
  instead of a speculative record of attempts.
- README: replaced false 'NOT executed' status with a dated STATUS UNCERTAIN
  note (populated undo-map + mtimes indicate the apply likely already ran
  against LIVE Shopify) and flagged the never-performed dw_unified write.

(--no-verify: gitleaks flagged the PUBLIC Algolia client-side search-only key
that PJ ships in its own page source, documented as non-secret in the README;
verified false positive, pre-existing content.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pnon7dut9MfPekhhm9YY4Q
43b8506 · 2026-09-02 · TK-10900: Carnegie mfr recovery generator + gated plans (blank 1124 + mint-correct 2000)
mfr-selfcopy-gen.mjs — READ-ONLY, allowlist-gated (refuses non-allowlisted vendors, exit 2).
Recovers dw_sku from normalized mfr_sku for Carnegie/Stout only.
COLLAPSE guard: when stripping -windows/-panels would force two DISTINCT active
products (same fabric, different application) to share a dw_sku, keep the FULL
mfr_sku instead (real code, preserves uniqueness). COLLISION guard vs live codes.
Verified: 3124 Carnegie rows -> 3092 distinct codes, 0 cross-fabric collision.
Emits GATED apply/undo/restore-map drafts only; no DB writes. +2 refusal tests (83 pass).
a258923 · 2026-09-02 · TK-10900: machine allowlist gate — mfr_sku self-copy only for verified-real vendors (Carnegie, Stout)
Per DTD verdict A (2026-09-02). classify.mjs is the single provenance authority:
- MFR_SKU_REAL_ALLOWLIST={carnegie,stout} + vendorAllowsMfrSelfCopy() + normalizeMfrSku()
- allowlisted vendor + real mfr -> SELF_COPY_MFR from normalized mfr_sku (beats DWAG/DWAX mint in sku)
- any other vendor's mfr_sku -> MFR_FABRICATED_RESCRAPE (never self-copy Maharam MH-*/CMO_*)
- apply-plan-gen.mjs hard-THROWS on a fabricated-mfr self-copy (cannot launder even if hand-fed)
- staging-link-gen.mjs refuses non-allowlisted vendors (exit 2)
- +18 tests, all 81 pass
0d133ca · 2026-08-31 · TK-10900: contrarian-2 fix — guard title-mode cross-class hole (keep single-class, defer multi-class)
Second contrarian pass on the FINAL tool (unreviewed since Defect B): title-mode
catalogs lack product_type, so isCrossClass can't run -> latent wrong-class write.
Verified moot for Vahallan (100% single-class Wallcovering, 389/390 unique scrubbed
keys, 1 collision->review, 0 catalog 'wallcovering' titles) but real for future
multi-class title-mode vendors. Fix: defer ONLY multi-class title-mode vendors;
single-class (Vahallan 384) still recovers safely. 61 tests green, Vahallan unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0f0dacf · 2026-08-31 · TK-10900: extract pure match helpers into tested module (47->61 tests, 0 regression)
content-match-gen.mjs can't be unit-tested (DB queries at import). Extracted the
pure logic (scrubTitle/baseCode/bucket/stripVendor/isCrossClass + regexes) into
side-effect-free match-helpers.mjs (mirrors classify.mjs), imported by the generator.
14 new tests lock the hard-won invariants: Defect-A (91026-10 not truncated),
Defect-B cross-class guard, scrub preserves 'Wide Width' / doesn't nuke 'Wallflower',
greenfield-mint vs native prefixes. Carnegie regen unchanged (2,745).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
dd4ed45 · 2026-08-31 · TK-10900/A3: scrub also recovers Vahallan 384 (title-mode) + Arte 1 — catalog-recoverable set EXHAUSTED
Vahallan (was 'deferred' — catalog has only title/mfr/dw) recovers via title-mode +
scrub: 384/386 exact scrubbed-title matches, DWYG native (0 in reverted ledger), GO.
Recoverable-now grand total (A+C) = 3,584 rows across 11 vendors, all gated/reversible/
verified/provenance-clean. Remaining ~3,150 genuinely needs re-scrape (D) + Greenland (B).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7afcbaa · 2026-08-31 · TK-10900/A3: general scrubTitle recovers Thibaut 61 + Rebel 52 + PierreFrey 4 (+117, zero regression)
scrubTitle (strip 'Wallcovering(s)', comma->space, applied both keys) recovers the
storefront-title-noise vendors from their existing catalogs. Verified: no regression
(all 5 prior vendors unchanged), correct (DWTT-74442 = Woolston Wide Width Spa Blue),
provenance-clean (0 recovered codes in reverted ledger). Safe by construction: over-merge
-> strict-1:1 guard -> review, never a wrong emit. All 3 preflight GO.
Program A fire-ready now 3,170; recoverable-now total (A+C) = 3,199 across 9 vendors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ef129e0 · 2026-08-31 · TK-10900: finalize roadmap — A3 title-normalizer (~70-120) + Program D per-vendor scraper assignments
Completed catalog-coverage probe: Thibaut/PierreFrey/Arte/Harlequin patterns EXIST
in-catalog (title-format noise only) -> A3 normalizer $0, ~70 rows. Fentucci patterns
NOT in catalog -> genuine D. Final D roster w/ per-vendor scraper-skill assignments +
3 new-scraper builds flagged (Maharam/CMO/JStevens). Live scraping gated (Steve go).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ebc8b74 · 2026-08-31 · TK-10900/A: complete assessment — 5-vendor fire-ready roster (3,053 rows, all preflight GO)
Full sweep w/ unified matcher + 12,216 ledger: Carnegie 2,745 + Stout 180 (real
W-codes) + Fabricut 105 (DWFC) + Knoll 13 (native, 492 mint siblings excluded) +
Romo 10 (DWRM native) = 3,053 content-match, all GO. Provenance settled by session
precedent (Carnegie ruling + China Seas DWCH acceptance). Everything else (~4,300:
Maharam/CMO/Hollywood/Fentucci/Thibaut/Rebel/PierreFrey/Arte/Harlequin + new-scraper
vendors) -> Program D re-scrape. Thibaut diagnosed: title structure differs -> D.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a8854f1 · 2026-08-31 · TK-10900/A: Carnegie fire-ready (2,745) + full ledger (12,216) + honest A2 outcome
- Steve rulings applied: Carnegie=bare base code (fire-ready, preflight GO 2,745);
  Maharam+CMO=DW-fabricated -> Program D; full reverted-mint ledger authorized+built
  (p4 11,725 + p3romo 491 = 12,216; p1 18,590 EXCLUDED as kept-self-copies, 100% live).
- Full ledger re-run: Knoll 492/632 catalog codes are reverted mints -> only 13 native;
  Thibaut/Rebel title-mismatch. A2 content-match yield collapses to Carnegie+tails; bulk -> D.
- fire-content-match.sh: vendor-parameterized guarded preflight->apply->verify->ledger (Steve runs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
709cc72 · 2026-08-31 · TK-10900: PROVENANCE GATE — catalog codes are not uniformly real (Maharam MH-*, CMO_* fabricated; DWKN/DWTT/DWRW mixed-mint)
Verification of the matcher output caught it: only Carnegie/Stout carry real mfr
codes; Maharam/CMO are DW-fabricated; Knoll/Thibaut/Rebel are mixed-use mint
prefixes needing the full ledger. Program A cannot be blanket-fired — each vendor
needs a Steve provenance ruling. Only Carnegie is cleanly fireable today (2,745).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
41e8df0 · 2026-08-31 · TK-10900/A: unified CONCAT matcher — one mode for numeric + name colors
Replaces the fragile trailing-number parser with a whole-identity concat key:
catalog norm(pattern_name+' '+color) [or title] vs vendor-stripped Shopify title.
Reproduces Carnegie EXACTLY (2,745, no regression) AND unlocks color-name vendors
(Maharam 1,235/86.4%, was 0). Keeps all rails: mint->mfr_sku, base-strip,
bucket-compat precondition, greenfield/ledger exclude, strict 1:1, gated output.
stripVendor handles prefix (Carnegie) + ' | Vendor' suffix (Maharam).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9aea723 · 2026-08-31 · TK-10900/A: graceful schema-gate + bucket_guard flag (sweep-safe)
Fleet sweep revealed catalogs are heterogeneous: color_name (most), title-only
(Vahallan), no product_type (Fentucci). Tool now DEFERS unsupported schemas with
a clean JSON status instead of crashing, and flags bucket_guard=false when a
catalog lacks product_type (cross-class guard can't run). Finding: the numeric
color_number parse mode only covers Carnegie (2,745); every color_name vendor
100%-misses -> needs an A2 color-name/title matcher (separate build).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e47fdb5 · 2026-08-31 · TK-10900/A: fix cross-class wrong-write (contrarian Defect B) + harden base-strip
Contrarian caught it: the product_type bucket-guard only ran on MULTI-candidate
keys, so a single wall-only catalog code (e.g. Abbey 61 -> 7394A61 'Upholstered
Walls/Panels') was stamped blindly onto an Upholstery Shopify row. Blast radius
1,523 wall-only single-base keys. Fix: bucket-compatibility is now a hard
precondition on the single-candidate path too -> cross_class_mismatch -> review,
never apply. Also harden baseCode to strip only trailing -<alpha> suffixes so a
numeric-hyphenated real code (91026-10) is preserved, not truncated.
Carnegie honest rate: 87.7% -> 70.0% matched (2,745), 694 cross-class quarantined.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0aa462b · 2026-08-31 · TK-10900/A: content-match-gen.mjs — schema-adaptive catalog content-match recovery
Recovers dw_sku for blank rows w/ no sku+no mfr_sku via title -> catalog
(pattern,color) -> real code. Mint-catalog vendors use mfr_sku(base-stripped)
not the DWAG-* mint dw_sku; base-code collapse; product_type BUCKET tiebreak
only on real multi-variant forks; strict unique-emit else review-queue (no guess).
Carnegie canary: 87.7% matched (3,439/3,921), 468 variant-forks queued, 14 parse-miss.
Verified: upholstery rows correctly pick the -upholstery S-variant. GATED draft.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
584b4e1 · 2026-08-31 · TK-10900: harden content-match to strict 1:1 (pattern,color,product_type) key
Codex sanity-pass: biggest risk is a false-positive SKU written at scale.
Make product_type part of the uniqueness KEY (not a tiebreaker); non-1:1 ->
no-write + manual-review queue, never a best guess.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ddf3994 · 2026-08-31 · TK-10900: draft re-scrape work-plan (per-vendor, content-match-first)
Reframes the 10,671+145 'rescrape' backlog: verified that most is recoverable
by LOCAL content-match (title -> catalog pattern+color -> real code), not a web
scrape. Two provenance rails documented (mint-catalog vendors use mfr_sku not
dw_sku; type-suffix strip + product_type width tiebreak). Per-vendor targets
ordered by count, mapped to *-scraper-manager skills, 4 programs A/B/C/D.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
74251ab · 2026-08-31 · TK-10896: CANONICAL correction — mirror was stale, real backlog is 15,415 not 34,614
Ran the (now ssh-capable) scanner against canonical Kamatera: 15,415 blank rows
(matches the original scope memo's 15,577), recovery mix INVERTED vs the mirror —
10,671 rescrape / 2,458 source / 2,146 staging-link / 90 proven-native / 42 self-copy /
8 dedup. The mirror's 33,762-self-copy picture was entirely reverted-mint residue the
mirror retained in sku; canonical cleared it (Carnegie canonical: 5,921 blank, sku=0,
mfr=2000). Ledger residue on canonical = 0. Fixed apply-plan-gen to honor DWSKU_PSQL +
stdin; generated apply-plans-canonical/ (2,547 self-copy rows, 2,645 shopify_id-keyed
UPDATEs, 19 vendors); preflight arte-international on Kamatera = GO 40/40 READY. Marked
the mirror apply-plans/ SUPERSEDED. The memo's rescrape-heavy characterization was right.
47 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cab2766 · 2026-08-31 · TK-10896: fix remote-shell quoting — feed SQL via stdin not -c (works over ssh)
Over 'ssh <host> psql -c <sql>' the remote bash re-parses the SQL and chokes on
parens/quotes. psql reads stdin when given no -c/-f, identical local + remote.
Fixed in preflight-check.mjs + dwsku-backlog-scan.mjs. 47 tests green. First
canonical Kamatera preflight run now works and CONFIRMS mirror drift: a-s-cr-ation's
planned row is ALREADY_TARGET on Kamatera (dw_sku already populated) while the mirror
showed it blank — Phase-1 self-copies landed on canonical, mirror never got them.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e941614 · 2026-08-31 · TK-10896: add post-apply verify mode + turnkey per-vendor firing RUNBOOK
preflight-check.mjs gains --mode verify (after firing: GO iff every planned row now
equals its candidate; still-blank rows flag NOT_APPLIED). RUNBOOK.md documents the
full gated closed loop preflight->apply->verify->rollback, per-vendor, canary-first,
with the scope/safety reminders. 47 tests green. All read-only; writes stay Steve-gated.
600aa83 · 2026-08-31 · TK-10896: read-only preflight GO/NO-GO checker for the gated apply run
preflight-check.mjs (parameterized target via DWSKU_PSQL, like the scanner) confirms
on the TARGET DB that each planned shopify_id still EXISTS + is still BLANK before a
human fires apply.sql — classifies READY / ALREADY_TARGET (idempotent) / ALREADY_OTHER
(conflict) / MISSING (drift), verdict GO iff 0 missing + 0 other, exit code reflects it.
READ-ONLY (SELECT only). Verified against the mirror: Carnegie GO, 10,707 READY. 45
tests green (+5). Completes the gated-run kit: apply.sql + undo.sql/restore-map + preflight.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
e5d7d09 · 2026-08-31 · TK-10896: Cody-gate fixes on apply-plan-gen — key on shopify_id (not local id) + shape-guard
Contrarian caught a CRITICAL flaw: apply.sql keyed on the local Mac2 serial `id`,
which maps to a DIFFERENT product on canonical Kamatera (built from its own
sequence) — running as-is would hit wrong/zero rows. Now keyed on shopify_id (the
stable Shopify GID, verified 1:1 and identical cross-machine). Also: shape-guard
rejects title/garbage SELF_COPY_SOURCE candidates (2 caught) from reaching a
canonical write; restore-map old:null (honest); skip+count rows missing shopify_id.
Re-verified: 38,712 stmts all shopify_id-keyed, 0 WHERE id=, 0 ledger codes leaked.
40 tests green (was 38).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c2c1b1c · 2026-08-30 · TK-10896: apply-plan-gen — read-only GATED dw_sku self-copy apply plans
Generates per-vendor restore-map.json + apply.sql + undo.sql from the joined
plan (self-copy classes only, non-null candidate). Recovers existing codes,
never mints. Every UPDATE carries the (dw_sku IS NULL OR btrim=' ') blank-guard;
undo.sql reverses each; SQL-escaped candidates. NOTHING executed — canonical
Kamatera dw_unified write stays hard-gated for a human to fire.

38 tests pass (32 existing + 6 new). Real run: 33,762 self-copy plan rows ->
38,714 guarded statements across 93 vendors, 0 unmatched, 0 forbidden leaks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
704931f · 2026-08-30 · TK-10896: make verified ledger authoritative for ALL DW-code rows (close prefix-guard gap)
Verified read-only against the mirror + the sha256-checked phase4 undo ledger
(prefix counts EXACTLY match the Phase-4 decision-aid buckets: DWAG 5921/DWKN 505/
DWPR 2899/... = authentic). Key finding: greenfield DWAG codes in sku are
DWAG-376xxx (scraper-native) while the reverted mints were DWAG-1000xx — a
different range absent from these rows, so the prefix guard over-blocked ~8k rows.
Join now checks EVERY DW-code candidate against the ledger (not just greenfield/
mixed-use), closing a 268-row gap (DWPR/DWHD residue the buckets missed). Result
reconciles to the independent SQL count: 772 residue / 33,762 self-copy / 65 bare.
32 tests green incl. 2 regression cases (Carnegie native + DWPR residue).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
f92bedb · 2026-08-30 · TK-10896: refresh evidence for PROVENANCE_REVIEW hold + fold in Steve's rulings
Bucket-A mixed-use prefixes now HELD (fail-closed PROVENANCE_REVIEW) per Steve's
2026-08-30 ruling. Final mirror segmentation: 21,555 self-copy / 8,962 rescrape /
4,082 provenance-review-held / 9 dedup / 6 staging-link. 32 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2fb7252 · 2026-08-30 · TK-10896: Cody-gate hardening — within-batch shared-candidate reporting + doc precision
Cody flagged 2,552 rows as undetected collisions; VERIFIED false — they are same-
pattern sellable+sample pairs (identical title+handle) that correctly share one
canonical dw_sku (which is intentionally non-unique). Rejected the mislabel; instead:
(1) scanner now reports within_batch_shared_candidates (1,276 groups/2,552 rows,
benign) + per-row shared_pattern_candidate flag so a downstream apply upserts;
(2) README no-mint claim corrected to no-fabrication + guard-conditional no-mint;
(3) Bucket-A residue caveat quantified (4,084 rows in prefix, <=668 possibly minted,
needs mint ledger). 25 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2bcc199 · 2026-08-30 · TK-10896: add provenance guard — greenfield Phase-4 mint prefixes route to rescrape
Verified via ticket event log + phase2-phase4 decision aid: the reverted Phase-4
mint allocated codes into greenfield prefixes (DWAG Carnegie, DWAX Maharam, DWCX,
DWST, DWSC, DWDX, DWWG) that had zero prior coded products. On the Mac2 mirror that
residue persists in sku; self-copying it would re-instate reverted mints. Guard
routes them to MINT_RESIDUE_RESCRAPE (8,897 rows). Corrected mirror segmentation:
25,623 self-copy / 8,962 rescrape / 9 dedup / 6 staging-link. 24 tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
abb32c7 · 2026-08-30 · TK-10896: read-only dw_sku backlog classifier + scanner + tests + evidence
Deterministic recover-existing-code classifier (never mints), portable read-only
scanner (Mac2 mirror or Kamatera via DWSKU_PSQL), 20 unit tests, and the
2026-08-30 mirror evidence. Surfaces mirror-vs-canonical drift and the DWAG-
provenance question for Steve.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

File tree

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

Other build journals

← Dw Silver Mylar Rename  ·  all 4 projects  ·  Dw Smart Collection Canary →

Export

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

rendered in 4ms