{"record":{"id":"e2932b225607023d","repo":"Hmbown/CodeWhale","slug":"turn-schema-v-is-newer-than-supported-v","errorCode":null,"errorMessage":"Turn schema v{} is newer than supported v{}","messagePattern":"Turn schema v(.+?) is newer than supported v(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/runtime_threads.rs","lineNumber":1309,"sourceCode":"            .with_context(|| format!(\"Failed to parse thread {}\", path.display()))?;\n        if record.schema_version > CURRENT_RUNTIME_SCHEMA_VERSION {\n            bail!(\n                \"Thread schema v{} is newer than supported v{}\",\n                record.schema_version,\n                CURRENT_RUNTIME_SCHEMA_VERSION\n            );\n        }\n        Ok(record)\n    }\n\n    pub fn load_turn(&self, turn_id: &str) -> Result<TurnRecord> {\n        let path = self.turn_path(turn_id)?;\n        let raw = read_store_file(&path)\n            .with_context(|| format!(\"Failed to read turn {}\", path.display()))?;\n        let record: TurnRecord = serde_json::from_str(&raw)\n            .with_context(|| format!(\"Failed to parse turn {}\", path.display()))?;\n        if record.schema_version > CURRENT_RUNTIME_SCHEMA_VERSION {\n            bail!(\n                \"Turn schema v{} is newer than supported v{}\",\n                record.schema_version,\n                CURRENT_RUNTIME_SCHEMA_VERSION\n            );\n        }\n        Ok(record)\n    }\n\n    pub fn load_item(&self, item_id: &str) -> Result<TurnItemRecord> {\n        let path = self.item_path(item_id)?;\n        let raw = read_store_file(&path)\n            .with_context(|| format!(\"Failed to read item {}\", path.display()))?;\n        let record: TurnItemRecord = serde_json::from_str(&raw)\n            .with_context(|| format!(\"Failed to parse item {}\", path.display()))?;\n        if record.schema_version > CURRENT_RUNTIME_SCHEMA_VERSION {\n            bail!(\n                \"Item schema v{} is newer than supported v{}\",\n                record.schema_version,","sourceCodeStart":1291,"sourceCodeEnd":1327,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/runtime_threads.rs#L1291-L1327","documentation":"load_turn applies the same forward-compatibility guard as threads to turn records: if a turn JSON's schema_version exceeds CURRENT_RUNTIME_SCHEMA_VERSION (2), loading stops with 'Turn schema vN is newer than supported v2'. Newer turns may have fields or semantics this build cannot honor, so refusing is safer than partial parsing.","triggerScenarios":"Calling RuntimeThreadStore::load_turn(turn_id) on a store whose turn JSON was written by a newer Codewhale; common when the same data dir is reused across versions.","commonSituations":"Downgrade after an upgrade; a teammate on a newer build shares their task data directory; restoring from a backup created by a newer release.","solutions":["Upgrade to the Codewhale version that wrote the turn records.","Use a fresh/empty data directory for the older version.","Inspect the turn file's schema_version to confirm the mismatch before migrating data."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Rust: check the turn file's schema_version before load_turn\nlet path = store.turn_path(turn_id)?;\nif let Ok(raw) = std::fs::read_to_string(&path) {\n    if let Ok(v) = serde_json::from_str::<serde_json::Value>(&raw) {\n        if v.get(\"schema_version\").and_then(|s| s.as_u64()).unwrap_or(0) > 2 {\n            anyhow::bail!(\"turn {turn_id} uses a newer schema; upgrade Codewhale first\");\n        }\n    }\n}\nlet turn = store.load_turn(turn_id)?;","typeGuard":null,"tryCatchPattern":"// Rust: catch and classify the version error distinctly from parse errors\nmatch store.load_turn(turn_id) {\n    Ok(turn) => Ok(turn),\n    Err(err) if err.to_string().contains(\"newer than supported\") => {\n        Err(anyhow::anyhow!(\"turn store is from a newer Codewhale; upgrade: {err}\"))\n    }\n    Err(err) => Err(err),\n}","preventionTips":["Treat data dirs as forward-only: upgrade binaries before reading upgraded stores.","Verify schema_version when accepting turn files from other machines.","Log the store path and schema version at startup to detect mismatches early."],"tags":["schema","versioning","persistence","thread-store","rust"],"backgroundTag":"schema-version-mismatch","analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","schemaVersion":2},"datasetVersion":"2026-08-22T04:17:13.399Z"}