Skip to main content
← Back to list
01Issue
BugOpenSwamp CLIPublic
AssigneesNone

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:

  1. swamp repo init --tool none in an empty workspace, then swamp behavior create command/shell probe.
  2. Write workflows/workflow-dyn.yaml with inputs.properties.instance (type: string, default: probe) and one step: task: {type: behavior, behavior: ${{ inputs.instance }}, methodName: execuet}.
  3. swamp workflow validate dyn: ✓ Step inputs ... (${{ inputs.instance }}.execuet), Result: PASSED.
  4. Change behavior: to probe and 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.

02Bog Flow
◉OPEN○TRIAGED○IN PROGRESS○SHIPPED

Open

10/23/2026, 5:22:54 PM

No activity in this phase yet.

03Sludge Pulse

Sign in to post a ripple.