{"record":{"id":"b85f27f3a4aecb70","repo":"twentyhq/twenty","slug":"malformed-workflow-version-missing-steps-informat","errorCode":null,"errorMessage":"Malformed workflow version: missing steps information; be sure to create at least one step before trying to edit one","messagePattern":"Malformed workflow version: missing steps information; be sure to create at least one step before trying to edit one","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/twenty-front/src/modules/workflow/utils/getStepDefinitionOrThrow.ts","lineNumber":33,"sourceCode":"  trigger: WorkflowTrigger | null;\n  steps: Array<WorkflowAction> | null;\n}) => {\n  if (stepId === TRIGGER_STEP_ID) {\n    if (!isDefined(trigger)) {\n      return {\n        type: 'trigger',\n        definition: undefined,\n      } as const;\n    }\n\n    return {\n      type: 'trigger',\n      definition: trigger,\n    } as const;\n  }\n\n  if (!isDefined(steps)) {\n    throw new Error(\n      'Malformed workflow version: missing steps information; be sure to create at least one step before trying to edit one',\n    );\n  }\n\n  const selectedNodePosition = findStepPosition({\n    steps,\n    stepId,\n  });\n  if (!isDefined(selectedNodePosition)) {\n    return undefined;\n  }\n\n  return {\n    type: 'action',\n    definition: selectedNodePosition.steps[selectedNodePosition.index],\n  } as const;\n};\n","sourceCodeStart":15,"sourceCodeEnd":51,"githubUrl":"https://github.com/twentyhq/twenty/blob/1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6/packages/twenty-front/src/modules/workflow/utils/getStepDefinitionOrThrow.ts#L15-L51","documentation":"getStepDefinitionOrThrow throws when the requested stepId is not the trigger step and the workflow version's `steps` array is null/undefined. It means the loaded WorkflowVersion has no action steps at all, so any non-trigger lookup is invalid.","triggerScenarios":"Editing/selecting an action step on a workflow version that only has a trigger (steps === null). The version was created as a stub before any actions were added. Race where the version fetch has not yet populated steps.","commonSituations":"Newly created workflow with only a trigger. Backend returned a version shape without steps. Frontend attempted to look up a step before the workflow graph finished loading.","solutions":["Guard the call site: skip the lookup until steps is a non-null array.","Ensure at least one action step exists before opening the step editor.","Verify the workflow version query selects the steps field."],"exampleFix":"// before: const def = getStepDefinitionOrThrow({ stepId, trigger, steps });\n// after:  if (stepId !== TRIGGER_STEP_ID && !steps?.length) return undefined;\n//         const def = getStepDefinitionOrThrow({ stepId, trigger, steps });","handlingStrategy":"type-guard","validationCode":"const canLookupStep = (stepId: string, steps: Array<WorkflowAction> | null): boolean =>\n  stepId === TRIGGER_STEP_ID || (Array.isArray(steps) && steps.length > 0);","typeGuard":"const hasActionSteps = (steps: Array<WorkflowAction> | null | undefined): steps is Array<WorkflowAction> =>\n  Array.isArray(steps) && steps.length > 0;","tryCatchPattern":"try {\n  return getStepDefinitionOrThrow({ stepId, trigger, steps });\n} catch (e) {\n  if (/missing steps information/.test((e as Error).message)) return undefined;\n  throw e;\n}","preventionTips":["Do not call getStepDefinitionOrThrow until the workflow version (with steps) has loaded.","For new workflows with only a trigger, branch on stepId === TRIGGER_STEP_ID first.","Ensure the workflow version query selects the steps field."],"tags":["workflow","validation"],"backgroundTag":null,"analyzedSha":"1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6","analyzedAt":"2026-08-12T15:37:27.593Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}