KB-6708

S144 Phase 3A Report — Layer 5 Edges + DOT Lifecycle

3 min read Revision 1
reports144phase3alayer5universal-edgeslifecycle

S144: Phase 3A — Layer 5 Reads Edges + DOT Lifecycle

Date: 2026-03-19 Status: COMPLETE PR: #549 (merged)

Assembly Gate

# Answer
Q0 PG: universal_edges (450 edges), fn_transition_lifecycle, 6 AFTER triggers — all exist
Q1 Directus: universal_edges registered, 3 read permissions, public accessible
Q2 Layer 5 was reading from entity_dependencies — now switched to universal_edges
Q3 Existing: [id].vue + DiscoveryView.vue already had 6 headings structure
Q4 Modified existing views + created shared composable
Q5 Searched: PG tables, Directus API, Nuxt pages/components/composables

Part A: Layer 5 reads from universal_edges

Changes

File Change
web/composables/useUniversalEdges.ts NEW — shared composable, fetches outgoing+incoming edges from Directus API
web/config/detail-sections.ts Added reverseCollectionMap, missing prefix mappings (CPI, TBL, TRG, CMT, ISS, TAX)
web/pages/knowledge/registries/[entityType]/[id].vue Layer 5 now uses useUniversalEdges composable
web/components/registries/DiscoveryView.vue Layer 5 now uses useUniversalEdges composable

Data Flow

PG universal_edges (450 edges, auto-maintained by 6 AFTER triggers)
  → Directus API /items/universal_edges (public read)
    → useUniversalEdges composable (outgoing + incoming queries)
      → 6 headings: Thuộc ai, Chứa gì, Dùng ai, Ai dùng tôi, Cùng nhóm, Tương tự

6 Headings (always visible, fixed order)

# Heading Edge Type Current Data
1 Thuộc ai BELONGS_TO (outgoing) 222 edges
2 Chứa gì CONTAINS (outgoing) 201 edges
3 Dùng ai USES (outgoing) 27 edges
4 Ai dùng tôi USES (incoming) reverse of #3
5 Cùng nhóm GROUP_WITH + taxonomy scoring 0 edges + taxonomy
6 Tương tự SIMILAR_TO 0 edges

Part B: DOT Lifecycle Tools

Changes

Tool Version Change
dot-entity-deprecate 1.0 → 2.0 Now calls fn_transition_lifecycle() instead of deprecate_entity()
dot-entity-retire 1.0 → 2.0 Now calls fn_transition_lifecycle() instead of retire_entity()

Both tools:

  • Resolve entity code to collection + id via multi-table UNION query
  • Call fn_transition_lifecycle(collection, id, new_status, reason, performed_by)
  • Log to lifecycle_log automatically
  • Retire checks fn_retire_gate_check for active dependents

Verification

# Condition Result
1 Layer 5 shows 6 headings PASS — all 6 visible in SSR
2 Data from universal_edges PASS — API /items/universal_edges accessible
3 Empty headings display PASS — headings always render
4 verify_counts 0 MISMATCH PASS — 19/19 OK
5 CI GREEN PASS — all checks passed
6 Health check 3/4 PASS (auth FAIL pre-existing)
7 Production deployed PASS — site HTTP 200