ADR-009: Edge-Based Composition DAG for Multi-Directional Melding

Status

Phase 3 Complete (Composition extension + cross-axis sub-containers)

Context

Glyph melding in QNTX creates spatial compositions through proximity. Phase 1 implemented N-glyph compositions using flat arrays (glyphIds: string[]) for horizontal chains: [ax|py|prompt].

However, QNTX requires multi-directional melding beyond linear chains:

Horizontal (right): Data flow chains

Vertical (top): Configuration injection

Vertical (bottom): Result attachment

Flat arrays cannot represent DAG topologies. We need arbitrary graph structures with directional edges.

Decision

Migrate from flat glyphIds: string[] to edge-based composition DAG structure.

Data model:

message CompositionEdge {
  string from = 1;        // source glyph ID
  string to = 2;          // target glyph ID
  string direction = 3;   // 'right', 'top', 'bottom'
  int32 position = 4;     // ordering
}

message Composition {
  string id = 1;
  repeated CompositionEdge edges = 2;
  reserved 3;  // formerly glyph_ids (removed for DAG-native approach)
  double x = 4;
  double y = 5;
}

Proto as source of truth:

Rationale

Why edges instead of alternatives?

  1. Nested structures (children: Composition[]): Doesn't support multiple parents (DAG requires this)
  2. Adjacency matrix: O(N²) space, sparse for typical compositions
  3. Port-based connections: Over-engineered for current needs, can add later
  4. Edge list: Flexible, SQL-friendly, supports arbitrary topologies ✓

Why breaking change instead of migration?

Why remove type field?

Why remove glyph_ids field?

Implementation

Phase 1ba: Backend (DB + storage)

Phase 1bb: API + Frontend state ✅

Phase 1bc: UI integration

Phase 2: Port-aware meldability + multi-directional melding ✅

Phase 3: Composition extension + cross-axis sub-containers ✅

Consequences

Positive

Negative

Neutral

Alternatives Considered

Keep flat arrays, add separate structure for complex cases:

Port-based model (à la GoFlow):

Graph library (Graphology, dominikbraun/graph):

Future Work

References