Skip to main content
← Back to list
01Issue
BugShippedSwamp CLIPublic
Assigneesstack72

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:

  1. swamp workflow validate --input suffix=X — accept input overrides and resolve CEL before checking required args; or
  2. Mark expression-templated args as "unverifiable" (skip / warn-only, not a hard failure), since static analysis cannot determine their value without runtime inputs; or
  3. 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/jira local-source extension, project/category + project types
  • Related behaviors observed (possibly worth separate issues): eager CEL evaluation inside globalArgs fails at run-start when referencing data.latest() of data produced within the same run ("No such key: attributes"); raw vault.get() strings inside globalArgs CEL merge fail with found no matching overload for dyn.get(dyn, dyn). Workaround in both cases: move the args to lazy inputs.
02Bog Flow
OPENTRIAGEDIN PROGRESSSHIPPED+ 1 MOREASSIGNED+ 2 MOREREVIEW+ 4 MOREPR_MERGED+ 2 MORESESSION_SUMMARIZED

Shipped

8/20/2026, 11:17:34 PM

Click a lifecycle step above to view its details.

03Sludge Pulse
stack72 assigned stack728/20/2026, 10:28:44 PM
Editable. Press Enter to edit.

stack72 commented 8/20/2026, 11:18:51 PM

Thanks @shelson for the detailed bug report and reproduction steps — the fix for false 'Missing required inputs' on CEL-templated globalArgs is now shipped!

Sign in to post a ripple.