Relationships
#1751 workflow validate: false 'Missing required inputs' for CEL-templated globalArgs (${{ inputs.* }})
Opened by shelson · 8/20/2026· Shipped 8/20/2026
Summary
swamp workflow validate reports steps as failing "Step inputs" checks when a required global argument is supplied via a CEL expression like ${{ "Swamp Tests " + inputs.suffix }}. The steps are perfectly valid at runtime — they succeed — but validation marks them red, making validate unreliable as a CI/pre-run gate.
Reproduction
Model type @shelson/jira/project-category requires the name global argument. Workflow step (direct-type execution):
inputs:
type: object
properties:
suffix: { type: string }
required: [suffix]
jobs:
- name: define-category
steps:
- name: create
task:
type: model_method
modelType: "@shelson/jira/project-category"
modelName: e2e-category
methodName: create
globalArgs:
name: ${{ "Swamp Tests " + inputs.suffix }}
site: [HOST-1]
email: [REDACTED-EMAIL]
token: ${{ vault.get(jira, API_TOKEN) }}swamp workflow validate returns:
{ "name": "Step inputs for create in job define-category (e2e-category.create)",
"passed": false,
"error": "Missing required inputs: name" }but swamp workflow run wf --input suffix=DD3 succeeds and creates "Swamp Tests DD3".
Impact
A full e2e workflow of 35+ steps generated ~30 false "Missing required inputs" errors, drowning any genuine schema problems in noise. Users learn to ignore validate results, defeating its purpose. This affects any workflow that parameterizes args via ${{ inputs.* }}, ${{ data.latest(...) }}, etc. — i.e. the recommended pattern for dynamic workflow inputs (docs suggest exactly this in reference.md § Using Inputs in Expressions).
Expected behavior
One of:
swamp workflow validate --input suffix=X— accept input overrides and resolve CEL before checking required args; or- Mark expression-templated args as "unverifiable" (skip / warn-only, not a hard failure), since static analysis cannot determine their value without runtime inputs; or
- Treat any non-empty
${{ ... }}string as satisfying the presence requirement for required-arg checks (the type-level shape is still validated against the schema).
Environment
- swamp CLI: 20260819.011806.0 (sha a9c7ee9a)
- Reproduced against
@shelson/jiralocal-source extension, project/category + project types - Related behaviors observed (possibly worth separate issues): eager CEL evaluation inside
globalArgsfails at run-start when referencingdata.latest()of data produced within the same run ("No such key: attributes"); rawvault.get()strings inside globalArgs CEL merge fail withfound no matching overload for dyn.get(dyn, dyn). Workaround in both cases: move the args to lazyinputs.
Shipped
Click a lifecycle step above to view its details.