KB-EFAA
RP Dynamic Drill — 03 Final Substrate Contract
3 min read Revision 1
03 — Final Substrate Contract (Track B)
Dispatcher: fn_rp_node_substrate(p_axis_code text, p_node_code text) → jsonb (STABLE, birth-free).
View: v_rp_node_final_substrate_contract (exercises the dispatcher per node).
Envelope
{ axis_code, node_code, substrate_type, source_tables[], rows_count, substrate_available, warnings[], provenance, payload }
Per-axis substrate resolution (real PG sources)
| axis / node kind | substrate_type | source tables |
|---|---|---|
AX-BASE PIV-* |
base_pivot_leaf / base_pivot_branch | v_registries_pivot_node_contract + fn_registries_pivot_node_substrate |
AX-TOPIC TOPIC-CAND:* |
topic_candidate | fn_topic_node_substrate + information_unit metadata |
AX-PROCESS WPC-* |
process_candidate | wf_process_candidate + wf_process_candidate_member |
AX-PROCESS job:cut |
job_pipeline | job_queue (8 cut.* step-kinds) |
| AX-PROCESS official | official_workflow | workflows + workflow_steps |
| AX-TRIGGER class | trigger_class | v_trigger_universe_census |
AX-PXT TRIG:/PROC:* |
actionability_gap | v_process_trigger_actionability_ledger |
| (unresolved) | UNKNOWN | warning NEEDS_SUBSTRATE_WRAPPER |
Live substrate samples
job:cut→ job_pipeline, rows_count 8, source job_queue ✓db_dml_trigger→ trigger_class, rows_count 408, source v_trigger_universe_census ✓TOPIC-CAND:knowledge_graph→ topic_candidate, rows_count 10 IUs ✓WPC-DOCKER-RUNTIME→ process_candidate, rows_count 11 members ✓PIV-019→ base_pivot_leaf, rows_count 1,194,828 (birth_registry) ✓PROC:official_rp→ actionability_gap, object_count 0, blocker BLOCKED_NO_PRESIDENT_VOTE ✓
Track-F gap closed mid-run
Initial AX-BASE branch keyed PIV-* through the registry-code function fn_registries_pivot_node_substrate (which keys on registry leaf codes, not pivot codes) → PIV-019 returned empty. Patched (02_patch_base_substrate.sql) to resolve base substrate from v_registries_pivot_node_contract (always PIV-keyed), enriched with leaf detail when codes match. Re-verified birth-free.
Honest gaps
- 2 empty WPC candidates (member_count=0) →
substrate_available=false(correct, not faked).