{"record":{"id":"5ed07a267dd45549","repo":"flowable/flowable-engine","slug":"migration-activity-mapping-missing-for-activity-de-5ed07a","errorCode":null,"errorMessage":"Migration Activity mapping missing for activity definition Ids:'\" + Arrays.toString(executionActivityIdsToMapExplicitly.toArray()) + \"'","messagePattern":"Migration Activity mapping missing for activity definition Ids:'\" \\+ Arrays\\.toString\\(executionActivityIdsToMapExplicitly\\.toArray\\(\\)\\) \\+ \"'","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationManagerImpl.java","lineNumber":862,"sourceCode":"                        }\n                    }\n                    if (activityMapping.isToCallActivity()) {\n                        mainProcessChangeActivityStateBuilder.moveActivityIdsToSubProcessInstanceActivityId(fromActivityIds, toActivityId,\n                                activityMapping.getToCallActivityId(),\n                                activityMapping.getCallActivityProcessDefinitionVersion(),\n                                (SingleToActivityOptions<?>) activityMapping);\n                    } else {\n                        mainProcessChangeActivityStateBuilder.moveExecutionsToSingleActivityId(executionIds, toActivityId, (SingleToActivityOptions<?>) activityMapping);\n                    }\n                }\n                \n            } else {\n                throw new FlowableException(\"Unknown Activity Mapping or not implemented yet!!!\");\n            }\n        }\n\n        if (!executionActivityIdsToMapExplicitly.isEmpty()) {\n            throw new FlowableException(\"Migration Activity mapping missing for activity definition Ids:'\" + Arrays.toString(executionActivityIdsToMapExplicitly.toArray()) + \"'\");\n        }\n\n        return changeActivityStateBuilders;\n    }\n\n    protected boolean isSameOrDefaultTenant(String processInstanceTenantId, String processDefinitionKey, \n            String processDefinitionTenantId, ProcessEngineConfigurationImpl processEngineConfiguration) {\n        \n        if (processInstanceTenantId != null && processDefinitionTenantId != null) {\n            boolean tenantIdsEqual = processInstanceTenantId.equals(processDefinitionTenantId);\n            if (!tenantIdsEqual && processEngineConfiguration.isFallbackToDefaultTenant() && processEngineConfiguration.getDefaultTenantProvider() != null) {\n                return processDefinitionTenantId.equals(processEngineConfiguration.getDefaultTenantProvider().getDefaultTenant(processInstanceTenantId, ScopeTypes.BPMN, processDefinitionKey));\n            }\n            \n            return tenantIdsEqual;\n            \n        } else if (processInstanceTenantId == null && processDefinitionTenantId == null) {\n            return true;","sourceCodeStart":844,"sourceCodeEnd":880,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/migration/ProcessInstanceMigrationManagerImpl.java#L844-L880","documentation":"Final safety check after preparing change-state builders: lists all running activity ids that ended up with neither an auto mapping nor an explicit mapping (including MI parent fallback). The migration is rejected wholesale, listing every unmapped activity definition id in the message.","triggerScenarios":"Calling migrate() or validateMigrations on instances whose running activity set contains ids absent from the target model and absent from the migration document's activity mappings.","commonSituations":"New definition version renamed or deleted activities on active branches; partial mapping documents; parallel branches with renamed tasks; validating migrations of many instances where some fail mapping.","solutions":["Iterate the reported activity ids and add .addActivityMapping(oldId, newId) for each in the migration builder","Run validateMigrations first and fix all reported issues before calling migrate","Keep activity ids unchanged in new model versions where possible","Handle instances individually: terminate or complete branches that cannot be mapped before migrating"],"exampleFix":"// before\nmigrationBuilder.migrate(id); // error: mapping missing for ['taskB','taskC']\n// after\nmigrationBuilder.addActivityMapping(\"taskB\",\"taskB2\").addActivityMapping(\"taskC\",\"taskC2\").migrate(id);","handlingStrategy":"validation","validationCode":"ProcessInstanceMigrationValidationResult r =\n    runtimeService.createProcessInstanceMigrationBuilder().migrateToProcessDefinition(targetDefId)\n        .validateMigrations(instanceIds);\nfor (ValidationMessage m : r.getValidationMessages()) {\n    // collect unmapped activity ids and add mappings\n}","typeGuard":null,"tryCatchPattern":"try {\n    migrationBuilder.migrate(instanceId);\n} catch (FlowableException e) {\n    if (e.getMessage().startsWith(\"Migration Activity mapping missing for activity definition Ids\")) {\n        // extract id list, addActivityMapping for each, retry\n    }\n}","preventionTips":["Run validateMigrations for every batch before migrate()","Adopt id-stability policy for process definitions","Map every renamed/deleted activity explicitly in migration documents","Log and handle unmapped instances individually instead of failing the batch silently"],"tags":["flowable","migration","activity-mapping","missing-mapping"],"backgroundTag":"missing-required-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}