Fentucci Naturals

repo: ~/Projects/fentucci-naturals · 52 commits · 0 in last 24h, 2 in last 7d · █

Search the build

52 commits indexed

  1. 8eb7e3b 2026-09-20 TK-11943: EXECUTED — deleted 462 vestigial $0 Per-Yard variants (Steve-approved Option A), all Sample-only, verified
  2. ae29738 2026-09-20 TK-11943: evidence — Fentucci Naturals $0 Per-Yard is guarded (0 live risk), restore-map for 462 vestigial variants
  3. 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
  4. 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
  5. ce29b0e 2026-09-17 TK-11664: fix launchd-PATH blind spot in fentucci go-live cadence (psql not found, 18 crashed tranches)
  6. 8805ceb 2026-09-17 auto-data-snapshot: 2026-09-17T14:12:57 (1 data files) — data/products.json
  7. 7ad86d7 2026-09-15 TK-11438: migrate postgres pool to unix socket (darwin fallback)
  8. 46f9c5c 2026-09-14 TK-11664 Option B: codify Sample qty=2026+tracked carve-out (no Shopify write)
  9. 09562bf 2026-09-12 chore: v1.0.6 (TK-11471 session close — weight guard on the latent Tokiwa pipeline)
  10. 9874a31 2026-09-11 TK-11471: wire the weight guard into the Fentucci create + activate paths
  11. 81a477a 2026-09-11 TK-11471: vendor a Python weight guard + its negative tests
  12. 7bb6ba0 2026-08-24 TK-10801: recover 3 DWNAT (Winfield Thybony) images locally; 145/148 dead at source
  13. ed32f00 2026-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
  14. d634aa6 2026-08-06 chore(fentucci): disable prod-deploy config (viewer is Mac2-local; prod has no fentucci-viewer process) + document
  15. 6ef3ae9 2026-08-03 add .deploy.conf to .gitignore (TK-10123)
  16. c32b78d 2026-08-01 fentucci-naturals: href-drill — card data points are filter-links (multi-select, URL-addressable)
  17. ed29985 2026-07-28 auto-save: 2026-07-28T05:27:36 (2 files) — logs/golive-launchd.err logs/golive-launchd.out
  18. 30df3b0 2026-07-27 auto-save: 2026-07-27T19:23:22 (1 files) — package-lock.json
  19. 842b7c2 2026-07-27 chore: v1.0.5 (session close — TK-34 go-live cadence)
  20. f13fc3d 2026-07-27 auto-save: 2026-07-27T18:53:10 (3 files) — data/golive-done.jsonl scripts/cadence-golive.sh scripts/reconcile-width-backfill.js
  21. 0805607 2026-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.
  22. dc2dcc2 2026-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).
  23. 7c78370 2026-07-26 chore: gitignore __pycache__/*.pyc + untrack, v1.0.4 (session close)
  24. 8968402 2026-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
  25. bccaed0 2026-07-26 chore: version-up v1.0.2 (session close) — pg-writeback lint-clean
  26. 21d1f04 2026-07-26 PG-first writeback: link 504 Tokiwa staging rows to Shopify draft ids (shopify_product_id + on_shopify)
  27. 8cdafc0 2026-07-23 auto-save: 2026-07-23T05:18:46 (1 files) — data/created.jsonl
  28. e3058c0 2026-07-23 auto-save: 2026-07-23T04:48:39 (1 files) — data/created.jsonl
  29. 4ac1d93 2026-07-22 auto-save: 2026-07-22T22:47:10 (1 files) — data/created.jsonl
  30. 802e05e 2026-07-22 auto-save: 2026-07-22T22:17:02 (1 files) — data/created.jsonl
  31. 303746b 2026-07-22 auto-save: 2026-07-22T20:16:30 (1 files) — data/created.jsonl
  32. 8355d18 2026-07-22 auto-save: 2026-07-22T19:46:22 (2 files) — data/created.jsonl package-lock.json
  33. da9325f 2026-07-22 chore: v1.0.1 (session close)
  34. 1ca6211 2026-07-22 chore: lint + light refactor (session close) — cadence.sh redirect guard, dead /api/health route removed, esc hoisted in enrich.py
  35. 9c3c6f4 2026-07-22 auto-save: 2026-07-22T19:16:13 (1 files) — data/created.jsonl
  36. c566116 2026-07-22 fix 422: custom.material metafield type matches store definition (multi_line); importer records create before metafields + non-fatal metafield errors
  37. bae363c 2026-07-22 daily import cadence: 245/day tranche script + launchd com.steve.fentucci-import-cadence (Steve-approved std-cadence rollout)
  38. ab35a39 2026-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
  39. 56057b4 2026-07-22 auto-save: 2026-07-22T18:46:04 (2 files) — data/lookbook-verification.json scripts/lookbook-verify.js
  40. f3f925a 2026-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
  41. 15039eb 2026-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
  42. ba65537 2026-07-22 add fentucci-scraper-manager skill (in-repo copy; live at ~/.claude/skills/) — canonical DWFN scheme, refresh runbook, scrape gotchas, hard gates
  43. 934b282 2026-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)
  44. 73c3434 2026-07-22 gated importer scaffold (create-drafts.py, resumable, day-capped, leak tripwire) — NOT executed; approval memo filed to pending-approval
  45. ea8b38b 2026-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)
  46. 5115461 2026-07-22 increment 2: enrichment engine (qwen3:14b per-pattern copy + deterministic colorway/tags/specs) + draft-payload builder
  47. 7824e0c 2026-07-22 stage: 504 SKUs / 64 patterns into dw_unified.tokiwa_catalog, colors derived, 100% image coverage, 0 collapse flags
  48. b4b07f8 2026-07-22 add sanity report script
  49. 20606ea 2026-07-22 gitignore images/ — full-res originals project to >1GB (task rule: keep in git only if <100MB)
  50. bd416c6 2026-07-22 add download-images, color-names (PIL hue buckets), stage-db (tokiwa_catalog), image-audit scripts
  51. 7b19e7b 2026-07-22 normalize: 504 products / 64 patterns, deterministic town rename-map, DWFN-100001+ assignment
  52. b67d83d 2026-07-22 scrape: Tokiwa USA SSR img scraper, 510 items across 21 categories (label-pairing for japanese-silk)

Authors

Agents used

  • none detected

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

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

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

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

Other build journals

← Feature Harvest  ·  all 4 projects  ·  Fentucci Theme Note →

Export

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

rendered in 3ms