feat(binding-graph): Phase 1 data model (ADR-0132) (#171)
Frozen dataclasses + deterministic allocator + invariants for the
Semantic-Symbolic Binding Graph proposed in PR #170. Pure data layer:
no parser, no solver, no adapter, no runtime wiring. Phases 2-5
deferred to follow-up PRs.
- generate/binding_graph/model.py: SourceSpanLink, SymbolBinding,
BoundFact, BoundEquation, BoundUnknown, BoundConstraint, and the
top-level SemanticSymbolicBindingGraph container. All
@dataclass(frozen=True, slots=True). Refusal-first construction via
typed BindingGraphError. Cross-collection referential integrity
enforced at __post_init__.
- generate/binding_graph/allocation.py: pure deterministic
allocate_symbols() — same input order yields byte-equal output.
- generate/binding_graph/__init__.py: public API surface.
- tests/test_binding_graph_model.py: 69 tests covering frozen
invariants, slots enforcement, refusal paths, allocation
determinism, canonical-string round-trip, cross-collection
integrity.
- docs/decisions/ADR-0132-binding-graph-data-model.md: ratifies
Phase 1 only; explicit Phase 2-5 deferred section citing #170.