diff --git a/codex-rs/app-server/tests/suite/v2/thread_resume.rs b/codex-rs/app-server/tests/suite/v2/thread_resume.rs index efa51573cb..5eb893b8e1 100644 --- a/codex-rs/app-server/tests/suite/v2/thread_resume.rs +++ b/codex-rs/app-server/tests/suite/v2/thread_resume.rs @@ -437,6 +437,14 @@ async fn thread_resume_accepts_personality_override() -> Result<()> { let request = response_mock.single_request(); let developer_texts = request.message_input_texts("developer"); + let personality_update_count = developer_texts + .iter() + .filter(|text| text.contains("")) + .count(); + assert_eq!( + personality_update_count, 1, + "expected exactly one personality update message in developer input, got {developer_texts:?}" + ); assert!( developer_texts .iter() diff --git a/codex-rs/app-server/tests/suite/v2/turn_start.rs b/codex-rs/app-server/tests/suite/v2/turn_start.rs index 1b53a5cfef..35d0c53f85 100644 --- a/codex-rs/app-server/tests/suite/v2/turn_start.rs +++ b/codex-rs/app-server/tests/suite/v2/turn_start.rs @@ -474,6 +474,14 @@ async fn turn_start_accepts_personality_override_v2() -> Result<()> { eprintln!("request body: {}", request.body_json()); } + let personality_update_count = developer_texts + .iter() + .filter(|text| text.contains("")) + .count(); + assert_eq!( + personality_update_count, 1, + "expected exactly one personality update message in developer input, got {developer_texts:?}" + ); assert!( developer_texts .iter() @@ -585,6 +593,14 @@ async fn turn_start_change_personality_mid_thread_v2() -> Result<()> { ); let second_developer_texts = requests[1].message_input_texts("developer"); + let personality_update_count = second_developer_texts + .iter() + .filter(|text| text.contains("")) + .count(); + assert_eq!( + personality_update_count, 1, + "expected exactly one personality update message in second request, got {second_developer_texts:?}" + ); assert!( second_developer_texts .iter() diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 29b02c006a..1ab712ebbf 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -2434,6 +2434,7 @@ async fn submission_loop(sess: Arc, config: Arc, rx_sub: Receiv personality, ..Default::default() }, + &mut previous_context, ) .await; } @@ -2572,6 +2573,7 @@ mod handlers { sess: &Session, sub_id: String, updates: SessionSettingsUpdate, + previous_turn_context: &mut Option>, ) { let previous_context = sess .new_default_turn_with_sub_id(sess.next_internal_sub_id()) @@ -2597,12 +2599,13 @@ mod handlers { return; } + let current_context = sess.new_default_turn_with_sub_id(sub_id).await; let initial_context_seeded = sess.state.lock().await.initial_context_seeded; if !initial_context_seeded { + *previous_turn_context = Some(current_context); return; } - let current_context = sess.new_default_turn_with_sub_id(sub_id).await; let update_items = sess.build_settings_update_items( Some(&previous_context), ¤t_context, @@ -2613,6 +2616,7 @@ mod handlers { sess.record_conversation_items(¤t_context, &update_items) .await; } + *previous_turn_context = Some(current_context); } pub async fn user_input_or_turn( diff --git a/codex-rs/core/tests/suite/personality.rs b/codex-rs/core/tests/suite/personality.rs index 2b00574d58..e3fe3b0d97 100644 --- a/codex-rs/core/tests/suite/personality.rs +++ b/codex-rs/core/tests/suite/personality.rs @@ -255,6 +255,14 @@ async fn user_turn_personality_some_adds_update_message() -> anyhow::Result<()> .expect("expected personality update request"); let developer_texts = request.message_input_texts("developer"); + let personality_update_count = developer_texts + .iter() + .filter(|text| text.contains("")) + .count(); + assert_eq!( + personality_update_count, 1, + "expected exactly one personality update message in developer input, got {developer_texts:?}" + ); let personality_text = developer_texts .iter() .find(|text| text.contains("")) @@ -738,6 +746,14 @@ async fn user_turn_personality_remote_model_template_includes_update_message() - .last() .expect("expected personality update request"); let developer_texts = request.message_input_texts("developer"); + let personality_update_count = developer_texts + .iter() + .filter(|text| text.contains("")) + .count(); + assert_eq!( + personality_update_count, 1, + "expected exactly one personality update message in developer input, got {developer_texts:?}" + ); let personality_text = developer_texts .iter() .find(|text| text.contains(""))