Skip to content

Root engines.node >=22 claims support for 22.0.0–22.11.x, a window yargs does not support #137

Description

@os-warren

Measured while implementing #127 (the Node floor gate). Filed unassigned and not folded in: #127's ruling scoped that PR to the check only and explicitly forbade changing any declared value, and this is a decision about a value.

The finding

pnpm-lock.yaml at 5fd04d8 carries:

  yargs@18.0.0:
    engines: {node: '^20.19.0 || ^22.12.0 || >=23'}

  yargs-parser@22.0.0:
    engines: {node: '^20.19.0 || ^22.12.0 || >=23'}

Those three branches cover [20.19.0, 21.0.0), [22.12.0, 23.0.0), and 23 upward. Node 22.0.0 satisfies none of them. The root package.json declares engines.node: ">=22", which asserts that every version from 22.0.0 up is supported — so the declaration currently claims a window (22.0.0 through 22.11.x) in which a package in the tree declares itself unsupported.

yargs reaches the tree through wrangler@4.95.0 (apps/docs devDependency).

Why the new gate does not catch it

The gate that landed for #127 reduces each dependency range to the lowest version satisfying it and takes the maximum across the tree. For this range that minimum is 20.19.0 — far below 22 — so it never moves the maximum and never fires. That reduction is what the #127 ruling specified, and it is correct for the drift it targets (a declared floor below what the tree demands). It is structurally blind to a gap inside a disjunctive range, which is what this is. The limitation is documented in the script header rather than left implicit.

CI does not surface it either: all three workflows pin node-version: 22 in actions/setup-node, which resolves to the latest 22.x — today well above 22.12.0 — so the unsupported window is never exercised.

Options

  1. Tighten the declaration to >=22.12.0 (and the apps/docs sibling to match). Makes the declaration true. Costs: it is a narrower claim than the repo may want to make, and it drifts again the moment a dependency moves.
  2. Strengthen the gate to "the declared floor version must itself satisfy every dependency range", then fix whatever it reports. This is strictly more correct than max-of-minimums and would have caught this. It is red on main today, purely because of this finding — so it can only land together with option 1 or with a decision to accept the finding.
  3. Accept it. Argue that nobody runs 22.0.0–22.11.x, that CI proves the latest 22.x works, and that >=22 is a statement about the major line rather than a precise floor. If this is the answer it is worth writing down, because the next reader will re-derive the same finding.

Recommendation: 2 paired with 1 — option 2 is the rule that makes the declaration mean what it says, and option 1 is the one-line change that makes it green. Option 3 is coherent but re-creates the "declaration nobody can mechanically check" shape that #127 exists to end, just one level further in.

Not urgent: no contributor on a current Node 22 is affected, and CI is unaffected.

Generated by Claude Code

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions