Skip to content
Latchkey

CircleCI Reusable Executor Parameters Unresolved - Fix Inheritance

A job references a parameterized reusable executor but the parameters do not resolve - the job passes a parameter the executor never declared, or tries to override a field the executor does not expose. The job environment cannot be built.

What this error means

Validation fails resolving the executor’s parameters, or the job silently runs with the executor’s defaults instead of the values you passed. The executor reference does not bind the parameters the way you intended.

CircleCI UI
Config is invalid:
  - job 'test': executor 'node-builder' has no parameter 'tag'
  - executor 'node-builder': parameter 'tag' used in image but not declared

Common causes

Job passes an undeclared executor parameter

To pass parameters to an executor, the job must use the executor: { name: ..., <param>: ... } form, and every key must be declared under the executor’s parameters:.

Executor references an undeclared parameter

The executor’s docker/resource_class uses << parameters.tag >> but never declares tag under its own parameters:, so expansion fails.

Trying to override a non-parameterized field

You can only override fields the executor parameterizes. Passing a value for a field the executor hardcodes has no effect or errors.

How to fix it

Declare executor parameters and pass them by name

.circleci/config.yml
executors:
  node-builder:
    parameters:
      tag: { type: string, default: "20.11" }
    docker:
      - image: cimg/node:<< parameters.tag >>
    resource_class: medium

jobs:
  test:
    executor:
      name: node-builder
      tag: "22.2"
    steps: [checkout, { run: npm test }]

Only override what the executor exposes

  1. Declare every parameter the executor’s fields reference under its parameters:.
  2. Use the executor: { name:, <param>: } form when passing values.
  3. Parameterize any field you need to vary per job (image tag, resource_class).

How to prevent it

  • Declare all executor parameters the executor’s fields use.
  • Pass executor parameters with the name: form, by declared key.
  • Parameterize fields that must vary, rather than overriding hardcoded ones.

Frequently asked questions

What causes "executor param inheritance"?
To pass parameters to an executor, the job must use the executor: { name: ..., <param>: ... } form, and every key must be declared under the executor’s parameters:.
How do I fix executor param inheritance?
Declare executor parameters and pass them by name

Related guides

References

Latchkey auto-heals failures like this one - detected, fixed, and retried without you. Start free → 30-day trial · No credit card