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

Relationships

#1500 workflow validate: new 'GlobalArgument input references' check resolves model-definition ${{ inputs.* }} against workflow inputs, false-failing steps that supply the input

Opened by 4chems · 8/2/2026· Shipped 8/2/2026

Since 20260801.231848.0, swamp workflow validate runs a new (undocumented) validation named GlobalArgument input references for '<step>' in job '<job>' (<model>.<method>). It fails with Model definition references undeclared workflow input(s): <name> whenever the target model's own globalArguments use ${{ inputs.<name> }} — even though the calling step supplies <name> in its inputs: block, which is the documented model-inputs pattern and is exactly what the existing "Step inputs" check verifies (and passes for the same steps).

Reproduction

Model definition (documented factory/inputs pattern):

type: '@keeb/ssh/host'
name: ssh-host
inputs:
  properties:
    ip: { type: string }
  required: [ip]
globalArguments:
  host: ${{ inputs.ip }}
  user: root

Workflow step that satisfies the model input:

inputs:
  properties:
    nodeName: { type: string }
  required: [nodeName]
jobs:
  - name: prune
    steps:
      - name: prune-images
        task:
          type: model_method
          modelIdOrName: ssh-host
          methodName: execWithKey
          inputs:
            ip: ${{ data.latest("node-provisioner", inputs.nodeName).attributes.ipv4 }}
            command: docker image prune -f

swamp workflow validate on 20260801.231848.0 reports:

  • Step inputs for 'prune-images' ... — passed (ip is provided)
  • GlobalArgument input references for 'prune-images' ... — failed: Model definition references undeclared workflow input(s): ip

In a repo with ~80 workflows built on this pattern, 37 now fail validation with no change to their definitions; the previous CLI release validated all of them green. There is no --skip flag for the check, so workflow validate --json in CI/pre-commit hooks hard-blocks. The model reference docs still present ${{ inputs.<name> }} in globalArguments as the supported parameterization mechanism, and the workflow reference documents only the original 8 checks.

Expected

The check should resolve ${{ inputs.* }} expressions found in a model definition's globalArguments against the model's own inputs schema, and then verify the calling step's inputs: block (plus defaults) covers them — i.e. the namespace of those expressions is the model instance, not the workflow. Only inputs genuinely missing from both the step's inputs and the model's defaults should fail, and the error message should say which step failed to supply which model input rather than "undeclared workflow input(s)".

Fix summary

This affects the workflow validation service's new global-argument reference resolver. The fix would scope input-reference resolution for model-definition expressions to the model inputs schema/step-supplied inputs instead of the workflow's declared inputs, keeping the workflow-input namespace only for expressions written in the workflow YAML itself. Alternatively (if the stricter semantic is intentional), the check needs a documented migration path and a skip/waiver mechanism, since it currently hard-blocks validation of previously-valid repos.

02Bog Flow
OPENTRIAGEDIN PROGRESSSHIPPED+ 1 MOREASSIGNED+ 2 MOREREVIEW+ 4 MOREPR_MERGED+ 2 MORESESSION_SUMMARIZED

Shipped

8/2/2026, 10:16:00 PM

Click a lifecycle step above to view its details.

03Sludge Pulse
stack72 assigned stack728/2/2026, 9:11:53 PM
Editable. Press Enter to edit.

stack72 commented 8/2/2026, 10:16:09 PM

Thanks @4chems for reporting this! The fix has been merged and a release is on its way. We appreciate your contribution to swamp.

Sign in to post a ripple.