{"slug":"greenland-onboard","total":65,"limit":100,"offset":0,"since":null,"commits":[{"hash":"b7ccab2","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":"cc826bb","date":"2026-09-10 17:52:31 -0700","author":"Steve Abrams","subject":"governance(TK-11370): make live-by-default Shopify writers dry-run by default","body":"Flip `DRY = argv.includes('--dry')` -> `DRY = !argv.includes('--apply')` so a\nzero-argument run no longer fires customer-facing Shopify writes.\n\nBackward compatible: `--dry` still means dry; `--apply` now required to write.\nOnly zero-arg invocations change behaviour, and every candidate was checked\nagainst its launchd/cron/pm2/wrapper invocation sites first (4 scripts that a\ncadence job runs flagless were EXCLUDED so this cannot silently disable them).\n\nVerified: node --check/py_compile 87/87 with a positive control proving the\nchecker rejects an injected fault; argv truth-table negative test 5/5.\n\nCo-Authored-By: Claude Opus 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01L53y4oP2itY3qeJ8WQgMzc"},{"hash":"eb421f7","date":"2026-08-31 10:53:28 -0700","author":"Steve","subject":"importer: map global.width metafield (Carnegie-class fix)","body":""},{"hash":"a21e610","date":"2026-08-31 00:39:59 -0700","author":"Steve Abrams","subject":"remove stray tracked index.lookbook.bak.html (served backup = creds-in-URL hole) (TK-10984)","body":""},{"hash":"24d5c84","date":"2026-08-30 23:53:34 -0700","author":"Steve Abrams","subject":"deploy-safety: exclude data/ from rsync (TK-10984)","body":""},{"hash":"79e25d1","date":"2026-08-30 22:57:39 -0700","author":"Steve Abrams","subject":"add creds-in-URL fetch guard to gated pages (TK-10984)","body":""},{"hash":"20e37e6","date":"2026-08-27 10:13:04 -0700","author":"Steve Abrams","subject":"TK-10434: regenerate cork enrichment (213/213 tags+colors+hex+styles), stage title-fix map for 21 doubled titles","body":""},{"hash":"93dd23f","date":"2026-08-25 10:48:56 -0700","author":"Steve","subject":"creds-safe fetch guard: resolve relative fetch vs credential-free location (creds-in-URL trap)","body":"Fleet inoculation — opening this basic-auth app with credentials in the URL\npoisoned document.baseURI and made relative fetch('/api/…') throw. Guard resolves\nnon-absolute request URLs against location instead. Ref: creds-in-url-fetch-guard-fleet-pattern.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"c03f37b","date":"2026-08-20 08:14:33 -0700","author":"Steve Abrams","subject":"nav-agent: sync v1.3 (host left-sidebar collapse on load)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"898e549","date":"2026-08-19 14:31:01 -0700","author":"Steve","subject":"nav-agent: List data full-width tight columns (grid) — layout fix","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"14471a6","date":"2026-08-19 14:05:21 -0700","author":"Steve","subject":"Refresh nav-agent to v1.2 (adds kv-list compact List view, default-off)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"55866cc","date":"2026-08-13 08:29:16 -0700","author":"Steve Abrams","subject":"nav-agent: universal grid-controls drop-in on internal viewer pages (STRONG-only)","body":""},{"hash":"ace5493","date":"2026-08-11 04:31:01 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-11T04:29:53 (1 data files) — data/full-catalog.ndjson","body":""},{"hash":"475d7a8","date":"2026-08-10 16:41:18 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-10T16:40:28 (2 data files) — backups/runs/miyago-216222-227-fullstate-20260810-162937.json backups/runs/miyago-216222-227-inspect-20260810-162937.jsonl","body":""},{"hash":"4b24288","date":"2026-08-10 16:22:11 -0700","author":"Steve Abrams","subject":"greenland cork go-live step 6: reactivate+publish+image-attach 15 archived Cork-500210-500350 (all unique non-dups), add audit/reactivate scripts + run log","body":""},{"hash":"9ae7f09","date":"2026-08-10 16:12:26 -0700","author":"Steve Abrams","subject":"greenland cork go-live: 100% color coverage (lift from pattern_name), localize image_url column, add 2-leaf cork discovery script","body":""},{"hash":"3bb9eb3","date":"2026-08-10 16:10:22 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-10T16:09:17 (4 data files) — backups/greenland_catalog-20260810-155642.sql backups/greenland_catalog_20260810-160137.sql data/expand-live-all.ndjson data/expand-new.ndjson","body":""},{"hash":"d9b8507","date":"2026-08-01 01:47:59 -0700","author":"Steve Abrams","subject":"greenland-onboard: href-drill — city/width/backing are filter-links + URL-addressable","body":"Card data points (city / width / backing — exact-match FIELDS facets) are now\n<a href=\"?city=…\"> to their filtered view (href-drill HARD rule); the left-panel\nfacets + search + pattern are URL-addressable too. Click filters in place + reflects\ninto the URL, cmd/ctrl-click opens the shareable href, back-button + deep-link restore\nvia popstate/readURL.\n\nVerified (Playwright + basic auth, live :9973): click city 'Hilton Head' -> ?city + grid\n120->8 all-matching; deep-link restores; back-button->120; canary FLAT->DONE; 0 pageerrors.\nhref-drill backlog grid 6/92. TK-10089."},{"hash":"d3f4af8","date":"2026-07-27 16:38:29 -0700","author":"Steve Abrams","subject":"gitignore locally-served product images after history purge","body":""},{"hash":"a1b0e3b","date":"2026-07-26 20:02:57 -0700","author":"Steve Abrams","subject":"greenland-internal: capture go-live deploy notes (express/pg npm install, IP-specific nginx listen, gray-cloud LE TLS)","body":""},{"hash":"33f8806","date":"2026-07-15 16:51:25 -0700","author":"Steve","subject":"greenland-onboard: add Memo/Stock/Price chip actions via shared vendor-requests module (express sub-app delegation)","body":""},{"hash":"664f66c","date":"2026-07-15 14:21:14 -0700","author":"Steve","subject":"Greenland cork go-live: publish the 1 active-unpublished SKU (Montauk-Bison Gold)","body":"Reality check via live Shopify (snapshot was stale): cork line is ALREADY 195/196\nactive SKUs published. Published the 1 remaining active-unpublished (verified live,\nstorefront 200). publish-online.mjs guards: Online Store only, Phillipe-Romano-name /\nno-Greenland / no-Wallpaper rails, and status===ACTIVE (never resurrect the 15 ARCHIVED\n= discontinued SKUs). Canary correctly no-op'd on archived (no harm)."},{"hash":"8e47620","date":"2026-07-14 08:55:24 -0700","author":"Steve","subject":"Greenland cork disco: archive 15 Phillipe Romano cork SKUs (Southampton G0154 + Palm Beach G0155) across Shopify/FileMaker/dw_unified 2026-07-14","body":""},{"hash":"d892db4","date":"2026-07-14 07:48:58 -0700","author":"Steve","subject":"Add Activation Calendar tab: every staged SKU gets a go-live date+time","body":"Reusable client-side drop-in (public/activation-calendar.js) + a Products|Calendar\ntoggle. Reads the line's own products, assigns every not-yet-published SKU a durable\ngo-live date+HH:10 slot at 50/day, renders a month calendar (213/213 cork SKUs).\nZero server changes. Pilot for the fleet-wide rollout Steve requested.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"fcfbcf5","date":"2026-07-13 09:53:45 -0700","author":"Steve Abrams","subject":"trim trailing whitespace in mfrModel (scraper + existing full-catalog data) — fixes false 'no DW sku' join misses like G0111NQ8242","body":""},{"hash":"1809334","date":"2026-07-13 08:53:54 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-13T08:53:46 (1 files) — scripts/make-cork-reels.py","body":""},{"hash":"3fd488b","date":"2026-07-13 01:52:14 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-13T01:52:00 (1 files) — scripts/rerule-material-collections.mjs","body":""},{"hash":"b9d4529","date":"2026-07-13 00:09:51 -0700","author":"Steve Abrams","subject":"Add refresh-viewer.sh, README internal-tool docs, .deploy.conf rename to greenland-internal; deploy/DNS memo drafted to pending-approval","body":""},{"hash":"0f19e5d","date":"2026-07-12 23:57:56 -0700","author":"Steve Abrams","subject":"Internal cork tool: basic-auth Express-style http server (/healthz, /api/products, /api/product, /api/stock live $0), full viewer UI (facets incl City/Use/FireRating, stock+price badges, detail drawer w/ pricing card + live stock recheck + copy + Shopify/all.dw links)","body":""},{"hash":"b4a101a","date":"2026-07-12 23:53:10 -0700","author":"Steve Abrams","subject":"Add viewer-snapshot generator (catalog+enriched+shopify merge); localize+enrich 2 Montauk strays → 213/213 complete","body":""},{"hash":"6aa4faf","date":"2026-07-12 23:21:18 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T23:21:12 (1 files) — scripts/update-tags.mjs","body":""},{"hash":"3598236","date":"2026-07-12 22:49:03 -0700","author":"Steve Abrams","subject":"build 38 Phillipe Romano smart collections (material/style/hue, vendor-scoped)","body":""},{"hash":"fb2d951","date":"2026-07-12 19:32:10 -0700","author":"Steve Abrams","subject":"Finish cork SKU standardization: convert 3 stray DWGL- strays (Bark/Antique Gold→Montauk Cork-, Bison Gold dup archived), refresh viewer feed","body":"Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"20e5c7e","date":"2026-07-12 12:33:02 -0700","author":"Steve Abrams","subject":"fix 82 junk titles via colorway lexicon (live+DB); regen internal viewer products.json from DB; pending-approval memo","body":""},{"hash":"4f22ce7","date":"2026-07-12 11:56:36 -0700","author":"Steve Abrams","subject":"Greenland Cork: sync staging dw_sku to canonical Cork- scheme (was DWGL-); viewer feed refreshed","body":""},{"hash":"e9e1bae","date":"2026-07-12 11:56:19 -0700","author":"Steve Abrams","subject":"tag-updater: source from DB (authoritative hue/style), fixes undefined tags","body":""},{"hash":"6ab7e31","date":"2026-07-12 11:55:22 -0700","author":"Steve Abrams","subject":"Add cork enrichment: 213 Cork-500xxx locally enriched (PIL median-cut + lexicon), full coverage, Phillipe Romano titles/alt/tags/desc","body":""},{"hash":"fc66c8b","date":"2026-07-12 11:54:04 -0700","author":"Steve Abrams","subject":"tag-updater: tags-only (drop colliding custom.* metafields)","body":""},{"hash":"2698f6b","date":"2026-07-12 11:48:07 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T11:48:02 (1 files) — data/published.ndjson","body":""},{"hash":"7929d17","date":"2026-07-12 11:44:26 -0700","author":"Steve Abrams","subject":"add hue(from hex)+style per SKU; Shopify tag-updater (Style/Color/Hue/Hex tags + metafields)","body":""},{"hash":"3308030","date":"2026-07-12 11:18:00 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T11:17:54 (1 files) — data/published.ndjson","body":""},{"hash":"6cd5fcc","date":"2026-07-12 10:49:17 -0700","author":"Steve Abrams","subject":"live publisher: sample-$4.25 + quotes-tag, per-SKU dup-guard, DB backfill; canary 5 verified","body":""},{"hash":"726327d","date":"2026-07-12 10:47:52 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T10:47:45 (1 files) — scripts/publish-samples.mjs","body":""},{"hash":"f451923","date":"2026-07-12 10:38:04 -0700","author":"Steve Abrams","subject":"scrub Greenland leak from microsite (title/h1/fallback → Phillipe Romano)","body":""},{"hash":"d4237fa","date":"2026-07-12 10:37:23 -0700","author":"Steve Abrams","subject":"romance wording fix (Specialty→surface) + merged rich products.json (cork+908) for internal viewer","body":""},{"hash":"2f11272","date":"2026-07-12 10:33:13 -0700","author":"Steve Abrams","subject":"enriched preview: local images, cleaned titles, hex swatches, tags","body":""},{"hash":"4fd9c17","date":"2026-07-12 10:31:35 -0700","author":"Steve Abrams","subject":"Full-catalog step 7: stage 908 to greenland_full_catalog (DRAFT/quote-only/price NULL) + shopify DRAFT payloads + full-specs CSV; 0 customer-facing leaks","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"5b87e99","date":"2026-07-12 10:30:42 -0700","author":"Steve Abrams","subject":"Full-catalog step 6: romance body_html via local qwen3:14b (think:false), 101/101 ollama, per-colorway color sentence","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"a784bc0","date":"2026-07-12 10:17:42 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T10:17:36 (1 files) — scripts/full-03-romance.py","body":""},{"hash":"800bae3","date":"2026-07-12 10:16:49 -0700","author":"Steve Abrams","subject":"Full-catalog steps 2-5: PIL hex+color-clean, tags, packaging, titles, alt (908 enriched)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"fd65197","date":"2026-07-12 10:15:08 -0700","author":"Steve Abrams","subject":"Full-catalog step 1: localize 908 SKU images to public/img (0 fail)","body":"Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"},{"hash":"180de83","date":"2026-07-12 10:04:19 -0700","author":"Steve Abrams","subject":"full-catalog scrape + classify/assign backbone: 908 SKUs, coastal cities, material prefixes, specs","body":""},{"hash":"f3e3eb6","date":"2026-07-12 09:47:34 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T09:47:28 (3 files) — data/full-catalog.ndjson scripts/scout-full-catalog.mjs scripts/scrape-full.mjs","body":""},{"hash":"7259183","date":"2026-07-12 09:17:26 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T09:17:21 (2 files) — public/products.json scripts/localize-images.mjs","body":""},{"hash":"f8e5587","date":"2026-07-12 08:53:43 -0700","author":"Steve","subject":"microsite: localize all 213 cork images (public/img), serve image/jpeg, repoint products.json to local paths","body":""},{"hash":"206fe16","date":"2026-07-12 08:47:19 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-12T08:47:12 (1 files) — public/products.json","body":""},{"hash":"7842bb8","date":"2026-07-11 18:53:10 -0700","author":"Steve","subject":"chore: v1.0.0 — Greenland cork onboard (session close)","body":""},{"hash":"f1be0c0","date":"2026-07-11 09:12:44 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-11T09:12:35 (1 files) — data/greenland-cork-specs.csv","body":""},{"hash":"2e16ad9","date":"2026-07-10 23:32:41 -0700","author":"Steve Abrams","subject":"Greenland Cork: backfill 12 pre-existing SKUs + final feed refresh (213/213 live)","body":""},{"hash":"9a083a9","date":"2026-07-10 23:31:32 -0700","author":"Steve Abrams","subject":"Greenland Cork: 213 published LIVE + ACTIVE on Shopify (quote-only, DWGL-); viewer feed refreshed with assigned SKUs","body":""},{"hash":"96cd126","date":"2026-07-10 20:47:16 -0700","author":"Steve Abrams","subject":"Greenland Cork internal viewer: DWGL- series assigned (213), full SKU+mfr detail, Amazon/all.dw left-panel facets (8 fields), density/sort/list/card-toggles","body":""},{"hash":"8db9308","date":"2026-07-10 17:32:44 -0700","author":"Steve","subject":"fix(contrarian): explode skus[] colorways 100->213 SKUs; material=Cork; distinct color names; render-verified 213 cards","body":""},{"hash":"979fe7c","date":"2026-07-10 17:20:52 -0700","author":"Steve","subject":"microsite scaffold: greenland.designerwallcoverings.com DW lookbook (sort+density, quote-only, port 9973)","body":""},{"hash":"c709b6a","date":"2026-07-10 17:19:12 -0700","author":"Steve","subject":"scrape 100 Greenland cork SKUs → greenland_catalog (feed-first, $0); + schema","body":""},{"hash":"7d57d2c","date":"2026-07-10 17:13:06 -0700","author":"Steve","subject":"initial scaffold: greenland-onboard (feed-first API mapped, staging table)","body":""}]}