03 — candidate-freeze
Goal
Freeze a bounded, ranked candidate list — one scan, write-once, NO infinite re-scan-and-grow. Rank by accretion (distinct work-items/bugs touching the symbol, via symbol-plans) × clone-cluster cohesion × centrality. The judgment + execution stages walk THIS frozen list; they never re-discover it (the infinite-regress lock).
Implementation Sketch
candidates.py: dedup the §02 signals into unique collapse candidates, rank by symbol-plans accretion count × cohesion × hotspot/pagerank, write the frozen list once to a scratch artifact. Downstream stages consume the frozen list by path; re-scanning is banned.
Spec References
scripts/intel-query.sh symbol-plans (accretion / wide-net count), insights (hotspot_score/pagerank); .claude/rules/context-discipline.md (scratch-path indirection)
Work Items
-
candidates.py: dedup §02 signals into unique collapse candidates - Rank by symbol-plans accretion × cohesion × centrality
- Write the frozen list ONCE to scratch; downstream consumes by path
- Test: re-running freeze on the same surface yields the same bounded list (no growth)