chore(armory): engines.node drift-prevention gate — closes queue #31#84
Merged
Merged
Conversation
Extend scripts/lint-pkg.mjs (Gate 6) with a per-manifest engines.node presence assertion across the workspace root + all 10 packages. Closes enforcement queue #31 (drift-prevention half — declarations themselves landed 2026-04-22 via commit 0605d99). Option α (fold into existing wrapper). Same domain as the publint suggestion-strictness — both are per-manifest publish-readiness assertions — so the failure aggregation, message shape, and CI gate count (8) stay unchanged. Presence-only check; value alignment (currently uniform ">=24.0.0") is a separate doctrine question. Smoke test: temporarily stripped engines from packages/storage/package.json, ran lint:pkg, confirmed exit 1 with named failure "@script-development/fs-storage: engines field missing (queue #31 — engines.node presence required)" and aggregate footer "lint:pkg gate FAILED (1):"; reverted, re-ran, confirmed exit 0 with "lint:pkg gate PASS — 10 packages + root clean".
Deploying fs-packages with
|
| Latest commit: |
73c39e1
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://9467ba26.fs-packages.pages.dev |
| Branch Preview URL: | https://armorer-queue-31-engines-nod.fs-packages.pages.dev |
jasperboerhof
approved these changes
May 13, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Closes war-room enforcement queue #31 — adds a CI-time presence gate so any future workspace package (or the root manifest) that ships without an
engines.nodedeclaration fails Gate 6 of the 8-gate pipeline. The declarations themselves landed 2026-04-22 in commit0605d99(root + all 10 packages declareengines.node: ">=24.0.0"); without this guard, the next package added to the Armory (fs-auth,fs-validation, future) can ship without the declaration and consumers get silent Node-version mismatches instead ofEBADENGINE.Shape — Option α (fold into
scripts/lint-pkg.mjs)Picked α over a new
scripts/check-engines.mjs+ 9th CI gate because the engines.node presence check sits in exactly the same domain as the existing publint suggestion-strictness wrapper (queue #33, PR #35 follow-up): both are per-manifest publish-readiness assertions over the samepackages/*corpus, both share the samefailures[]collection shape, and both already iterate the same loop. Folding keeps the CI gate count at 8 and the script discovery surface small.Filename
scripts/lint-pkg.mjsretained deliberately — renaming toscripts/check-packages.mjs(more accurate now that it covers two assertion classes) would force a parallel edit to thelint:pkgnpm-script alias and the.github/workflows/ci.ymlnpm run lint:pkgstep, neither of which is in scope for this PR. The expanded responsibility is documented in the script's header comment.What this gate asserts
For every
package.jsoninpackages/*/and the workspace rootpackage.json:enginesentirely → fail.engines.nodeis missing or not a non-empty string → fail.The gate is presence, not value. It does NOT enforce
>=24.0.0specifically — value alignment is a separate doctrine question tracked alongside the CI workflow'snode-version. If a future bump moves the corpus to>=26.0.0, the gate does not need editing.Smoke test — gate fires correctly
Per orders §F:
enginesblock frompackages/storage/package.json.npm run lint:pkg.npm run lint:pkg.Full local CI matrix — all 8 gates green
npm auditfast-uri) pre-exists onmain— not introduced by this PRformat:checklintbuildtypechecklint:pkgtest:coveragetest:mutationFiles changed
scripts/lint-pkg.mjs(+53 / -11) —checkEnginesNode()helper, root-manifest check before the per-package loop, header comment updated to reference queue Fix setById reactivity by invalidating adapted cache #31 alongside queue fs-packages M1 moderate remediation (Armorer) #33.CLAUDE.md(+2 / -2) — one-sentence note appended to the Stack §Package lint bullet (doctrine-propagation per war-room CLAUDE.md).Reviewer checklist
scripts/lint-pkg.mjsto confirm the assertion is presence-only (no value validation).0605d99reference).References
enforcement/queue.md)orders/fs-packages/queue-31-engines-node-drift-prevention-gate-armorer-deployment.md0605d99, 2026-04-22