Validates Alfresco Activiti BPMN 2.0 process definition files and companion workflow model XML for structural correctness: required namespaces, task assignees, variable naming conventions, process variable promotion pattern, formKey alignment, and forbidden Activiti 6/Flowable patterns. Trigger automatically when generating or editing *.bpmn files or *-workflow-model.xml files.
Installs into .claude/skills of the current project.
Are you the author of Workflow Bpmn Validator?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/aborroy-workflow-bpmn-validator)
---
name: workflow-bpmn-validator
description: Validates Alfresco Activiti BPMN 2.0 process definition files and companion workflow model XML for structural correctness: required namespaces, task assignees, variable naming conventions, process variable promotion pattern, formKey alignment, and forbidden Activiti 6/Flowable patterns. Trigger automatically when generating or editing *.bpmn files or *-workflow-model.xml files.
---
# Workflow BPMN Validator
Validate the given Alfresco Activiti BPMN process definition (and companion workflow model, if present) against these rules.
## BPMN Namespace Validation
- Root element must be `<definitions>` with BPMN 2.0 namespace:
`xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"`
- **REQUIRED**: `xmlns:activiti="http://activiti.org/bpmn"` — must be present; Alfresco Activiti extensions use this namespace
- **ERROR if present**: Any `org.flowable.*` class reference in `class` attributes of `<activiti:taskListener>`, `<activiti:executionListener>`, or `<serviceTask activiti:class="...">`. ACS 26.1 uses Activiti 5.22.x; the Flowable API is not on the classpath.
## Process Structure Validation
- `<process>` element must have:
- `id` attribute (camelCase identifier)
- `name` attribute (human-readable)
- `isExecutable="true"`
- **WARNING** if any `<startEvent>` is missing `activiti:formKey` in a non-trivial process (more than one user task)
- Every `<userTask>` must have either `activiti:assignee` or `activiti:candidateGroups`:
- **WARNING** if a user task has neither — it will never be claimable
- **WARNING** if a user task that represents an approval step is missing `activiti:formKey`
- Every `<exclusiveGateway>` with multiple outgoing sequence flows must have `<conditionExpression>` on all but one outgoing flow:
- **ERROR** if an outgoing flow from an exclusive gateway has no condition and is not marked as `default`
- Every `<serviceTask>` must have either `activiti:class` or `activiti:expression` or `activiti:delegateExpression`:
- **WARNING** for service tasks with none of these attributes (becomes a no-op)
## Variable Naming Validation
- Scan all `<activiti:string>` blocks inside `<activiti:field name="script">` elements and inside `<conditionExpression>` elements
- **ERROR** if any call to `execution.setVariable(...)` or `task.getVariableLocal(...)` uses a variable name containing a colon (e.g. `acme:outcome`). The correct form uses underscore (`acme_outcome`). Alfresco maps content model properties `{prefix}wf:{propName}` → process variable `{prefix}wf_{propName}` (colon → underscore).
- **ERROR** if any `<conditionExpression>` references a variable with a colon in the name (e.g. `${acme:count == 2}`). Use `${acme_count == 2}`.
## Task Listener Validation
- Any `<activiti:taskListener>` or `<activiti:executionListener>` using a `class` attribute:
- **ERROR** if the class is from `org.flowable.*`
- Allowed built-in classes: `org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener`, `org.alfresco.repo.workflow.activiti.listener.ScriptExecutionListener`
- **INFO** if the class is custom (not from `org.alfresco.*`) — confirm it implements `org.activiti.engine.delegate.TaskListener`
## Timer Event Validation
- Every `<boundaryEvent>` containing a `<timerEventDefinition>` must have:
- `cancelActivity` attribute explicitly set to `"true"` or `"false"` — **WARNING** if missing
- Timer duration in ISO 8601 format inside `<timeDuration>`: `PT{N}S`, `PT{N}M`, `PT{N}H`, `P{N}D`, or combinations — **ERROR** if the format does not match ISO 8601
## Workflow Model Alignment
If a companion `*-workflow-model.xml` exists in the same module's `model/` directory:
- Every `activiti:formKey` value in the BPMN must correspond to a `<type name="...">` declared in the workflow model:
- **ERROR** if a formKey references a type not present in the workflow model
- The workflow model must import the `bpm` namespace:
`<import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm"/>`
- **ERROR** if this import is missing
- Every workflow task type must extend `bpm:startTask`, `bpm:activitiOutcomeTask`, or `bpm:workflowTask`:
- **WARNING** if a type in the workflow model has no recognized `bpm:` parent
- **ERROR** if any property in the workflow model uses `<mandatory enforced="true">` — the integrity checker fires before `addAspect()` writes properties, causing a spurious `IntegrityException`
## Bootstrap Registration Check
If a `bootstrap-context.xml` exists in the module's `context/` directory:
- **WARNING** if it contains a `<bean>` with `parent="dictionaryModelBootstrap"` that lists a `.bpmn` file in its `models` property — BPMN files must be registered via `parent="workflowDeployer"`, not `dictionaryModelBootstrap`
- **WARNING** if the `workflowDeployer` bean has `<prop key="redeploy">true</prop>` — this causes duplicate process definitions on every restart
## Output
Report all violations with:
- File path and element ID (BPMN) or type name (workflow model)
- Rule violated
- Suggested fix
If no violations are found, confirm: "BPMN and workflow model are valid for ACS 26.1 / Activiti 5.x."