Replies: 1 comment
|
The distinction is in the rollout already every decline funnels through
ToolEventStage::Failure(ToolEventFailure::Rejected { message, .. }) => {
let text = message.to_string();
let exec_result = ExecCommandResult {
stdout: String::new(),
stderr: text.clone(),
aggregated_output: text.clone(),
exit_code: -1,
duration: Duration::ZERO,
formatted_output: text,
status: ExecCommandStatus::Declined,
};
emit_exec_end(ctx, exec_input, exec_result).await;
}
so the strings you can match on guardian — that is the same human — policy or hook amendment deny — let rejection = match source {
ApprovalResolutionSource::Hook => "rejected by configuration",
ApprovalResolutionSource::Guardian => "automatic approval review denied the action",
ApprovalResolutionSource::User => "rejected by user",
};guardian timeout is so it is recoverable but only by string matching |
Uh oh!
There was an error while loading. Please reload this page.
I've been reading rollout/src/policy.rs alongside rollout-trace/src/protocol_event.rs. Both exclude ExecApprovalRequest, ApplyPatchApprovalRequest, and GuardianAssessment from persistence, with a comment noting the long explicit match arms exist so new protocol variants force a deliberate choice. ExecCommandEnd still carries a Declined status, so a rollout file shows that a command didn't run. What it can't tell me is which path produced that outcome: an explicit human decision, an execpolicy amendment, or the guardian reviewer's own assessment, which carries a rationale field that isn't persisted either. Is that distinction meant to live somewhere else, like the app-server protocol layer, or is it considered out of scope for what a rollout is meant to capture?
All reactions