SLICE-7: images pipeline end-to-end — fetch/host/serve + INV-12 over images (SD-0002 §7.2) #30

Merged
ben.stull merged 13 commits from worktree-slice-7-images into main 2026-06-12 08:00:01 +00:00
Owner

SLICE-7 — the products images pipeline end-to-end (SD-0002 §7.2), closing PUC-7.

Ships: platform/images (decode + resolution bar Q-3=500px + WebP renditions) · platform/objectstore (local/GCS port) · the post-commit SSRF-guarded, bounded, resumable image-fetch phase (domains/products/imagefetch.py) · the storefront-authorized app-served image route (INV-16, immutable cache) · hosted-URL recognition extending INV-12 over images (export emits hosted detail URLs for fetched images; re-import resolves them to the existing record, never re-fetched; unknown hosted id → row error) · run-detail images section (live poll) + Products-page image-problems notice band + history image column · TEL-4/TEL-5 · v0.7.0.

Cross-repo: launch-app provision-bucket gesture built + merged (engineering #58) — the operator runs it at the PPE deploy to create wiggleverse-ecomm-ppe-media.

Invariants: INV-12 (200-seed property test mixing fetched/non-fetched), INV-14 (storefront-scoped), INV-16 (hosted-only serving), INV-18 (≤20MB/30s/image-type + SSRF public-IP-only, no cross-guard redirects). A final code review caught + fixed a Critical decompression-bomb / unexpected-error path that could wedge a run (bomb→rejection + per-image error isolation).

Gates: check.sh green (lint-imports, 202 backend pytest, frontend build, 19 vitest); e2e.sh 7/7 incl. e2e_image_outcomes (local fixture image host, no egress). Issue #13 stays open until SLICE-8 (Shopify dialect).

🤖 Generated with Claude Code

SLICE-7 — the products images pipeline end-to-end (SD-0002 §7.2), closing PUC-7. **Ships:** `platform/images` (decode + resolution bar Q-3=500px + WebP renditions) · `platform/objectstore` (local/GCS port) · the post-commit SSRF-guarded, bounded, **resumable** image-fetch phase (`domains/products/imagefetch.py`) · the storefront-authorized app-served image route (INV-16, immutable cache) · hosted-URL recognition extending **INV-12 over images** (export emits hosted detail URLs for fetched images; re-import resolves them to the existing record, never re-fetched; unknown hosted id → row error) · run-detail images section (live poll) + Products-page image-problems notice band + history image column · **TEL-4/TEL-5** · v0.7.0. **Cross-repo:** launch-app `provision-bucket` gesture built + merged (engineering #58) — the operator runs it at the PPE deploy to create `wiggleverse-ecomm-ppe-media`. **Invariants:** INV-12 (200-seed property test mixing fetched/non-fetched), INV-14 (storefront-scoped), INV-16 (hosted-only serving), INV-18 (≤20MB/30s/image-type + SSRF public-IP-only, no cross-guard redirects). A final code review caught + fixed a Critical decompression-bomb / unexpected-error path that could wedge a run (bomb→rejection + per-image error isolation). **Gates:** `check.sh` green (lint-imports, 202 backend pytest, frontend build, 19 vitest); `e2e.sh` **7/7** incl. `e2e_image_outcomes` (local fixture image host, no egress). Issue #13 stays open until SLICE-8 (Shopify dialect). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ben.stull added 13 commits 2026-06-12 07:59:41 +00:00
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ben.stull merged commit 8ed9b25771 into main 2026-06-12 08:00:01 +00:00
Sign in to join this conversation.