130 Commits

Author SHA1 Message Date
ben.stull c18ddcc561 Merge pull request 'Pivot: strip storefront → network-service seed (v0.9.0)' (#33) from pivot-strip-storefront into main
ci / check (push) Has been cancelled
2026-06-12 16:32:49 +00:00
ben.stull 84a2bdbd78 chore(reset): drop e2e run artifacts swept in by git add -A
ci / check (push) Has been cancelled
ci / check (pull_request) Has been cancelled
These local Playwright run artifacts (.objectstore renditions, .backend.log,
test-results) stopped being ignored when e2e/.gitignore was removed with the suite,
so the strip commit wrongly added them. Remove; e2e is fully gone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 09:31:37 -07:00
ben.stull df92e3f94c chore(reset)!: strip storefront → network-service seed (v0.9.0)
ci / check (push) Has been cancelled
Pivot ecomm from a generic multi-tenant Shopify-alternative storefront to the
commitment-commerce + cross-maker verified referral NETWORK direction
(ecomm-content/rfcs/network_strategy.md; OHM identity/relationality super-drafts).

Phase A of the reset — clear the decks:
- Strip the storefront surfaces with no carry-forward: the storefronts domain,
  the products import/export/image HTTP spine (service/imagefetch/repo + endpoints),
  the SPA frontend, and the Playwright e2e suite.
- Keep the reusable core: /healthz + /api/auth/* (accounts); the
  catalog-normalization library (codec/dialect/models/serialize/validate/diff/hosted —
  importable, no HTTP yet); platform/* infra. Migrations untouched (append-only).
- Reduce check.sh to backend-only (import-linter + pytest); trim dev.sh and the unused
  GCS overlay env. Repoint app.json/README/CLAUDE.md; bump VERSION 0.8.0 -> 0.9.0.

check.sh green: import-linter (main > domains > platform) KEPT, pytest passing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 09:30:01 -07:00
ben.stull e2d8b5caae Merge pull request 'SLICE-8: Shopify dialect — detect/map Shopify export at the codec boundary + DOC-2/3 (SD-0002 §7.2)' (#32) from slice-8-shopify-dialect into main
ci / check (push) Has been cancelled
v0.8.0 release/2026-06-12T02-41
2026-06-12 09:37:37 +00:00
ben.stull a851d3587c fix(products): conservative dialect detection — canonical-distinctive columns veto Shopify (SLICE-8 review)
ci / check (push) Has been cancelled
ci / check (pull_request) Has been cancelled
Addresses adversarial-review findings: a canonical file carrying a stray
Shopify-signature name (e.g. SEO Title) no longer misdetects as Shopify and
silently drops canonical Type / corrupts the weight unit (kg->g). A
canonical-distinctive column (Description/Variant Cost/Variant Weight/Google
Product Category/Variant Volume/Tax ID/Position) now vetoes detection, so
detection leans conservative (under-detection warns; over-detection corrupts).
Also closes the dual-named-column shadow (Body (HTML)+Description) and the
stale-weight-unit-on-clear case. Tests cover all three.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:36:09 -07:00
ben.stull cb6b5996f3 chore(products): SLICE-8 complete — bump v0.8.0; §12 traceability audited (SD-0002)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:28:18 -07:00
ben.stull 17f3b600fd test(e2e): e2e_import_shopify_dialect — Shopify export imports directly (PUC-6, SLICE-8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:26:44 -07:00
ben.stull 6459e34480 docs(products): DOC-4 dialect-adapter notes (SLICE-8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:24:44 -07:00
ben.stull 60a06de302 docs(products): DOC-2 column reference served at /api/products/columns.md (SLICE-8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:24:05 -07:00
ben.stull 0aeccf7d2c feat(products-ui): Shopify 'mapped' label + format help links to column reference (PUC-6/PUC-11, SLICE-8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:22:32 -07:00
ben.stull a00f5baaec test(products): INV-10 holds over a partial Shopify import (SLICE-8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:21:34 -07:00
ben.stull f170950aec test(products): exhaustive Shopify->canonical mapping fixture (SD-0002 §6.5.1, SLICE-8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:21:05 -07:00
ben.stull 0c7a76a305 feat(products): codec detects + maps Shopify dialect at the boundary (INV-17, SLICE-8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:20:21 -07:00
ben.stull daa237dd59 feat(products): Shopify dialect adapter — header detection + canonical mapping (SD-0002 §6.5.1, SLICE-8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:19:15 -07:00
ben.stull e16ec7cf94 docs(plan): SLICE-8 Shopify dialect implementation plan (SD-0002 §7.2)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 02:17:30 -07:00
ben.stull 8ed9b25771 Merge pull request 'SLICE-7: images pipeline end-to-end — fetch/host/serve + INV-12 over images (SD-0002 §7.2)' (#30) from worktree-slice-7-images into main
ci / check (push) Has been cancelled
v0.7.0 release/2026-06-12T01-20
2026-06-12 08:00:00 +00:00
ben.stull c929282e07 fix(products): bomb-safe image processing + per-image error isolation; honest claim/resumability docs (SLICE-7 review)
ci / check (push) Has been cancelled
ci / check (pull_request) Has been cancelled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:58:10 -07:00
ben.stull 757412ef2a docs(products): image pipeline ops + seams (DOC-1/DOC-4); overlay bucket config; v0.7.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:48:44 -07:00
ben.stull 0775537d4c test(e2e): e2e_image_outcomes — fixture image host, per-image outcomes + notice band (SD-0002 §6.8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:41:39 -07:00
ben.stull d81215be1d feat(products-ui): run-detail images section + progress poll, image-problems notice band, history images column (SD-0002 §5.2/§5.5)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:37:45 -07:00
ben.stull 7f51f5242f feat(products): app-served image route — storefront-authorized, immutable cache (SD-0002 §6.4, INV-16)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:34:04 -07:00
ben.stull 5d5341b29b feat(products): confirm → fetching_images + post-commit fetch scheduling + startup recovery (SD-0002 §6.5.3/§6.9)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:30:08 -07:00
ben.stull 23267c4d4c feat(products): image-fetch phase — SSRF guard, bounds, renditions, resume (SD-0002 §6.5.4, §6.9, INV-18)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:26:26 -07:00
ben.stull 13e74f4c61 feat(products): image-phase repo helpers + run progress/outcomes/counts (SD-0002 §6.5.4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:23:09 -07:00
ben.stull 984dc98dee feat(products): diff resolves hosted image URLs to existing records — INV-12 over images (SD-0002 §6.3)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:19:23 -07:00
ben.stull 906bc87c96 feat(products): export hosted detail URL for fetched images; snapshot carries status (SD-0002 §6.5.5, INV-16)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:15:47 -07:00
ben.stull da5177c950 feat(products): hosted-image URL build/parse helpers (SD-0002 §6.3.1)
DB-free host-agnostic helpers: image_url() builds the canonical hosted
Image Src for a fetched image; parse_image_id() recognizes one on re-import
via path-parse so exports round-trip across localhost/PPE/rebrand (INV-12).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:13:27 -07:00
ben.stull 0fc29a34dd feat(platform): objectstore port — local + GCS adapters, config (SD-0002 §6.2)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:12:24 -07:00
ben.stull f27a24353d feat(platform): images port — decode, resolution bar (Q-3), WebP renditions (SD-0002 §6.2)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 00:09:58 -07:00
ben.stull 385df8d728 Merge pull request 'SLICE-6: export & the round-trip lock — canonical serializer + streamed export (SD-0002 §7.2)' (#29) from worktree-slice-6-export-roundtrip into main
ci / check (push) Has been cancelled
v0.6.0 release/2026-06-11T22-23
2026-06-12 05:23:23 +00:00
ben.stull af72299a57 fix(products): serialize Variant Position explicitly — INV-12 round-trip bug
ci / check (push) Has been cancelled
ci / check (pull_request) Has been cancelled
A stored variant position is a CatalogVariant attribute, not a fields{} entry,
so the serializer emitted an empty Variant Position cell — which re-imports as
'reset to file order'. A non-sequential stored position (a merchant can import
explicit positions) then round-tripped to a spurious update, violating INV-12.
Emit str(variant.position) explicitly (like _write_image). The property-test
generator now assigns non-sequential positions to lock the regression, plus a
targeted test. Also wires isExportEnabled into ProductsPage (was dead code).
Both caught by the final code review.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 22:22:11 -07:00
ben.stull 6f22c8b146 chore: version 0.6.0 — SLICE-6 export & round-trip
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 22:14:30 -07:00
ben.stull 767011fbae docs(products): DOC-1 export ops + TEL-3, DOC-4 serializer/round-trip (SLICE-6)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 22:14:30 -07:00
ben.stull 8077f2e07b test(e2e): e2e_export_download + e2e_roundtrip_noop (SD-0002 §6.8, PUC-9/10)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 22:12:53 -07:00
ben.stull 0a85c4fef8 feat(frontend): Export status-filter menu on the Products page (SD-0002 §5.2, PUC-9)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 22:08:34 -07:00
ben.stull 6f213e1f02 feat(frontend): export URL helper + status-filter list (PUC-9)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 22:07:36 -07:00
ben.stull 155f9bd147 feat(api): GET /api/products/export — streamed canonical CSV, 409 empty_catalog (§6.4, PUC-9)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 22:05:55 -07:00
ben.stull 1c2a6af986 feat(products): streamed export service + TEL-3 + EmptyCatalog (PUC-9, §9.1) 2026-06-11 22:03:09 -07:00
ben.stull 5a97b9dc59 feat(products): status-filtered export_catalog snapshot query (PUC-9) 2026-06-11 22:01:11 -07:00
ben.stull fce0b5eaed test(products): decimal/int variant fields round-trip clean (INV-12 coverage) 2026-06-11 21:59:06 -07:00
ben.stull b40e4d30b5 test(products): INV-12 property test — export round-trips to a no-op (SD-0002 §6.8) 2026-06-11 21:58:47 -07:00
ben.stull 7652e92cbe feat(products): serialize multi-variant + interleaved images (§6.5.1 row grammar) 2026-06-11 21:58:22 -07:00
ben.stull 627e257d4c feat(products): canonical serializer skeleton — header + single product row (SD-0002 §6.5.5) 2026-06-11 21:57:48 -07:00
ben.stull 011f4d5dc1 Merge pull request 'SLICE-5: products import spine — canonical CSV → preview → confirm (SD-0002 §7.2)' (#26) from worktree-slice-5-import-spine into main
ci / check (push) Has been cancelled
v0.5.0 release/2026-06-11T20-50
2026-06-12 03:50:20 +00:00
ben.stull 2606fbf826 docs(products): operator guide (DOC-1) + domain notes (DOC-4); version 0.5.0
ci / check (push) Has been cancelled
ci / check (pull_request) Has been cancelled
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 17:00:13 -07:00
ben.stull ad738adbc0 test(e2e): SLICE-5 scenarios — preview/confirm, errors, rejection, cancel (§6.8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 16:53:59 -07:00
ben.stull a58f42cf86 test(e2e): stand up Playwright — fresh-DB server harness + sign-up helper
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 16:50:59 -07:00
ben.stull d18a84e135 fix(products-ui): review pass — show-more race, keyboard history access, a11y glyphs/aria-live, label consistency
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 16:46:43 -07:00
ben.stull 87a56a66c4 feat(products-ui): import run detail (§5.5, PUC-4/5/8)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 16:35:49 -07:00
ben.stull 4141285b89 feat(products-ui): import preview — tiles, drill-in diffs, confirm/cancel (§5.4)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 16:34:33 -07:00