# Coverage matrix — OPENAPI.md Source: `docs/OPENAPI.md` at tag `pre-simplification`. Method: subagent extracted every surface entry; PoR home assigned here. Dispositions: `ported`, `superseded`, `dropped` (contract detail), `ui`, `missing`. ## Findings None. Three items are contract detail (photo 40 MB request cap, `GET /meta`, `inference_error` field), and the schema conflicts are already resolved in the PoR. ## SETTINGS KEYS - `woo_base_url` read-only → SETTINGS-5 - `woo_base_url` not writable, reject write → SETTINGS-85 - `woo_wp_username` / `woo_app_password` write-only, AES-GCM → SETTINGS-20 - reject `woo_consumer_key` / `woo_consumer_secret` → SETTINGS-15 - `woo_credentials_configured` boolean → SETTINGS-75 - secrets masked, never echoed → SETTINGS-75 - `inference_base_url`, `inference_model`, `inference_enabled`, `content_llm_enabled`, `brand_voice`, `geo_context`, `woo_create_status` → SETTINGS-30, SETTINGS-65 - `aspect_ratio` 3:4 → CAPTURE-100 - `output_px` / `output_px_min` 1600, `fill_target` 0.80 → superseded CAPTURE-105 - client prefs not in SettingsView → CAPTURE-145 - PUT partial body, re-encrypt, no echo → SETTINGS-20, SETTINGS-30 - `inference_enabled` default `true` in the example → superseded SETTINGS-90 (default off) ## CONTROLS - pickers limited to synced taxonomy → METADATA-5 - duplicate SKU actions `edit_sku` / `open_existing` → PUBLISH-15 - stale field actions/options → PUBLISH-20 ## LISTING FIELDS (SlabCreate, read model, results) - `id`, `client_rev` → APP-20 - `sku` 3..24 uppercase → REVIEW-45 (case widened; Woo hard cap in WOO-API §9) - `length_in`, `thickness_in` 1/8 → CAPTURE-70 - `sqft`, `bdft`, widths → CAPTURE-80, CAPTURE-85, CAPTURE-90 - `species_id`, `wood_category_ids` → METADATA-10 - `edge_type_term_id`, `figure_term_ids`, `thickness_term_id`, `moisture_term_id` → METADATA-15 - `grade_term_ids` (plural, 1+) → superseded METADATA-15 (exactly one, singular) - `fig_tag_ids` (1+) → superseded METADATA-30 (optional) - `feat_tag_ids` (0+) → METADATA-30 - `price`, `price_source` → REVIEW-25 - `price_per_bdft` on slab → contract detail (pricing rules SETTINGS-35) - `title`, `description` → REVIEW-10 - `short_title` → superseded REVIEW-10 (`short_description` canonical) - `content_source` → METADATA-66 - read model `status`, `inference_status`, `woo_product_id`, `published_at`, revisions → APP-5, METADATA-35, PUBLISH-25, APP-20 - `inference_error` → contract detail - PhotoRead `kind` label → dropped (label discarded); urls → contract; 410 → PUBLISH-25 - Call1 result ids/confidences → METADATA-40; free-text → METADATA-100 - Call2 result → METADATA-55/60 - PriceRule shape → SETTINGS-35 ## STATUSES - `calibrated` on create → APP-5, CAPTURE-135 - `ready` preconditions → REVIEW-5 (fig/grade cardinality superseded) - `publishing` / `failed` / `published` → APP-5, PUBLISH-25, PUBLISH-30 - `inference_status` enum → METADATA-35 - duplicate check across any Woo status → PUBLISH-15 ## ENDPOINTS - `GET /api/health` body → APP-45 - `GET /api/v1/meta` → contract detail - `POST/GET/PUT/DELETE /api/v1/slabs` → docs/contracts/API.md - `POST .../u2net/{pid}` reserved → CAPTURE-165 - `GET .../photos/...` → PUBLISH-25 - `POST .../infer-taxon` → METADATA-35 - `POST .../infer-content` → METADATA-55 - `POST .../publish` → PUBLISH-5 - taxonomy GET/sync → SETTINGS-50, SETTINGS-55, SETTINGS-60 - pricing CRUD → SETTINGS-35 - settings GET/PUT, test-woo, test-inference → SETTINGS-20, SETTINGS-30, SETTINGS-40, SETTINGS-45, SETTINGS-75, SETTINGS-85 - `GET /api/v1/validation/module` → dropped (module cut) ## ERROR CODES - 400, 404, 500 → APP-35 - 409 `revision_conflict` → APP-20 - 409 `duplicate_sku` → PUBLISH-15 - 422 `unpublishable` → REVIEW-5, REVIEW-20 - 422 `stale_field` → PUBLISH-20 - 422 test-inference gate → SETTINGS-45 - 422 `woo_base_url` write → SETTINGS-85 - 502 `woo_error` → PUBLISH-30, SETTINGS-50 - 504 timeout → METADATA-115 - 410 photos → PUBLISH-25 - 412 validation module → dropped (module cut) ## USER-FACING ERROR / EMPTY STATES - never show the code, no raw code → PUBLISH-35 - unpublishable UI mapping → REVIEW-20 - test-woo fails closed → SETTINGS-80 - test-inference `fail` blocks Call 2 only → SETTINGS-45, METADATA-75 - low-confidence no prefill → METADATA-45 - Woo failure surfaces as failed + log → PUBLISH-30 - taxonomy sync failure keeps previous cache → SETTINGS-50 ## INFERENCE - Call 1 auto only if enabled → METADATA-35 - Call 1 inputs "original photos downscaled to 1024" → superseded METADATA-35 (clean processed photos) - Call 1 timeout 45s → METADATA-115 - confidence persist ≥0.7 → METADATA-45 - free-text → feat-* mapping → METADATA-100 - Call 2 default resend full context → METADATA-60 (no thread) - `previous_response_id`, per-slab thread → superseded (thread work out) - Call 2 requires test-inference ok → SETTINGS-45 - validation module shared with Call 2 → dropped (module cut) ## PUBLISH PAYLOAD / FLOW - preconditions → REVIEW-5 - dedupe → PUBLISH-15 - stale → PUBLISH-20 - success (product id, purge, delete row) → PUBLISH-25 - failure (failed, sync_log, poll 502) → PUBLISH-30 - create-time Woo status → SETTINGS-65, PUBLISH-10 ## CONSTANTS / NUMBERS - base path `/api/v1`, version bump → APP-30 - timestamps UTC ISO-8601 → APP-20 - photo request cap 40 MB → contract detail - SKU pattern `[A-Z0-9-]{3,24}` → REVIEW-45 - 1/8 step → CAPTURE-70 - price 2 decimals → REVIEW-25 - poll backoff 1/2/4/10s → contract detail - 1024 downscale → METADATA-35 - 0.7 threshold → METADATA-45 - 45s timeout → METADATA-115 - 3:4 → CAPTURE-100 - 1600 / 0.80 → superseded CAPTURE-105 - publish cardinalities → REVIEW-5 ## BROWSER / API SUPPORT - client pins version → APP-30 - no client auth → OPS-55 - Woo HTTPS Basic Auth, application password, not consumer keys → SETTINGS-10, SETTINGS-15 - u2net post-POC not exposed → CAPTURE-165 - out of contract (bulk, staff, webhook, analytics) → dropped - test-woo always resyncs → SETTINGS-40 - anchor re-pull / bump rules → SETTINGS-55, SETTINGS-60