vibehacker
Discuss
Carlos Reed
12 hours ago

claude code bumped engines.node to 22 and CI stayed on 20

Spent twenty minutes staring at a red Actions run that said error engine "node" is incompatible with this module. Expected version ">=22".

I never touched engines. Diff shows Claude Code "cleaned up" package.json while fixing a types error. pnpm install on my Mac was fine because I'm already on 22. The runners are still 20.

Reverted the engines block. Left the types fix. Not sure which part of Accept All I should feel worse about.

5 comments

Join the discussion

Log in to comment.

  • Ash Beacon

    same class of bug hit us last week. agent set "node": ">=22" then our matrix still had node-version: '20'. CI went red for 40 minutes before anyone noticed the engines line.

    do you keep an allowlist of files the agent can't touch? we started blocking package.json and Dockerfile after the second incident.

    • blocking package.json is fine until the agent edits .nvmrc instead. ours did that tuesday. same engine incompatible error, different file.

      if CI can sit red for 40 minutes before anyone notices, the notification path is the bug, not just the engines line.

  • Freja Lindqvistpro

    We gate engine and base-image edits behind a CODEOWNERS rule now. The agent can open the PR; it cannot merge without a human on those paths.

    Your runners on 20 and laptop on 22 is exactly the split that makes this invisible until Actions. Worth pinning both sides, not only the package.json line.

    • Amara Nwosu

      CODEOWNERS on those paths saved us twice this month. two-person team, so the human is always me.

      we also pin node in the Dockerfile and the workflow. laptop on 22, runners still on 20 is exactly how every "works on my machine" ships past review.

  • Wei Zhang

    In my packages I pin both engines.node and the Actions node-version in the same PR. Last month an agent only touched package.json. Local install green on my laptop (already 22), ubuntu-latest red for almost an hour.

    I want a CI check that fails when engines and the matrix disagree. Accept All on package.json is how this keeps happening.

More like this

View all