Feature: populate AnalysisResult.riskFiles
AnalysisResult declares a riskFiles: RiskFile[] field (and RiskFile is a documented type), but pipeline.ts hardcodes riskFiles: [] — it's never populated. So the per-file risk view that reporters could surface is always empty.
Proposal
Add a pure computeRiskFiles(changes) in src/core/risk.ts that aggregates breaking changes per file, counts confirmed broken call sites, and assigns a risk tier:
critical (3+ broken call sites), high (1–2), medium (breaking surface, no confirmed broken caller).
- Sorted deterministically (tier, then path). Wired into
pipeline.ts so it flows through to reporters (JSON output shows it immediately).
Pure function → unit-testable with plain mock changes, no git/tree-sitter.
Acceptance criteria
Contributing as part of Elite Coders Summer of Code (ECSoC 2026).
Feature: populate
AnalysisResult.riskFilesAnalysisResultdeclares ariskFiles: RiskFile[]field (andRiskFileis a documented type), butpipeline.tshardcodesriskFiles: []— it's never populated. So the per-file risk view that reporters could surface is always empty.Proposal
Add a pure
computeRiskFiles(changes)insrc/core/risk.tsthat aggregates breaking changes per file, counts confirmed broken call sites, and assigns a risk tier:critical(3+ broken call sites),high(1–2),medium(breaking surface, no confirmed broken caller).pipeline.tsso it flows through to reporters (JSON output shows it immediately).Pure function → unit-testable with plain mock changes, no git/tree-sitter.
Acceptance criteria
computeRiskFilesgroups breaking changes by file with a tier + reason + change countpipeline.tspopulatesriskFilesContributing as part of Elite Coders Summer of Code (ECSoC 2026).