Files
SlabUploader/.planning/milestones/v0.5/M3/task_breakdown.md
T

87 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# M3 — task breakdown
Role: breakdown. Ordered task list for v0.5 / M3. Cites requirement IDs; defines none.
Objectives: `roadmap.md` in this folder. Behavior and acceptance: `docs/capabilities/CREATE.md`.
Scope and IDs: `docs/MILESTONES.md`. Decisions live in `docs/contracts/`, not here.
TDD every slice: the failing test precedes its implementation; never parallelize RED and GREEN of
the same scenario. Execute slices **serially** (one local GPU; see `AGENTS.md`). Frontend ships
**with** the slice that first needs the screen, not as a trailing blob.
## Hard dependencies
```
S0 full schema.sql + factory + health
└─ S1 crypto + Settings
├─ S2 slabs CRUD (needs S0 tables; tests seed fixture taxonomy rows)
│ └─ S3 photos (needs slab_id)
└─ S4 Woo + taxonomy (needs S1 credentials only — not S2/S3)
│
S5 pricing + title/short-desc + ready ← S2 AND S4
├─ S6 publish ← S3 + S4 + S5
└─ S7 inference last ← S2 + S3 + S4 + S5; not S6
```
Default serial order for Atlas: **S0 → S1 → S2 → S3 → S4 → S5 → S6 → S7 → Exit**.
S4 does not wait on S2/S3. If S2 is blocked after S1, start S4. S7 does not wait on S6
(`METADATA-75`).
## Slices
| Slice | Delivers | M3 IDs | Hard deps |
|---|---|---|---|
| S0 | factory; **full** `schema.sql` from `docs/contracts/DATA-MODEL.md` (including empty taxonomy tables); config/startup guards; health/meta; JSON logs; Dockerfile | APP-30, APP-45, APP-55, APP-65, SETTINGS-10, SETTINGS-25, OPS-25 | — |
| S1 | AES-GCM crypto + Settings API/UI (masked, write-only secrets). Missing key refuses startup (S0); this slice encrypts/decrypts. Decrypt failure → owner re-enters credentials. | SETTINGS-5/15/20/25/30/75/85/90, QUALITY-125 | S0 |
| S2 | slabs CRUD, optimistic concurrency, soft delete. Fixture `woo_categories` rows for FK tests. Frontend: API client + slab list. | APP-5/15/20/35/40, REVIEW-45 | S0 |
| S3 | photos (multipart → BLOBs, original/processed, 410 after purge). Frontend: photo attach on the draft. | CAPTURE-95/105/130, PUBLISH-40 | S2 |
| S4 | Woo client (application-password Basic) + taxonomy sync + test-woo. Fills the S0 taxonomy tables. Owns `taxonomy_anchor` / `taxonomy_last_sync_at`. Frontend: Settings test-woo. | METADATA-5/10/15/20/30, SETTINGS-40/50/51/55/60/80, QUALITY-35 | S1 |
| S5 | species `$/bdft` rates; deterministic title + short_description; server-derived `ready`. Inference off: owner types `description` by hand (`METADATA-70`). Frontend: Review screen. | REVIEW-5/10/15/20/25/30/35/40/50, METADATA-70/80/85/90, SETTINGS-35, QUALITY-90/95 | S2, S4 |
| S6 | publish sequence, UAT draft, duplicate/stale/partial failure; upload processed PNGs; publish-time taxonomy refresh when last sync is stale (`SETTINGS-60`). Frontend: Publish screen. | PUBLISH-5/10/15/20/25/30/31/35/36/37/38/40/45/50/55/60, SETTINGS-60 | S3, S4, S5 |
| S7 | inference last: Call 1, Call 2 (one static seed; calculated title/short_description injected into the Call 2 prompt), prompt revision REST. Never blocks create. Frontend: Generate text control. | METADATA-35/40/45/50/55/60/65/66/75/95/100/105/106/110/115, SETTINGS-45/70 | S2, S3, S4, S5 |
| Exit | inference-off suite, Woo-mock integration, Compose UI E2E, real `SLAB-UAT-*` draft | QUALITY-20/35/50/105/110/120 | S0–S7 |
IDs split on purpose (do not “move” them to one slice):
| ID | Slices | Split |
|---|---|---|
| SETTINGS-25 | S0 + S1 | S0 refuses startup without the key; S1 implements AES-GCM |
| SETTINGS-60 | S4 + S6 | S4 owns anchor + cache rebuild; S6 refreshes on publish when stale |
| PUBLISH-40 | S3 + S6 | S3 stores PNG BLOBs; S6 uploads them to Woo |
| QUALITY-35 | S4 + Exit | S4 writes the Woo-mock tests; Exit re-runs them |
## Parked work items
1. The seven per-leaf Call 2 prose templates are **not M3**. S7 ships the single static `call2`
seed in `docs/contracts/PROMPTS.md` §6. The model keys off the already-calculated title,
short_description, fact block, photos, and metadata. Per-leaf templates are later.
2. `Specialty cuts` is out of M3: no title pattern, no prose template, no Call 2 prompt. Owner will
not inventory that leaf in M3.
3. S7 ships the prompt revision REST interface (`METADATA-106`) so UAT prompt tuning is an API call
on the trusted LAN. There is no prompt editing UI.
4. Authentication for the prompt revision interface is `later` (`METADATA-107`), not M3.
## Frontend layout
New code stays outside the Capture union: `frontend/src/api/*`, `frontend/src/create/*`.
| With slice | Screen |
|---|---|
| S1 | Settings (store creds, inference flags, secret masking) |
| S2 | Slab list / draft resume |
| S5 | Review (ready set, primary wood category, price, title/short_description) |
| S6 | Publish |
| S7 | Generate text |
## Verification
Slice bar: `docs/contracts/TEST-SPEC.md`. Docs gate: `python tools/check_requirements.py`.
Exit bar: `docs/MILESTONES.md` and `docs/capabilities/CREATE.md`.
## Not yet validated
- Long-horizon multi-step agentic loops (more than one or two tool round-trips).
- M3 implementation has not started.