AffectedReportGenerator
Renders an AffectedModules result as the two local artefacts aalekhAffected writes: a PR-ready Markdown comment and a machine-readable JSON envelope. A consumer's own CI posts the Markdown as a pull-request comment - Aalekh never posts anything itself.
Pure string transforms - no Gradle, no I/O.