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
- 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.
- 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.
- 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
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.yamlat5fd04d8carries: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 rootpackage.jsondeclaresengines.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.yargsreaches the tree throughwrangler@4.95.0(apps/docsdevDependency).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: 22inactions/setup-node, which resolves to the latest 22.x — today well above 22.12.0 — so the unsupported window is never exercised.Options
>=22.12.0(and theapps/docssibling 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.maintoday, purely because of this finding — so it can only land together with option 1 or with a decision to accept the finding.>=22is 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