Simplify guardian review terminal state handling

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Charles Cunningham
2026-03-24 17:13:53 -07:00
parent 734db45cb1
commit 73fae3c53d

View File

@@ -169,72 +169,42 @@ async fn run_guardian_review(
Err(err) => GuardianReviewOutcome::Completed(Err(err.into())),
};
let (assessment, status, decision, warning, risk_score, risk_level) = match outcome {
GuardianReviewOutcome::Completed(Ok(assessment)) => {
let (status, decision, verdict) =
if assessment.risk_score < GUARDIAN_APPROVAL_RISK_THRESHOLD {
(
GuardianAssessmentStatus::Approved,
GuardianApprovalDecision::Approved,
"approved",
)
} else {
(
GuardianAssessmentStatus::Denied,
GuardianApprovalDecision::Denied,
"denied",
)
};
let warning = format!(
"Automatic approval review {verdict} (risk: {}): {}",
guardian_risk_level_str(assessment.risk_level),
assessment.rationale
);
let risk_score = Some(assessment.risk_score);
let risk_level = Some(assessment.risk_level);
(
assessment, status, decision, warning, risk_score, risk_level,
)
}
GuardianReviewOutcome::Completed(Err(err)) => {
let assessment = GuardianAssessment {
risk_level: GuardianRiskLevel::High,
risk_score: 100,
rationale: format!("Automatic approval review failed: {err}"),
evidence: vec![],
};
let risk_score = Some(assessment.risk_score);
let risk_level = Some(assessment.risk_level);
let warning = format!(
"Automatic approval review denied (risk: {}): {}",
guardian_risk_level_str(assessment.risk_level),
assessment.rationale
);
(
assessment,
GuardianAssessmentStatus::Denied,
GuardianApprovalDecision::Denied,
warning,
risk_score,
risk_level,
)
}
let (risk_level, risk_score, rationale) = match outcome {
GuardianReviewOutcome::Completed(Ok(assessment)) => (
assessment.risk_level,
assessment.risk_score,
assessment.rationale,
),
GuardianReviewOutcome::Completed(Err(err)) => (
GuardianRiskLevel::High,
100,
format!("Automatic approval review failed: {err}"),
),
GuardianReviewOutcome::TimedOut => {
let assessment = GuardianAssessment {
risk_level: GuardianRiskLevel::High,
risk_score: 100,
rationale: GUARDIAN_TIMEOUT_MESSAGE.to_string(),
evidence: vec![],
};
let warning = assessment.rationale.clone();
(
assessment,
GuardianAssessmentStatus::TimedOut,
GuardianApprovalDecision::TimedOut,
warning,
None,
None,
)
let warning_event_message = GUARDIAN_TIMEOUT_MESSAGE.to_string();
session
.send_event(
turn.as_ref(),
EventMsg::Warning(WarningEvent {
message: warning_event_message.clone(),
}),
)
.await;
session
.send_event(
turn.as_ref(),
EventMsg::GuardianAssessment(GuardianAssessmentEvent {
id: assessment_id,
turn_id: assessment_turn_id,
status: GuardianAssessmentStatus::TimedOut,
risk_score: None,
risk_level: None,
rationale: Some(warning_event_message),
action: Some(terminal_action),
}),
)
.await;
return GuardianApprovalDecision::TimedOut;
}
GuardianReviewOutcome::Aborted => {
session
@@ -255,10 +225,19 @@ async fn run_guardian_review(
}
};
let approved = risk_score < GUARDIAN_APPROVAL_RISK_THRESHOLD;
let verdict = if approved { "approved" } else { "denied" };
let warning_event_message = format!(
"Automatic approval review {verdict} (risk: {}): {rationale}",
guardian_risk_level_str(risk_level),
);
session
.send_event(
turn.as_ref(),
EventMsg::Warning(WarningEvent { message: warning }),
EventMsg::Warning(WarningEvent {
message: warning_event_message,
}),
)
.await;
session
@@ -267,16 +246,24 @@ async fn run_guardian_review(
EventMsg::GuardianAssessment(GuardianAssessmentEvent {
id: assessment_id,
turn_id: assessment_turn_id,
status,
risk_score,
risk_level,
rationale: Some(assessment.rationale.clone()),
status: if approved {
GuardianAssessmentStatus::Approved
} else {
GuardianAssessmentStatus::Denied
},
risk_score: Some(risk_score),
risk_level: Some(risk_level),
rationale: Some(rationale),
action: Some(terminal_action),
}),
)
.await;
decision
if approved {
GuardianApprovalDecision::Approved
} else {
GuardianApprovalDecision::Denied
}
}
/// Public entrypoint for approval requests that should be reviewed by guardian.