.node-versionis pinned to an exact patch. Bumping it is a breaking-dev-env change — open a separate PR, never bundled with a feature.engines.node: ">=22"in everypackage.json.- Action runtime targets
runs.using: node24(the first GitHub-supported runtime ≥ 22 —node22doesn't exist in the runner protocol).
We run TypeScript directly via node --experimental-strip-types. Do not introduce ts-node, tsx, swc-node, or a transform-loader.
tsconfig.base.jsonenforceserasableSyntaxOnly: true— any syntax that would confuse strip-types (enums, namespaces, parameter properties, decorator metadata,import =/export =) fails compilation.- The
typescriptdevDependency is pinned to the version compatible with the Node floor's bundledamaroparser — do not bump it independently from.node-version.
- No vitest, no jest, no mocha.
- Assertions via
node:assert/strict, function mocks viat.mock.fn, snapshots viat.assert.snapshot. - Module mocking (
t.mock.module) is treated as experimental until the M-1 spike closes; prefer DI-style test doubles.
Hard caps: 6 runtime deps, 3 dev deps. Every addition requires a justification comment next to its package.json entry. See the plan's §16 for the current allow-list and deny-list.
- Conventional Commits (
feat:,fix:,refactor:,test:,chore:,docs:). - Rebase onto
main, not merge. - CI must be green before merge.
dist/and generatedaction.ymlfiles are checked viagit diff --exit-code— runyarn buildbefore committing.
See issue #248 implementation plan for the M-1 → v1.0 roadmap and scope boundaries per milestone.