KB-20FB
T2 RP Audit — 09 UI Contract Risk
4 min read Revision 1
09 — UI Contract Risk
Contract surfaces (present and live)
v_rp_universal_node_ui_contract: 87 nodes, 5 axes, single universal contract.v_rp_node_final_substrate_contract: 87 nodes, 85 substrate_available / 2 unavailable (both empty AX-PROCESS placeholders: WPC-MONITOR-BOOTSTRAP, WPC-UNCLASSIFIED).- Substrate functions exist:
fn_rp_node_substrate,fn_process_node_substrate,fn_topic_node_substrate(3/3). - Blocker dashboards:
v_rp_officialization_blocker_dashboard(7),v_rp_ui_deploy_blocker_dashboard(4).
Completeness — strong
next_routeNULL: 0 ·drill_actionNULL: 0 → every node has navigation. No dead ends.drill_action: SHOW_SUBSTRATE 57 + DRILL 30 = 87. Clean binary.governance_status='official': 0 → everything is correctly badged candidate; candidate-vs-official clarity is explicit on every node viagovernance_status+warning_flags+owner_blocker.
No Nuxt math
All count / grouping / substrate / drill decisions (count_value, grouping_status, substrate_available, drill_action, next_route) are server-computed in PG views. The UI renders; it does not compute. The dynamic-drill proof (12/12) was achieved with "0 Nuxt math". → LOW Nuxt-math risk.
Risks
- 5 axes presented, only 2 governance-registered. AX-TOPIC + AX-PROCESS are in
axis_registry; AX-BASE, AX-TRIGGER, AX-PXT are synthetic axes hardcoded as UNIONs in the contract view. Adding/removing those 3 is a view edit, not data-driven. → MODERATE hardcoded-axis risk. UI showing "5 axes" should not imply 5 governed axes. substrate_available=true≠ count present. All 39 AX-BASE nodes report substrate_available=true, but 14 have NULL count. A UI that opens a substrate on the strength ofsubstrate_availablealone may render an empty/0-row drawer. UI must checkcount_value/count_statustoo.- Non-partition parents require UI discipline. PIV-001 (169 parent vs 492 children) and MTX-L1 (1.19M vs 2.39M) do not sum. The contract exposes
grouping_statusand the separatev_rp_drill_reconciliationwithpartition_defined/drill_status— UI must respect these and never sum children into a parent total. If it does its own arithmetic, it will display wrong totals. → handled at contract level, but a discipline dependency. - Digest vs live. UI must bind to the live contract/census views, not the
wf_*_digest_v2tables (1-day stale). (doc 08)
Classification
- Completeness (0 null routes/actions, 3 substrate fns) → OK.
- 3 synthetic axes → NEEDS_LAW_DEFINITION / structural (register or clearly mark as derived lenses).
- substrate_available semantics, non-partition discipline → COUNT semantics caveat (UI-side guardrails required).
Score: 80/100
The contract is complete, single-source, server-computed, and badges candidate/official clearly. Docked for the synthetic-axis hardcoding, the substrate/count semantic overlap, and the partition-discipline dependency the UI must honor.