Skip to content

Commit 6520114

Browse files
authored
Merge pull request #627 from escoffier-labs/codex/568-10-redaction
feat(run): add operator journal redaction
2 parents e7e9c51 + b73f819 commit 6520114

6 files changed

Lines changed: 4289 additions & 1 deletion

File tree

docs/command-inventory.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ enabled: run `brigade extras on` once, or set `BRIGADE_EXTRAS=1`.
5656
- `brigade route`: 1 command path(s)
5757
- `brigade run`: 1 command path(s)
5858
- `brigade runbook` (extras): 5 command path(s)
59-
- `brigade runs`: 8 command path(s)
59+
- `brigade runs`: 9 command path(s)
6060
- `brigade scrub`: 1 command path(s)
6161
- `brigade search`: 6 command path(s)
6262
- `brigade security`: 15 command path(s)
@@ -443,6 +443,7 @@ enabled: run `brigade extras on` once, or set `BRIGADE_EXTRAS=1`.
443443
- `brigade runs latest`
444444
- `brigade runs list`
445445
- `brigade runs recover`
446+
- `brigade runs redact`
446447
- `brigade runs resume`
447448
- `brigade runs show`
448449
- `brigade runs steer`

src/brigade/cli/runs.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,42 @@ def register(sub: argparse._SubParsersAction) -> None:
110110
default=None,
111111
help="Explicit runs directory for run ids. Defaults to .brigade/runs under --cwd.",
112112
)
113+
p_runs_redact = runs_sub.add_parser(
114+
"redact",
115+
help="Run the explicit operator procedure for lifecycle journal redaction.",
116+
)
117+
p_runs_redact.add_argument("run", help="Run directory path, run id under --runs-dir, or 'latest'.")
118+
p_runs_redact.add_argument(
119+
"--cwd",
120+
type=Path,
121+
default=Path("."),
122+
help="Workspace whose default .brigade/runs directory should be used for run ids.",
123+
)
124+
p_runs_redact.add_argument(
125+
"--runs-dir",
126+
type=Path,
127+
default=None,
128+
help="Explicit runs directory for run ids. Defaults to .brigade/runs under --cwd.",
129+
)
130+
p_runs_redact.add_argument("--from-sequence", dest="sequence_start", type=int, default=None)
131+
p_runs_redact.add_argument("--to-sequence", dest="sequence_end", type=int, default=None)
132+
p_runs_redact.add_argument(
133+
"--reason",
134+
default=None,
135+
help="Closed incident reason code; never include the private value.",
136+
)
137+
p_runs_redact.add_argument(
138+
"--cleanup-quarantine",
139+
dest="cleanup_operation",
140+
default=None,
141+
metavar="OPERATION_ID",
142+
help="Explicitly remove a previously verified quarantine.",
143+
)
144+
p_runs_redact.add_argument(
145+
"--operator-confirm",
146+
action="store_true",
147+
help="Confirm this operator-only incident procedure.",
148+
)
113149
p_runs_resume = runs_sub.add_parser(
114150
"resume", help="Re-attach interrupted app-server workers from a run and re-synthesize."
115151
)
@@ -148,6 +184,17 @@ def dispatch(args) -> int:
148184
return _control_request(args.run, cwd=args.cwd, runs_dir=args.runs_dir, payload=payload)
149185
if args.runs_command == "recover":
150186
return runs_cmd.recover(args.run, cwd=args.cwd, runs_dir=args.runs_dir)
187+
if args.runs_command == "redact":
188+
return runs_cmd.redact(
189+
args.run,
190+
cwd=args.cwd,
191+
runs_dir=args.runs_dir,
192+
sequence_start=args.sequence_start,
193+
sequence_end=args.sequence_end,
194+
reason=args.reason,
195+
operator_confirmed=args.operator_confirm,
196+
cleanup_operation=args.cleanup_operation,
197+
)
151198
if args.runs_command == "resume":
152199
return runs_cmd.resume(args.run_dir)
153200
args._brigade_parser.error(f"unknown runs command: {args.runs_command}")

0 commit comments

Comments
 (0)