{"record":{"id":"66b0a38fc93567e8","repo":"Hmbown/CodeWhale","slug":"task-schema-v-is-newer-than-supported-v","errorCode":null,"errorMessage":"Task schema v{} is newer than supported v{}","messagePattern":"Task schema v(.+?) is newer than supported v(.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/tui/src/task_manager.rs","lineNumber":2262,"sourceCode":"\nfn load_state(tasks_dir: &Path, queue_path: &Path) -> Result<LoadedTaskState> {\n    let mut tasks = HashMap::new();\n    let mut recovered = Vec::new();\n    if tasks_dir.exists() {\n        for entry in fs::read_dir(tasks_dir)\n            .with_context(|| format!(\"Failed to read tasks dir {}\", tasks_dir.display()))?\n        {\n            let entry = entry?;\n            let path = entry.path();\n            if path.extension().is_none_or(|ext| ext != \"json\") {\n                continue;\n            }\n            let content = fs::read_to_string(&path)\n                .with_context(|| format!(\"Failed to read task file {}\", path.display()))?;\n            let mut task: TaskRecord = serde_json::from_str(&content)\n                .with_context(|| format!(\"Failed to parse task file {}\", path.display()))?;\n            if task.schema_version > CURRENT_TASK_SCHEMA_VERSION {\n                bail!(\n                    \"Task schema v{} is newer than supported v{}\",\n                    task.schema_version,\n                    CURRENT_TASK_SCHEMA_VERSION\n                );\n            }\n            if task.status == TaskStatus::Running {\n                let now = Utc::now();\n                let duration_ms = task.started_at.and_then(|started| {\n                    u64::try_from(now.signed_duration_since(started).num_milliseconds()).ok()\n                });\n                task.status = TaskStatus::Failed;\n                task.lifecycle_seq = task.lifecycle_seq.saturating_add(1);\n                task.ended_at = Some(now);\n                task.duration_ms = duration_ms;\n                task.terminal_reason = Some(TaskTerminalReason::Failed.as_str().to_string());\n                task.error = Some(\n                    \"Interrupted by process restart; prior process is not attached\".to_string(),\n                );","sourceCodeStart":2244,"sourceCodeEnd":2280,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/task_manager.rs#L2244-L2280","documentation":"Forward-compatibility guard while loading the persisted task store at boot: a task JSON file declares a schema_version greater than CURRENT_TASK_SCHEMA_VERSION, so this build cannot safely interpret it. Older files (schema_version <= current) load normally; newer ones abort the load.","triggerScenarios":"Opening a tasks directory that was last written by a newer Codewhale release, then running an older binary against it; downgrading after trying a pre-release; a shared state dir used by two versions.","commonSituations":"Version rollback after an upgrade; CI or containers pinned to an older image while a newer tool wrote the state; copying a tasks dir between machines with different versions.","solutions":["Run the newer Codewhale version that wrote the files (its schema is a superset) instead of the downgraded binary.","If the downgraded version must be used, move the tasks dir aside (e.g. mv tasks tasks.from-v2) so a fresh store is created, and keep the old dir for the newer version to read later.","Never hand-edit schema_version downward in task files; fields you cannot parse may be load-bearing for the newer version."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"fn store_is_backward_compatible(tasks_dir: &Path) -> Result<()> {\n    for entry in fs::read_dir(tasks_dir)? {\n        let path = entry?.path();\n        if path.extension().is_none_or(|e| e != \"json\") { continue; }\n        let v: serde_json::Value = serde_json::from_str(&fs::read_to_string(&path)?)?;\n        if v[\"schema_version\"].as_u64().unwrap_or(0) > CURRENT_TASK_SCHEMA_VERSION as u64 {\n            bail!(\"newer store in {} ({})\", path.display(), v[\"schema_version\"]);\n        }\n    }\n    Ok(())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Pin one Codewhale version per state dir; do not share tasks dirs across versions.","After testing a pre-release, archive its tasks dir before running the stable build.","Never hand-edit schema_version in persisted task files."],"tags":["task","schema","versioning","persistence","rust"],"backgroundTag":"schema-version-mismatch","analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","schemaVersion":2},"datasetVersion":"2026-08-22T04:17:13.399Z"}