# Coverage matrix — PRD-2026-08.txt Source: `docs/archive/PRD-2026-08.txt` (frozen history). Method: every labeled atom dispositioned. ## Findings None new. The two potential holes from this doc are already covered: inference timeout/error → `METADATA-115`, and no app-level auth → `OPS-55`. The archive's own banner already flags FR17, FR19, FR40, FR42, and the NFR server timing as non-authoritative. ## Archive banner - Flags FR17, FR19, FR40, FR42, NFR server timing, and "Known stale" → each of those lines is superseded by a current row (below). ## Decisions log (2026-08-31) - Doc contradiction freeze → dropped (process). - bdft identity, secrets AES-GCM, online-only, `woo_create_status` default draft, `SLAB-UAT-*` force draft, hybrid happy path, inference off first → ported CAPTURE-90, SETTINGS-20/25, CAPTURE-15, SETTINGS-65, PUBLISH-10, CAPTURE-5, QUALITY-20. - Review package not in repo → dropped. ## Decisions log (2026-08-27) | # | Atom | Disposition | PoR | |---|---|---|---| | 1 | no calibration photos | superseded | CAPTURE-25, CAPTURE-30 | | 1 | manual SKU/length/thickness | ported | CAPTURE-70 | | 2 | first photo is the measurement photo, top-down | ported | CAPTURE-30, CAPTURE-20 | | 3 | all photos 80% crop | superseded | CAPTURE-100 | | 4 | transparent PNG min 1600, 3:4 | superseded | CAPTURE-95, CAPTURE-105 | | 5 | green/black auto-detect from borders | ported | CAPTURE-35 | | 6 | species 1 leaf, wood 1+ leaf | ported | METADATA-10 | | 7 | edge 1, figure 1+, thickness round-up | ported | METADATA-15 | | 7 | grade 1+ | superseded | METADATA-15 | | 8 | tags fig/feat 1+ | superseded | METADATA-30 | | 9 | two-call inference | ported | METADATA-35, METADATA-55 | | 10 | Call 1 auto only if enabled; review before Call 2 | ported | METADATA-35, METADATA-55 | | 11 | timeout/non-200 error + retry | ported | METADATA-115 | | 12 | create status default draft; SLAB-UAT force draft | ported | SETTINGS-65, PUBLISH-10 | | 13 | prompts as server text files | superseded | METADATA-105 | | 14 | brand voice + GEO into Call 2 | ported | METADATA-60, SETTINGS-30 | | 15 | Woo creds server-side AES-GCM | ported | SETTINGS-15, SETTINGS-20 | | 16 | inference endpoint configurable | ported | SETTINGS-30 | | 17 | test connection text + vision | ported | SETTINGS-45, SETTINGS-80 | | 18 | offline not required | ported | CAPTURE-15 | Open items: none → dropped. ## Functional requirements - FR1 (1–5 photos) superseded → CAPTURE-25; first top-down ported → CAPTURE-20 - FR2 manual SKU/length/thickness → CAPTURE-70 - FR3 border BG detect → CAPTURE-35 - FR4 scale/sqft/bdft, old divide-by-12 wrong → CAPTURE-75, CAPTURE-85, CAPTURE-90 - FR5 80% crop / 1600 / 3:4 → superseded CAPTURE-100, CAPTURE-105 - FR6 retake/abort → CAPTURE-155 - FR7 deterministic compute → CAPTURE-85, CAPTURE-90 - FR8 thickness manual authoritative → CAPTURE-70, METADATA-50 - FR9 deterministic unit-tested → QUALITY-5, QUALITY-15 - FR10 sync categories/attributes/tags → SETTINGS-50 - FR11 species 1 leaf → METADATA-10 - FR12 wood 1+ leaf → METADATA-10 - FR13 edge 1 → METADATA-15 - FR14 figure 1+ → METADATA-15 - FR15 grade 1+ → superseded METADATA-15 - FR16 thickness round-up → METADATA-15 - FR17 fig-* 1+ → superseded METADATA-30 - FR18 auto-assign + manual override → METADATA-40, METADATA-45, METADATA-50 - FR19 category-weighted pricing → superseded SETTINGS-35 - FR20 bdft pricing → REVIEW-25 - FR21 price editable, stored authoritative → REVIEW-25 - FR22 Call 1 vision with confidences → METADATA-35, METADATA-40 - FR22a threshold 0.7 → METADATA-45 - FR22b species bias full list → METADATA-40 - FR22c free-text → feat-* → METADATA-100 - FR23 Call 2 user-triggered; prose only; server assembles templates → METADATA-55, METADATA-65; server-assembles superseded → METADATA-70, METADATA-80 - FR24 prompts text files + reset script → superseded METADATA-105 - FR25 progress indicator → dropped (presentation) - FR26 timeout/non-200 error + retry → METADATA-115 - FR27 results editable, no auto publish → METADATA-50, METADATA-75 - FR28 endpoint configurable + test text/vision → SETTINGS-30, SETTINGS-45, SETTINGS-80 - FR29 chroma-key, U2Net fallback → CAPTURE-35, CAPTURE-165 - FR30 80% / 3:4 / 1600 → superseded CAPTURE-100, CAPTURE-105 - FR31 transparent PNG → CAPTURE-95 - FR32 original + processed, purge after publish → PUBLISH-25, PUBLISH-40 - FR33 consumer keys + app password → superseded SETTINGS-15 - FR34 publish blocked on existing SKU → PUBLISH-15 - FR35 create product fields → PUBLISH-55 - FR36 default draft; SLAB-UAT draft → SETTINGS-65, PUBLISH-10 - FR37 log sync, surface errors, store product id → PUBLISH-25, PUBLISH-30 - FR38 draft slab state → APP-10 - FR39 single review screen, all editable → REVIEW-40 - FR40 server-side processing → superseded CAPTURE-135, APP-40 - FR41 settings UI → SETTINGS-15, SETTINGS-20, SETTINGS-30, SETTINGS-35 - FR42 compose on `.201` Caddy → superseded OPS-5, OPS-15, OPS-40 - FR43 secrets encrypted, HTTPS → SETTINGS-20, SETTINGS-25, OPS-5 ## Non-functional requirements - performance budgets (1–2s, 3–5s, 45s) → dropped (server timing non-authoritative) - reliability: unit-tested → QUALITY-5, QUALITY-15 - security: encrypted/HTTPS → SETTINGS-20, SETTINGS-25, OPS-5 - maintainability separation → dropped - usability one-hand → dropped ## Acceptance criteria - E2E capture→publish on iPhone/Android → QUALITY-115 - area accuracy +/- 0.25 in² → dropped (sqin banned) - normalization 80% / PNG / 1600 → superseded CAPTURE-100, CAPTURE-105 - Woo product images/taxonomy/content → PUBLISH-40, PUBLISH-45, PUBLISH-55 - deterministic unit tests + inference logged → QUALITY-5, METADATA-66