# Coverage matrix — CONTENT-WOO, CAPTURE, PHOTOS (current branch) Sources: `docs/CONTENT-WOO.md`, `docs/CAPTURE.md`, `docs/PHOTOS.md` (current working tree). ## Findings None new. Two notes: the copy-template storage location ("templates live in Settings") is contract detail for `docs/contracts/CONTENT-WOO.md`, and the case-insensitive name-matching rule is legacy — the review flow selects from pickers, so it is superseded by `METADATA-5`. ## CONTENT-WOO.md Superseded: `short_title` → REVIEW-10; `fig-*` 1+ required → METADATA-30; "≤5 inventory photos" → PUBLISH-40; "Only kind=inventory photos / calibration photos do not exist" → calibration exists (CAPTURE-25, CAPTURE-30); "check against the shared rules (current copy)" → validation module cut (REVIEW-5); case-insensitive name matching → METADATA-5. Ported: - `content_llm_enabled`, `content_source` → SETTINGS-30, METADATA-66 - `geo_sentence` from Settings, default none → SETTINGS-30 - `woo_create_status` default draft → SETTINGS-65 - `WOO_BASE_URL` env HTTPS; `SLAB_AES_KEY` → SETTINGS-5, SETTINGS-10, SETTINGS-25 - templates title/short/description and `{character}` → contract detail `docs/contracts/CONTENT-WOO.md` - categories species 1 + wood 1+, tags fig/feat, five attributes → METADATA-10, METADATA-15, METADATA-30 - ready set → REVIEW-5 (fig/grade cardinality superseded) - payload fields → `docs/contracts/WOO-API.md`, PUBLISH-55 - `type simple`, `virtual false`, `downloadable false`, `catalog_visibility visible` → PUBLISH-55 - image bytes keep alpha, `POST /media` → PUBLISH-40, WOO-API §5 - `SLAB-UAT-*` force draft → PUBLISH-10 - status `draft`/`publish`, published meaning → SETTINGS-65, PUBLISH-50 - create sequence steps 1–7 → PUBLISH-5 - dedupe every time → PUBLISH-15 - post-create delete originals + processed → PUBLISH-25 - failure: field message, mark failed, keep photos → PUBLISH-30, PUBLISH-35 - partial-failure orphaned media manual cleanup → PUBLISH-31 - taxonomy sync order, `per_page=100`, 1-hour reconcile, anchor → SETTINGS-50, SETTINGS-55, SETTINGS-60 - vision 0.7 fills; vision off typed; typed wins → METADATA-45, METADATA-50, METADATA-70 - model writes prose only, synced choices only, no invented dimensions → METADATA-40, METADATA-65 - httpx timeouts 10s/60s → contract detail - wire `{field, code, message, actions[]}`, codes never shown → PUBLISH-35, API contract ## CAPTURE.md Ported: - Sheet control, Sensitivity 0–100 → CAPTURE-40, CAPTURE-41 - immediate value update, 2.0 s recompute, last good overlay → CAPTURE-45 - approve blocked with no slab pixels → CAPTURE-50 - length axis rotate/approve → CAPTURE-60 - length/thickness 1/8, Calculate → CAPTURE-70 - scale `longest_axis_px / L` → CAPTURE-75 - widths every 6 in, drop first/last 6, `L ≤ 12` all zero → CAPTURE-80 - `sqft = mask_pixels / scale² / 144`, 2 dp → CAPTURE-85 - `bdft = sqft × thickness_in`, 2 dp → CAPTURE-90 - 3:4, 90% fill, shorter side ≥ 800, no upscale → CAPTURE-100, CAPTURE-105 - PNG 8-bit RGBA, alpha kept → CAPTURE-95 - browsers and hard stop → CAPTURE-10 - client APIs and no OpenCV/ONNX/U2Net → CAPTURE-140 - preview display-only, source pixels → CAPTURE-141 - device draft, Resume/Continue/Start fresh → APP-10 - 1/8 steps → CAPTURE-70; sensitivity maps green/black → CAPTURE-41 Dropped: busy-mark "fraction of a second" (nit, migration TODO); "other backgrounds out of M1" (scope); M1 single reference photo superseded by batch (CAPTURE-25). ## PHOTOS.md Ported: - batch one or more, continue at least one → CAPTURE-25 - pick calibration photo → CAPTURE-25 - M1 states on the calibration photo only → CAPTURE-30 - Photos ready lineup order → CAPTURE-130 - per-photo empty mask / size floor excluded, rest proceed → CAPTURE-110 - single-photo batch works → CAPTURE-25 - crop rules reuse (3:4, 90%, PNG, floor) → CAPTURE-100, CAPTURE-105 - overlay black; stations every 12 in from 6 in, while ≤ L−6; EXIF bottom → CAPTURE-120, CAPTURE-125 - 1–N photos → CAPTURE-25 - no inference / Woo create on this path → APP-25 No findings.