Fentucci Naturals
Search the build
-
8eb7e3b2026-09-20 TK-11943: EXECUTED — deleted 462 vestigial $0 Per-Yard variants (Steve-approved Option A), all Sample-only, verified -
ae297382026-09-20 TK-11943: evidence — Fentucci Naturals $0 Per-Yard is guarded (0 live risk), restore-map for 462 vestigial variants -
e3b1ada2026-09-20 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 -
8b8222e2026-09-17 TK-11664: propagate cadence exit codes (kill the false-green swallow) + stop minting $0 Per Yard variants for quote-only rows -
ce29b0e2026-09-17 TK-11664: fix launchd-PATH blind spot in fentucci go-live cadence (psql not found, 18 crashed tranches) -
8805ceb2026-09-17 auto-data-snapshot: 2026-09-17T14:12:57 (1 data files) — data/products.json -
7ad86d72026-09-15 TK-11438: migrate postgres pool to unix socket (darwin fallback) -
46f9c5c2026-09-14 TK-11664 Option B: codify Sample qty=2026+tracked carve-out (no Shopify write) -
09562bf2026-09-12 chore: v1.0.6 (TK-11471 session close — weight guard on the latent Tokiwa pipeline) -
9874a312026-09-11 TK-11471: wire the weight guard into the Fentucci create + activate paths -
81a477a2026-09-11 TK-11471: vendor a Python weight guard + its negative tests -
7bb6ba02026-08-24 TK-10801: recover 3 DWNAT (Winfield Thybony) images locally; 145/148 dead at source -
ed32f002026-08-24 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 -
d634aa62026-08-06 chore(fentucci): disable prod-deploy config (viewer is Mac2-local; prod has no fentucci-viewer process) + document -
6ef3ae92026-08-03 add .deploy.conf to .gitignore (TK-10123) -
c32b78d2026-08-01 fentucci-naturals: href-drill — card data points are filter-links (multi-select, URL-addressable) -
ed299852026-07-28 auto-save: 2026-07-28T05:27:36 (2 files) — logs/golive-launchd.err logs/golive-launchd.out -
30df3b02026-07-27 auto-save: 2026-07-27T19:23:22 (1 files) — package-lock.json -
842b7c22026-07-27 chore: v1.0.5 (session close — TK-34 go-live cadence) -
f13fc3d2026-07-27 auto-save: 2026-07-27T18:53:10 (3 files) — data/golive-done.jsonl scripts/cadence-golive.sh scripts/reconcile-width-backfill.js -
08056072026-07-27 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. -
dc2dcc22026-07-27 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). -
7c783702026-07-26 chore: gitignore __pycache__/*.pyc + untrack, v1.0.4 (session close) -
89684022026-07-26 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 -
bccaed02026-07-26 chore: version-up v1.0.2 (session close) — pg-writeback lint-clean -
21d1f042026-07-26 PG-first writeback: link 504 Tokiwa staging rows to Shopify draft ids (shopify_product_id + on_shopify) -
8cdafc02026-07-23 auto-save: 2026-07-23T05:18:46 (1 files) — data/created.jsonl -
e3058c02026-07-23 auto-save: 2026-07-23T04:48:39 (1 files) — data/created.jsonl -
4ac1d932026-07-22 auto-save: 2026-07-22T22:47:10 (1 files) — data/created.jsonl -
802e05e2026-07-22 auto-save: 2026-07-22T22:17:02 (1 files) — data/created.jsonl -
303746b2026-07-22 auto-save: 2026-07-22T20:16:30 (1 files) — data/created.jsonl -
8355d182026-07-22 auto-save: 2026-07-22T19:46:22 (2 files) — data/created.jsonl package-lock.json -
da9325f2026-07-22 chore: v1.0.1 (session close) -
1ca62112026-07-22 chore: lint + light refactor (session close) — cadence.sh redirect guard, dead /api/health route removed, esc hoisted in enrich.py -
9c3c6f42026-07-22 auto-save: 2026-07-22T19:16:13 (1 files) — data/created.jsonl -
c5661162026-07-22 fix 422: custom.material metafield type matches store definition (multi_line); importer records create before metafields + non-fatal metafield errors -
bae363c2026-07-22 daily import cadence: 245/day tranche script + launchd com.steve.fentucci-import-cadence (Steve-approved std-cadence rollout) -
ab35a392026-07-22 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 -
56057b42026-07-22 auto-save: 2026-07-22T18:46:04 (2 files) — data/lookbook-verification.json scripts/lookbook-verify.js -
f3f925a2026-07-22 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 -
15039eb2026-07-22 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 -
ba655372026-07-22 add fentucci-scraper-manager skill (in-repo copy; live at ~/.claude/skills/) — canonical DWFN scheme, refresh runbook, scrape gotchas, hard gates -
934b2822026-07-22 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) -
73c34342026-07-22 gated importer scaffold (create-drafts.py, resumable, day-capped, leak tripwire) — NOT executed; approval memo filed to pending-approval -
ea8b38b2026-07-22 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) -
51154612026-07-22 increment 2: enrichment engine (qwen3:14b per-pattern copy + deterministic colorway/tags/specs) + draft-payload builder -
7824e0c2026-07-22 stage: 504 SKUs / 64 patterns into dw_unified.tokiwa_catalog, colors derived, 100% image coverage, 0 collapse flags -
b4b07f82026-07-22 add sanity report script -
20606ea2026-07-22 gitignore images/ — full-res originals project to >1GB (task rule: keep in git only if <100MB) -
bd416c62026-07-22 add download-images, color-names (PIL hue buckets), stage-db (tokiwa_catalog), image-audit scripts -
7b19e7b2026-07-22 normalize: 504 products / 64 patterns, deterministic town rename-map, DWFN-100001+ assignment -
b67d83d2026-07-22 scrape: Tokiwa USA SSR img scraper, 510 items across 21 categories (label-pairing for japanese-silk)
Authors
- Steve50
- auto-commit-fleet2
Agents used
Skills used
- /created7
- /raw5
- /claude3
- /code3
- /shopify-drafts2
- /sbin2
- /golive-launchd2
- /products1
- /sample-qty-carveout1
- /config1
- /unset1
- /golive-held1
- /scripts1
- /weight-guard1
- /abaca1
- /bamboo1
- /denim1
- /fine-arrowroot1
- /gildingwashi1
- /ctrl-click1
- /golive-done1
- /cadence-golive1
- /reconcile-width-backfill1
- /portal1
- /health1
- /day1
- /lookbook-verification1
- /lookbook-verify1
- /skills1
- /healthz1
Creative ideas + design notes
e3b1ada · 2026-09-20 · 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
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C7ujhBP8rChweH7QfhWRia
8b8222e · 2026-09-17 · TK-11664: propagate cadence exit codes (kill the false-green swallow) + stop minting $0 Per Yard variants for quote-only rows
Ticket finding #3 second half: both cadence wrappers piped go-live.py /
create-drafts.py inside { ...; } >> log blocks that always exited 0, so
launchd reported success while the sanctioned go-live path was dead for
18 tranches (the exact false-green class the ticket flagged). Wrappers now
capture the child rc, stamp it on the '=== done' log marker, and exit with
it. PATH export itself already fixed in ce29b0e; validated 5/5 with a
harness incl. the negative control (old minimal PATH still crashes).
Ticket item #6 (durability gap): build-drafts.py minted {price:'0.00',
option1:'Per Yard'} for every enriched row, so any re-scrape adding new
colorways would re-mint fresh $0 Per Yard variants — the same shape that
produced the TK-11635 population. Quote-only rows (tags carry 'quotes') now
build sample-only payloads ($4.25 Sample = sole orderable item, CMO-Paris
precedent, matching go-live.py step 3a's end state); rows without 'quotes'
keep the old two-variant shape. Regenerated data/shopify-drafts.jsonl
(504/504 sample-only, 0 zero-weight; files-only, no API write; create-drafts
remains a no-op — all 504 SKUs already in created.jsonl).
Restore map: docs/TK-11664-restore-map.md. Reversible: git revert.
No Shopify or dw_unified write fired.
ce29b0e · 2026-09-17 · TK-11664: fix launchd-PATH blind spot in fentucci go-live cadence (psql not found, 18 crashed tranches)
launchd runs com.steve.fentucci-golive-cadence with the minimal PATH (/usr/bin:/bin:/usr/sbin:/sbin — no homebrew), so go-live.py's bare 'psql' settlement_map/pg_activate subprocess calls died with FileNotFoundError BEFORE processing any product. Every scheduled tranche 2026-07-28..2026-09-15 (18 runs) crashed identically; golive-done.jsonl stalled at 2/504 and 502 drafts were left outside this gated path — 462 of them flipped ACTIVE via the rotation activator's quotes-tag exemption instead, still carrying the $0.00 'Per Yard' placeholder that go-live.py step 3a would have deleted (the TK-11635 population). Mirrors the proven Osborne-class PATH fix already in Designer-Wallcoverings run-cadence-hourly.sh (launchd preflight linter 2026-06-18). Dry-run proof: with the fix, settlement_map resolves (502 to process, first 3 = DWFN-100003..5); with the old minimal PATH it still crashes. No Shopify write fired by this commit (go-live --apply remains gated); revert with git revert.
7ad86d7 · 2026-09-15 · TK-11438: migrate postgres pool to unix socket (darwin fallback)
Use process.env.PGHOST || darwin?/tmp:127.0.0.1 so Mac2 services use the unix socket at /tmp and Kamatera keeps TCP until its own migration. Undo: git revert HEAD
46f9c5c · 2026-09-14 · TK-11664 Option B: codify Sample qty=2026+tracked carve-out (no Shopify write)
Steve-approved 2026-09-14. The $4.25 Sample being tracked+DENY+on_hand=2026 is go-live.py's deliberate quote-only design (ruling 2026-07-26), NOT the TK-11357 $0-restamper fingerprint and NOT a "sample=no tracking" violation. Codified as an inline CARVE-OUT block in go-live.py + a machine-readable data/sample-qty-carveout.json with an explicit boundary: a $0 checkout-orderable variant stays an armed defect for every canary. Documentation/config only — no Shopify or dw_unified write. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
09562bf · 2026-09-12 · chore: v1.0.6 (TK-11471 session close — weight guard on the latent Tokiwa pipeline)
Patch: guards only. This pipeline is dormant (monthly, broken since 2026-08-25 on a missing psql) and was NOT the source of the live leak; it is guarded so it cannot become one when repaired. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9874a31 · 2026-09-11 · TK-11471: wire the weight guard into the Fentucci create + activate paths
CREATE (build-drafts.py, create-drafts.py): every variant now carries
weight + weight_unit "lb" — Sample 0.25, Per Yard 3.0 (Wallcovering default).
The $0.00 quote-only Per Yard variant still ships, so it still needs a weight.
Both files assert weight>0 before writing/POSTing. The guard is applied again
at the POST site because data/shopify-drafts.jsonl predates this change — a
stale payload must not be able to create a zero-weight variant. Price,
inventory_policy deny, inventory_management, tags and the settlement exclusion
are untouched (the TK-11357 quote-only posture is a separate load-bearing guard).
ACTIVATE (go-live.py): new step 3d weight_gate() runs before publish + before
status=active. It re-reads weights through a query that ACTUALLY returns them
(inventoryItem{measurement{weight{value unit}}}), writes the approved default
onto any zero/unset variant, RE-VERIFIES, and on any variant still zero returns
the existing ("held", [...]) outcome with a `weight>0` reason so it lands in
data/golive-held.jsonl like every other gate. Idempotent; a no-op beyond one
read when weights are already positive. Heal path is inventoryItemUpdate with a
REST variant-update fallback for a token without write_inventory.
go-live.py / cadence-golive.sh / resume.sh now prefer SHOPIFY_FULL_ACCESS_TOKEN
over the narrow SHOPIFY_ADMIN_TOKEN: the weight heal and the pre-existing
inventory_levels writes both need write_inventory (dw-golive-token-guard-canary).
Offline replay over the real 504-row drafts file: 1008 zero-weight variants
before the guard, 0 after. No Shopify writes, no pipeline run.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FJHxAzaEMMxado57mFjiCk
81a477a · 2026-09-11 · TK-11471: vendor a Python weight guard + its negative tests
Python port of designerwallcoverings/scripts/lib/weight-guard.mjs, constants byte-identical (SAMPLE_WEIGHT_LB 0.25, FALLBACK_LB 2.0, the 17-entry TYPE_DEFAULT_LB table). This pipeline is Python + REST and lives outside scripts/*-onboard/, so every .js/.mjs-only or GraphQL-only sweep of this lineage structurally misses it — third recorded occurrence of that omission. Deliberate divergence from the .mjs: all_zero_weight_variants() counts SAMPLE variants. The .mjs zeroWeightBlockers() filters them out, which made the gate narrower than the invariant dw-active-weight-canary enforces (its live run split the offenders 43 sample / 40 sellable). That bug is not ported. heal_and_verify_weights() fails CLOSED: an unreadable re-query, a re-query response that never carried the weight field, a missing inventoryItem id, or a userError all return ok=False. response_carries_weight_field() is the guard against the false-green class — a gate reading a response that never contained weight proves nothing. test_weight_guard.py: 30 offline tests (no network, no DB, no cost), every one an injected fault or an asserted clean state. Verified by mutation: removing the go-live gate -> 3 failures; porting the .mjs sample-filter bug -> 7 failures; neutering resolve_weight_lb -> 4 failures. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FJHxAzaEMMxado57mFjiCk
7bb6ba0 · 2026-08-24 · TK-10801: recover 3 DWNAT (Winfield Thybony) images locally; 145/148 dead at source
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). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c32b78d · 2026-08-01 · fentucci-naturals: href-drill — card data points are filter-links (multi-select, URL-addressable)
Card pattern / color / material / category / tag data points are now <a href="?dim=val"> that ADD that facet to the multi-select selection (href-drill HARD rule); the full facet state (comma-encoded per dimension) + search are URL-addressable — shareable, deep-linkable, back-button-safe (popstate/readURL). Click adds the facet in place; cmd/ctrl-click opens the shareable href. Existing facet checkboxes / search / sort / memo-stock-price actions untouched. Verified LOCAL (Playwright + basic auth, :9981): click material 'Wood Veneer' -> ?materials + grid 504->27; deep-link restores; back-button->504; canary FLAT->DONE; 0 pageerrors. CUSTOMER-FACING storefront — local commit only; DEPLOY is gated (pending-approval). grid 8/92. TK-10089.
File tree
- .deploy.conf.DISABLED-local-only
- .gitignore
- DEPLOY-NOTE.md
- data/_shopify-fentucci-reconcile.tsv
- data/activation-batch-manifest.json
- data/colors.json
- data/created.jsonl
- data/golive-done.jsonl
- data/golive-done.jsonl.bak-TK00034-1785195344
- data/golive-held.jsonl
- data/image-audit.json
- data/image-failures.json
- data/lookbook-verification.json
- data/normalize-flags.json
- data/pattern-copy.json
- data/products.json
- data/raw/_summary.json
- data/raw/abaca.json
- data/raw/bamboo.json
- data/raw/denim.json
- data/raw/fine-arrowroot.json
- data/raw/gildingwashi.json
- data/raw/glassbeads.json
- data/raw/glassbeadscollection.json
- data/raw/greenbookcollection.json
- data/raw/heavy-jute.json
- data/raw/hyacinth.json
- data/raw/japanese-silk.json
- data/raw/japanese-silk2.json
- data/raw/metal-leaf-3.json
- data/raw/metal-leaf.json
- data/raw/metalleaf2.json
- data/raw/mica.json
- data/raw/paperweave.json
- data/raw/raffia.json
- data/raw/reflectionsvol2.json
- data/raw/reflectionvol1.json
- data/raw/sisal.json
- data/raw/textile.json
- data/raw/textilecollection.json
- data/raw/washi.json
- data/raw/washi2.json
- data/raw/wood-veneer.json
- data/rename-map.json
- data/revert-snapshot-40-TK00034.json
- data/sample-qty-carveout.json
- data/shopify-drafts.jsonl
- data/stage.sql
- docs/TK-11664-restore-map.md
- docs/fentucci-scraper-manager-SKILL.md
- evidence/TK-11868/REMEASURE.md
- evidence/TK-11868/fentucci-width-scope.json
- evidence/TK-11868/remeasure-probe.mjs
- evidence/TK-11868/width-metafield-distribution-probe.mjs
- evidence/tk11943/FINDINGS.md
- evidence/tk11943/live-variant-scan.json
- evidence/tk11943/per-yard-restore-map.json
- images-dwnat/WNR1104.jpg
- images-dwnat/WNR1108.jpg
- images-dwnat/WNR1115.jpg
- images/005-801-003-301.jpg
- images/005-801-003-305.jpg
- images/005-801-003-307.jpg
- images/005-801-003-308.jpg
- images/005-801-003-310.jpg
- images/005-802-003-301.jpg
- images/005-802-003-305.jpg
- images/005-802-003-307.jpg
- images/005-802-003-308.jpg
- images/005-802-003-310.jpg
- images/005-803-003-301.jpg
- images/005-803-003-305.jpg
- images/005-803-003-307.jpg
- images/005-803-003-308.jpg
- images/005-804-003-301.jpg
- images/005-804-003-305.jpg
- images/005-804-003-307.jpg
- images/005-804-003-308.jpg
- images/005-804-003-310.jpg
- images/005-805-003-301.jpg
- images/005-805-003-305.jpg
- images/005-805-003-307.jpg
- images/005-805-003-308.jpg
- images/005-805-003-310.jpg
- images/0509.jpg
- images/0510.jpg
- images/0511.jpg
- images/0512.jpg
- images/0513.jpg
- images/0514.jpg
- images/0709.jpg
- images/0710.jpg
- images/0711.jpg
- images/0712.jpg
- images/0713.jpg
- images/1201.jpg
- images/1202.jpg
- images/1203.jpg
- images/1204.jpg
- images/1205.jpg
- images/1206.jpg
- images/1207.jpg
- images/1208.jpg
- images/1301.jpg
- images/1302.jpg
- images/1303.jpg
- images/1304.jpg
- images/1305.jpg
- images/1306.jpg
- images/1401.jpg
- images/1402.jpg
- images/1403.jpg
- images/1405.jpg
- images/1406.jpg
- images/1501.jpg
- images/1502.jpg
- images/1503.jpg
- images/1504.jpg
- images/A-18001.jpg
- images/A-18002.jpg
- images/A-18003.jpg
- images/A-18004.jpg
- images/A-18005.jpg
- images/A-18006.jpg
- images/A-18007.jpg
- images/A-18008.jpg
- images/A-18009.jpg
- images/A-18010.jpg
- images/A-2550.jpg
- images/A-2551.jpg
- images/A-2552.jpg
- images/A-2553.jpg
- images/A-2555.jpg
- images/A-2556.jpg
- images/A-2557.jpg
- images/A-2558.jpg
- images/A-2559.jpg
- images/A-2560.jpg
- images/A-2561.jpg
- images/A-2562.jpg
- images/A-2563.jpg
- images/A-2564.jpg
- images/DW-101.jpg
- images/DW-103.jpg
- images/DW-201.jpg
- images/DW-203.jpg
- images/FE-GC001.jpg
- images/FE-GC002.jpg
- images/FE-GC003.jpg
- images/FE-GC004.jpg
- images/FE-GC006.jpg
- images/FE-GC007.jpg
- images/GB-1053.jpg
- images/GB-1054.jpg
- images/GB-1055.jpg
- images/GB-1056.jpg
- images/GB-1057.jpg
- images/GB-1058.jpg
- images/GB-1059.jpg
- images/GB-1060.jpg
- images/GB-1061.jpg
- images/GB-1062.jpg
- images/GB-1063.jpg
- lib/vendor-requests.js
- logs/golive-launchd.err
- logs/golive-launchd.out
- logs/launchd.err
- logs/launchd.out
- package-lock.json
- package.json
- public/index.html
- scripts/build-drafts.py
- scripts/cadence-golive.sh
- scripts/cadence-import.sh
- scripts/color-names.py
- scripts/create-drafts.py
- scripts/download-images.js
- scripts/enrich.py
- scripts/go-live.py
- scripts/image-audit.js
- scripts/lib/test_weight_guard.py
- scripts/lib/weight_guard.py
- scripts/lookbook-verify.js
- scripts/normalize.js
- scripts/pg-writeback.py
- scripts/reconcile-width-backfill.js
- scripts/report.js
- scripts/resume.sh
- scripts/retown-collisions.py
- scripts/scrape.js
- scripts/stage-db.js
- server.js