RP Dynamic Drill — 02 Universal UI Contract
02 — Universal UI Contract (Track A)
Object: v_rp_universal_node_ui_contract (read-only view, birth-free). One contract row per node, every axis. The UI renders this verbatim — no axis-specific business logic in Nuxt.
Columns (the contract)
axis_code, node_code, label, count_value, count_status, lifecycle_status, governance_status, warning_flags(jsonb), has_children, child_count, child_node_codes(text[]), grouping_status, final_substrate_ref, substrate_available, drill_action, next_route, owner_blocker, related_axes(jsonb), proof_source
Core drill rule (computed in PG, not Nuxt)
count_value > 1 AND has_children→drill_action = DRILLcount_value > 1 AND NOT has_children AND NOT substrate→NEEDS_GROUPING- otherwise →
SHOW_SUBSTRATE
Live coverage (87 nodes)
| axis | nodes | drillable | with_substrate | needs_grouping | source |
|---|---|---|---|---|---|
| AX-BASE | 39 | 5 | 39 | 0 | v_registries_pivot_node_contract |
| AX-PROCESS | 22 | 18 | 20 | 0 | wf_process_candidate + job:cut + workflows |
| AX-PXT | 12 | 0 | 12 | 10 | v_process_trigger_actionability_ledger |
| AX-TOPIC | 7 | 0 | 7 | 0 | v_registries_pivot_axis_surface |
| AX-TRIGGER | 7 | 7 | 7 | 0 | v_ax_trigger_surface |
Unifies: base pivot nodes, AX-TOPIC candidate nodes, AX-PROCESS candidates (WPC-*) + sole-verified job:cut + 2 official workflows, AX-TRIGGER census classes, and Process×Trigger ledger gaps. Every row carries honest governance/lifecycle status (candidate / blocked / verified) and owner_blocker.
No-hardcode guarantee
All counts, drill rules, child sets, and statuses come from PG views/functions. Nuxt does zero math.