Reuse guardian session across approvals (#14668)

## Summary
- reuse a guardian subagent session across approvals so reviews keep a
stable prompt cache key and avoid one-shot startup overhead
- clear the guardian child history before each review so prior guardian
decisions do not leak into later approvals
- include the `smart_approvals` -> `guardian_approval` feature flag
rename in the same PR to minimize release latency on a very tight
timeline
- add regression coverage for prompt-cache-key reuse without
prior-review prompt bleed

## Request
- Bug/enhancement request: internal guardian prompt-cache and latency
improvement request

---------

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Charley Cunningham
2026-03-15 22:56:18 -07:00
committed by GitHub
parent ba463a9dc7
commit 6fdeb1d602
26 changed files with 3132 additions and 1504 deletions

View File

@@ -8396,7 +8396,7 @@ async fn permissions_selection_history_snapshot_full_access_to_default() {
chat.open_permissions_popup();
let popup = render_bottom_popup(&chat, 120);
chat.handle_key_event(KeyEvent::from(KeyCode::Up));
if popup.contains("Smart Approvals") {
if popup.contains("Guardian Approvals") {
chat.handle_key_event(KeyEvent::from(KeyCode::Up));
}
chat.handle_key_event(KeyEvent::from(KeyCode::Enter));
@@ -8453,7 +8453,7 @@ async fn permissions_selection_emits_history_cell_when_current_is_selected() {
}
#[tokio::test]
async fn permissions_selection_hides_smart_approvals_when_feature_disabled() {
async fn permissions_selection_hides_guardian_approvals_when_feature_disabled() {
let (mut chat, _rx, _op_rx) = make_chatwidget_manual(None).await;
#[cfg(target_os = "windows")]
{
@@ -8466,13 +8466,13 @@ async fn permissions_selection_hides_smart_approvals_when_feature_disabled() {
let popup = render_bottom_popup(&chat, 120);
assert!(
!popup.contains("Smart Approvals"),
"expected Smart Approvals to stay hidden until the experimental feature is enabled: {popup}"
!popup.contains("Guardian Approvals"),
"expected Guardian Approvals to stay hidden until the experimental feature is enabled: {popup}"
);
}
#[tokio::test]
async fn permissions_selection_hides_smart_approvals_when_feature_disabled_even_if_auto_review_is_active()
async fn permissions_selection_hides_guardian_approvals_when_feature_disabled_even_if_auto_review_is_active()
{
let (mut chat, _rx, _op_rx) = make_chatwidget_manual(None).await;
#[cfg(target_os = "windows")]
@@ -8497,13 +8497,13 @@ async fn permissions_selection_hides_smart_approvals_when_feature_disabled_even_
let popup = render_bottom_popup(&chat, 120);
assert!(
!popup.contains("Smart Approvals"),
"expected Smart Approvals to stay hidden when the experimental feature is disabled: {popup}"
!popup.contains("Guardian Approvals"),
"expected Guardian Approvals to stay hidden when the experimental feature is disabled: {popup}"
);
}
#[tokio::test]
async fn permissions_selection_marks_smart_approvals_current_after_session_configured() {
async fn permissions_selection_marks_guardian_approvals_current_after_session_configured() {
let (mut chat, _rx, _op_rx) = make_chatwidget_manual(None).await;
#[cfg(target_os = "windows")]
{
@@ -8542,13 +8542,14 @@ async fn permissions_selection_marks_smart_approvals_current_after_session_confi
let popup = render_bottom_popup(&chat, 120);
assert!(
popup.contains("Smart Approvals (current)"),
"expected Smart Approvals to be current after SessionConfigured sync: {popup}"
popup.contains("Guardian Approvals (current)"),
"expected Guardian Approvals to be current after SessionConfigured sync: {popup}"
);
}
#[tokio::test]
async fn permissions_selection_marks_smart_approvals_current_with_custom_workspace_write_details() {
async fn permissions_selection_marks_guardian_approvals_current_with_custom_workspace_write_details()
{
let (mut chat, _rx, _op_rx) = make_chatwidget_manual(None).await;
#[cfg(target_os = "windows")]
{
@@ -8561,7 +8562,7 @@ async fn permissions_selection_marks_smart_approvals_current_with_custom_workspa
.features
.set_enabled(Feature::GuardianApproval, true);
let extra_root = AbsolutePathBuf::try_from("/tmp/smart-approvals-extra")
let extra_root = AbsolutePathBuf::try_from("/tmp/guardian-approvals-extra")
.expect("absolute extra writable root");
chat.handle_codex_event(Event {
@@ -8596,13 +8597,13 @@ async fn permissions_selection_marks_smart_approvals_current_with_custom_workspa
let popup = render_bottom_popup(&chat, 120);
assert!(
popup.contains("Smart Approvals (current)"),
"expected Smart Approvals to be current even with custom workspace-write details: {popup}"
popup.contains("Guardian Approvals (current)"),
"expected Guardian Approvals to be current even with custom workspace-write details: {popup}"
);
}
#[tokio::test]
async fn permissions_selection_can_disable_smart_approvals() {
async fn permissions_selection_can_disable_guardian_approvals() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(None).await;
#[cfg(target_os = "windows")]
{
@@ -8632,7 +8633,7 @@ async fn permissions_selection_can_disable_smart_approvals() {
event,
AppEvent::UpdateApprovalsReviewer(ApprovalsReviewer::User)
)),
"expected selecting Default from Smart Approvals to switch back to manual approval review: {events:?}"
"expected selecting Default from Guardian Approvals to switch back to manual approval review: {events:?}"
);
assert!(
!events
@@ -8678,8 +8679,8 @@ async fn permissions_selection_sends_approvals_reviewer_in_override_turn_context
assert!(
popup
.lines()
.any(|line| line.contains("Smart Approvals") && line.contains('')),
"expected one Down from Default to select Smart Approvals: {popup}"
.any(|line| line.contains("Guardian Approvals") && line.contains('')),
"expected one Down from Default to select Guardian Approvals: {popup}"
);
chat.handle_key_event(KeyEvent::from(KeyCode::Enter));