Topic Axis — 01 Live Substrate & SSOT Confirmation
01 — Live Substrate & SSOT Confirmation
All values below are live-verified on 2026-06-04 (query_pg RO + ssh→docker psql). Old reports = evidence; live evidence wins.
Execution channel
query_pgRO MCP: working.ssh contabo→docker exec postgres psql -U directus -d directus: working. Roledirectus,rolsuper=f,transaction_read_only=off, owns public tables → can apply additive DDL. Classification: EXECUTION_MODE.- Rollback rehearsal proven (BEGIN..ROLLBACK net-zero, see doc 02).
DDL safety gate (critical pre-mutation finding)
Two prod event triggers exist:
evt_trigger_guard_ddl(ddl_command_end) →fn_evt_trigger_guard()evt_trigger_guard_drop(sql_drop) →fn_evt_trigger_guard_drop()
Both functions act only on object_type='trigger' (log a row to trigger_guard_alerts + RAISE WARNING). For CREATE TABLE/VIEW/FUNCTION and DROP TABLE/VIEW/FUNCTION they are no-ops. → Additive table/view/function DDL is safe and unlogged.
Taxonomy is birth-gated (why node creation is operator-only)
taxonomy carries 13 triggers, incl: fn_birth_gate (BEFORE), fn_birth_registry_auto ×2 (AFTER → birth row, no retire mechanism = known defect), trg_after_sync_edges_taxonomy (writes universal_edges), gen_code_taxonomy (auto code), fn_validate_dot_origin, fn_description_birth_guard, chk_no_cycle, fn_auto_label_assignment. ⇒ Do not INSERT taxonomy nodes live. Candidate topics held in axis_assignment instead.
Substrate inventory (presence / counts)
| Object | State |
|---|---|
axis_registry |
was ABSENT → now LIVE (this macro) |
axis_assignment |
was ABSENT → now LIVE (this macro) |
axis_node, axis_relation, entity_relations, topic table |
ABSENT (by design — no island) |
taxonomy |
LIVE; 57 active nodes across facets 1–7; 0 nodes under FAC-08 |
taxonomy_facets |
LIVE; FAC-08 = id 9, "Chủ đề nội dung?", active; (FAC-09 id=10 "Tầng kiến trúc?" = next candidate axis) |
iu_metadata_tag |
LIVE; topic:* = 7 keys / 25 assignments / ≤16 IUs (architecture5, knowledge_graph10, dot_trigger3, governance3, workflow2, cut_pipeline1, render_pipeline1) |
information_unit |
219 |
knowledge_documents |
5,723 (drifted from 5,710 in checkpoint — live wins) |
iu_relation |
60 |
universal_edges |
2,199 (rich DAG: source/target collection+id+code, edge_type, status, valid_time) |
governance_object_ownership |
LIVE but EMPTY (0 rows) → owner must populate |
governance_responsibility_scope, approval_requests, birth_registry, system_issues, event_type_registry |
LIVE |
approval_requests |
statuses observed: approved/applied/rejected/expired |
pivot_definitions |
39 rows; engine reads source_object (any relation/view) + jsonb filter/group/metric specs |
| Topic pivots PIV-310/320..332 | ABSENT (only PIV-311 IU + PIV-313 issues exist) |
RP integration points (live)
v_registries_pivot_surface (tree-shaped, DAG-unsafe for topics), v_registries_pivot_node_contract, v_rp_aggregate_candidate_register, v_registries_pivot_tree, v_living_lists, v_count_integrity, registry_pin, rp_grouping_policy — all confirmed present. The tree shape is exactly why a DAG-aware companion (v_registries_pivot_axis_surface) was needed (doc 06).
SSOT confirmation
Matches checkpoint checkpoint-information-piece-topic-axis-design-2026-06-03.md on every structural claim. Deltas vs checkpoint: docs 5,710→5,723; governance tables confirmed present (checkpoint already corrected this). No contradiction found.