{"slug":"fentucci-naturals","total":52,"limit":100,"offset":0,"since":null,"commits":[{"hash":"8eb7e3b","date":"2026-09-20 12:16:54 -0700","author":"Steve Abrams","subject":"TK-11943: EXECUTED — deleted 462 vestigial $0 Per-Yard variants (Steve-approved Option A), all Sample-only, verified","body":""},{"hash":"ae29738","date":"2026-09-20 12:01:10 -0700","author":"Steve Abrams","subject":"TK-11943: evidence — Fentucci Naturals $0 Per-Yard is guarded (0 live risk), restore-map for 462 vestigial variants","body":""},{"hash":"e3b1ada","date":"2026-09-20 01:06:56 -0700","author":"Steve Abrams","subject":"TK-11868: live re-measurement — Fentucci Per-Yard width defect is 29, not 290 (261 already correct + rendering; 22 wrong-value linen, 7 missing faux-suede); memo width-source (tokiwa_catalog) does not join this vendor","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01C7ujhBP8rChweH7QfhWRia"},{"hash":"8b8222e","date":"2026-09-17 17:25:58 -0700","author":"Steve Abrams","subject":"TK-11664: propagate cadence exit codes (kill the false-green swallow) + stop minting $0 Per Yard variants for quote-only rows","body":"Ticket finding #3 second half: both cadence wrappers piped go-live.py /\ncreate-drafts.py inside { ...; } >> log blocks that always exited 0, so\nlaunchd reported success while the sanctioned go-live path was dead for\n18 tranches (the exact false-green class the ticket flagged). Wrappers now\ncapture the child rc, stamp it on the '=== done' log marker, and exit with\nit. PATH export itself already fixed in ce29b0e; validated 5/5 with a\nharness incl. the negative control (old minimal PATH still crashes).\n\nTicket item #6 (durability gap): build-drafts.py minted {price:'0.00',\noption1:'Per Yard'} for every enriched row, so any re-scrape adding new\ncolorways would re-mint fresh $0 Per Yard variants — the same shape that\nproduced the TK-11635 population. Quote-only rows (tags carry 'quotes') now\nbuild sample-only payloads ($4.25 Sample = sole orderable item, CMO-Paris\nprecedent, matching go-live.py step 3a's end state); rows without 'quotes'\nkeep the old two-variant shape. Regenerated data/shopify-drafts.jsonl\n(504/504 sample-only, 0 zero-weight; files-only, no API write; create-drafts\nremains a no-op — all 504 SKUs already in created.jsonl).\n\nRestore map: docs/TK-11664-restore-map.md. Reversible: git revert.\nNo Shopify or dw_unified write fired."},{"hash":"ce29b0e","date":"2026-09-17 15:46:56 -0700","author":"Steve Abrams","subject":"TK-11664: fix launchd-PATH blind spot in fentucci go-live cadence (psql not found, 18 crashed tranches)","body":"launchd runs com.steve.fentucci-golive-cadence with the minimal PATH\n(/usr/bin:/bin:/usr/sbin:/sbin — no homebrew), so go-live.py's bare 'psql'\nsettlement_map/pg_activate subprocess calls died with FileNotFoundError\nBEFORE processing any product. Every scheduled tranche 2026-07-28..2026-09-15\n(18 runs) crashed identically; golive-done.jsonl stalled at 2/504 and 502\ndrafts were left outside this gated path — 462 of them flipped ACTIVE via the\nrotation activator's quotes-tag exemption instead, still carrying the $0.00\n'Per Yard' placeholder that go-live.py step 3a would have deleted (the TK-11635\npopulation). Mirrors the proven Osborne-class PATH fix already in\nDesigner-Wallcoverings run-cadence-hourly.sh (launchd preflight linter 2026-06-18).\n\nDry-run proof: with the fix, settlement_map resolves (502 to process, first\n3 = DWFN-100003..5); with the old minimal PATH it still crashes. No Shopify\nwrite fired by this commit (go-live --apply remains gated); revert with\ngit revert."},{"hash":"8805ceb","date":"2026-09-17 14:14:03 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-09-17T14:12:57 (1 data files) — data/products.json","body":""},{"hash":"7ad86d7","date":"2026-09-15 04:07:21 -0700","author":"steve@designerwallcoverings.com","subject":"TK-11438: migrate postgres pool to unix socket (darwin fallback)","body":"Use process.env.PGHOST || darwin?/tmp:127.0.0.1 so Mac2 services use the\nunix socket at /tmp and Kamatera keeps TCP until its own migration.\nUndo: git revert HEAD"},{"hash":"46f9c5c","date":"2026-09-14 08:33:35 -0700","author":"Steve Abrams","subject":"TK-11664 Option B: codify Sample qty=2026+tracked carve-out (no Shopify write)","body":"Steve-approved 2026-09-14. The $4.25 Sample being tracked+DENY+on_hand=2026 is\ngo-live.py's deliberate quote-only design (ruling 2026-07-26), NOT the TK-11357\n$0-restamper fingerprint and NOT a \"sample=no tracking\" violation. Codified as an\ninline CARVE-OUT block in go-live.py + a machine-readable data/sample-qty-carveout.json\nwith an explicit boundary: a $0 checkout-orderable variant stays an armed defect for\nevery canary. Documentation/config only — no Shopify or dw_unified write.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"09562bf","date":"2026-09-12 06:40:59 -0700","author":"Steve Abrams","subject":"chore: v1.0.6 (TK-11471 session close — weight guard on the latent Tokiwa pipeline)","body":"Patch: guards only. This pipeline is dormant (monthly, broken since 2026-08-25 on a\nmissing psql) and was NOT the source of the live leak; it is guarded so it cannot\nbecome one when repaired.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>"},{"hash":"9874a31","date":"2026-09-11 11:35:05 -0700","author":"Steve Abrams","subject":"TK-11471: wire the weight guard into the Fentucci create + activate paths","body":"CREATE (build-drafts.py, create-drafts.py): every variant now carries\nweight + weight_unit \"lb\" — Sample 0.25, Per Yard 3.0 (Wallcovering default).\nThe $0.00 quote-only Per Yard variant still ships, so it still needs a weight.\nBoth files assert weight>0 before writing/POSTing. The guard is applied again\nat the POST site because data/shopify-drafts.jsonl predates this change — a\nstale payload must not be able to create a zero-weight variant. Price,\ninventory_policy deny, inventory_management, tags and the settlement exclusion\nare untouched (the TK-11357 quote-only posture is a separate load-bearing guard).\n\nACTIVATE (go-live.py): new step 3d weight_gate() runs before publish + before\nstatus=active. It re-reads weights through a query that ACTUALLY returns them\n(inventoryItem{measurement{weight{value unit}}}), writes the approved default\nonto any zero/unset variant, RE-VERIFIES, and on any variant still zero returns\nthe existing (\"held\", [...]) outcome with a `weight>0` reason so it lands in\ndata/golive-held.jsonl like every other gate. Idempotent; a no-op beyond one\nread when weights are already positive. Heal path is inventoryItemUpdate with a\nREST variant-update fallback for a token without write_inventory.\n\ngo-live.py / cadence-golive.sh / resume.sh now prefer SHOPIFY_FULL_ACCESS_TOKEN\nover the narrow SHOPIFY_ADMIN_TOKEN: the weight heal and the pre-existing\ninventory_levels writes both need write_inventory (dw-golive-token-guard-canary).\n\nOffline replay over the real 504-row drafts file: 1008 zero-weight variants\nbefore the guard, 0 after. No Shopify writes, no pipeline run.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FJHxAzaEMMxado57mFjiCk"},{"hash":"81a477a","date":"2026-09-11 11:34:51 -0700","author":"Steve Abrams","subject":"TK-11471: vendor a Python weight guard + its negative tests","body":"Python port of designerwallcoverings/scripts/lib/weight-guard.mjs, constants\nbyte-identical (SAMPLE_WEIGHT_LB 0.25, FALLBACK_LB 2.0, the 17-entry\nTYPE_DEFAULT_LB table). This pipeline is Python + REST and lives outside\nscripts/*-onboard/, so every .js/.mjs-only or GraphQL-only sweep of this\nlineage structurally misses it — third recorded occurrence of that omission.\n\nDeliberate divergence from the .mjs: all_zero_weight_variants() counts SAMPLE\nvariants. The .mjs zeroWeightBlockers() filters them out, which made the gate\nnarrower than the invariant dw-active-weight-canary enforces (its live run\nsplit the offenders 43 sample / 40 sellable). That bug is not ported.\n\nheal_and_verify_weights() fails CLOSED: an unreadable re-query, a re-query\nresponse that never carried the weight field, a missing inventoryItem id, or a\nuserError all return ok=False. response_carries_weight_field() is the guard\nagainst the false-green class — a gate reading a response that never contained\nweight proves nothing.\n\ntest_weight_guard.py: 30 offline tests (no network, no DB, no cost), every one\nan injected fault or an asserted clean state. Verified by mutation: removing\nthe go-live gate -> 3 failures; porting the .mjs sample-filter bug -> 7\nfailures; neutering resolve_weight_lb -> 4 failures.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01FJHxAzaEMMxado57mFjiCk"},{"hash":"7bb6ba0","date":"2026-08-24 19:43:08 -0700","author":"Steve Abrams","subject":"TK-10801: recover 3 DWNAT (Winfield Thybony) images locally; 145/148 dead at source","body":"Source winfieldwall.com dropped 145 of 148 older real_skus (20232-27, BA206, TW/TSJ/SG codes) from its live CDN. Only current Natural Resources patterns WNR1104/1108/1115 recoverable via free CDN scrape. Stored locally in images-dwnat/, recorded in dw_unified.fentucci_naturals_catalog (image_local + image_url).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"ed32f00","date":"2026-08-24 19:35:18 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-24T19:34:57 (26 data files) — data/raw/abaca.json data/raw/bamboo.json data/raw/denim.json data/raw/fine-arrowroot.json data/raw/gildingwashi.json","body":""},{"hash":"d634aa6","date":"2026-08-06 12:26:40 -0700","author":"Steve Abrams","subject":"chore(fentucci): disable prod-deploy config (viewer is Mac2-local; prod has no fentucci-viewer process) + document","body":""},{"hash":"6ef3ae9","date":"2026-08-03 04:20:34 -0700","author":"steve@designerwallcoverings.com","subject":"add .deploy.conf to .gitignore (TK-10123)","body":""},{"hash":"c32b78d","date":"2026-08-01 02:06:16 -0700","author":"Steve Abrams","subject":"fentucci-naturals: href-drill — card data points are filter-links (multi-select, URL-addressable)","body":"Card pattern / color / material / category / tag data points are now <a href=\"?dim=val\">\nthat ADD that facet to the multi-select selection (href-drill HARD rule); the full facet\nstate (comma-encoded per dimension) + search are URL-addressable — shareable, deep-linkable,\nback-button-safe (popstate/readURL). Click adds the facet in place; cmd/ctrl-click opens\nthe shareable href. Existing facet checkboxes / search / sort / memo-stock-price actions\nuntouched.\n\nVerified LOCAL (Playwright + basic auth, :9981): click material 'Wood Veneer' -> ?materials\n+ grid 504->27; deep-link restores; back-button->504; canary FLAT->DONE; 0 pageerrors.\nCUSTOMER-FACING storefront — local commit only; DEPLOY is gated (pending-approval). grid 8/92. TK-10089."},{"hash":"ed29985","date":"2026-07-28 05:27:41 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-28T05:27:36 (2 files) — logs/golive-launchd.err logs/golive-launchd.out","body":""},{"hash":"30df3b0","date":"2026-07-27 19:23:46 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T19:23:22 (1 files) — package-lock.json","body":""},{"hash":"842b7c2","date":"2026-07-27 19:05:32 -0700","author":"Steve Abrams","subject":"chore: v1.0.5 (session close — TK-34 go-live cadence)","body":""},{"hash":"f13fc3d","date":"2026-07-27 18:53:15 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-27T18:53:10 (3 files) — data/golive-done.jsonl scripts/cadence-golive.sh scripts/reconcile-width-backfill.js","body":""},{"hash":"0805607","date":"2026-07-27 16:37:58 -0700","author":"Steve Abrams","subject":"TK-00034 reconcile: revert the 40 quote-only activations → DRAFT (snapshot-first) per Steve 'width-first' decision after TK-00058 conflict; reset go-live ledger; restore 504 DRAFT/0 ACTIVE. Width not autonomously reachable (tokiwausa Wix, no specs/portal); reference 36in from fentucci_catalog. Blocked on Steve width-source.","body":""},{"hash":"dc2dcc2","date":"2026-07-27 16:19:58 -0700","author":"Steve Abrams","subject":"TK-00034: Fentucci/Tokiwa 504 go-live prep — verify override rules, reconcile 150-live mismatch (148 live = Winfield Thybony, not Tokiwa; real_sku∩mfr_sku=0), activation-batch manifest. Go-live stays gated (memo → pending-approval).","body":""},{"hash":"7c78370","date":"2026-07-26 16:31:07 -0700","author":"Steve Abrams","subject":"chore: gitignore __pycache__/*.pyc + untrack, v1.0.4 (session close)","body":""},{"hash":"8968402","date":"2026-07-26 16:20:05 -0700","author":"Steve Abrams","subject":"go-live trickle: quote-only activation (CMO-Paris shape: drop $0 per-yard, keep $4.25 sample, ex-Google channels) + resume.sh + daily plist; canary 2 live","body":""},{"hash":"bccaed0","date":"2026-07-26 16:03:12 -0700","author":"Steve Abrams","subject":"chore: version-up v1.0.2 (session close) — pg-writeback lint-clean","body":""},{"hash":"21d1f04","date":"2026-07-26 08:26:12 -0700","author":"Steve Abrams","subject":"PG-first writeback: link 504 Tokiwa staging rows to Shopify draft ids (shopify_product_id + on_shopify)","body":""},{"hash":"8cdafc0","date":"2026-07-23 05:18:49 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-23T05:18:46 (1 files) — data/created.jsonl","body":""},{"hash":"e3058c0","date":"2026-07-23 04:48:42 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-23T04:48:39 (1 files) — data/created.jsonl","body":""},{"hash":"4ac1d93","date":"2026-07-22 22:47:14 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T22:47:10 (1 files) — data/created.jsonl","body":""},{"hash":"802e05e","date":"2026-07-22 22:17:06 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T22:17:02 (1 files) — data/created.jsonl","body":""},{"hash":"303746b","date":"2026-07-22 20:16:34 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T20:16:30 (1 files) — data/created.jsonl","body":""},{"hash":"8355d18","date":"2026-07-22 19:46:26 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T19:46:22 (2 files) — data/created.jsonl package-lock.json","body":""},{"hash":"da9325f","date":"2026-07-22 19:29:44 -0700","author":"Steve Abrams","subject":"chore: v1.0.1 (session close)","body":""},{"hash":"1ca6211","date":"2026-07-22 19:29:28 -0700","author":"Steve Abrams","subject":"chore: lint + light refactor (session close) — cadence.sh redirect guard, dead /api/health route removed, esc hoisted in enrich.py","body":""},{"hash":"9c3c6f4","date":"2026-07-22 19:16:17 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T19:16:13 (1 files) — data/created.jsonl","body":""},{"hash":"c566116","date":"2026-07-22 19:07:28 -0700","author":"Steve Abrams","subject":"fix 422: custom.material metafield type matches store definition (multi_line); importer records create before metafields + non-fatal metafield errors","body":""},{"hash":"bae363c","date":"2026-07-22 19:03:07 -0700","author":"Steve Abrams","subject":"daily import cadence: 245/day tranche script + launchd com.steve.fentucci-import-cadence (Steve-approved std-cadence rollout)","body":""},{"hash":"ab35a39","date":"2026-07-22 18:56:52 -0700","author":"Steve Abrams","subject":"FIX 1 residue: sync specs.pattern jsonb to renamed towns (235 rows had old town in tokiwa_catalog specs; viewer :9981 was serving it) + retown script now propagates to specs on every run","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"56057b4","date":"2026-07-22 18:46:08 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-22T18:46:04 (2 files) — data/lookbook-verification.json scripts/lookbook-verify.js","body":""},{"hash":"f3f925a","date":"2026-07-22 18:28:32 -0700","author":"Steve Abrams","subject":"FIX 2: quote-only hardening — custom.price_mode=quote_only + custom.needs_width=true metafields on all 504 drafts (gates independent of the quotes tag), Per Yard variant inventory_policy=deny, create-drafts.py hard draft-only assert (can never set ACTIVE); drafts regenerated with re-towned patterns","body":""},{"hash":"15039eb","date":"2026-07-22 18:27:45 -0700","author":"Steve Abrams","subject":"FIX 1: re-town 27 pattern-name collisions vs live Fentucci family (748 titles) — deterministic retown-collisions.py, gate 0 collisions / 0 dupes; propagated to rename-map, products.json, pattern-copy, tokiwa_catalog; normalize.js now excludes live-colliding towns","body":""},{"hash":"ba65537","date":"2026-07-22 18:14:52 -0700","author":"Steve Abrams","subject":"add fentucci-scraper-manager skill (in-repo copy; live at ~/.claude/skills/) — canonical DWFN scheme, refresh runbook, scrape gotchas, hard gates","body":""},{"hash":"934b282","date":"2026-07-22 18:14:01 -0700","author":"Steve Abrams","subject":"internal line viewer :9981 (fentucci-viewer pm2) — full internal-line-viewer spec: left rail collapsed facet tables w/ counts+type-ahead, card-field toggles to image-only wall, sort+density+text-scale persisted, unauth /healthz before basic-auth, created date+time chip, local-image serving, Memo/Stock/Price vendor-requests; E2E green chromium+webkit(creds-URL)","body":""},{"hash":"73c3434","date":"2026-07-22 18:01:50 -0700","author":"Steve Abrams","subject":"gated importer scaffold (create-drafts.py, resumable, day-capped, leak tripwire) — NOT executed; approval memo filed to pending-approval","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"ea8b38b","date":"2026-07-22 18:00:54 -0700","author":"Steve Abrams","subject":"enrich: 504/504 rows via Mac1 qwen3:14b (64 pattern calls, 3.6s ea) + gilding-aware settlement screen (0 review) + 504 draft payloads (per-colorway, quote-only, family-matched)","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"5115461","date":"2026-07-22 17:56:21 -0700","author":"Steve Abrams","subject":"increment 2: enrichment engine (qwen3:14b per-pattern copy + deterministic colorway/tags/specs) + draft-payload builder","body":"Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>"},{"hash":"7824e0c","date":"2026-07-22 17:45:11 -0700","author":"Steve Abrams","subject":"stage: 504 SKUs / 64 patterns into dw_unified.tokiwa_catalog, colors derived, 100% image coverage, 0 collapse flags","body":""},{"hash":"b4b07f8","date":"2026-07-22 17:40:44 -0700","author":"Steve Abrams","subject":"add sanity report script","body":""},{"hash":"20606ea","date":"2026-07-22 17:40:14 -0700","author":"Steve Abrams","subject":"gitignore images/ — full-res originals project to >1GB (task rule: keep in git only if <100MB)","body":""},{"hash":"bd416c6","date":"2026-07-22 17:40:02 -0700","author":"Steve Abrams","subject":"add download-images, color-names (PIL hue buckets), stage-db (tokiwa_catalog), image-audit scripts","body":""},{"hash":"7b19e7b","date":"2026-07-22 17:38:25 -0700","author":"Steve Abrams","subject":"normalize: 504 products / 64 patterns, deterministic town rename-map, DWFN-100001+ assignment","body":""},{"hash":"b67d83d","date":"2026-07-22 17:36:44 -0700","author":"Steve Abrams","subject":"scrape: Tokiwa USA SSR img scraper, 510 items across 21 categories (label-pairing for japanese-silk)","body":""}]}