mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
Update guardian output schema (#17061)
## Summary - Update guardian output schema to separate risk, authorization, outcome, and rationale. - Feed guardian rationale into rejection messages. - Split the guardian policy into template and tenant-config sections. ## Validation - `cargo test -p codex-core mcp_tool_call` - `env -u CODEX_SANDBOX_NETWORK_DISABLED INSTA_UPDATE=always cargo test -p codex-core guardian::` --------- Co-authored-by: Owen Lin <owen@openai.com>
This commit is contained in:
committed by
GitHub
Unverified
parent
49677ec71f
commit
dcbc91fd39
@@ -6736,7 +6736,6 @@ impl ChatWidget {
|
||||
GuardianAssessmentStatus::Aborted
|
||||
}
|
||||
},
|
||||
risk_score: review.risk_score,
|
||||
risk_level: review.risk_level.map(|risk_level| match risk_level {
|
||||
codex_app_server_protocol::GuardianRiskLevel::Low => {
|
||||
codex_protocol::protocol::GuardianRiskLevel::Low
|
||||
@@ -6747,6 +6746,25 @@ impl ChatWidget {
|
||||
codex_app_server_protocol::GuardianRiskLevel::High => {
|
||||
codex_protocol::protocol::GuardianRiskLevel::High
|
||||
}
|
||||
codex_app_server_protocol::GuardianRiskLevel::Critical => {
|
||||
codex_protocol::protocol::GuardianRiskLevel::Critical
|
||||
}
|
||||
}),
|
||||
user_authorization: review.user_authorization.map(|user_authorization| {
|
||||
match user_authorization {
|
||||
codex_app_server_protocol::GuardianUserAuthorization::Unknown => {
|
||||
codex_protocol::protocol::GuardianUserAuthorization::Unknown
|
||||
}
|
||||
codex_app_server_protocol::GuardianUserAuthorization::Low => {
|
||||
codex_protocol::protocol::GuardianUserAuthorization::Low
|
||||
}
|
||||
codex_app_server_protocol::GuardianUserAuthorization::Medium => {
|
||||
codex_protocol::protocol::GuardianUserAuthorization::Medium
|
||||
}
|
||||
codex_app_server_protocol::GuardianUserAuthorization::High => {
|
||||
codex_protocol::protocol::GuardianUserAuthorization::High
|
||||
}
|
||||
}
|
||||
}),
|
||||
rationale: review.rationale,
|
||||
action: action.into(),
|
||||
|
||||
@@ -39,6 +39,7 @@ pub(super) use codex_app_server_protocol::GuardianApprovalReviewAction as AppSer
|
||||
pub(super) use codex_app_server_protocol::GuardianApprovalReviewStatus;
|
||||
pub(super) use codex_app_server_protocol::GuardianCommandSource as AppServerGuardianCommandSource;
|
||||
pub(super) use codex_app_server_protocol::GuardianRiskLevel as AppServerGuardianRiskLevel;
|
||||
pub(super) use codex_app_server_protocol::GuardianUserAuthorization as AppServerGuardianUserAuthorization;
|
||||
pub(super) use codex_app_server_protocol::HookCompletedNotification as AppServerHookCompletedNotification;
|
||||
pub(super) use codex_app_server_protocol::HookEventName as AppServerHookEventName;
|
||||
pub(super) use codex_app_server_protocol::HookExecutionMode as AppServerHookExecutionMode;
|
||||
@@ -152,6 +153,7 @@ pub(super) use codex_protocol::protocol::GuardianAssessmentEvent;
|
||||
pub(super) use codex_protocol::protocol::GuardianAssessmentStatus;
|
||||
pub(super) use codex_protocol::protocol::GuardianCommandSource;
|
||||
pub(super) use codex_protocol::protocol::GuardianRiskLevel;
|
||||
pub(super) use codex_protocol::protocol::GuardianUserAuthorization;
|
||||
pub(super) use codex_protocol::protocol::ImageGenerationEndEvent;
|
||||
pub(super) use codex_protocol::protocol::ItemCompletedEvent;
|
||||
pub(super) use codex_protocol::protocol::McpStartupCompleteEvent;
|
||||
|
||||
@@ -18,8 +18,8 @@ async fn guardian_denied_exec_renders_warning_and_denied_request() {
|
||||
id: "guardian-1".into(),
|
||||
turn_id: "turn-1".into(),
|
||||
status: GuardianAssessmentStatus::InProgress,
|
||||
risk_score: None,
|
||||
risk_level: None,
|
||||
user_authorization: None,
|
||||
rationale: None,
|
||||
action: action.clone(),
|
||||
}),
|
||||
@@ -36,8 +36,8 @@ async fn guardian_denied_exec_renders_warning_and_denied_request() {
|
||||
id: "guardian-1".into(),
|
||||
turn_id: "turn-1".into(),
|
||||
status: GuardianAssessmentStatus::Denied,
|
||||
risk_score: Some(96),
|
||||
risk_level: Some(GuardianRiskLevel::High),
|
||||
user_authorization: Some(GuardianUserAuthorization::Low),
|
||||
rationale: Some("Would exfiltrate local source code.".into()),
|
||||
action,
|
||||
}),
|
||||
@@ -79,8 +79,8 @@ async fn guardian_approved_exec_renders_approved_request() {
|
||||
id: "thread:child-thread:guardian-1".into(),
|
||||
turn_id: "turn-1".into(),
|
||||
status: GuardianAssessmentStatus::Approved,
|
||||
risk_score: Some(14),
|
||||
risk_level: Some(GuardianRiskLevel::Low),
|
||||
user_authorization: Some(GuardianUserAuthorization::High),
|
||||
rationale: Some("Narrowly scoped to the requested file.".into()),
|
||||
action: GuardianAssessmentAction::Command {
|
||||
source: GuardianCommandSource::Shell,
|
||||
@@ -133,8 +133,8 @@ async fn app_server_guardian_review_started_sets_review_status() {
|
||||
target_item_id: "guardian-1".to_string(),
|
||||
review: GuardianApprovalReview {
|
||||
status: GuardianApprovalReviewStatus::InProgress,
|
||||
risk_score: None,
|
||||
risk_level: None,
|
||||
user_authorization: None,
|
||||
rationale: None,
|
||||
},
|
||||
action,
|
||||
@@ -173,8 +173,8 @@ async fn app_server_guardian_review_denied_renders_denied_request_snapshot() {
|
||||
target_item_id: "guardian-1".to_string(),
|
||||
review: GuardianApprovalReview {
|
||||
status: GuardianApprovalReviewStatus::InProgress,
|
||||
risk_score: None,
|
||||
risk_level: None,
|
||||
user_authorization: None,
|
||||
rationale: None,
|
||||
},
|
||||
action: action.clone(),
|
||||
@@ -191,8 +191,8 @@ async fn app_server_guardian_review_denied_renders_denied_request_snapshot() {
|
||||
target_item_id: "guardian-1".to_string(),
|
||||
review: GuardianApprovalReview {
|
||||
status: GuardianApprovalReviewStatus::Denied,
|
||||
risk_score: Some(96),
|
||||
risk_level: Some(AppServerGuardianRiskLevel::High),
|
||||
user_authorization: Some(AppServerGuardianUserAuthorization::Low),
|
||||
rationale: Some("Would exfiltrate local source code.".to_string()),
|
||||
},
|
||||
action,
|
||||
@@ -241,8 +241,8 @@ async fn guardian_parallel_reviews_render_aggregate_status_snapshot() {
|
||||
id: id.to_string(),
|
||||
turn_id: "turn-1".to_string(),
|
||||
status: GuardianAssessmentStatus::InProgress,
|
||||
risk_score: None,
|
||||
risk_level: None,
|
||||
user_authorization: None,
|
||||
rationale: None,
|
||||
action: GuardianAssessmentAction::Command {
|
||||
source: GuardianCommandSource::Shell,
|
||||
@@ -271,8 +271,8 @@ async fn guardian_parallel_reviews_keep_remaining_review_visible_after_denial()
|
||||
id: "guardian-1".to_string(),
|
||||
turn_id: "turn-1".to_string(),
|
||||
status: GuardianAssessmentStatus::InProgress,
|
||||
risk_score: None,
|
||||
risk_level: None,
|
||||
user_authorization: None,
|
||||
rationale: None,
|
||||
action: GuardianAssessmentAction::Command {
|
||||
source: GuardianCommandSource::Shell,
|
||||
@@ -287,8 +287,8 @@ async fn guardian_parallel_reviews_keep_remaining_review_visible_after_denial()
|
||||
id: "guardian-2".to_string(),
|
||||
turn_id: "turn-1".to_string(),
|
||||
status: GuardianAssessmentStatus::InProgress,
|
||||
risk_score: None,
|
||||
risk_level: None,
|
||||
user_authorization: None,
|
||||
rationale: None,
|
||||
action: GuardianAssessmentAction::Command {
|
||||
source: GuardianCommandSource::Shell,
|
||||
@@ -303,8 +303,8 @@ async fn guardian_parallel_reviews_keep_remaining_review_visible_after_denial()
|
||||
id: "guardian-1".to_string(),
|
||||
turn_id: "turn-1".to_string(),
|
||||
status: GuardianAssessmentStatus::Denied,
|
||||
risk_score: Some(92),
|
||||
risk_level: Some(GuardianRiskLevel::High),
|
||||
user_authorization: Some(GuardianUserAuthorization::Low),
|
||||
rationale: Some("Would delete important data.".to_string()),
|
||||
action: GuardianAssessmentAction::Command {
|
||||
source: GuardianCommandSource::Shell,
|
||||
|
||||
@@ -618,7 +618,7 @@ mod tests {
|
||||
allowed_approvals_reviewers: Some(vec![ApprovalsReviewer::GuardianSubagent]),
|
||||
allowed_sandbox_modes: Some(vec![SandboxModeRequirement::ReadOnly]),
|
||||
allowed_web_search_modes: Some(vec![WebSearchModeRequirement::Cached]),
|
||||
guardian_developer_instructions: None,
|
||||
guardian_policy_config: None,
|
||||
feature_requirements: Some(FeatureRequirementsToml {
|
||||
entries: BTreeMap::from([("guardian_approval".to_string(), true)]),
|
||||
}),
|
||||
@@ -811,7 +811,7 @@ approval_policy = "never"
|
||||
allowed_approvals_reviewers: None,
|
||||
allowed_sandbox_modes: None,
|
||||
allowed_web_search_modes: Some(Vec::new()),
|
||||
guardian_developer_instructions: None,
|
||||
guardian_policy_config: None,
|
||||
feature_requirements: None,
|
||||
mcp_servers: None,
|
||||
apps: None,
|
||||
|
||||
Reference in New Issue
Block a user