From 7b5b3bd5a2418a5e142449c9ab95e057d14bc98a Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Sun, 23 Aug 2026 04:54:11 +0000 Subject: [PATCH] Identify detached memory requests as memory consolidation (#40186) ## What changed - Set `thread_source` to `memory_consolidation` in turn metadata for detached memory requests. - Verify that startup requests carry matching turn metadata in the request header and nested `client_metadata`. GitOrigin-RevId: 318d6f097e07463ac7a1c52b35a926532e67b83d --- codex-rs/core/src/turn_metadata.rs | 1 + codex-rs/core/src/turn_metadata_tests.rs | 5 +++++ codex-rs/memories/write/src/startup_tests.rs | 11 +++++++++++ 3 files changed, 17 insertions(+) diff --git a/codex-rs/core/src/turn_metadata.rs b/codex-rs/core/src/turn_metadata.rs index fe85efe685..ec652ee520 100644 --- a/codex-rs/core/src/turn_metadata.rs +++ b/codex-rs/core/src/turn_metadata.rs @@ -87,6 +87,7 @@ pub async fn detached_memory_responses_metadata( ) -> CodexResponsesMetadata { CodexResponsesMetadata { request_kind: Some(CodexResponsesRequestKind::Memory), + thread_source: Some(ThreadSource::MemoryConsolidation), subagent_header: subagent_header_value(session_source), sandbox: sandbox.map(ToString::to_string), sandbox_mode: Some( diff --git a/codex-rs/core/src/turn_metadata_tests.rs b/codex-rs/core/src/turn_metadata_tests.rs index bb19d1adb6..36ad699bbd 100644 --- a/codex-rs/core/src/turn_metadata_tests.rs +++ b/codex-rs/core/src/turn_metadata_tests.rs @@ -153,6 +153,10 @@ async fn detached_memory_responses_metadata_omits_turn_identity() { assert!(!header.contains("東京")); let parsed: Value = serde_json::from_str(&header).expect("valid json"); assert_eq!(parsed["request_kind"].as_str(), Some("memory")); + assert_eq!( + parsed["thread_source"].as_str(), + Some("memory_consolidation") + ); assert_eq!(parsed[SANDBOX_MODE_KEY].as_str(), Some("read-only")); assert!(parsed.get("session_id").is_none()); assert!(parsed.get("thread_id").is_none()); @@ -205,6 +209,7 @@ async fn detached_memory_responses_metadata_omits_empty_workspace_metadata() { serde_json::json!({ "request_kind": "memory", "sandbox_mode": "read-only", + "thread_source": "memory_consolidation", }) ); } diff --git a/codex-rs/memories/write/src/startup_tests.rs b/codex-rs/memories/write/src/startup_tests.rs index b1de7d0af8..729dfb4a24 100644 --- a/codex-rs/memories/write/src/startup_tests.rs +++ b/codex-rs/memories/write/src/startup_tests.rs @@ -507,7 +507,18 @@ async fn memories_startup_phase1_uses_live_thread_service_tier_and_detached_meta .expect("detached memory request should include workspace metadata"); let metadata: serde_json::Value = serde_json::from_str(&metadata_header).expect("turn metadata json"); + let client_metadata: serde_json::Value = serde_json::from_str( + request.body_json()["client_metadata"]["x-codex-turn-metadata"] + .as_str() + .expect("detached memory request should include client metadata"), + ) + .expect("client metadata json"); + assert_eq!(client_metadata, metadata); assert_eq!(metadata["request_kind"].as_str(), Some("memory")); + assert_eq!( + metadata["thread_source"].as_str(), + Some("memory_consolidation") + ); assert_eq!(metadata["sandbox_mode"].as_str(), Some("workspace-write")); assert!(metadata.get("session_id").is_none()); assert!(metadata.get("thread_id").is_none());