build(deps): take vitest 4 and @eslint/js 10, and pin @types/node to the runtime - #67
Merged
Merged
Conversation
semics-tech
force-pushed
the
build/toolchain-majors
branch
from
July 31, 2026 12:22
8bb21e5 to
7e17a95
Compare
…the runtime Closes dependabot #40 and #42, and closes #39 without taking it. vitest 4 removes the workspace file. `vitest.workspace.ts` and `defineWorkspace` are gone; projects are declared as `test.projects` in vitest.config.ts, which is what this adds. The five projects, their roots and their timeouts are carried over unchanged. The way that removal fails is worth recording, and is in a comment at the top of the new file. vitest 4 does not warn about a workspace file it no longer reads — it just finds no projects. `pnpm test:unit` names its projects with --project, so it errored and the problem was obvious. An unfiltered `vitest run` would have collected nothing, reported no failures and exited 0, and a green CI would have meant the tests did not run. @eslint/js 10 turns on `no-useless-assignment`, which found three dead initialisers. All three are real and all three are fixed rather than suppressed: - hub.ts declared `identity` as `AuthenticatedWorker | null = null`, then assigned it in a try whose catch always returns. The null was a value no path could observe, and a second binding existed further down purely to narrow it back to non-null. Both are gone; there is one `authenticated` now, declared without an initialiser, which TypeScript accepts because it can see the catch return. - job-edit.ts seeded `startStepId` from the definition and then reassigned it on every branch. - agent-repo.ts assigned 'unknown' twice, at the declaration and again in the catch. @types/node stays on 24 and dependabot is told not to offer 26 again. Everything here runs Node 24 — engines, both Dockerfile stages, CI, and the runtime baked into the single-file executables — because 26 is the Current line and the worker ships its runtime onto customer database servers. Types from a newer major describe APIs that are not present, and the failure would land at runtime on someone else's SQL host rather than in CI. The ignore says to raise it when NODE_VERSION moves, in the same change. Verified on vitest 4: typecheck 7/7, lint, 357 unit, 18 integration, 25 e2e. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AyYg2j8FVkLjiaVcj5HCkj
semics-tech
force-pushed
the
build/toolchain-majors
branch
from
July 31, 2026 12:27
7e17a95 to
338266d
Compare
This was referenced Jul 31, 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.
Closes #40 and #42. Closes #39 without taking it — see below.
vitest 4 removes the workspace file
vitest.workspace.tsanddefineWorkspaceare gone. Projects are nowtest.projectsinvitest.config.ts. The five projects, their roots and their timeouts carry over unchanged.The way this fails is worth knowing, and there's a comment at the top of the new file saying so. vitest 4 does not warn about a workspace file it no longer reads — it just finds no projects.
pnpm test:unitnames its projects with--project, so it errored loudly and the problem was obvious:An unfiltered
vitest runwould have collected nothing, reported no failures, and exited 0. A green CI would have meant the tests did not run.@eslint/js 10 turns on
no-useless-assignmentThree dead initialisers, all real, all fixed rather than suppressed:
hub.tsdeclaredidentityasAuthenticatedWorker | null = null, then assigned it in atrywhosecatchalways returns. Thenullwas a value no path could observe — and a second binding (const authenticated = identity) existed further down purely to narrow it back to non-null. Both gone; there's oneauthenticatednow, declared without an initialiser, which TypeScript accepts because it can see the catch return.job-edit.tsseededstartStepIdfrom the definition, then reassigned it on every branch.agent-repo.tsassigned'unknown'twice — at the declaration and again in the catch.Why #39 (@types/node 26) is closed, not merged
@types/nodeshould track the runtime, not the newest release. Everything here is Node 24 —engines, both Dockerfile stages, CI'sNODE_VERSION, and the runtime baked into the single-file executables — and that's deliberate:release.ymlalready says 26 is the Current line and the worker ships its runtime onto customer database servers.Types from a newer major describe APIs that are not there. The failure wouldn't land in CI (which also runs 24) — it'd land at runtime on someone else's SQL host.
There's now a
dependabot.ymlignore for@types/nodemajors, alongside the existing one forargon2, saying to raise it whenNODE_VERSIONmoves, in the same change.Verified on vitest 4
typecheck7/7 ·lint· 357 unit · 18 integration · 25 e2e🤖 Generated with Claude Code
https://claude.ai/code/session_01AyYg2j8FVkLjiaVcj5HCkj