@@ -199,6 +199,28 @@ def register(sub: argparse._SubParsersAction) -> None:
199199 "resume" , help = "Re-attach interrupted app-server workers from a run and re-synthesize."
200200 )
201201 p_runs_resume .add_argument ("run_dir" , type = Path , help = "Path to a Brigade run artifact directory." )
202+ p_runs_audit = runs_sub .add_parser (
203+ "audit" ,
204+ help = (
205+ "Offline coordinator decision audit from recorded lifecycle evidence. "
206+ "Exit 0 on match, 1 on divergence or corrupt journal evidence, "
207+ "2 when the run is not auditable or the run id cannot be resolved."
208+ ),
209+ )
210+ p_runs_audit .add_argument ("run" , help = "Run directory path, run id under --runs-dir, or 'latest'." )
211+ p_runs_audit .add_argument (
212+ "--cwd" ,
213+ type = Path ,
214+ default = Path ("." ),
215+ help = "Workspace whose default .brigade/runs directory should be used for run ids." ,
216+ )
217+ p_runs_audit .add_argument (
218+ "--runs-dir" ,
219+ type = Path ,
220+ default = None ,
221+ help = "Explicit runs directory for run ids. Defaults to .brigade/runs under --cwd." ,
222+ )
223+ p_runs_audit .add_argument ("--json" , action = "store_true" , help = "Emit the audit receipt as JSON." )
202224 p_runs .set_defaults (func = dispatch )
203225
204226
@@ -262,6 +284,13 @@ def dispatch(args) -> int:
262284 )
263285 if args .runs_command == "resume" :
264286 return runs_cmd .resume (args .run_dir )
287+ if args .runs_command == "audit" :
288+ return runs_cmd .audit (
289+ args .run ,
290+ cwd = args .cwd ,
291+ runs_dir = args .runs_dir ,
292+ json_output = args .json ,
293+ )
265294 args ._brigade_parser .error (f"unknown runs command: { args .runs_command } " )
266295 return 2
267296
0 commit comments