diff --git a/ecomm/0034/SESSION-0034.0-TRANSCRIPT-2026-06-11T23-49--INPROGRESS.md b/ecomm/0034/SESSION-0034.0-TRANSCRIPT-2026-06-11T23-49--INPROGRESS.md index 6bd3b42..c2e77ad 100644 --- a/ecomm/0034/SESSION-0034.0-TRANSCRIPT-2026-06-11T23-49--INPROGRESS.md +++ b/ecomm/0034/SESSION-0034.0-TRANSCRIPT-2026-06-11T23-49--INPROGRESS.md @@ -12,10 +12,69 @@ ## Launch prompt -_(launch prompt not captured at claim time)_ +`/goal next` → resumed the stored `Next /goal:` from memory: +**Plan and build SLICE-7 of SD-0002 (products images pipeline end-to-end):** +`platform/objectstore` port (local + GCS adapters), `platform/images` +(decode + resolution bar + WebP renditions), the post-commit in-process +image-fetch task with SSRF guard + bounds + restart recovery, the +app-served authorized image route with immutable caching, INV-12 extended +over images / hosted-URL recognition, run-detail images section + +Products-page notice band, TEL-4/5 + ALR-3. Hand the operator the flotilla +`provision-bucket` gesture for the per-env private GCS bucket at the PPE +deploy. DoD: PUC-7 acceptance, INV-12 over images, E2E `e2e_image_outcomes` +green, version 0.7.0 shipped through merge + PPE. + +## Plan + +> Anchor: design `wiggleverse-ecomm-content/specs/SD-0002-products-bulk-csv-import-export.md` §7.2 SLICE-7 (R2a — graduated Solution Design, eligible) · issue wiggleverse/wiggleverse-ecomm#13 +> Posture: autonomous (yolo) +> Worktree: `.claude/worktrees/slice-7-images` on branch `worktree-slice-7-images` (concurrent session 0027 in flight → §5.4 isolation) + +Implementation plan written JIT (`superpowers:writing-plans`) → +`docs/superpowers/plans/2026-06-11-slice-7-images.md` (14 tasks, TDD, +cross-repo: ecomm + engineering launch-app `provision-bucket`). Archived to +the content repo `plans/` at finalize. Executed subagent-driven this session. + +### Task list (DoD = SD-0002 §7.2 SLICE-7, PUC-7, INV-12/16/18, v0.7.0 PPE) + +1. `platform/images` — decode + Q-3 bar (500px) + WebP renditions +2. `platform/objectstore` — port + local/GCS adapters + config +3. hosted-image URL build/parse helpers (DB-free, host-agnostic) +4. snapshot carries image `status`; serializer emits hosted detail URL for fetched +5. diff resolves hosted URLs (INV-12 over images) + extended property test +6. image-phase repo helpers + run progress/outcomes/counts payloads +7. image-fetch phase — SSRF guard, INV-18 bounds, thread pool, resume +8. confirm → `fetching_images`; lifespan wiring + post-commit scheduling + recovery +9. app-served image route — storefront-authorized, immutable cache (INV-16) +10. frontend — run-detail images section + poll, notice band, history column +11. E2E `e2e_image_outcomes` — fixture image host +12. engineering launch-app `provision-bucket` gesture (cross-repo PR) +13. telemetry/docs/config glue + v0.7.0 +14. integration gate, merge, PPE deploy (operator: provision-bucket + ALR-3) ## Deferred decisions _Autonomous-mode low-confidence calls the driver made and would have liked operator input on. Appended as the session runs; surfaced at finalize. Empty if none._ + +- **Draft-blob storage left as BYTEA (deferred the objectstore move).** The + `products-domain.md` named seam "BYTEA draft blob → objectstore SLICE-7" + is NOT in the §7.2 SLICE-7 *Ships* list (which is images-only). Moving the + upload blob to the bucket adds risk to the working import/confirm path for + the marginal benefit of the §6.3.1 `import-drafts/` lifecycle safety net. + Kept drafts as BYTEA (≤10 MB, 1 h expiry, swept); re-targeted the doc seam + to a later hardening pass. The bucket gets only product-image objects this + slice. +- **Image-fetch task implemented as a background thread + ThreadPoolExecutor + (not asyncio).** The spec (§6.2/§6.7) describes "in-process asyncio task"; + the rest of the stack is sync (sync psycopg pool, sync httpx). A + thread-based runner with an inner `ThreadPoolExecutor(max_workers≈4)` over + the run's pending images satisfies the binding invariants (in-process, + post-commit, bounded concurrency ~4, resumable, per-image idempotent) and + avoids an async/sync DB bridge. The §6.9 queue-portability seam is + unaffected. +- **Q-3 resolution bar pinned: shorter side ≥ 500 px** (configurable + constant). Rejects icons/thumbnails while accepting normal product photos; + consistent with the rendition ladder (detail ≤1600 / card ~480 / thumb + ~160 are all downscale-only at ≥500). Recorded against SD-0002 §13 Q-3.