Skip to content

Refresh the dependency baseline to Effect 4.1.1 - #256

Merged
SandroMaglione merged 3 commits into
mainfrom
dependency-baseline-refresh
Nov 1, 2026
Merged

SandroMaglione merged 3 commits into
mainfrom
dependency-baseline-refresh

Conversation

@SandroMaglione

@SandroMaglione SandroMaglione commented Nov 1, 2026 •

Copy link
Copy Markdown
Member

Summary

Refreshes the development dependency baseline. Published Effect ranges stay ^4.0.0.

Dependency From To Where
effect, @effect/vitest, @effect/atom-react 4.0.0 4.1.1 root and package devDependencies
@effect/platform-* (resolved) 4.0.0 4.1.1 pnpm-workspace.yaml overrides, with all six Effect overrides at 4.1.1
vite 8.1.5 8.3.5 root devDependency
vitest 5.0.1 5.0.5 root, core, react, oxlint-plugin
tstyche 7.2.1 7.2.5 root, core, react
dprint 0.55.2 0.64.3 root (plugin versions in dprint.json unchanged; pnpm format produced no changes)
@types/node 25.7.0 26.6.6 root, core, devtools (no type errors)
jsdom 27.2.0 30.1.3 react
react, react-dom 19.2.7 19.3.1 react devDependencies
chokidar 4.0.3 6.0.0 devtools runtime dependency
@oxlint/plugins 1.80.0 1.90.0 oxlint-plugin runtime dependency (types only at runtime; dist never imports it)
oxlint 1.80.0 1.90.0 oxlint-plugin devDependency

Notes:

  • chokidar 6: a rewrite that requires Node.js >= 22.22. The devtools engines.node therefore goes from >=22.19.0 to >=22.22.0, and the README line moves with it. The watcher options now use the v6 names: backend: "polling" | "auto" replaces the deprecated usePolling, and pollingInterval replaces the deprecated interval (second commit, with an updated DevServer unit test). devtools:pack-check runs the installed CLI with --watch-polling and verifies live reload.
  • Oxlint plugin: the oxlint peer range stays >=1.80.0 <2, so consumers on oxlint 1.82 are unaffected. oxlint-plugin:pack-check still installs the packed plugin next to oxlint 1.80.0 (the floor of the peer range), so the 1.90-built plugin is verified against the oldest supported host.
  • Left alone: the devtools vite/typescript runtime entries are owned by Let devtools reuse compatible TypeScript and Vite installs #254, which turns them into ranges. Until then the lockfile carries both vite 8.1.5 (devtools) and 8.3.5 (root). scheduler and its peer range are owned by Remove the unused scheduler peer from the React package #253. react-dom 19.3.1 brings its own scheduler 0.28, and the React package source never imports scheduler.
  • Expected conflicts: pnpm-lock.yaml will conflict with Remove the unused scheduler peer from the React package #253, Let devtools reuse compatible TypeScript and Vite installs #254, Check TypeScript 7 compatibility in pnpm check #255, and the oxlint port. packages/devtools/README.md touches the line right above Let devtools reuse compatible TypeScript and Vite installs #254's insertion. Regenerate the lockfile with pnpm install after rebasing.
  • Performance classifier fix: scripts/ci-changes.mjs merged dependencies, devDependencies, optionalDependencies, and peerDependencies into one map with peers last. The unchanged effect ^4.0.0 peer range therefore hid every Effect development bump, and the first push of this PR skipped both performance measurements. It now compares each section separately and has a regression test (third commit). Changing the classifier also triggers both workflows on this PR, so the Effect 4.1.1 bump gets measured.
  • latest-effect: I dry-ran scripts/prepare-effect-compatibility.mjs on a scratch copy of the new manifests. It resolves 4.1.1, rewrites nothing, and the manifests keep their formatting. Its unit test passes in check:ci.

Changeset

  • Added or updated for a library or package-metadata change
  • Not required because this PR does not change a publishable package

.changeset/dependency-baseline-refresh.md: patch for @typeonce/effect-machine-devtools (chokidar 6, Node.js 22.22) and @typeonce/oxlint-plugin-effect-machine (@oxlint/plugins 1.90.0, unchanged peer range). The fixed group releases all four packages together.

Validation

  • pnpm check passed in 2:39: 92 files / 901 tests, tstyche 41 files / 1334 assertions, consumer, all four pack checks (including the devtools CLI live reload on chokidar 6 and the Oxlint plugin diagnostic and fixer), docs, and architecture. I re-ran format:check, docs:site:check, check:ci (31/31), and devtools:pack-check after adding the engines bump and the changeset.
  • Automated type-performance measurement passed: all 26 instantiation scenarios unchanged (0.0%).
  • Automated runtime- and memory-performance measurement passed: "No large, noise-adjusted throughput or heap regressions detected". For example, plan counter +2.6% and compound-state observer burst -0.0%.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Type performance

Measured with TypeScript 6.0.3 and skipLibCheck=true.

Scenario Base PR Difference
Effect only 55 55 0 (0.0%)
Import effect-machine 55 55 0 (0.0%)
Machine.state (3 children) 2,664 2,664 0 (0.0%)
Machine.make (3 states, 2 events) 8,932 8,932 0 (0.0%)
machine.handle (3 states, 2 transitions) 39,449 39,449 0 (0.0%)
declared transition (10 named branches) 60,402 60,402 0 (0.0%)
atomic construction, guards, and reentry 85,710 85,710 0 (0.0%)
registered invocation (input-taking Effect) 39,819 39,819 0 (0.0%)
machine.handle (depth 24) 194,531 194,531 0 (0.0%)
machine.handle (wide depth 16) 218,238 218,238 0 (0.0%)
machine.handle (parallel/history/choice) 91,642 91,642 0 (0.0%)
machine definition (3 independent implementations) 99,173 99,173 0 (0.0%)
machine exact input/output/error/services 82,941 82,941 0 (0.0%)
execution adapter readiness 71,428 71,428 0 (0.0%)

Marginal instantiations are measured against the matching setup without that API call:

Scenario Base PR Difference
Import effect-machine 0 0 0
Machine.state (3 children) 2,609 2,609 0 (0.0%)
Machine.make (3 states, 2 events) 6,260 6,260 0 (0.0%)
machine.handle (3 states, 2 transitions) 30,517 30,517 0 (0.0%)
declared transition (10 named branches) 51,849 51,849 0 (0.0%)
atomic construction, guards, and reentry 70,370 70,370 0 (0.0%)
registered invocation (input-taking Effect) 32,682 32,682 0 (0.0%)
machine.handle (depth 24) 177,222 177,222 0 (0.0%)
machine.handle (wide depth 16) 201,707 201,707 0 (0.0%)
machine.handle (parallel/history/choice) 79,144 79,144 0 (0.0%)
machine definition (3 independent implementations) 88,492 88,492 0 (0.0%)
machine exact input/output/error/services 70,732 70,732 0 (0.0%)
execution adapter readiness 31,922 31,922 0 (0.0%)
Check times (informational)
Scenario Base PR
Effect only 0.03s 0.03s
Import effect-machine 0.03s 0.03s
Machine.state (3 children) 0.07s 0.07s
Machine.make (3 states, 2 events) 0.11s 0.13s
machine.handle (3 states, 2 transitions) 0.27s 0.25s
declared transition (10 named branches) 0.31s 0.32s
atomic construction, guards, and reentry 0.40s 0.43s
registered invocation (input-taking Effect) 0.25s 0.27s
machine.handle (depth 24) 0.50s 0.51s
machine.handle (wide depth 16) 0.57s 0.56s
machine.handle (parallel/history/choice) 0.42s 0.42s
machine definition (3 independent implementations) 0.44s 0.44s
machine exact input/output/error/services 0.42s 0.39s
execution adapter readiness 0.37s 0.35s

Type instantiations are the comparison metric. Check time varies with runner load and is informational only.

@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

Runtime performance

Median of 5 independent benchmark processes on AMD EPYC 7763 64-Core Processor with Node v24.22.1.

Pull request baseline

Scenario Effect Machine
Plan counter transitions 114,092 transitions/s
Drain burst with terminal fence 399,706 increments/s
Drain burst with a change observer 369,991 increments/s
Lookup and send to one child 290,247 increments/s
Start and stop a machine 119,403 machines/s
Start and stop a parent with one child 24,069 families/s
Complete an Effect invocation with tracing enabled 6,179 invocations/s
Complete an Effect invocation with tracing disabled 7,299 invocations/s
Plan transitions through a compound state 100,302 transitions/s
Plan transitions through parallel regions 80,254 transitions/s
Drain burst through a compound state 343,406 events/s
Drain burst through two parallel regions 316,393 events/s
Drain a compound-state burst with a change observer 314,991 events/s

Process runtime reference points

Scenario Effect Machine
Start and stop a raw generic process 22,737 processes/s
Start and stop a raw compiled process 67,810 processes/s
Memory profile Effect Machine
Idle machine 1.8 KiB
Raw generic managed process 11.4 KiB
Raw compiled process 3.1 KiB
Two independent idle machines 3.6 KiB
Idle parent with one child 6.0 KiB
Parent with observed child registry 9.6 KiB
Parent with observed invoked child snapshots 7.0 KiB

Effect Machine change from base

Metric Base Base variability PR PR variability Difference
Plan counter transitions 114,288 transitions/s 1.1% MAD 114,092 transitions/s 1.0% MAD -0.2%
Drain burst with terminal fence 398,774 increments/s 0.9% MAD 399,706 increments/s 0.5% MAD +0.2%
Drain burst with a change observer 369,766 increments/s 0.6% MAD 369,991 increments/s 0.4% MAD +0.1%
Lookup and send to one child 287,282 increments/s 0.3% MAD 290,247 increments/s 0.2% MAD +1.0%
Start and stop a machine 117,564 machines/s 0.8% MAD 119,403 machines/s 1.3% MAD +1.6%
Start and stop a parent with one child 23,770 families/s 0.2% MAD 24,069 families/s 0.4% MAD +1.3%
Complete an Effect invocation with tracing enabled 6,261 invocations/s 1.1% MAD 6,179 invocations/s 0.5% MAD -1.3%
Complete an Effect invocation with tracing disabled 7,438 invocations/s 0.9% MAD 7,299 invocations/s 0.9% MAD -1.9%
Plan transitions through a compound state 102,343 transitions/s 0.3% MAD 100,302 transitions/s 0.8% MAD -2.0%
Plan transitions through parallel regions 79,534 transitions/s 0.3% MAD 80,254 transitions/s 0.7% MAD +0.9%
Drain burst through a compound state 341,106 events/s 0.8% MAD 343,406 events/s 0.5% MAD +0.7%
Drain burst through two parallel regions 314,598 events/s 0.7% MAD 316,393 events/s 0.5% MAD +0.6%
Drain a compound-state burst with a change observer 315,904 events/s 0.1% MAD 314,991 events/s 0.3% MAD -0.3%
Idle machine heap per unit 1.9 KiB 0.8% MAD 1.8 KiB 0.6% MAD -0.7%
Raw generic managed process heap per unit 11.1 KiB 0.0% MAD 11.4 KiB 0.0% MAD +2.7%
Raw compiled process heap per unit 3.1 KiB 0.1% MAD 3.1 KiB 0.0% MAD +0.2%
Two independent idle machines heap per unit 3.6 KiB 0.2% MAD 3.6 KiB 0.2% MAD +0.4%
Idle parent with one child heap per unit 6.0 KiB 0.0% MAD 6.0 KiB 0.0% MAD +0.2%
Parent with observed child registry heap per unit 9.5 KiB 0.0% MAD 9.6 KiB 0.0% MAD +1.2%
Parent with observed invoked child snapshots heap per unit 6.9 KiB 0.0% MAD 7.0 KiB 0.0% MAD +1.1%

Process runtime reference change from base

Metric Base Base variability PR PR variability Difference
Start and stop a raw generic process 25,179 processes/s 1.2% MAD 22,737 processes/s 1.1% MAD -9.7%
Start and stop a raw compiled process 66,542 processes/s 1.1% MAD 67,810 processes/s 0.8% MAD +1.9%

Regression guard

No large, noise-adjusted throughput or heap regressions detected.

Versions and interpretation
  • Effect Machine: 0.46.0

Higher throughput is better; lower heap is better. Variability is the median absolute deviation across independent processes, relative to their median. Small differences on shared GitHub-hosted hardware remain informational; the required guard rejects only large changes beyond the measured noise allowance.

SandroMaglione and others added 3 commits November 1, 2026 17:21
Move the development baseline to Effect 4.1.1 (effect, @effect/vitest,
@effect/atom-react, and the @effect/platform-* overrides) while published
ranges stay ^4.0.0. Update Vite 8.3.5, Vitest 5.0.5, tstyche 7.2.5,
dprint 0.64.3, @types/node 26, jsdom 30, and the React 19.3.1 development
dependencies.

Update devtools to chokidar 6, which requires Node.js 22.22, and build the
Oxlint plugin against @oxlint/plugins and oxlint 1.90.0 while keeping its
oxlint >=1.80.0 <2 peer range.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Select the polling backend through backend instead of the deprecated
usePolling flag and set pollingInterval instead of the deprecated interval
alias.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The classifier merged every dependency section into one map, so the unchanged
effect peer range overwrote the changed development version and Effect bumps
skipped the type- and runtime-performance workflows. Compare each section
separately.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@SandroMaglione
SandroMaglione force-pushed the dependency-baseline-refresh branch from 02e4687 to 45c085a Compare November 1, 2026 09:23
@SandroMaglione
SandroMaglione merged commit 7d0e987 into main Nov 1, 2026
9 checks passed
@SandroMaglione
SandroMaglione deleted the dependency-baseline-refresh branch November 1, 2026 09:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant