Browse documentation

ADR 002: Relationship flow semantics

On this page

Status: Accepted · 2026-04

Context

A relationship like student_export.py READS_FROM Student.Person is stored in a natural direction: the statement reads correctly in English. But the product question is the opposite one — if I change Student.Person, what breaks? — and that propagates from the table to the script.

Naively traversing stored edges gives backwards results for exactly the relationships that matter most (reads_from, consumes, uses_column).

Decision

Every relationship type declares a flow:

The graph index expands each relationship into one or two influence arcs and traversal walks those, not the stored edges.

calls is BOTH. A caller and a callee are genuinely coupled: changing the caller can break the callee’s contract, and changing the callee breaks the caller. Everything else is single-direction.

Consequences

Alternatives considered