T2 UI-Current Audit — 01 UI-Current Binding Risk
01 · UI-Current Binding Risk
Source access: UNVERIFIED_SOURCE_ACCESS (Nuxt repo outside read-file allowlist). UI internals audited from package docs; PG binding targets audited live.
Live evidence (directus.public, 2026-06-05, read-only)
_current aliases exist (5)
v_rp_universal_node_ui_contract_current, v_rp_dynamic_drill_proof_matrix_current, v_rp_dynamic_drill_acceptance_dashboard_current, v_rp_count_reliability_dashboard_current, v_rp_node_final_substrate_contract_current. PASS — the canonical binding targets the next macro needs all exist.
_current resolves to the reliability decorator (good behavior, hardcoded topology)
pg_get_viewdef(v_rp_universal_node_ui_contract_current) = SELECT … FROM v_rp_universal_node_ui_contract_reliability. The chain is v1 → v2 → reliability. So _current gets the correct drill behaviour (0 NEEDS_GROUPING false-affordances) but still rides the hardcoded 6/7-way UNION — it does NOT resolve through v_rp_universal_node_ui_contract_registry_driven.
_current exposes the reliability fields — YES
Confirmed columns on _current: reliability_label, source_scope, confidence_score, lane_code, count_semantics, warning_flags_v2, blocker_type_v2, next_action_v2 (plus base contract cols). A UI bound to _current can render badges. PASS (data available).
R1 — No UI package binds _current — P0 (HARD binding bug for the next macro)
The two existing UI route packages bind versioned view names, not _current:
- v1 package (
/opt/incomex/docs/mcp-writes/rp-dynamic-drill-2026-06-05/ui-package/):/api/registries-pivot/contract→v_rp_universal_node_ui_contract(the stale v1 with 12 false-affordance nodes),/children→ v1, etc. - v2 package (
…/rp-dynamic-drill-grouping-2026-06-05/ui-package-v2/):grouping.get.ts→v_rp_pxt_grouping_surface/v_pxt_grouped_children; contract →…_v2.
The contract-canonical macro that built _current shipped NO UI package. Consequence: if an operator deploys the existing package as-is, the UI renders the stale hardcoded v1 contract (the exact 12 false-affordance nodes the _current/reliability chain was built to fix). The next macro must author a _current-bound package; this is the single most important pre-deploy action.
R2 — False-green at the bound surface: contract label ≠ invariant status — P0
The 2 live invariant FAILs are not self-labelled as failures by the contract's own reliability fields:
| node | invariant view (…_full_population_drill_invariant) |
_current contract fields |
|---|---|---|
PROC:new_candidates (AX-PXT) |
FAIL_COUNT_SUBSTRATE_MISMATCH (count 6 vs child_total 50) |
reliability_label=CANDIDATE, source_scope=synthetic_axis, count_semantics=ledger_backed, next_action_v2=DRILL_GROUPS |
PROC:residual_reconcile (AX-PXT) |
FAIL_COUNT_SUBSTRATE_MISMATCH (count 8 vs child_total 23) |
reliability_label=CANDIDATE … (same) |
A renderer that badges off reliability_label alone shows these as benign CANDIDATE (effectively green). The FAIL only appears if the UI also joins/renders invariant_status from v_rp_full_population_drill_invariant. Binding spec (P0): the renderer's status branch MUST come from the invariant's invariant_status, never from reliability_label alone. Otherwise 2 real count-substrate failures render as healthy candidate nodes.
R3 — Does the UI distinguish SYNTHETIC / CANDIDATE / OFFICIAL / PARTIAL / STALE? — P1 (data partial, render unverified)
- CANDIDATE / OFFICIAL — yes,
governance_status/lifecycle_statuscarry it (all nodes CANDIDATE, 0 official — correct, no fake-official). - SYNTHETIC — yes via
source_scope='synthetic_axis'(AX-BASE/AX-PXT/AX-TRIGGER) andv_rp_axis_source_binding.is_registry_backed=false. Renderable. - PARTIAL — present in reliability layer (kb_sop PARTIAL, trigger 525 DB-only) but the node-level propagation onto AX-TRIGGER nodes is shallow.
- STALE — GAP.
v_rp_static_literal_live_mismatchknowsPROC:residual_reconcileis STALE (literal 8 vs live 2), but_currentstill reports it asCANDIDATE/ledger_backed— the STALE flag is not surfaced on the node in the bound contract. Until T1's substrate-fix lands, the UI must derive STALE from the static-literal detector / invariant, not from the contract row.
R4 — Badges not yet in the renderer — P1
The v2 package predates the reliability fields (per prior T2 doc 09). The renderer has no evidence of rendering reliability_label / source_scope / confidence_score / invariant_status / next_action. The _current UI package must add these to the render model. Source-unverifiable this run — T1 must grep pages/**,composables/**,server/api/** when source access is available.
Binding-risk verdict
NOT_READY (P0). _current is the right target and is reliability-rich, but (a) no package binds it, and (b) the bound contract under-labels the 2 real fails (false-green) unless the renderer also binds the invariant. Both are fixable in the next macro without authority.