KB-2D9A

Topic Axis Self-Operated — 01 Live State & SSOT Confirmation

3 min read Revision 1
topic-axislive-checkssot2026-06-04

01 — Live State & SSOT Confirmation (2026-06-04)

SSOT read: checkpoint-rp-ui-axis-decision-queue-2026-06-04.md + package docs 02–07. Live re-verified via query_pg (RO) and ssh→psql (RW). Old reports = evidence; live wins. Every accepted-state number matched live before any mutation.

Topic Axis core (matched checkpoint exactly, pre-mutation)

Object Live Expected
axis_registry 1 row, AX-TOPIC = CANDIDATE CANDIDATE
axis_assignment 25 rows / 7 distinct nodes 25 / 7
v_registries_pivot_axis_surface 7 rows 7
v_axis_topic_pivots 14 rows 14
v_axis_topic_decision_queue 7 rows 7 (LIVE)
fn_topic_node_substrate(text) live; KG → 10 IUs / 10 evidence tags live
taxonomy 58 rows; FAC-08 = 0 governed nodes 58 / 0
source iu_metadata_tag topic:* 25 tags / 16 IUs 25 / 16
governance_object_ownership 0 rows (empty system-wide) 0
governance_responsibility_scope 6 rows (new finding)
universal_edges 2,199 2,199
event_type_registry 45 rows
approval_requests 211 (pre) → 225 (post) 211 pre
birth_registry 1,152,873 (pre) → 1,152,887 (post, +14) ~1,152,860

Schema / constraint facts that shaped the plan

  • approval_requests.status CHECK = pending|approved|applied|rejected|expired. No draftpending is the safe human-gate state.
  • approval_requests has 2 FKs: request_type_code → apr_request_types.request_code, proposed_action_code → apr_action_types.action_code. Both governed vocabularies. Mapped each row to existing codes (e.g. register_axis, register_topic_node, assign_axis_owner, amend_law). action CHECK = add|modify|delete|review; target_collection NOT NULL.
  • 6 triggers on approval_requests (via pg_trigger; invisible to MCP information_schema): trg_apr_auto_approve (auto-approves action='add'), trg_birth_approval_requests (births per insert), trg_approval_auto_code, trg_apr_lifecycle, trg_apr_quorum_check, trg_apr_block_unimplemented.
  • governance_object_ownership.lifecycle_status CHECK = active|superseded|revoked|expired. No draft/pending → inserting any row asserts ACTIVE ownership = forbidden. Therefore ownership bootstrap is a pending approval_request + a read-only gap view, never a live ownership row.
  • axis_assignment.status CHECK = candidate|provisional|approved|rejected|retired; UNIQUE(axis_code,node_code,target_type,target_code,relation_type). Speculative routing rows would dangle on non-existent targets → automation expressed as a derived view + packet, not inserted rows.

Execution-mode classification

EXECUTION_MODE — RW confirmed (directus role via ssh root → docker exec). All actions additive/reversible. No forbidden capability exercised.

Back to Knowledge Hub knowledge/dev/reports/architecture/topic-axis-self-operated-decision-ui-content-automation-2026-06-04/01-live-state-and-ssot-confirmation.md