# Coverage matrix — CREATE.md (current branch) Source: `docs/CREATE.md` (current working tree). Method: every surface entry dispositioned to PoR IDs or a recorded drop. ## Findings None new. Two open decisions in the doc are already settled elsewhere: the `attributes` element shape is resolved in `docs/contracts/WOO-API.md` §4, and the crop fill/floor (90% / 800) is the PoR. The client stack note ("Vite + Svelte SPA") is implementation, not a requirement. ## Superseded (queued in migration TODOs) - ready set "at least one inventory PNG" → REVIEW-5 (two images) - grade 1+ → METADATA-15 (exactly one) - `fig-*` 1+ required → METADATA-30 (optional) - `short_title` → REVIEW-10 (`short_description`) - "user typed number wins if overridden" for widths/sqft/bdft → REVIEW-30, REVIEW-40 (read-only) - "title/short/desc not required to reach ready" → REVIEW-10 - "templates always available" and "server assembles from templates" → METADATA-70, METADATA-80 (model writes when Call 2 runs; template is fallback) - "Cap at 5 images" / "Cap ≤5" → PUBLISH-40 (no cap) - Call 1 input "inventory photos downscaled to 1024" → METADATA-35 (clean processed photos) ## SETTINGS KEYS - `WOO_BASE_URL` env, read-only → SETTINGS-5; HTTPS → SETTINGS-10 - `SLAB_AES_KEY` env → SETTINGS-25 - `woo_wp_username` / `woo_app_password` encrypted → SETTINGS-20 - `woo_create_status` default draft → SETTINGS-65 - `inference_base_url`, `inference_api_key`, `inference_model`, `inference_enabled` → SETTINGS-30 - `content_llm_enabled` → SETTINGS-30, SETTINGS-90 - `taxonomy_last_sync_at`, `taxonomy_anchor` → SETTINGS-55 - `brand_voice`, `geo_context` → SETTINGS-30 ## CONTROLS - store URL read-only → SETTINGS-5 - credential entry → SETTINGS-20 - Generate text disabled when endpoint down → METADATA-110, METADATA-75 - Call 2 blocked when test-inference `fail` → SETTINGS-45 - inline nudges → REVIEW-20 - species picker synced only → METADATA-5, METADATA-10 - attribute pickers synced only → METADATA-15 - stale field / vanished id → PUBLISH-20, REVIEW-35 - duplicate SKU actions → PUBLISH-15 - create/publish trigger → PUBLISH-5 - draft upload trigger → CAPTURE-135 ## LISTING FIELDS - `sku` → REVIEW-45; `status` enum → APP-5 - `length_in`, `thickness_in` 1/8 → CAPTURE-70 - `sqft`, `bdft`, widths → CAPTURE-80, CAPTURE-85, CAPTURE-90 - `species_id` 1 leaf → METADATA-10; `wood_category_ids` 1+ → METADATA-10 - `edge_type_term_id` 1 → METADATA-15; `figure_term_ids` 1+ → METADATA-15 - `thickness_term_id` round-up → METADATA-15; `moisture_term_id` default kiln-dried → METADATA-15 - `feat_tag_ids` 0+ → METADATA-30 - `price`, `price_per_bdft`, `price_source` → REVIEW-25 - templates (title, short, description, `{character}`, `{geo_sentence}`) → contract detail in `docs/contracts/CONTENT-WOO.md`; fallback only - species/character/length/free-text thickness not attributes → METADATA-25 ## STATUSES - draft/calibrated/ready/publishing/published/failed → APP-5 - `woo_create_status` draft/publish → SETTINGS-65 - test-inference mode stateful/stateless/fail → SETTINGS-45 - device draft is not a Woo draft → APP-10 ## ENDPOINTS - `/api/health` → APP-30, APP-45 - slabs CRUD, photos, infer-taxon, infer-content, publish, taxonomy, pricing, settings → `docs/contracts/API.md` - Woo endpoints (`/wc/v3/products`, categories, tags, attributes, media) → `docs/contracts/WOO-API.md` ## ERROR CODES - 502 `woo_error` → SETTINGS-50, PUBLISH-30 - 422 `unpublishable` → REVIEW-5 - 409 `duplicate_sku` → PUBLISH-15 - 202 publish → contract ## USER-FACING ERROR / EMPTY STATES - sync failure keeps previous cache → SETTINGS-50 - create blocked until ready → REVIEW-5, REVIEW-20 - duplicate SKU block → PUBLISH-15 - stale field, current options → PUBLISH-20 - vanished id not silently swapped → REVIEW-35 - failure: log, mark failed, keep photos, field-level error, no raw code → PUBLISH-30, PUBLISH-35 - low-confidence not shown as defaults → METADATA-45 - Generate text down → METADATA-110 - no pricing rule → price empty, owner types → REVIEW-25 ## INFERENCE - Call 1 auto only when enabled → METADATA-35 - Call 1 input (photos, metadata, taxonomy) → METADATA-35 - Call 1 output + confidence → METADATA-40 - threshold 0.7 pre-fill / below empty → METADATA-45 - moisture never inferred → METADATA-15 - typed wins → METADATA-50 - never blocks create / auto-publish → METADATA-75 - Call 2 user-triggered; requires test-inference ok → METADATA-55, SETTINGS-45 - model prose only, no dimensions → METADATA-65 - templates fallback → METADATA-70 - test-inference shape, fail blocks Call 2 only → SETTINGS-45 - templates math from deterministic pipeline → METADATA-90 - inference-off create → QUALITY-20, METADATA-70 - FastAPI proxies inference → APP-25 ## PUBLISH PAYLOAD / FLOW - payload fields (`name`, `type`, `status`, `sku`, `regular_price`, `description`, `short_description`, `categories`, `tags`, `images`, `attributes`, `virtual`, `downloadable`, `catalog_visibility`) → `docs/contracts/WOO-API.md`, PUBLISH-55 - non-null only → PUBLISH-55 - `SLAB-UAT-*` force draft → PUBLISH-10 - images upload keep alpha, lineup order → PUBLISH-40, PUBLISH-45 - published meaning (not live) → PUBLISH-50 - success behavior (product id, purge, delete row, clear device draft) → PUBLISH-25, APP-15 - failure behavior → PUBLISH-30 - create sequence steps 1–4 → PUBLISH-5 - `images alt` text → contract detail - attributes element shape → resolved, `docs/contracts/WOO-API.md` §4 ## CONSTANTS / NUMBERS - `per_page=100` → SETTINGS-50, WOO-API §7 - connect 10s / read 60s → contract detail - taxonomy staleness 1 hour → SETTINGS-60 - SKU `[A-Z0-9-]{3,24}` → REVIEW-45 - downscale 1024 → METADATA-35 - confidence 0.7 → METADATA-45 - bdft and price formulas → CAPTURE-90, REVIEW-25 - 1/8 step → CAPTURE-70 - five attributes → METADATA-15 - UAT port `:10881`, do not touch `:10880` → OPS-40 - fill 90% / 800px floor → CAPTURE-100, CAPTURE-105 ## BROWSER / API SUPPORT - FastAPI only Woo caller; browser no creds → APP-25 - app-password Basic auth, not consumer keys → SETTINGS-15 - HTTPS only → SETTINGS-10 - proxy inference, no key in browser → APP-25, SETTINGS-30 - device draft IndexedDB → APP-10, CAPTURE-140 - Woo source of truth, cache ids → METADATA-5 - v1 no term creation → METADATA-20 - taxonomy sync order, transactional, anchor, re-pull, triggers → SETTINGS-50, SETTINGS-55, SETTINGS-60 - pricing rules flat per species, seed, override sticks, manual allowed → SETTINGS-35, REVIEW-25 - practice rules (`SLAB-UAT-*`, hidden, inference off) → PUBLISH-10, QUALITY-20 - dishonest proxies → QUALITY-105 - tag/leaf filters and feat mapping → SETTINGS-51, METADATA-10, METADATA-30, METADATA-100