01 — Production API Truth Baseline
— 01 PRODUCTION API TRUTH BASELINE — live probe 2026-06-06 ~04:47 UTC, host vps.incomexsaigoncorp.vn
Method: read-only HTTPS GET probes from outside, capturing status, time, body, headers; cross-checked against the deployed Nitro route manifest inside container incomex-nuxt (image nuxt-ssr-local:s174) and against Postgres truth.
Full route truth table (20 RP routes probed):
| route | status | class | note |
|---|---|---|---|
| /api/registry/counts | 200 | HEALTHY | body {"total":2122910} = RAW birth-polluted count (raw<>clean truth note) |
| /api/registry/raw-counts | 200 | HEALTHY | 22929 bytes |
| /api/registry/composition | 200 | HEALTHY | 12539 bytes |
| /api/registry/health | 200 | HEALTHY | slow ~6.4s |
| /api/registry/species-matrix | 200 | HEALTHY_SLOW | ~17.8–21.8s, near timeout; same entity-bloat pattern as matrix |
| /api/registry/species-summary | 200 | HEALTHY | {"total":42} |
| /api/registry/unmanaged | 200 | HEALTHY | 8520 bytes |
| /api/registry/system-issues | 200 | HEALTHY | all=223255 |
| /api/registry/system-issues-detail | 400 | PARAM_REQUIRED | needs param |
| /api/registry/system-issues-groups | 200 | HEALTHY | 1072 bytes |
| /api/registry/system-issues-subgroups | 400 | PARAM_REQUIRED | needs param |
| /api/registries/system-issues | 200 | HEALTHY | plural alias |
| /api/registries/system-issues/detail | 400 | PARAM_REQUIRED | needs param |
| /api/registries/index | 404 | ROUTE_MISSING | REAL BREAK — page calls it, route not mounted |
| /api/registries-pivot/summary | 200 | HEALTHY | pg-backed |
| /api/registries-pivot/rows | 200 | HEALTHY | 64283 bytes, pg-backed |
| /api/registries-pivot/node | 400 | PARAM_REQUIRED | needs ?code |
| /api/registry/matrix | 500 | SERVER_ERROR | REAL BREAK — 500 at ~28s |
| /api/registry/pivot-query | 500 | SERVER_ERROR | REAL BREAK — Directus 400 |
| /api/registry/refresh-counts | 404 | METHOD_POST_ONLY | GET 404 by design (mutating POST route) |
Rollup: HEALTHY 12, PARAM_REQUIRED 4, SERVER_ERROR 2, ROUTE_MISSING 1 (matches the prior P0 control-plane probe exactly), plus the POST-only refresh-counts.
Captured failure bodies:
- pivot-query 500 statusMessage carried the upstream cause verbatim: GET http://directus:8055/items/pivot_definitions?...filter=...group_spec..._neq... : 400 Bad Request.
- matrix 500 returned generic "Server Error" after 28.4s wall time (no upstream URL) = thrown fetch timeout, not a createError.
PIVOT_MISSING = 14 (DB truth): v_registries_pivot_node_contract.count_status = 'PIVOT_MISSING' (25 pivot_backed + 14 missing = 39 UI tree nodes). See doc 05.
Secondary observations (not API breaks, logged not hidden):
- Homepage SSR fetch of /items/pages returns 403 Forbidden in nuxt logs; the page still renders 200 via fallback. Separate Directus-permission/field issue, out of the RP API-break scope.
- /api/registry/counts returns the raw polluted object total 2,122,910 rather than the clean managed count — a raw-vs-clean truth concern for the UI, not a 404/500.
Truth views created: v_rp_production_api_truth_status_v2, v_rp_production_api_failure_inventory, v_rp_production_ui_no_false_green_guard. Read-back: ui guard verdict = BLOCKED_REAL_API_BREAKS_PRESENT_DO_NOT_CLAIM_READY (real_break_routes=3, healthy=12).