Relationships
#3844 workflow validate passes a CEL behavior target with a resolvable default, so a misspelled method passes
Opened by reset · 10/23/2026
On 20261020.024627.0-sha.26dc044f (macOS 27), a step whose behavior: is ${{ inputs.instance }} with an input default naming a real instance, and a misspelled methodName, validates clean:
swamp workflow validate dyn
✓ Step inputs for 'list-active' in job 'main' (${{ inputs.instance }}.execuet)
Summary: 9 passed / Result: PASSED, exit 0.
The same step with the literal target fails as expected:
swamp workflow validate lit
✗ Step inputs for 'list-active' in job 'main' (probe.execuet)
→ Method 'execuet' not found on behavior type 'command/shell'
Result: FAILED, exit 1.
Expected: validate resolves the target from the input's default and checks the method, or reports the step as not checked because its target is dynamic. Actual: the check is reported as passed, so a misspelled method or a default that names no instance fails only at run time.
Steps to reproduce:
swamp repo init --tool nonein an empty workspace, thenswamp behavior create command/shell probe.- Write
workflows/workflow-dyn.yamlwithinputs.properties.instance(type: string,default: probe) and one step:task: {type: behavior, behavior: ${{ inputs.instance }}, methodName: execuet}. swamp workflow validate dyn:✓ Step inputs ... (${{ inputs.instance }}.execuet),Result: PASSED.- Change
behavior:toprobeand validate again:Method 'execuet' not found on behavior type 'command/shell'.
Cause: src/domain/workflows/validation_service.ts:966, else if (modelIdOrName.includes("${{")) { return [WorkflowValidationResult.pass(checkName)]; } under the comment "Skip dynamic CEL references — cannot resolve statically", so the method is never looked up and the skip is reported as a pass. #1788 (shipped) fixed the factory-pattern case where modelType is literal and only modelName is CEL; this is the behavior:/modelIdOrName case with no modelType.
Suggestion: when the expression is a whole-field inputs.<name> reference and the input has a default, resolve the default and run the existing method check; otherwise report the step as skipped ("not checked: target resolved at run time") instead of passed.
Open
No activity in this phase yet.
Sign in to post a ripple.