Reconciles two independent lines of work that both touched Review.svelte, MultiSelect.svelte, and the thickness band: - main's PR #97 (client-side thicknessBand.ts + MultiSelect names/commit + syncSelects DOM race fix + box-sizing CSS) - work/merge-89-90 (server-side thickness band in thickness_band.py, Create-string #89, metadata_locked dropped, photo strip, wood primary) Canonical resolution: the band is SERVER-side (hidden from UI, sent to Woo on publish), so the client-side thicknessBand.ts + read-only band display are removed from Review.svelte; PR #97's syncSelects() and box-sizing CSS are preserved (orthogonal fixes). MultiSelect takes selectedSummary from woodPrimary.ts (names in closed state) + the ms-count testid + onDestroy timer cleanup; duplicate close()/summary definitions dropped. Gates: backend 117/117, unit 88/88, tsc clean, e2e 6/6 (m3-create + photo-strip).
Docs map
Read this file first. It tells you what SlabUploader is for, what already ships, and what Milestone 3 must build.
Who this is for. Mill owner (Ty), humans reviewing scope, and agents implementing.
Source of truth for Milestone 3. docs/REQUIREMENTS.md plus the M3 ID subset in docs/MILESTONES.md. Behavior is in docs/capabilities/CREATE.md and the docs/contracts/ set.
High-level project goal
SlabUploader lists one-of-a-kind wood slabs on Whidbey Wood Store (WooCommerce).
One slab is one unit and one listing. Photos and metadata are the inventory record. The mill owner photographs a slab on a green or black sheet, gets store-ready transparent PNGs and measurements on the phone, fills the store's taxonomy and price, then creates a WooCommerce product.
Store: https://www.whidbeywoodstore.com/
What is already implemented (pre-M3)
| Milestone | Spec | Status on this branch |
|---|---|---|
| 1 Capture | docs/capabilities/CAPTURE.md |
Shipped. Browser-only mask, length axis, measure, inventory PNG, device draft. |
| 2 Photos | docs/capabilities/PHOTOS.md |
Shipped. Batch photos, pick calibration, apply mask/crop to the batch, dimension overlay, Photos-ready lineup. UAT on :10881. |
There is no Woo create yet. There is no Complete-listing taxonomy UI yet. There is no FastAPI Woo client (backend/ is a stub). Inference is not wired.
What Milestone 3 builds
Spec: docs/capabilities/CREATE.md.
Exit criteria. A Photos-ready slab becomes submission-ready for WooCommerce, and a practice SLAB-UAT-* draft exists in the store that matches the reviewed ready set. Create must still work with inference off.
In plain terms, M3 connects the Photos-ready device draft to the real store:
- Talk to WooCommerce with a WordPress application password (server-side only).
- Sync and use the Woo Slab Taxonomy (categories, five locked attributes,
fig-*/feat-*tags) per the requirements. - Pricing from species
$/bdftrules, with user override. - Inference Settings (OpenAI-compatible URL, key, model) and Call 1 / Call 2 rules when enabled.
- Review to the full ready set, then create the Woo product (force draft for
SLAB-UAT-*).
Technical detail for Woo sync, metadata, pricing, and inference is in docs/capabilities/CREATE.md and docs/contracts/.
How to read the folder
| File | Role |
|---|---|
README.md (this file) |
Map: goals, shipped, M3. |
PRODUCT.md |
Product overview: complete listing, decision rights, seams. |
capabilities/CAPTURE.md |
Milestone 1 Capture (shipped). |
capabilities/PHOTOS.md |
Milestone 2 Photos (shipped). |
capabilities/CREATE.md |
Milestone 3 Create. Read this before task breakdown or coding. |
contracts/CONTENT-WOO.md |
Listing copy and payload intent; the deterministic title and short-description patterns. |
DEPLOYMENT.md |
Ops runbook: hosts, build, smoke checks, rollback. |
UAT-PRACTICE.md |
Human practice walk for a SLAB-UAT-* listing. Defers to capabilities/CREATE.md on conflict. |
archive/ |
Historical only. Not M3 scope. |
Deployment
Hosts, ports, build and rollback steps, and the dev-test port block live in docs/DEPLOYMENT.md;
deploy/INVENTORY.md is the only source for what runs where. This map does not repeat them.