[M3] Review + Publish workflow UI (with inference) is missing — the core of the release #77
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
The entire M3 Review → Publish flow — the actual reason this release exists — is not built. What shipped instead is a row of six
(dev)toggle buttons inApp.svelte(lines 103–128) that each dump an unconnectedfetch()stub<div>below the live capture workflow. There is no routing, no state handoff, no real form. The owner cannot take a Photos-ready slab to a WooCommerce product through the UI at all.This is a wholesale UI fail and the E2E that "passed" was a dishonest proxy:
m3-create.spec.tsonly asserts that the six buttons and one heading are visible in the DOM. It never drives the flow. The last genuine green E2E was #71 (2026-09-15), an M2 capture test run before any M3 work. There is no Gitea CI, so nothing in the pipeline ever exercised M3.What the spec requires (the flow that is missing)
One column of screens, one slab, straight through (
docs/contracts/UX.md§1: "capture → review → publish. No dashboard and no batch view"). No slab-list / picker screen exists in the requirements — you are always in the single slab you are capturing (CAPTURE-25/30).2. REVIEW (the SAME slab, loaded by id)
Read-only capture math (REVIEW-30): length / thickness / sqft / bdft / widths.
Inference assist — the part that is entirely absent:
inference_enabled(METADATA-35). Sends processed photos ≤1024px + metadata + synced taxonomy.content_llm_enabledAND endpoint reachable, disabled when down (METADATA-110).3. PUBLISH
POST /slabs/{id}/publish→ ready-set validate → SKU lookup (stop if exists) → taxonomy refresh if last sync >1h → resolve cats/tags/attrs → upload processed PNGs in photos-ready lineup order (PUBLISH-40/45) →POST /products.SLAB-UAT-*always draft (PUBLISH-10). Success setswoo_product_id, purges photos, clears the device draft (PUBLISH-25, APP-15). Duplicate SKU → edit-SKU / open-existing (PUBLISH-15). Stale value → field-level error with current options, never a raw code (PUBLISH-20). Failure → plain message, classified recoverable/unrecoverable, Retry while draft+photos retained (PUBLISH-30/35/36/37/38). Partial failure → orphaned media + cleanup note (PUBLISH-31).SETTINGS (separate page, never in the flow)
Store creds + Test & Sync Woo (SETTINGS-40), the species $/bdft rates list (SETTINGS-35 — tracked separately), inference config (SETTINGS-30/90), Test Inference showing ok/mode/vision_capable/detail (SETTINGS-45),
woo_create_statusdefault draft (SETTINGS-65).Backend status
The backend is verified functional end-to-end — every M3 flow (slabs CRUD + optimistic concurrency, photos multipart + 410-after-purge, review compute, pricing, taxonomy sync + anchor, publish + UAT draft + dup/stale/partial failure, inference Call 1/2 + prompt revision) has real passing tests against the live FastAPI app with Woo/inference mocked at the transport. This is a pure frontend rebuild; no backend work is required for the owner flow. (Known backend gaps, not blockers: no endpoint persists
status='ready'— ready is computed; call1 suggestions need a manualPUTto apply;width_px/height_pxnever populated.)Why no test caught this
m3-create.spec.tsis a DOM-presence proxy (buttons + heading visible). It is exactly the "dishonest proxy" QUALITY-105 rejects.7575471 test(exit): M3 exit wave … Compose E2E + UAT walksat on top of the dev-toggle scaffolding and was treated as done; the README already had M3 marked "paused — requirements reconciliation."Acceptance (the real E2E, per QUALITY-50)
Drive the actual flow against a Compose stack with mocked Woo:
set1-48x2).readyflips to true only when the full set incl. SKU is filled.woo_product_idreturned, draft forSLAB-UAT-*, photos purged (410), device draft cleared.The current
m3-create.spec.tsmust be rewritten to drive this flow, not assert button presence.Related