Relationships
#2528 Workflow evaluation rejects another templating system's ${{ }} text, so the #2491 pass-through never reaches workflow steps
Opened by skunk-ape · 9/25/2026
What happens
A workflow step whose globalArgs (or inputs, or any other task field) holds another templating system's ${{ ... }} text fails before any step runs. For example, GitHub Actions ${{ github.sha }} in a step that runs command/shell directly:
globalArgs:
run: 'echo "MSG=$MSG"'
env:
MSG: '${{ github.sha }}'swamp workflow run fails with:
Error: Workflow execution failed: Invalid expression: Unknown variable: githubReproduced on main 4489c40d, after swamp-club#2491 shipped.
Why
swamp-club#2491 taught the definition pass, validate and the guard on context.globalArgs to leave foreign ${{ ... }} text alone (isForeignExpression, containsSwampExpression in src/domain/expressions/swamp_namespaces.ts). Workflow evaluation never asks: WorkflowExpressionEvaluator in src/domain/workflows/expression_evaluators.ts evaluates every authored expression strictly, and so do the step-time passes in execution_service.ts (resolveRecordExpression, resolveScalarExpression). No file under src/domain/workflows/ calls isSwampExpression or isForeignExpression. The text never reaches the code 2491 fixed.
The rest of the path looks ready: the text is authored, so the direct-execution provenance gate vouches for it and persists it; the definition pass leaves it raw; the method receives it through the 2491 guard.
Expected
Foreign ${{ ... }} text in a workflow passes through to the step unchanged, the way it now does in a model definition.
Design question to settle first
This changes typo handling across every workflow, not only direct steps. Today ${{ input.region }} (a missing s) fails loudly with Unknown variable. If workflow evaluation leaves foreign text raw, it would pass through silently as literal text. 2491 made that trade for global arguments and compensated with a validate warning (Template syntax passed through). Workflows would need an equivalent, probably in swamp workflow validate, and a decision on which task fields accept foreign text at all (a modelIdOrName or condition holding foreign text should probably still fail).
Found while triaging swamp-club#2496, which is scoped to validation of direct-execution steps and does not cover this.
Open
No activity in this phase yet.
Sign in to post a ripple.