# Graph and lane projection contract
`graph/topology.json` and `lanes/<lane>/plan.md` are deterministic projections of `plan.md`; regenerate, compare byte-for-byte, and never edit them as independent sources.
## Topology shape
The canonical renderer emits `shepherd.plan-topology/2` with run, seed, mesh,
planning_evidence, goal, capacity_policy, deliverables, capacity, lanes, nodes, and
topological_order. Capacity and node fields are exactly those in `plan-contract.md`;
each lane has id, conductor, cargo_target, deliverables, and node_ids. Values come
from `plan.md`, never a second template. Empty dependency/interface arrays mean true
roots/no interface behavior; every node retains review, failure, and rollback.
## Validation
1. Normalize identifiers and reject duplicates.
2. Sort deliverables, lanes, nodes, dependencies, paths, and interfaces lexicographically; preserve schema field order.
3. Require existing dependencies and reachability from roots.
4. Topologically sort phases; cycles fail.
5. Give every seed deliverable a path to an accepted terminal node.
6. Require one producer per interface and an existing version for each consumer.
7. At each ready frontier reject overlapping `owns`, ancestor/descendant collisions, and shared mutable files. Broad forbidden paths need explicit no-follow boundaries.
8. Reject placeholders, empty fields, missing RED/GREEN commands, judgment evals, evidence, review, failure, or rollback.
9. Render topology and lanes from the same parsed `plan.md`; a second render must be byte-identical.
Structure alone proves neither path/symbol existence nor command success. `plan verify`
requires current canonical probes and byte-identical projections; see the native readiness
boundary in `plan-contract.md`. Critic and the Planning campaign judge vertical outcomes.
## Projection boundary
If a source-plan edit changes a node, interface, path, dependency, phase, lane, acceptance, or evidence path, regenerate topology and affected lanes before Critic. A stale projection fails. Never repair generated bytes by hand or place a generated commit/tree hash in its source.
