{"record":{"id":"cc082180b25415f6","repo":"openai/codex","slug":"timed-out-waiting-for-a-client-to-subscribe-to-the","errorCode":null,"errorMessage":"timed out waiting for a client to subscribe to the thread after {}s","messagePattern":"timed out waiting for a client to subscribe to the thread after (.+?)s","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"codex-rs/app-server/src/current_time.rs","lineNumber":97,"sourceCode":"                }\n            }\n        })\n    }\n}\n\nasync fn request_current_time(\n    outgoing: Arc<OutgoingMessageSender>,\n    thread_state_manager: ThreadStateManager,\n    thread_id: ThreadId,\n) -> Result<DateTime<Utc>> {\n    let deadline = Instant::now() + CURRENT_TIME_REQUEST_TIMEOUT;\n    timeout_at(\n        deadline,\n        thread_state_manager.wait_for_thread_subscriber(thread_id),\n    )\n    .await\n    .map_err(|_| {\n        anyhow!(\n            \"timed out waiting for a client to subscribe to the thread after {}s\",\n            CURRENT_TIME_REQUEST_TIMEOUT.as_secs()\n        )\n    })?;\n    let connection_ids = thread_state_manager\n        .subscribed_connection_ids(thread_id)\n        .await;\n    let connection_id = require_single_current_time_connection(&connection_ids)?;\n    let connection_ids = [connection_id];\n    let (request_id, rx) = outgoing\n        .send_request_to_connections(\n            Some(&connection_ids),\n            ServerRequestPayload::CurrentTimeRead(CurrentTimeReadParams {\n                thread_id: thread_id.to_string(),\n            }),\n            /*thread_id*/ None,\n        )\n        .await;","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/openai/codex/blob/339751715c64496cb86246bfb3935f40e309dd3d/codex-rs/app-server/src/current_time.rs#L79-L115","documentation":"The memory summary artifact carries a format marker: memory_summary.md's first line must be exactly 'v1'. validate_consolidation_artifacts fails when the file is missing (surfaced as the 'read memory summary artifact' context error) or when the first line differs (codex-rs/memories/write/src/workspace.rs:75) — an empty file, prose without the header, or a version written by mismatched tooling.","triggerScenarios":"Post-consolidation validation reading memory_summary.md whose first line is not exactly 'v1': hand-edited summaries, truncated writes, or version skew between the writer and validator.","commonSituations":"Editing memory_summary.md manually and dropping the header; codex versions mixed across machines sharing a memories dir; interrupted consolidation leaving a partial file.","solutions":["If the content is v1-format, make the first line exactly 'v1' — no leading blank line, BOM, or whitespace.","Prefer regenerating it by re-running consolidation.","Keep all machines touching a shared memories dir on compatible codex versions."],"exampleFix":"# before (memory_summary.md)\nRecap of recent work...\n# after\nv1\nRecap of recent work...","handlingStrategy":"validation","validationCode":"async fn summary_has_v1_header(root: &std::path::Path) -> bool {\n    tokio::fs::read_to_string(root.join(\"memory_summary.md\"))\n        .await\n        .ok()\n        .and_then(|s| s.lines().next().map(|l| l == \"v1\"))\n        .unwrap_or(false)\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = validate_consolidation_artifacts(root).await {\n    if e.to_string().contains(\"does not start with v1\") {\n        // repair: first line must be exactly 'v1', or regenerate via consolidation\n    }\n}","preventionTips":["Do not hand-edit memory_summary.md; let consolidation own it.","Keep codex versions aligned across machines sharing a memories dir.","Check the v1 header when copying or restoring memory artifacts."],"tags":["memories","consolidation","file-format","version-marker","rust"],"backgroundTag":"file-format-version-mismatch","analyzedSha":"339751715c64496cb86246bfb3935f40e309dd3d","analyzedAt":"2026-08-25T05:35:09.876Z","schemaVersion":2},"datasetVersion":"2026-08-25T06:17:31.827Z"}