gatsbyjs/gatsby · error · Error
If you encounter this error, it's probably a Gatsby internal
Error message
If you encounter this error, it's probably a Gatsby internal bug. Please open an issue reporting us this.
What it means
The v2 jobs reducer's END_JOB_V2 case reads state.jobsV2.incomplete.get(jobContentDigest) and destructures `{ job }` from it; if no incomplete job exists for that digest, `job` is undefined and the reducer throws, telling the user this is almost certainly a Gatsby internal bug. The v2 API keys jobs by contentDigest, and END_JOB_V2 should always have a matching START_JOB_V2 predecessor in the same build.
Source
Thrown at packages/gatsby/src/redux/reducers/jobsv2.ts:64
case `CREATE_JOB_V2`: {
const { job } = action.payload
state.incomplete.set(job.contentDigest, {
job,
} as IGatsbyIncompleteJobV2)
return state
}
case `END_JOB_V2`: {
const { jobContentDigest, result } = action.payload
const { job } = state.incomplete.get(
jobContentDigest
) as IGatsbyIncompleteJobV2
if (!job) {
throw new Error(
`If you encounter this error, it's probably a Gatsby internal bug. Please open an issue reporting us this.`
)
}
state.incomplete.delete(job.contentDigest)
// inputPaths is used to make sure the job is not stale
state.complete.set(job.contentDigest, {
result,
inputPaths: job.inputPaths,
} as IGatsbyCompleteJobV2)
return state
}
case `REMOVE_STALE_JOB_V2`: {
const { contentDigest } = action.payload
state.incomplete.delete(contentDigest)View on GitHub (pinned to 8b06340921)
Solutions
- Report the issue to Gatsby with a reproduction (the message explicitly asks for this).
- Clear .cache and public and rebuild to reset the v2 job maps.
- Update to the latest Gatsby patch release in case it is a fixed internal bug.
- If you maintain a plugin calling internal v2 job actions directly, ensure END_JOB_V2 only fires after a successful START_JOB_V2 with the same digest.
Defensive patterns
Strategy: try-catch
Try / catch
// This signals a Gatsby internal bug; surface and reset rather than swallow.
try {
// ... v2 job lifecycle ...
} catch (e) {
if (/probably a Gatsby internal bug/.test(e.message)) {
report.error(e)
// recommend gatsby clean + rebuild
} else throw e
} Prevention
- Do not call internal v2 redux actions (START_JOB_V2 / END_JOB_V2) directly; use the public createJobV2 API.
- Keep Gatsby updated to pick up internal fixes.
- Run gatsby clean when job state looks inconsistent.
When it happens
Trigger: Dispatching END_JOB_V2 with a jobContentDigest that is absent from state.incomplete (never started, or already completed and deleted). The incomplete map is mutated (delete on completion), so a duplicate end also misses.
Common situations: Genuinely rare; indicates out-of-order dispatch, replayed actions after a partial cache, or a regression in the v2 job orchestration. End users essentially cannot cause this through normal plugin APIs - it is a guard for invariant violations inside Gatsby's job runner.
Related errors
- An ID must be provided when creating or setting job
- An ID must be provided when ending a job
- The plugin "${_.get(action, `plugin.name`, `anonymous`)}" tr
- An error occurred finding a node by it's type. This is likel
- Pages can only be created by plugins. There wasn't a plugin
AI-assisted analysis of gatsbyjs/gatsby@8b06340921 (2026-08-13).
Data as JSON: /api/errors/6185c51c69181f51.
Report an issue: GitHub.