Executable plan for spec 0056. Three tasks:
- Task 1 (atomic compile unit): introduce a `Scope` struct threading
two maps — `entries` keyed by each binder's effective (post-rename)
name, `rename` mapping authored→effective for shadow detection and
Term::Var resolution; add `fresh_binder` (<name>$<n>) and
`rename_pattern_binders`; rewrite every binder site (Let, flat-Match
pattern, Lam params, Loop binders) with rename-on-shadow, plus the
LetRec arm and both def-boundary constructions, to the new API.
- Task 2: correct the UniquenessTable doc-comment; verify the four RED
tests go GREEN; full-suite regression gate.
- Task 3: regression guard — a desugar unit test pinning that a
shadowing let is alpha-renamed and that a letrec capturing the
shadow-renamed binder still resolves (the entries-keyed-by-effective
choice is what keeps capture detection correct under rename).
Recon surfaced two facts the spec's sketch did not: the scope is a bare
BTreeMap (so resolved_name/bind live on a new Scope type, not the map),
and the LetRec capture-detection reads effective names from the
desugared body — hence entries are keyed by effective name. Both stay
internal to desugar.rs, preserving acceptance criterion 5 (no change to
uniqueness.rs logic / codegen gates / linearity.rs). Both no-change
consumers verified: match_lower.rs:795 keys by the emitted (renamed)
pattern binder; linearity builds table and lookups from the same
desugared tree.