03 — IU Object Relationship & Điều 39 KG Enrichment Readiness/Design Pack (2026-05-28)
Doc 03 — Branch D: IU Object Relationship & Điều 39 KG Enrichment Readiness/Design Pack
Verdict: DESIGN/READINESS PACK (paper-only). A generic, Điều-39-shaped edge table already exists (universal_edges) but it is integer-keyed and does NOT contain IU. IU relationships live in dedicated uuid-keyed tables. Recommendation: enrich IU-native edges in place + a governed read-only projection — NO hidden second graph SoT, vector stays disabled.
1. Existing IU relationship substrate (live, 2026-05-28)
| Table | Keying | Rows | Role | Đ39 enrichment present? |
|---|---|---|---|---|
iu_relation |
uuid (source_unit_id/target_unit_id), version-pinned |
60 (contains/active) |
typed lineage edges: contains/derived_from/supersedes/replaced_by/merged_from/split_from | temporal (valid_from/to) + metadata jsonb; no explicit provenance/confidence/inferred columns |
iu_sql_link |
uuid IU ↔ SQL/Directus object | 3 (all enabled=false) |
IU→object link; validate/resolve | fingerprint, status; no confidence |
iu_tree_path |
uuid materialised containment | 199 | axis-C path | rebuildable from parent_or_container_ref |
iu_metadata_tag |
uuid IU ↔ classifier tag | 536 | axis-B domain tags | enrichment_source (derived/confirmed vs inferred/proposed) |
iu_split_set / iu_merge_set |
uuid | 1 / 0 | structure-op grouping | review_decision-bound |
| event/trigger | — | ETR 31, outbox 150,114, DLQ 0 | emission/capture | gated by emit_enabled |
| lifecycle | — | — | iu_lifecycle_log on retire/supersede |
Đ30/31 |
| review_decision | — | — | governing approval token (Đ32) | manifest-bound |
Key structural fact: information_unit.id is uuid.
2. The generic system edge table — universal_edges (CAT-130)
- 2,199 rows, governance_infra, layer 4. Comment: "Quan hệ toàn hệ thống — xuyên lớp composition, mirror FK + semantic edges."
- Edge types in use:
USES(1,486),BELONGS_TO(431),CONTAINS(282). - Source/target collections: taxonomy, dot_tools, trigger_registry, checkpoint_*, collection_registry, workflows, tasks, task_comments, ui_pages, agents, … —
information_unitis NOT present. - Keying:
source_id/target_idare integer +source_collection/target_collectionvarchar. - Đ39 enrichment columns already present (25 cols):
edge_type,edge_subtype,weight numeric,confidence numeric,valid_from/valid_to/valid_time tstzrange(temporal),provenance jsonb,metadata jsonb,symmetry_group_id uuid(inverse/symmetric pairs),source/target_composition_level,is_auto_managed,_dot_origin,status,source_info.
2.1 The compatibility gap (central finding)
universal_edges is the system's integer-keyed graph SoT for legacy collections; IU is uuid-keyed and absent. Forcing IU into universal_edges would require an integer surrogate per IU → a fragile, drift-prone mapping and a second identity space. This is the exact "hidden second graph SoT" the macro forbids if done covertly. Therefore IU relationships must remain in their uuid-native tables; any unified graph view must be an explicit, governed projection, not a copy.
3. Standard object relation pairs — coverage map
The system's canonical relation vocabulary (information-atom-law: IDENTITY, BELONGS_TO, CONTAINS, DEPENDS_ON, USED_BY, TRANSITIVE, PEERS, SIMILAR) maps to the requested pairs:
| Requested pair | IU-native today | universal_edges | Gap for IU |
|---|---|---|---|
| belongs_to / contains | iu_relation.contains (60); iu_tree_path; membership |
BELONGS_TO/CONTAINS | inverse belongs_to not materialised on IU |
| uses / used_by | — | USES (1,486) | not modelled for IU |
| depends_on / dependency_of | — | (entity_dependencies) | not modelled for IU |
| parent_of / child_of | parent_or_container_ref + tree_path |
CONTAINS | present (containment) |
| produced_by / produces | event/operation_ref lineage | — | partial (operation_ref) |
| triggers / triggered_by | event routes / trigger seam | trigger_registry edges | partial |
| references / referenced_by | iu_sql_link (IU→object) |
— | object-only, no IU↔IU reference |
| similar_to | — (vector OFF) | SIMILAR (atom-law) | blocked by vector_sync_enabled=false |
| conflicts_with | — | — | not modelled |
| supersedes / superseded_by | iu_relation (defined, unpopulated) |
— | type defined, 0 rows |
4. Điều 39 enrichment fields — required vs present
Điều 39 KG Law is ENACTED v2.3 (+v2.1 amendment): A8 every edge links back to source (W3C PROV-O); edge without provenance = quarantine; C7 explainability (explanation_path); C8 ACL/graph-projection; negative knowledge; override; temporal; confidence ranges in PG config kg_constraint_config (not hardcoded); soft constraints 3 levels.
| Đ39 field | universal_edges | iu_relation | IU enrichment action |
|---|---|---|---|
| provenance | ✅ provenance jsonb |
❌ (only metadata) |
add provenance jsonb (or namespaced metadata) — required by A8 or IU edges quarantine |
| confidence | ✅ confidence |
❌ | add confidence numeric |
| temporal validity | ✅ valid_time |
✅ valid_from/to |
OK (consider tstzrange parity) |
| evidence source | ✅ (provenance) | ❌ | via provenance |
| inferred vs asserted | partial (is_auto_managed) |
❌ | add assertion_mode ∈ {asserted,inferred} |
| negative knowledge | ❌ | ❌ | model as relation_type or negation flag (paper) |
| override | ❌ | ❌ | override_of ref + reason (paper) |
| explanation (XAI) | ❌ | ❌ | explanation_path jsonb (paper) |
| feedback / learning | ❌ | ❌ | RLKGF feedback link (paper) |
5. PG-first storage recommendation
- Keep IU relationships in uuid-native tables (
iu_relation,iu_sql_link,iu_tree_path,iu_metadata_tag). Do not migrate IU into integeruniversal_edges. - Enrich
iu_relationin place with the Đ39 fields (additive columns or a disciplinedmetadata/provenancejsonb contract). A8 compliance (provenance-or-quarantine) is the first must-have. - Unified graph = explicit governed projection. If a system-wide view over IU + legacy edges is needed, build a read-only
VIEW/materialized projection that UNIONsuniversal_edgeswith an IU-edge adapter (uuid-keyed), tagged by origin. The projection is derived, never authoritative — no write-back, no second identity space. This satisfies "no hidden second graph SoT." - No generic IU edge table needed yet —
iu_relationalready is the IU edge table; broaden itsrelation_typevocabulary (add uses/used_by, depends_on, references, conflicts_with) rather than create a new table. - Qdrant/vector stays governed-disabled (
iu_core.vector_sync_enabled=false, never_flip).similar_toedges remain blocked until policy permits — Đ39 SIMILAR is paper for IU. - Confidence/constraint thresholds live in
kg_constraint_config(Đ39 C4), not hardcoded.
6. How 4 Mothers will use this (forward map)
| Mother | Relations consumed |
|---|---|
| MOW (workflow) | workflow/task/IU contains, belongs_to, triggers/triggered_by |
| MOT (task) | assigned, used_by, depends_on/dependency_of |
| MOIT / MOUT (input/output) | input/output contract references, produces/produced_by |
| Governance Cockpit | depends_on impact graph + dependency/impact projection |
These all read the projection (or IU-native tables directly); none requires moving IU into universal_edges.
7. Outcome
- Applied this run: nothing (paper-only; no schema change, no edge write).
- Deliverable: substrate inventory + gap map + PG-first recommendation + Đ39 enrichment plan + 4-Mothers forward map.
- Next macro:
IU_KG_RELATIONSHIP_ENRICHMENT_READINESS_AND_DESIGN_PATCH_*X(doc 06, macro 3).