{"record":{"id":"0c63a95f8d4a1098","repo":"flowable/flowable-engine","slug":"child-form-variables-can-only-be-set-when-starting","errorCode":null,"errorMessage":"Child form variables can only be set when starting a plan item instance","messagePattern":"Child form variables can only be set when starting a plan item instance","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/runtime/PlanItemInstanceTransitionBuilderImpl.java","lineNumber":240,"sourceCode":"        validateChildTaskVariablesNotSet();\n        commandExecutor.execute(new CompleteStagePlanItemInstanceCmd(planItemInstanceId, variables, formVariables, formOutcome, \n                formInfo, localVariables, transientVariables, false));\n    }\n\n    @Override\n    public void forceCompleteStage() {\n        validateChildTaskVariablesNotSet();\n        commandExecutor.execute(new CompleteStagePlanItemInstanceCmd(planItemInstanceId, variables, formVariables, formOutcome, \n                formInfo, localVariables, transientVariables, true));\n    }\n\n    protected void validateChildTaskVariablesNotSet() {\n        if (childTaskVariables != null) {\n            throw new FlowableIllegalArgumentException(\"Child task variables can only be set when starting a plan item instance\");\n        }\n\n        if (childTaskFormInfo != null) {\n            throw new FlowableIllegalArgumentException(\"Child form variables can only be set when starting a plan item instance\");\n        }\n    }\n}\n","sourceCodeStart":222,"sourceCodeEnd":244,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/runtime/PlanItemInstanceTransitionBuilderImpl.java#L222-L244","documentation":"validateChildTaskVariablesNotSet() throws FlowableIllegalArgumentException when childTaskFormInfo (set via childTaskFormVariables) is present on a non-start transition. Child form variables, like child task variables, only apply when starting a plan item instance.","triggerScenarios":"Calling childTaskFormVariables(...) on the builder and then finishing with enable()/disable()/suspend()/resume()/terminate()/trigger() instead of start().","commonSituations":"Bulk transition utilities that always attach child form info; misordered refactors where the terminal operation was changed from start() to another transition.","solutions":["Complete the builder with start() when child form variables were supplied.","Replace childTaskFormVariables with formVariables/variables for non-start transitions.","Guard: only attach child form info when the operation is start."],"exampleFix":"// before\nbuilder.childTaskFormVariables(vars, formInfo, outcome).resume();\n// after\nbuilder.childTaskFormVariables(vars, formInfo, outcome).start();","handlingStrategy":"validation","validationCode":"if (childTaskFormInfo != null && operation != Operation.START) { childTaskFormInfo = null; }","typeGuard":null,"tryCatchPattern":"try { builder.resume(); } catch (FlowableIllegalArgumentException e) { throw new IllegalStateException(\"child form variables require start()\", e); }","preventionTips":["Pair childTaskFormVariables exclusively with start().","For non-start transitions use formVariables/variables only."],"tags":["flowable","cmmn","transition","form","invalid-state"],"backgroundTag":"invalid-state-transition","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}