Appendix B - 22. Symbol-anchored traceability graph (derived edges)

The judgment — Derived edges defend; snapshotted ones drift — anchor joins to symbols and re-derive them.

RoleModels-bridge
FamilySystem models
Used in stacksThe model-coherence stack
EnforcementHard
Related mechanismsCounterpart: Drift & parity gates; Enabler: Executable source-of-truth models; See also: Coverage → model-node mapping (which invariants are actually tested); See also: Control↔substrate dependency (computed blast-radius)

The Structure of Symbol-anchored traceability graph (derived edges) — its shape at a glance:

Every edge terminates on a SymbolAnchor — a resolvable (path, symbol, resolver) reference, carrying no line number — and joins two of five node genres (a model element, its lint, its code root, its proof, its registry) under a closed edge vocabulary. Each edge carries a non-optional derivation. A meta-lint re-resolves every anchor at check time and reddens on a broken one; the same anchors make the graph bidirectionally traversable.

enforced-bygovernsverified-byderived-frompoints-at live implre-resolve each anchorat DoD cadence; reddenon a broken oneEnforcing lintModel elementCode rootProof / checker runRegistryEvery edge ends on aresolvableSymbolAnchor: path,symbol, resolver noline numberMeta-lint
Figure B.22-1. Accessible description: a central model-element node is joined to four other node genres by typed, closed-vocabulary edges — enforced-by its lint, governs its code root, verified-by its proof or checker run, derived-from its registry, and points-at the live implementation. Every edge terminates on a resolvable SymbolAnchor of (path, symbol, resolver) that carries no line number, so it survives a refactor above it. A meta-lint re-resolves each anchor at definition-of-done or audit cadence and reddens a broken one. The same resolving anchors let an agent traverse the graph both ways — code to model, or model to code — on one index.

Full description → Symbol-anchored traceability graph (derived edges).

Intent — Link every model to its lint, its code entry-point, its proof, its related models, and its registry as a structured graph whose every edge is a derived obligation a lint re-checks — each edge terminating on a resolvable symbol, never a line number — so when the code moves and breaks an edge, the model↔code drift becomes mechanically visible at scan time. The governing principle: derived edges defend; snapshotted ones drift.

Problem

The executable models that let a context-bounded agent operate a context-exceeding codebase are useful only while the map equals the territory. A model states more than facts about itself: it names the lint that enforces it, the code root it governs, the test that verifies it, the registry it reconciles against — the joins an agent walks between levels of abstraction, which rot the moment the code moves without them.

The failure is silent traceability rot: a model's reference to a code symbol goes stale when the symbol is deleted, renamed, or moved, and nothing notices — the model still looks authoritative while pointing at a ghost. The design was read off real drift: an audit of recently-closed work harvested roughly two dozen drift instances — the clean cases all read the source of truth at check time, the drifted ones kept a rotting parallel list.

Mechanism

Engineering consequences

Drift-detection and traversal are two faces of one property: an anchor that resolves means both that the model's claim is currently true and that the agent's traversal is a current slice of the system. A sharp by-product: a model referencing a symbol with no clean anchor — logic buried inline in a god-function — surfaces that absence as an abstraction-completeness finding routing to a refactoring target, not an error. Against a fan-out over twelve models, it classified roughly six-hundred anchors and caught about fourteen genuine drifts no existing lint fired on.

Implementation seam

The symbol-anchor reference and its per-extension resolvers, from static analyzers that already ship; the edge type with its closed kind vocabulary and kind-pair table; the re-derivation meta-lint, landing audit-only then blocking; and the active-implementation registry with its pointer-agreement lint. Resolution is costly — a cross-reference round-trip per symbol over a large tree — so it runs at definition-of-done or audit cadence, a fast keyword companion catching the cheap cases inline.

Known limitations

Resolution catches deletion, not demotion: a symbol that still exists but no longer plays the role the edge claims resolves green, so the keyword companion for present-tense role-currency is the complement. A weak-prover fallback is a standing warning — a code anchor that resolves only by textual presence re-admits, if left un-burned-down, the drift the strong prover exists to remove. And the edge vocabulary must fit the domain: a relationship the closed kind set can't express forces an enum change, the honest signal that the join web grew a dimension, not a licence for a free-form string edge.

© James C. Davis, 2026–present