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_route NULL: 0 · drill_action NULL: 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 via governance_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

  1. 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.
  2. 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 of substrate_available alone may render an empty/0-row drawer. UI must check count_value/count_status too.
  3. 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_status and the separate v_rp_drill_reconciliation with partition_defined/drill_statusUI 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.
  4. Digest vs live. UI must bind to the live contract/census views, not the wf_*_digest_v2 tables (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.

Back to Knowledge Hub knowledge/dev/reports/architecture/parallel-terminal2-registries-pivot-count-reliability-bug-audit-2026-06-05/09-ui-contract-risk.md