{"slug":"carnegie-reprice","total":37,"limit":100,"offset":0,"since":null,"commits":[{"hash":"21bd662","date":"2026-09-24 12:19:22 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-24T12:18:37 (1 data files) — phase2-poc-acapella.json","body":""},{"hash":"5f484b7","date":"2026-09-24 11:36:23 -0700","author":"Steve Abrams","subject":"carnegie phase2: retry metafield writes, record failures, guard hardcoded RETAIL","body":"Apply-path hardening on the Acapella PoC: (1) shopify() now retries 429/5xx with\nbackoff so per-product metafield writes aren't silently dropped on a transient\nthrottle; (2) failed metafields are recorded on the created record (created.mf_failed\n-> run summary) instead of vanishing into a console.warn; (3) added a guard that\naborts if any item's cost != $42, since RETAIL=76 is hardcoded from that cost and a\ncopy to a different-cost pattern would otherwise ship a wrong price. Also lands the\nreviewed-clean TK-10820 change (activation gates on bodyHtmlValid, not raw\ndescription_text) that was uncommitted in this file.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"081afea","date":"2026-09-12 08:13:06 -0700","author":"Steve Abrams","subject":"TK-11547: weight guard on the carnegie rollback un-archive (heal, never block)","body":"archive-redirect.mjs's rollback path PUTs status:'active' to un-archive products\n(com.steve.carnegie-rollout). Despite the filename it is a real activator, and it had no\nweight handling — so a restored product could go live at zero weight, collapsing orders into\nthe lowest weight tier / free-shipping band (Steve's TK-11414 rule).\n\nFound by shopify-activator-register (TK-11498) on its first run; never in the\nTK-11414/TK-11471 field of view.\n\nDELIBERATELY DIFFERENT from every other TK-11547 site, which HOLD. This is an UNDO path: it\nrestores products that were intentionally archived. A gate that can block a rollback is worse\nthan the defect it prevents — it strands you mid-incident with no way back. So this never\nrefuses to un-archive:\n\n  1. read each variant's current weight\n  2. fill the TK-11414-approved default on any zero (sample 0.25 lb, sellable 3.0 lb)\n  3. RE-VERIFY — the write's own 200 is not evidence the weight is set\n  4. un-archive REGARDLESS, and if any variant is still zero, say so LOUDLY on stderr with the\n     ids, leaving dw-active-weight-canary (daily) as the backstop\n\nSilence is the only outcome ruled out. The heal goes through the REST variant field because\nthis script authenticates with the narrow SHOPIFY_ADMIN_TOKEN, which lacks write_inventory —\nthe GraphQL inventoryItemUpdate path would 403.\n\ntest-weight-guard.mjs — 10/10, offline. Unit cases for zero/null/negative/NaN and kg/g/oz\nconversion, plus five structural checks: it re-verifies after writing, it un-archives even\nwhen the heal fails, a failed heal is loud rather than silent, the heal uses the REST path the\nnarrow token can actually call, and the sample/sellable default split is applied.\n\n(One test caught itself: the \"no GraphQL path\" assertion initially matched the word\ninventoryItemUpdate inside this guard's own explanatory comment and failed on correct code.\nNow strips comments before asserting — prose is not behaviour.)\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"1634913","date":"2026-09-11 10:19:52 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T10:08:53 (3 data files) — reprice-tk11434-ledger.jsonl tk11434-apply.out tk11434-verify.out","body":""},{"hash":"576d074","date":"2026-09-11 09:38:52 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T09:31:49 (2 data files) — reprice-tk11434-ledger.jsonl tk11434-apply.out","body":""},{"hash":"6116dfb","date":"2026-09-11 09:27:22 -0700","author":"Steve Abrams","subject":"TK-11434: align all four Carnegie create paths to the fixer's 2-decimal retail","body":"The reprice fixer writes round(cost/0.65/0.85, 2) - verified live in its ledger\n($39 cost -> $70.59). The create paths rounded to whole dollars, so the same cost\nproduced a different price depending on whether a product was CREATED or REPRICED\n($71 vs $70.59). Now consistent across:\n\n  carnegie-split/rollout.mjs\n  carnegie-split/rollout2.mjs\n  carnegie-split/build-siltech-grain-v2-archived.mjs\n  carnegie-reprice/rebuild-line.mjs\n\nValues reproduce the TK-11434 memo's own table exactly: 997 -> 1804.52,\n114 -> 206.33, 623 -> 1127.60.\n\nrebuild-line.mjs keeps retail as a NUMBER rather than a formatted string: line 151\nand the progress log at :239 both call .toFixed(2) on it, so returning a string\nthere would have thrown \"retail.toFixed is not a function\" at runtime. node --check\npasses either way - it checks syntax, not types - so the usage sites were read\nbefore committing.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"17bd730","date":"2026-09-11 09:01:48 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T08:57:34 (2 data files) — reprice-tk11434-ledger.jsonl tk11434-apply.out","body":""},{"hash":"1293658","date":"2026-09-11 08:35:00 -0700","author":"Steve Abrams","subject":"TK-11434: spec-complete Carnegie reprice executor (apply-tk11434.mjs)","body":"Successor to reprice-tk11434.mjs (the original, already Steve-fired live). Reads the\njoin-verified staging table carnegie_reprice_staging_tk11434 (source of truth, NOT the\nbuggy reprice.mjs REST pull). Adds: FULL-access token preference, DRY-RUN Σ-delta plan,\npre-flight >2%-drift abort, per-variant live-re-read + compare-and-set, batched\nproductVariantsBulkUpdate with THROTTLED backoff, --limit daily cap, end-of-apply\nre-sweep, and a --rollback mode. SHARES the ledger + undo with reprice-tk11434.mjs so\nresume + rollback stay unified and idempotent. DRY-RUN by default; --apply is gated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CFntkQoFivTSkgwHjLY6ky"},{"hash":"086632c","date":"2026-09-11 08:27:27 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-11T08:16:47 (2 data files) — reprice-tk11434-ledger.jsonl tk11434-apply.out","body":""},{"hash":"92bde93","date":"2026-09-10 14:29:08 -0700","author":"Steve Abrams","subject":"TK-11434: GATED Carnegie at-cost reprice fixer + undo (idempotent, live re-read + compare-and-set + ledger; NOT run)","body":""},{"hash":"bc0fdf7","date":"2026-09-10 14:17:18 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-10T14:13:31 (4 data files) — plan-20260910-135724.jsonl plan-latest.jsonl snapshot-20260910-135724.jsonl snapshot-latest.jsonl","body":""},{"hash":"618df8b","date":"2026-08-24 19:23:54 -0700","author":"Steve Abrams","subject":"TK-10820: gate rebuild-line + build-one-proof born-active on non-blank body_html","body":"HOLE 1 (Cody): rebuild-line.mjs (the 5,928-SKU Phase-3 rollout create path) gated\nACTIVE only on (imgs.length && hasMfr) — a scraped body that is a whitespace/entity\nshell (e.g. <p>&nbsp;</p>) is truthy at L100 so the fallback composer never fires,\nletting a blank-desc product ship ACTIVE. Now imports bodyHtmlValid and gates on\n(imgs.length && hasMfr && bodyValid); blank body -> DRAFT + Needs-Description tag,\nrecorded in the ledger (desc_gate field).\n\nAlso patched build-one-proof.mjs (the 7th born-active create path Cody's census asked\nme to find): it POSTed status:'active' with raw row.description_text and NO gate. Now\ngates on imgs.length && mfrSkuValid && bodyHtmlValid, DRAFT+tag otherwise.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"83498d8","date":"2026-08-24 19:14:02 -0700","author":"Steve Abrams","subject":"carnegie-mfr-gate: broaden bodyHtmlValid entity strip (Cody TK-10820)","body":""},{"hash":"015d3c8","date":"2026-08-24 19:09:27 -0700","author":"Steve Abrams","subject":"carnegie-mfr-gate: add bodyHtmlValid + wire into assertActivatable (TK-10820)","body":""},{"hash":"4de1b96","date":"2026-08-23 04:11:48 -0700","author":"steve@designerwallcoverings.com","subject":"feat: Carnegie importer gate — skip ACTIVE if no real mfr_sku (TK-10792 stop-the-bleed)","body":"Add carnegie-mfr-gate.mjs (canonical guard + CLI audit) and wire into all\nactivation paths: rebuild-line.mjs, phase2-poc-acapella.mjs. Products with\nnull/empty or DWAG-* mfr_sku are held as DRAFT + tagged Needs-Mfr-SKU.\nDurable run-summary written to ledger JSONL. archive-redirect.mjs rollback\npath documented (intentionally exempt — restores original Carnegie products\nwith real vendor codes). CODE ONLY — no Shopify writes.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"},{"hash":"9f61e80","date":"2026-08-18 15:26:17 -0700","author":"Steve","subject":"carnegie reconcile: reconcile.mjs (dedup plan, live-truth) + fix-stragglers.mjs + Phase-1 plan (session close)","body":""},{"hash":"fbdd86c","date":"2026-08-18 15:06:46 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-18T15:04:50 (1 data files) — launchd-rollout.err","body":""},{"hash":"e09c5af","date":"2026-08-18 14:36:13 -0700","author":"Steve Abrams","subject":"supervise: self-announce completion (CNCP card + marker) for async archive/GMC handoff","body":""},{"hash":"9e92acf","date":"2026-08-18 14:35:15 -0700","author":"Steve Abrams","subject":"carnegie rollout: recreate deleted supervise.sh + harden worker (dupe-guard, crash-guard); launchd keep-alive","body":""},{"hash":"774a09f","date":"2026-08-18 14:34:50 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-18T14:32:35 (8 data files) — archive-preview-20260818-141920.json carnegie-orphans-to-delete.txt data/HALT launchd-rollout.err launchd-rollout.log","body":""},{"hash":"dac3cfa","date":"2026-08-18 14:02:35 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-18T14:00:27 (2 data files) — .rebuild-gql.lock rebuild-gql-ledger.jsonl","body":""},{"hash":"f93c29d","date":"2026-08-18 13:48:36 -0700","author":"steve","subject":"supervisor: 3 shards (429-retry makes it safe)","body":""},{"hash":"0fc1df3","date":"2026-08-18 13:48:36 -0700","author":"steve","subject":"metafields: REST with proof-exact namespaces (preserve space-keys rendering); dedup pilot handling; pilot memo","body":""},{"hash":"5cf2c4f","date":"2026-08-18 13:36:48 -0700","author":"steve","subject":"incident recovery: reconstruct ledger from Shopify, dedup 5, gitignore ledger","body":""},{"hash":"d53b331","date":"2026-08-18 13:35:52 -0700","author":"steve","subject":"gitignore ledger/logs — prevent any git checkout from truncating the live ledger","body":""},{"hash":"fbe7867","date":"2026-08-18 13:31:48 -0700","author":"steve","subject":"supervisor: use nohup not setsid (setsid absent on macOS); auto-restart shard workers until ledger complete","body":""},{"hash":"118abdc","date":"2026-08-18 13:30:26 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-18T13:28:17 (1 data files) — rebuild-ledger.jsonl","body":""},{"hash":"7ecf829","date":"2026-08-18 13:25:35 -0700","author":"steve","subject":"add 429 retry-with-backoff in shop(); errored SKUs auto-retry via ledger last-write-wins","body":""},{"hash":"c0e7acb","date":"2026-08-18 13:22:29 -0700","author":"steve","subject":"add --shard N/M for parallel disjoint workers (4x throughput on Advanced 80-bucket)","body":""},{"hash":"c05ae91","date":"2026-08-18 13:19:34 -0700","author":"steve","subject":"handle: append dw_sku tail for guaranteed uniqueness (2424 colorway collisions)","body":""},{"hash":"af22a7d","date":"2026-08-18 13:19:03 -0700","author":"steve","subject":"Carnegie Phase 3 full-line rollout: resumable builder + factual desc fallback + storage guard","body":""},{"hash":"4a8631c","date":"2026-08-18 12:55:08 -0700","author":"Steve Abrams","subject":"Carnegie Phase 2 PoC: Acapella de-fragment tool (14 per-color standalone products, dry-run + gated apply, reversible)","body":""},{"hash":"f5f4a83","date":"2026-08-18 12:31:19 -0700","author":"steve","subject":"Carnegie Phase 1 complete: specs+swatch images applied to 5910 sellable color-SKUs","body":""},{"hash":"08178e0","date":"2026-08-18 12:23:06 -0700","author":"steve","subject":"Carnegie Phase 1: psql-piped writer (no psycopg dep), fix repeat Length/Width split","body":""},{"hash":"4258cca","date":"2026-08-18 12:21:41 -0700","author":"steve","subject":"Carnegie Phase 1: spec-column ALTER + Magento spec/swatch scraper (staging only)","body":""},{"hash":"177cd46","date":"2026-08-18 10:11:41 -0700","author":"Steve","subject":"Carnegie metafield-fill tool: product pattern facts + variant color identity, dry-run + gated apply","body":""},{"hash":"d26507e","date":"2026-08-18 09:58:28 -0700","author":"Steve","subject":"Carnegie reprice tool: cost→retail (cost/0.65/0.85), dry-run + reversible apply + rollback","body":""}]}