{"record":{"id":"4c914cb4bdcb5e9a","repo":"different-ai/openwork","slug":"automation-saved-script-version-invalid","errorCode":"automation_saved_script_version_invalid","errorMessage":"automation_saved_script_version_invalid","messagePattern":"automation_saved_script_version_invalid","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"ee/apps/den-api/src/workflows.ts","lineNumber":578,"sourceCode":"      eq(ConfigObjectTable.objectType, \"workflow\"),\n      eq(ConfigObjectTable.status, \"active\"),\n      isNull(ConfigObjectTable.deletedAt),\n    ))\n    .innerJoin(PluginConfigObjectTable, and(\n      eq(PluginConfigObjectTable.configObjectId, ConfigObjectTable.id),\n      eq(PluginConfigObjectTable.pluginId, pluginId),\n      isNull(PluginConfigObjectTable.removedAt),\n    ))\n    .where(and(\n      eq(ConfigObjectVersionTable.id, configObjectVersionId),\n      eq(ConfigObjectVersionTable.configObjectId, configObjectId),\n      eq(ConfigObjectVersionTable.organizationId, organizationId),\n      eq(ConfigObjectVersionTable.isDeletedVersion, false),\n    )).limit(1)\n  const version = rows[0]?.version\n  if (!version) throw new Error(\"automation_saved_script_version_not_found\")\n  const parsed = parseCodemodeScriptPayload(version.normalizedPayloadJson)\n  if (!parsed.ok) throw new Error(\"automation_saved_script_version_invalid\")\n  if (parsed.payload.inputSchema) {\n    const validation = validateCodemodeScriptInput(parsed.payload.inputSchema, input.action.input)\n    if (!validation.ok) throw new Error(\"automation_saved_script_input_invalid\")\n  }\n}\n\nexport async function saveWorkflow(input: {\n  organizationId: string\n  ownerMemberId: string\n  workflow: SaveWorkflowInput\n  buildTools: () => Promise<BuiltCodemodeTools>\n  context?: PluginArchActorContext\n}): Promise<{ pluginId: string; configObjectId: string; configObjectVersionId: string }> {\n  const organizationId = normalizeDenTypeId(\"organization\", input.organizationId)\n  const ownerMemberId = normalizeDenTypeId(\"member\", input.ownerMemberId)\n  const requestedPluginId = input.workflow.pluginId\n    ? normalizeDenTypeId(\"plugin\", input.workflow.pluginId)\n    : null","sourceCodeStart":560,"sourceCodeEnd":596,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/ee/apps/den-api/src/workflows.ts#L560-L596","documentation":"Thrown in validateWorkflowAutomationAction when parseCodemodeScriptPayload fails on the saved version's normalizedPayloadJson. The version row exists but its stored payload is not a valid codemode script payload, so the automation cannot be validated.","triggerScenarios":"Creating/updating an automation whose referenced version was written by an older schema, corrupted, or written by a different pipeline that does not produce codemode-normalized JSON.","commonSituations":"Schema/format migrations leaving old versions unparsable; manual DB edits to normalizedPayloadJson; importing versions from another environment with an incompatible format.","solutions":["Create a new version of the script from a valid codemode payload and re-point the automation at it.","Re-normalize the version payload with the current parser/writer so normalizedPayloadJson is valid.","Inspect normalizedPayloadJson for corruption and repair or delete the bad version."],"exampleFix":"// before\n// automation pinned to a legacy version with non-codemode payload\naction: { configObjectVersionId: legacyVersionId }\n// after\nconst v2 = await saveWorkflowVersion({ configObjectId, payload: validCodemodePayload })\naction: { configObjectVersionId: v2.id }","handlingStrategy":"validation","validationCode":"const parsed = parseCodemodeScriptPayload(version.normalizedPayloadJson)\nif (!parsed.ok) throw new Error(\"version payload invalid before automation save\")","typeGuard":"const isValidCodemodeVersion = (v: {normalizedPayloadJson: string}) => parseCodemodeScriptPayload(v.normalizedPayloadJson).ok","tryCatchPattern":"try {\n  await updateAutomation({ configObjectVersionId, ... })\n} catch (e) {\n  if (e.message === \"automation_saved_script_version_invalid\") {\n    // create a fresh valid version and re-point the automation\n  } else throw e\n}","preventionTips":["Never edit normalizedPayloadJson manually.","Re-normalize old versions after schema migrations.","Validate payload parsability in CI for published versions."],"tags":["automation","payload","schema-validation","den-api"],"backgroundTag":"schema-validation-failed","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}