diff --git a/crates/memory/src/consolidate/staging.rs b/crates/memory/src/consolidate/staging.rs index 20b37a51..3696029c 100644 --- a/crates/memory/src/consolidate/staging.rs +++ b/crates/memory/src/consolidate/staging.rs @@ -150,13 +150,26 @@ mod tests { let layout = WorkspaceLayout::new(tmp.path().to_path_buf()); let (_id, _) = write_staging(&layout, source("s", [0, 1]), empty_payload()).unwrap(); - // Drop a non-UUID json file, an unparsable UUID-named json file, and - // a bare lock file alongside. Lock files are not `.json`; invalid - // `.json` files are surfaced separately instead of being mistaken for - // an empty staging directory. + // Drop a non-UUID json file, an unparsable UUID-named json file, an + // old-schema UUID-named json file, and a bare lock file alongside. + // Lock files are not `.json`; invalid `.json` files are surfaced + // separately instead of being mistaken for an empty staging directory. std::fs::write(layout.staging_dir().join("not-a-uuid.json"), "{}").unwrap(); let bad_id = Uuid::now_v7(); std::fs::write(layout.staging_dir().join(format!("{bad_id}.json")), "{").unwrap(); + let old_schema_id = Uuid::now_v7(); + std::fs::write( + layout.staging_dir().join(format!("{old_schema_id}.json")), + serde_json::json!({ + "source": { + "session_id": "legacy-session", + "range": [0, 1] + }, + "requests": [] + }) + .to_string(), + ) + .unwrap(); std::fs::write(layout.staging_dir().join(".consolidation.lock"), "{}").unwrap(); let entries = list_staging_entries(&layout); @@ -164,7 +177,7 @@ mod tests { let snapshot = list_staging_entries_snapshot(&layout); assert_eq!(snapshot.entries.len(), 1); - assert_eq!(snapshot.invalid_count, 2); + assert_eq!(snapshot.invalid_count, 3); } #[test] diff --git a/crates/pod/tests/consolidation_test.rs b/crates/pod/tests/consolidation_test.rs index 97c9bcf7..76a83ffb 100644 --- a/crates/pod/tests/consolidation_test.rs +++ b/crates/pod/tests/consolidation_test.rs @@ -288,7 +288,18 @@ async fn invalid_only_staging_is_distinct_from_no_staging() { std::fs::create_dir_all(layout.staging_dir()).unwrap(); let invalid_id = uuid::Uuid::now_v7(); let invalid_path = layout.staging_dir().join(format!("{invalid_id}.json")); - std::fs::write(&invalid_path, "{").unwrap(); + std::fs::write( + &invalid_path, + serde_json::json!({ + "source": { + "session_id": "legacy-session", + "range": [0, 1] + }, + "requests": [] + }) + .to_string(), + ) + .unwrap(); let client = MockClient::new(vec![]); let mut pod = make_pod_with(FILES_THRESHOLD_TOML, pwd.path().to_path_buf(), client).await; @@ -320,6 +331,11 @@ async fn below_threshold_skip_is_audit_only() { pod.try_post_run_consolidate().await.unwrap(); assert!(collect_memory_worker_reasons(&mut rx).is_empty()); + let audit = read_audit_jsonl(&layout); + let reason = audit.last().unwrap()["reason"] + .as_str() + .expect("audit reason must be a string"); + assert!(reason.starts_with("threshold_not_reached ")); } #[tokio::test]