{"record":{"id":"6b8f4d63045918f0","repo":"zeroclaw-labs/zeroclaw","slug":"cron-job-job-id-shell-output-format-is-owned","errorCode":null,"errorMessage":"Cron job '{job_id}': shell_output_format is owned by config.toml for a declarative job, not the database","messagePattern":"Cron job '(.+?)': shell_output_format is owned by config\\.toml for a declarative job, not the database","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-runtime/src/cron/store.rs","lineNumber":542,"sourceCode":"        // Empty list means \"clear the allowlist\" (all tools available),\n        // not \"allow zero tools\".\n        if allowed_tools.is_empty() {\n            job.allowed_tools = None;\n        } else {\n            job.allowed_tools = Some(allowed_tools);\n        }\n    }\n    if let Some(uses_memory) = patch.uses_memory {\n        job.uses_memory = uses_memory;\n    }\n    if let Some(shell_output_format) = patch.shell_output_format {\n        // Config-owned (declarative) and non-shell (agent) jobs never store\n        // this field: the gateway API already rejects both cases, but this\n        // is the core boundary every caller of `update_job` goes through,\n        // so it must reject them too rather than silently ignoring or\n        // persisting a value execution never consumes.\n        if job.source == \"declarative\" {\n            anyhow::bail!(\n                \"Cron job '{job_id}': shell_output_format is owned by config.toml for a \\\n                 declarative job, not the database\"\n            );\n        }\n        if job.job_type != JobType::Shell {\n            let job_type: &str = job.job_type.into();\n            anyhow::bail!(\n                \"Cron job '{job_id}': shell_output_format is shell-only and cannot be set on a '{job_type}' job\"\n            );\n        }\n        job.shell_output_format = shell_output_format;\n    }\n\n    if schedule_changed {\n        job.next_run = next_run_for_schedule(&job.schedule, Utc::now())?;\n    }\n\n    with_initialized_connection(config, |conn| {","sourceCodeStart":524,"sourceCodeEnd":560,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/cron/store.rs#L524-L560","documentation":"Error \"Cron job '{job_id}': shell_output_format is owned by config.toml for a declarative job, not the database\" thrown in zeroclaw-labs/zeroclaw.","triggerScenarios":"Thrown at crates/zeroclaw-runtime/src/cron/store.rs:542 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set shell_output_format in config.toml for the declarative job and restart; it is not database-editable."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}