pub fn respond(hook_json: &str, project_dir: &Path) -> Option<String>Expand description
The whole envelope, total: hook JSON in, whichever of the guard / shape-ticker / tier
voices fire out (joined, one version footer), or None. Every failure path is None — the fail-open
contract as a return type. The voices are derived from project_dir (the register, the
shim evidence), the classes come from spec/agenda.register, and the edited path is
normalized repo-relative so messages match what the repo’s own gates would say.
Capability: Effectful — reads the edited file, the registers, and build.rs
under project_dir.