diff --git a/AGENTS.md b/AGENTS.md index ab24a92..de943b9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,65 +1,35 @@ -# AGENTS.md — SlabUploader +# AGENTS.md -Working contract. Read this before writing code or more docs. +Read before writing code. -Branch intent: `doc-simplification` replaces the live doc pile with a small production set. Old files live under `docs/archive/` and are **not** sources for new work. +Live files: `README.md`, this file, `docs/PRODUCT.md`, `docs/CAPTURE.md`, `deploy/`. -## Live files +## Slice 1 -| File | Owns | -|---|---| -| `README.md` | What this is | -| `AGENTS.md` | Locks, slice scope, proof | -| `docs/PRODUCT.md` | Listing factory, fields, who decides, Woo outcome | -| `docs/CAPTURE.md` | Photo, mask slider, crop, numbers | -| `deploy/` | How it is hosted | +Client-side, phone and PC: -Do not add a new live markdown file without Ty saying so. +1. Open the app and choose one slab photo. +2. Isolate the slab with one live sensitivity slider. Sheet mode is Auto, Green, or Black. Overlay updates on the source photo as the slider moves. +3. User approves the edge. +4. App produces the inventory PNG and the measurements from that photo. +5. Both are visible on screen. -## Slice 1 (build this, nothing else) +Slice 1 scope: capture through on-screen PNG and measurements. -Client-side capture on phone and PC: +## Acceptance -1. Open the app. -2. Take or pick one slab photo. -3. Isolate the slab with **one live sensitivity slider** (plus Auto / Green / Black if the sheet is not obvious). Instant overlay. No Apply. No server trip for the slider. -4. User approves the edge. -5. App then produces the uniform inventory PNG **and** sizes / board feet from that reference photo. -6. User sees both on screen. - -Out of Slice 1: Woo, vision, titles, extra sliders, U2Net, offline, OCR, bulk. - -Add a second slider only after real slabs prove one cannot put the edge on the wood. - -## Proof - -A passing test suite is not proof. - -Proof is Ty on a phone, real slab, approved edge, visible uniform PNG, visible length-derived widths and board feet. If step 5 does not run after approve, the build failed. +A real slab on a phone: approved edge, inventory PNG on screen, widths and board feet on screen. ## Locks -- Every slab is quantity one. Photos + metadata are the listing. -- User types **length**, **thickness**, and **SKU**. -- App proposes everything else. User reviews before submit. -- Non-math fields stay editable until submit. -- Board feet is `sqft × thickness_in`. User does not invent the math. -- Price is proposed as `bdft × species $/bdft`. User may override. No rate → empty price, user types it. -- Manual length, thickness, SKU, price, and taxonomy always win over a model. -- `SLAB-UAT-*` is always a Woo draft. -- Vision does not gate publish. Full path must work with inference off. -- Undersized source → retake, not a soft publish. -- Duplicate SKU → stop. This version does not update the other product. - -## Conflict order - -1. These locks -2. `docs/PRODUCT.md` and `docs/CAPTURE.md` -3. `docs/archive/` (history only) - -## Do not - -- Restate these locks in a fourth file -- Treat `docs/archive/` as the spec -- Ship four sliders because an older spec listed four -- Call the slice done because unit tests passed +- Quantity per listing is one. +- User enters length, thickness, and SKU. +- App proposes remaining listing fields. User reviews before create. +- Non-math fields remain editable until create. +- `bdft = sqft × thickness_in` +- Price proposal is `bdft × species $/bdft`. User may replace it. Missing rate leaves price empty. +- User-entered length, thickness, SKU, price, and taxonomy override computed or inferred values. +- SKUs matching `SLAB-UAT-*` create as Woo draft. +- Create works with inference off. +- Source below the PNG size floor requires a new photo. +- Existing store SKU blocks create.