diff --git a/codex-rs/core/src/memories/phase1.rs b/codex-rs/core/src/memories/phase1.rs index 1d5fc9e506..654e062e3e 100644 --- a/codex-rs/core/src/memories/phase1.rs +++ b/codex-rs/core/src/memories/phase1.rs @@ -118,10 +118,10 @@ pub fn output_schema() -> Value { "type": "object", "properties": { "rollout_summary": { "type": "string" }, - "rollout_slug": { "type": "string" }, + "rollout_slug": { "type": ["string", "null"] }, "raw_memory": { "type": "string" } }, - "required": ["rollout_summary", "raw_memory"], + "required": ["rollout_summary", "rollout_slug", "raw_memory"], "additionalProperties": false }) } diff --git a/codex-rs/core/src/memories/tests.rs b/codex-rs/core/src/memories/tests.rs index 900cc21840..92fd69e4df 100644 --- a/codex-rs/core/src/memories/tests.rs +++ b/codex-rs/core/src/memories/tests.rs @@ -22,7 +22,7 @@ fn memory_root_uses_shared_global_path() { } #[test] -fn stage_one_output_schema_keeps_rollout_slug_optional() { +fn stage_one_output_schema_requires_rollout_slug_and_keeps_it_nullable() { let schema = crate::memories::phase1::output_schema(); let properties = schema .get("properties") @@ -43,7 +43,24 @@ fn stage_one_output_schema_keeps_rollout_slug_optional() { properties.contains_key("rollout_slug"), "schema should declare rollout_slug" ); - assert_eq!(required_keys, vec!["raw_memory", "rollout_summary"]); + + let rollout_slug_type = properties + .get("rollout_slug") + .and_then(Value::as_object) + .and_then(|schema| schema.get("type")) + .and_then(Value::as_array) + .expect("rollout_slug type array"); + let mut rollout_slug_types = rollout_slug_type + .iter() + .map(|entry| entry.as_str().expect("type entry string")) + .collect::>(); + rollout_slug_types.sort_unstable(); + + assert_eq!( + required_keys, + vec!["raw_memory", "rollout_slug", "rollout_summary"] + ); + assert_eq!(rollout_slug_types, vec!["null", "string"]); } #[tokio::test]