AWS PSM validation: Workflow
Step Functions and ASL rules protect the executable state graph. They verify definition sources, entry and terminal states, state naming, task targets, JSONPath/JSONata boundaries, waits, choices, retries, and catches so a generated state machine is not merely syntactically shaped but operationally startable.
Source profile: mde/validation/psm/rules/workflow.evl.
Reading these rules
Each entry preserves the actual EVL guard and check. Treat the guard as the applicability boundary. When it evaluates to false, EVL skips the rule. The diagnostic is the message emitted at runtime, and its final sentence usually gives the repository's recommended repair.
StateMachineHasRole
Context: AWSPSM!StepFunctionStateMachine
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:8
Why this rule exists
The rule checks whether state machine has role. The step function state machine element provides the relevant evidence through role, resource label. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. Missing evidence would leave an unresolved choice in generated infrastructure. The rule prevents the following failure: Step Functions state machine has no execution role.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.role.isDefined()
This rule reads: role, resourceLabel.
Diagnostic and repair
Step Functions state machine has no execution role. Fix: attach an IamRole trusted by states.amazonaws.com.
How to fix it:
attach an IamRole trusted by states.amazonaws.com.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
StateMachineHasDefinition
Context: AWSPSM!StepFunctionStateMachine
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:14
Why this rule exists
A Step Functions resource without a definition has no executable workflow. The rule permits the supported definition sources, but insists that one, and only one, owns the state machine body.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.definitionCount() >= 1
This rule reads: definitionCount, resourceLabel.
Diagnostic and repair
Step Functions state machine has no definition. Fix: provide definitionUri, definitionString, or aslDocument.
How to fix it:
provide definitionUri, definitionString, or aslDocument.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
StateMachineShouldUseSingleDefinitionSource
Context: AWSPSM!StepFunctionStateMachine
Classification: Advisory critique (warning)
Source: mde/validation/psm/rules/workflow.evl:20
Why this rule exists
The rule checks whether state machine should use single definition source. It examines definition count, resource label. Within this part of the model, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. The gap is Step Functions state machine defines more than one definition source. A later transformation, generator, or reviewer would otherwise have to infer the missing decision.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.definitionCount() <= 1
This rule reads: definitionCount, resourceLabel.
Diagnostic and repair
Step Functions state machine defines more than one definition source. Fix: keep exactly one of definitionUri, definitionString, or aslDocument to avoid ambiguity.
How to fix it:
keep exactly one of definitionUri, definitionString, or aslDocument to avoid ambiguity.
A critique does not necessarily make the model invalid. It is a deliberate quality/readiness signal; disposition it by improving the model, documenting why it is acceptable, or carrying the decision into the review record.
StateMachineAslHasStates
Context: AWSPSM!StepFunctionStateMachine
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:26
Why this rule exists
The rule checks whether state machine asl has states. The step function state machine element provides the relevant evidence through asl document, resource label. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. Missing evidence would leave an unresolved choice in generated infrastructure. The rule prevents the following failure: Step Functions state machine has an ASL document with no states.
When it applies
The rule is considered only when the guard below is true. A false guard is intentional: it means this invariant is not relevant to the current variant or modeling situation.
guard : self.aslDocument.isDefined()
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.aslDocument.states.notEmpty()
This rule reads: aslDocument, resourceLabel.
Diagnostic and repair
Step Functions state machine has an ASL document with no states. Fix: add AslState entries or remove the empty ASL document.
How to fix it:
add AslState entries or remove the empty ASL document.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
PublishAliasRequiresAliasName
Context: AWSPSM!StepFunctionStateMachine
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:33
Why this rule exists
The rule checks whether publish alias requires alias name. The step function state machine element provides the relevant evidence through publish alias, alias name, resource label. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. Missing evidence would leave an unresolved choice in generated infrastructure. The rule prevents the following failure: Step Functions state machine publishes an alias but aliasName is empty.
When it applies
The rule is considered only when the guard below is true. A false guard is intentional: it means this invariant is not relevant to the current variant or modeling situation.
guard : self.publishAlias = true
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.aliasName.hasText()
This rule reads: publishAlias, aliasName, resourceLabel.
Diagnostic and repair
Step Functions state machine publishes an alias but aliasName is empty. Fix: set aliasName.
How to fix it:
set aliasName.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
ProductionStateMachineShouldLogAndTrace
Context: AWSPSM!StepFunctionStateMachine
Classification: Advisory critique (warning)
Source: mde/validation/psm/rules/workflow.evl:40
Why this rule exists
The rule checks whether production state machine should log and trace. It examines is production scoped, logging, tracing, resource label. Within this part of the model, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. The gap is Production-scoped state machine lacks logging or tracing. A later transformation, generator, or reviewer would otherwise have to infer the missing decision.
When it applies
The rule is considered only when the guard below is true. A false guard is intentional: it means this invariant is not relevant to the current variant or modeling situation.
guard : self.isProductionScoped()
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.logging.isDefined() and self.tracing.isDefined() and self.tracing.enabled = true
This rule reads: isProductionScoped, logging, tracing, resourceLabel.
Diagnostic and repair
Production-scoped state machine lacks logging or tracing. Fix: add StepFunctionLoggingConfig and enable tracing.
How to fix it:
add StepFunctionLoggingConfig and enable tracing.
A critique does not necessarily make the model invalid. It is a deliberate quality/readiness signal; disposition it by improving the model, documenting why it is acceptable, or carrying the decision into the review record.
StartAtReferencesExistingState
Context: AWSPSM!AslDocument
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:50
Why this rule exists
StartAt is the first state lookup performed by Step Functions. A name that does not match an actual state fails before business logic begins, so this is an executable-reference check rather than a naming preference.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.startAt.hasText() and self.hasStateNamed(self.startAt)
This rule reads: startAt, hasStateNamed.
Diagnostic and repair
ASL document startAt value does not match any stateName. Fix: set startAt to the name of an existing AslState.
How to fix it:
set startAt to the name of an existing AslState.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
StateNamesUnique
Context: AWSPSM!AslDocument
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:56
Why this rule exists
ASL stores states by name, effectively using the name as a JSON key. Duplicate names erase the distinction between two modeled states and make transitions impossible to resolve deterministically.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.duplicateStateNames().isEmpty()
This rule reads: duplicateStateNames.
Diagnostic and repair
ASL document contains duplicate state names: , . Fix: give every AslState a unique stateName.
How to fix it:
give every AslState a unique stateName.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
AslHasTerminalState
Context: AWSPSM!AslDocument
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:62
Why this rule exists
Every execution path needs a defined completion or failure endpoint. Requiring a terminal state prevents a state machine from being generated as an open graph that can never finish cleanly.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.states.exists(stateItem | (stateItem.end = true) or stateItem.isKindOf(AWSPSM!AslSucceedState) or stateItem.isKindOf(AWSPSM!AslFailState))
This rule reads: states, end, isKindOf.
Diagnostic and repair
ASL document has no terminal state. Fix: mark one state end=true or add AslSucceedState/AslFailState.
How to fix it:
mark one state end=true or add AslSucceedState/AslFailState.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
NonTerminalStateHasNextOrTerminalType
Context: AWSPSM!AslState
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:72
Why this rule exists
The rule checks whether non terminal state has next or terminal type. The asl state element provides the relevant evidence through end, next state, next state name, is kind of, state name. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. Missing evidence would leave an unresolved choice in generated infrastructure. The rule prevents the following failure: ASL state is not terminal and has no next state.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : (self.end = true) or self.nextState.isDefined() or self.nextStateName.hasText() or self.isKindOf(AWSPSM!AslSucceedState) or self.isKindOf(AWSPSM!AslFailState) or self.isKindOf(AWSPSM!AslChoiceState)
This rule reads: end, nextState, nextStateName, isKindOf, stateName.
Diagnostic and repair
ASL state is not terminal and has no next state. Fix: set nextState/nextStateName, mark end=true, or use a terminal/choice state class.
How to fix it:
set nextState/nextStateName, mark end=true, or use a terminal/choice state class.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
TerminalStateDoesNotHaveNext
Context: AWSPSM!AslState
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:79
Why this rule exists
The rule checks whether terminal state does not have next. The asl state element provides the relevant evidence through end, is kind of, next state, next state name, state name. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. Missing evidence would leave an unresolved choice in generated infrastructure. The rule prevents the following failure: Terminal ASL state also defines a next state.
When it applies
The rule is considered only when the guard below is true. A false guard is intentional: it means this invariant is not relevant to the current variant or modeling situation.
guard : (self.end = true) or self.isKindOf(AWSPSM!AslSucceedState) or self.isKindOf(AWSPSM!AslFailState)
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.nextState.isUndefined() and (not self.nextStateName.hasText())
This rule reads: end, isKindOf, nextState, nextStateName, stateName.
Diagnostic and repair
Terminal ASL state also defines a next state. Fix: remove nextState/nextStateName from terminal states.
How to fix it:
remove nextState/nextStateName from terminal states.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
TaskStateHasResource
Context: AWSPSM!AslTaskState
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:90
Why this rule exists
The rule checks whether task state has resource. The asl task state element provides the relevant evidence through resource, invoked resource, state name. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. Missing evidence would leave an unresolved choice in generated infrastructure. The rule prevents the following failure: AslTaskState has no resource or invokedResource.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.resource.hasText() or self.invokedResource.isDefined()
This rule reads: resource, invokedResource, stateName.
Diagnostic and repair
AslTaskState has no resource or invokedResource. Fix: set the AWS service ARN/resource string or reference the invoked PSM resource.
How to fix it:
set the AWS service ARN/resource string or reference the invoked PSM resource.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
LambdaIntegrationHasFunctionTarget
Context: AWSPSM!AslTaskState
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:96
Why this rule exists
Prevents the Lambda optimized integration from being emitted without a function target. The asl task state element owns the evidence for this decision, including resource, invoked resource, arguments json, parameters json, state name. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language; allowing the model through without that evidence would move an unresolved choice into generated infrastructure. The concrete failure this rule prevents is: ASL Lambda integration has no function target.
When it applies
The rule is considered only when the guard below is true. A false guard is intentional: it means this invariant is not relevant to the current variant or modeling situation.
guard : self.resource = 'arn:aws:states:::lambda:invoke' or self.resource = 'arn:aws:states:::lambda:invoke.waitForTaskToken'
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.invokedResource.isDefined() or self.argumentsJson.hasText() or self.parametersJson.hasText()
This rule reads: resource, invokedResource, argumentsJson, parametersJson, stateName.
Diagnostic and repair
ASL Lambda integration has no function target. Fix: reference invokedResource or provide FunctionName in Arguments/Parameters.
How to fix it:
reference invokedResource or provide FunctionName in Arguments/Parameters.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
NestedExecutionHasStateMachineTarget
Context: AWSPSM!AslTaskState
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:103
Why this rule exists
Prevents nested execution integration from omitting the target state machine ARN. The asl task state element owns the evidence for this decision, including resource, invoked resource, arguments json, state name. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language; allowing the model through without that evidence would move an unresolved choice into generated infrastructure. The concrete failure this rule prevents is: ASL nested execution has no target state machine arguments.
When it applies
The rule is considered only when the guard below is true. A false guard is intentional: it means this invariant is not relevant to the current variant or modeling situation.
guard : self.resource = 'arn:aws:states:::states:startExecution.sync'
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.invokedResource.isDefined() and self.argumentsJson.hasText()
This rule reads: resource, invokedResource, argumentsJson, stateName.
Diagnostic and repair
ASL nested execution has no target state machine arguments. Fix: reference the nested Step Functions resource and provide StateMachineArn in Arguments.
How to fix it:
reference the nested Step Functions resource and provide StateMachineArn in Arguments.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
JsonataStateDoesNotUseJsonPathFields
Context: AWSPSM!AslState
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:112
Why this rule exists
JSONata and JSONPath use different ASL data-shaping fields. Mixing them is not a harmless extra setting: it makes the state document express two incompatible evaluation models.
When it applies
The rule is considered only when the guard below is true. A false guard is intentional: it means this invariant is not relevant to the current variant or modeling situation.
guard : self.queryLanguage = 'JSONata'
What counts as valid
The model passes when the following EVL check evaluates to true:
check : not self.inputPath.hasText() and not self.outputPath.hasText() and not self.resultPath.hasText() and not self.parametersJson.hasText()
This rule reads: queryLanguage, inputPath, outputPath, resultPath, parametersJson, stateName.
Diagnostic and repair
JSONata ASL state uses JSONPath-only fields. Fix: use Arguments/Output or change the state query language to JSONPath.
How to fix it:
use Arguments/Output or change the state query language to JSONPath.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
WaitStateHasTiming
Context: AWSPSM!AslWaitState
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:122
Why this rule exists
This rule checks a semantic decision. The asl wait state element owns the evidence for this decision, including timeout seconds, state name. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language; allowing the model through without that evidence would move an unresolved choice into generated infrastructure. The concrete failure this rule prevents is: ASL wait state has no timing value.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.timeoutSeconds.isDefined() and self.timeoutSeconds >= 0
This rule reads: timeoutSeconds, stateName.
Diagnostic and repair
ASL wait state has no timing value. Fix: provide a supported duration or model callback/event completion before deployment.
How to fix it:
provide a supported duration or model callback/event completion before deployment.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
ChoiceStateHasChoices
Context: AWSPSM!AslChoiceState
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:131
Why this rule exists
The rule checks whether choice state has choices. The asl choice state element provides the relevant evidence through choices, state name. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. Missing evidence would leave an unresolved choice in generated infrastructure. The rule prevents the following failure: AslChoiceState has no choices.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.choices.notEmpty()
This rule reads: choices, stateName.
Diagnostic and repair
AslChoiceState has no choices. Fix: add one or more AslChoiceRule entries.
How to fix it:
add one or more AslChoiceRule entries.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
RetryRuleRangesValid
Context: AWSPSM!AslRetryRule
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:140
Why this rule exists
Retry parameters determine how long a failure can occupy capacity and how aggressively it is repeated. The lower bounds ensure the modeled policy describes a real delay, attempt count, and backoff rather than an impossible value.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : ((self.intervalSeconds.isUndefined()) or (self.intervalSeconds >= 1)) and ((self.maxAttempts.isUndefined()) or (self.maxAttempts >= 0)) and ((self.backoffRate.isUndefined()) or (self.backoffRate >= 1.0)) and ((self.maxDelaySeconds.isUndefined()) or (self.maxDelaySeconds >= 1))
This rule reads: intervalSeconds, maxAttempts, backoffRate, maxDelaySeconds.
Diagnostic and repair
ASL retry rule has invalid range values. Fix: use intervalSeconds >= 1, maxAttempts >= 0, backoffRate >= 1.0, and maxDelaySeconds >= 1.
How to fix it:
use intervalSeconds >= 1, maxAttempts >= 0, backoffRate >= 1.0, and maxDelaySeconds >= 1.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
CatchRuleHasErrorsAndNext
Context: AWSPSM!AslCatchRule
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:152
Why this rule exists
The rule checks whether catch rule has errors and next. The asl catch rule element provides the relevant evidence through error equals, next state. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. Missing evidence would leave an unresolved choice in generated infrastructure. The rule prevents the following failure: ASL catch rule lacks errorEquals or nextState.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : self.errorEquals.notEmpty() and self.nextState.isDefined()
This rule reads: errorEquals, nextState.
Diagnostic and repair
ASL catch rule lacks errorEquals or nextState. Fix: list errors to catch and reference the recovery state.
How to fix it:
list errors to catch and reference the recovery state.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.
ChoiceRuleHasConditionAndNext
Context: AWSPSM!AslChoiceRule
Classification: Mandatory semantic constraint (error)
Source: mde/validation/psm/rules/workflow.evl:161
Why this rule exists
The rule checks whether choice rule has condition and next. The asl choice rule element provides the relevant evidence through condition expression, variable, next state. At this level, the ASL document can start, traverse, recover, and terminate using data-processing fields that match its query language. Missing evidence would leave an unresolved choice in generated infrastructure. The rule prevents the following failure: ASL choice rule lacks condition/variable or nextState.
When it applies
No guard is defined, so the check runs for every instance of this context in the validated model.
No guard expression is present. Every instance of the context is checked.
What counts as valid
The model passes when the following EVL check evaluates to true:
check : (self.conditionExpression.hasText() or self.variable.hasText()) and self.nextState.isDefined()
This rule reads: conditionExpression, variable, nextState.
Diagnostic and repair
ASL choice rule lacks condition/variable or nextState. Fix: define the condition and target state for the choice branch.
How to fix it:
define the condition and target state for the choice branch.
A constraint represents a mandatory semantic invariant for this validation profile. Transformation or deployment work should not treat the model as semantically ready while this violation remains unresolved.