Repository navigation
ci: run the shuffled suite on every PR, the mutation check nightly, and guard the Worker's entry points - #635
Merged
mrbobbytables merged 1 commit intoOct 31, 2026
Conversation
…nightly, and guard the Worker's entry points Three gaps the last month of quality findings kept hitting by hand: - test.yml gains a `shuffle` job running `npm run test:shuffle` (with the Redis service, so the store tests are in the order too). cncf#633 found an order-poisoning pair only because someone ran the shuffle locally; the suite passes in source order by luck and nothing in CI knew. - test.yml gains a `mutation` job on the daily schedule and on workflow_dispatch, running `npm run test:mutation:nightly` — stryker.nightly.config.mjs, the default merge-decision set of stryker.config.mjs with no incremental file and a `break` score of 95 (main reaches 96 with six equivalent survivors). The job writes a per-file tally to the step summary and uploads reports/mutation/. The schedule trigger existed and gated nothing extra. This is the single-shard form of cncf#594's proposal; the whole-tree five-shard matrix (5+ hours of runner time nightly) is declined for now. - __tests__/worker/entryPoints.test.ts: src/server/worker.ts is excluded from both coverage runs because it only executes inside workerd, so scheduled(), queue() and deferViaQueue shipped with no test and no number moved (cncf#629). The guard parses the file's default-export handlers, Hono routes and top-level functions, requires each to be listed with the evidence in __tests__/worker that drives it, and requires that evidence to be present — a new entry point or a deleted driver fails the unit run. The exclusion comment in vitest.config.mjs points at it. docs/contributing.md records the two jobs and the new script. Closes cncf#594 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Bob Killen <bkillen@linuxfoundation.org>
11 of 12 tasks
This was referenced Nov 1, 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.
Description
Three CI gaps the last month of quality findings kept hitting by hand, closed in one place:
shufflejob —npm run test:shuffleon every pull request (with the Redis service so the store tests are in the order). test(server): settle the abandoned installation-token request so stores.test.ts passes in any order (__tests__/server/stores.test.ts) #633 found an order-poisoning pair instores.test.tsonly because someone ran the shuffle locally; the suite passes in source order by luck and nothing in CI knew.mutationjob — on the dailyscheduleandworkflow_dispatch, runsnpm run test:mutation:nightly→stryker.nightly.config.mjs: the default merge-decision set ofstryker.config.mjs, no incremental file,break: 95(main reaches 96 with six equivalent survivors). Per-file tally in the step summary;reports/mutation/uploaded as an artifact. The schedule trigger already existed and gated nothing extra. This is the single-shard form of [quality] Gate proposal: scheduled Stryker run over the whole src/ tree (five advisory shards) #594; the whole-tree five-shard matrix (5+ h of runner time nightly) is declined for now.__tests__/worker/entryPoints.test.ts—src/server/worker.tsis excluded from both coverage runs because it only executes inside workerd, soscheduled(),queue()anddeferViaQueueshipped untested and no number moved ([quality] worker.ts scheduled(), queue consumer and deferViaQueue run under no test (unit excludes the file; miniflare suite only drives fetch()) #629). The guard parses the file's default-export handlers, Hono routes and top-level functions, requires each to be listed with the evidence in__tests__/workerthat drives it, and requires that evidence to be present. A new entry point or a deleted driver fails the unit run. Same pattern ascoverageIgnoreHints.test.ts(test(coverage): guard the v8-ignore hints in src/ so each ignored arm keeps the unit test it names #601).docs/contributing.mdrecords both jobs and the new script.Fixes #594
Testing
npx eslint .github/workflows/test.yml stryker.nightly.config.mjs vitest.config.mjs __tests__/worker/entryPoints.test.ts docs/contributing.md package.json— passednpm run typecheck— passednpx vitest run __tests__/worker/entryPoints.test.ts __tests__/workflows.test.ts __tests__/runtime.test.ts __tests__/releaseWorkflows.test.ts __tests__/configurationDocs.test.ts— 5 files / 139 tests passedfunction orphan(): void {}toworker.tsfailslists every entry point with the test that drives it, and no other; revertednpx stryker run stryker.nightly.config.mjs --mutate src/utils/duration.ts— config loads, 32 mutants, exit 1 on 93.75 < 95 as designed (the full default set is at 96); the summarynode -escript rendered the table from the resultingreport.jsonnpm run test:shuffle— 228 files / 2722 passed, seed 1793408552616mutationjob itself only runs on schedule/dispatch; trigger it withgh workflow run test.ymlafter mergeChecklist
npm run allto lint and build my code — lint and typecheck run on the changed files; nosrc/changenpm run packand committeddist/— nosrc/change,dist/is unaffected