GitHub Actions "Unrecognized named-value: inputs" - Context Scope
An expression references the inputs context, but this workflow never declared any inputs under workflow_call or workflow_dispatch, so the parser does not recognize the name.
What this error means
The workflow fails to compile with "Unrecognized named-value: inputs", even though the same expression works in another workflow. The file is valid YAML but the inputs context does not exist here.
The workflow is not valid. .github/workflows/ci.yml (Line: 12, Col: 18):
Unrecognized named-value: 'inputs'. Located at position 1 within expression: inputs.envDiagnose it: print the context before you change anything
Most workflow-expression bugs are not syntax errors, they are an expression reading something that is empty. GitHub resolves a missing property to an empty string instead of failing the run, so a wrong reference looks like a logic bug rather than a mistake. Dump the contexts first and you will usually see the answer immediately.
- name: Dump contexts
run: |
echo '--- github ---' ; echo '${{ toJSON(github) }}'
echo '--- needs ---' ; echo '${{ toJSON(needs) }}'
echo '--- steps ---' ; echo '${{ toJSON(steps) }}'
echo '--- matrix ---' ; echo '${{ toJSON(matrix) }}'
echo '--- inputs ---' ; echo '${{ toJSON(inputs) }}'Check the context is allowed where you used it
Contexts are not available everywhere. The same expression can be valid in a step if and invalid in a job if, which is why an expression that works in one workflow fails when moved.
| Where you wrote it | Contexts available there |
|---|---|
run-name | github, inputs, vars |
concurrency | github, inputs, vars |
Top-level env | github, secrets, inputs, vars |
jobs.<id>.if | github, needs, vars, inputs |
jobs.<id>.steps.if | github, needs, strategy, matrix, job, runner, env, vars, steps, inputs |
jobs.<id>.outputs | Full access, including secrets |
Reusable workflow outputs | github, jobs, vars, inputs |
Common causes
No inputs declared for this trigger
The inputs context only exists when the workflow defines inputs under on.workflow_call or on.workflow_dispatch. Referencing inputs.x without that declaration is an unknown named-value.
Confusing inputs with github.event.inputs
For a manual run triggered by another event, payload values live under github.event.inputs, not the inputs context. The two are populated by different mechanisms.
How to fix it
Declare the inputs you reference
Add the input under the trigger that runs this workflow so the inputs context is populated.
on:
workflow_dispatch:
inputs:
env:
type: string
default: staging
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- run: echo "Deploying to ${{ inputs.env }}"Use the right source for the value
- For workflow_call and workflow_dispatch with declared inputs, use the inputs context.
- For values arriving in an event payload, read github.event.inputs or the relevant event field.
- Run actionlint, which knows which contexts are valid for each trigger.
Catch it before it reaches CI
Every failure in this cluster is statically detectable. actionlint parses workflow expressions, checks context availability against the same rules above, and validates needs references, so these bugs never need to cost you a run.
# one-off
docker run --rm -v "$(pwd):/repo" --workdir /repo rhysd/actionlint:latest -color
# as a job, before anything expensive runs
- uses: actions/checkout@v4
- run: |
bash <(curl -s https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
./actionlint -colorHow to prevent it
- Declare every input under the trigger before referencing it.
- Prefer the inputs context over github.event.inputs for dispatch and call inputs.
- Validate expressions with actionlint, not just generic YAML.