{"record":{"id":"a33a0bbe6aa38f22","repo":"zeroclaw-labs/zeroclaw","slug":"cron-job-job-id-delivery-is-owned-by-cron-j","errorCode":null,"errorMessage":"Cron job '{job_id}': delivery is owned by [cron.{job_id}].delivery in config.toml for a declarative job, not the database. Edit the config and restart the daemon.","messagePattern":"Cron job '(.+?)': delivery is owned by \\[cron\\.(.+?)\\]\\.delivery in config\\.toml for a declarative job, not the database\\. Edit the config and restart the daemon\\.","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-runtime/src/cron/store.rs","lineNumber":504,"sourceCode":"    if let Some(name) = patch.name {\n        job.name = Some(name);\n    }\n    if let Some(enabled) = patch.enabled {\n        job.enabled = enabled;\n    }\n    if let Some(delivery) = patch.delivery {\n        // A declarative job's delivery is owned by `[cron.<id>].delivery` in\n        // config.toml. Writing it here would appear to succeed and then be\n        // silently reverted by `sync_declarative_jobs` on the next daemon\n        // start, which rewrites every declarative column from the config.\n        // Reject at this boundary rather than persist a value the next sync\n        // discards, matching how `shell_output_format` is handled below.\n        //\n        // Ownership is checked before shape: a declarative job rejects any\n        // delivery patch, so reporting a missing recipient first would imply\n        // that correcting it would let the write through.\n        if job.source == \"declarative\" {\n            anyhow::bail!(\n                \"Cron job '{job_id}': delivery is owned by [cron.{job_id}].delivery in \\\n                 config.toml for a declarative job, not the database. Edit the config \\\n                 and restart the daemon.\"\n            );\n        }\n        // Match add_*_job: announce delivery must include channel + to.\n        validate_delivery_config(Some(&delivery))?;\n        job.delivery = delivery;\n    }\n    if let Some(model) = patch.model {\n        job.model = Some(model);\n    }\n    if let Some(target) = patch.session_target {\n        job.session_target = target;\n    }\n    if let Some(delete_after_run) = patch.delete_after_run {\n        job.delete_after_run = delete_after_run;\n    }","sourceCodeStart":486,"sourceCodeEnd":522,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/cron/store.rs#L486-L522","documentation":"Error \"Cron job '{job_id}': delivery is owned by [cron.{job_id}].delivery in config.toml for a declarative job, not the database. Edit the config and restart the daemon.\" thrown in zeroclaw-labs/zeroclaw.","triggerScenarios":"Thrown at crates/zeroclaw-runtime/src/cron/store.rs:504 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Edit [cron.<job_id>].delivery in config.toml and restart the daemon instead of changing delivery via the database."],"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"}