Skip to content

Fix AtomMachine selectors for emitted events - #141

Merged
SandroMaglione merged 1 commit into
mainfrom
codex/fix-atom-machine-emitted-selectors
Aug 19, 2026
Merged

Fix AtomMachine selectors for emitted events#141
SandroMaglione merged 1 commit into
mainfrom
codex/fix-atom-machine-emitted-selectors

Conversation

@SandroMaglione

Copy link
Copy Markdown
Member

Summary

  • preserve emitted-event types through AtomMachine.select, selectSnapshot, and matches
  • preserve root and child bridge channels across internal adapter helpers and ChildOf
  • cover emitting root machines from direct and bound factories, plus emitting child selectors

Changeset

  • Added or updated for a library or package-metadata change
  • Not required because this PR does not change src/ or package.json

Validation

  • pnpm check
  • Relevant example checks, when examples changed
  • Automated type-performance measurement passed or was not required
  • Automated runtime- and memory-performance measurement passed or was not required

No examples changed. Local type-performance budgets and the runtime/memory smoke test passed; the CI base-versus-PR reports are authoritative.

@github-actions

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.states (3 states) 3,039 3,039 0 (0.0%)
Machine.make (3 states, 2 events) 10,439 10,439 0 (0.0%)
machine.handle (3 states, 2 transitions) 53,788 53,788 0 (0.0%)
Machine.transition (10 named branches) 96,110 96,110 0 (0.0%)
Machine.invoke (state-dependent Effect) 60,766 60,766 0 (0.0%)
machine.handle (depth 24) 180,713 180,713 0 (0.0%)
machine.handle (wide depth 16) 211,923 211,923 0 (0.0%)
machine.handle (parallel/history/choice) 125,019 125,019 0 (0.0%)
machine definition (3 independent implementations) 125,049 125,049 0 (0.0%)
machine exact input/output/error/services 108,465 108,465 0 (0.0%)
execution adapter readiness 118,832 118,832 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.states (3 states) 2,984 2,984 0 (0.0%)
Machine.make (3 states, 2 events) 7,392 7,392 0 (0.0%)
machine.handle (3 states, 2 transitions) 43,349 43,349 0 (0.0%)
Machine.transition (10 named branches) 86,181 86,181 0 (0.0%)
Machine.invoke (state-dependent Effect) 51,920 51,920 0 (0.0%)
machine.handle (depth 24) 161,023 161,023 0 (0.0%)
machine.handle (wide depth 16) 193,232 193,232 0 (0.0%)
machine.handle (parallel/history/choice) 105,343 105,343 0 (0.0%)
machine definition (3 independent implementations) 109,503 109,503 0 (0.0%)
machine exact input/output/error/services 94,374 94,374 0 (0.0%)
execution adapter readiness 56,054 56,054 0 (0.0%)
Check times (informational)
Scenario Base PR
Effect only 0.02s 0.02s
Import effect-machine 0.02s 0.02s
Machine.states (3 states) 0.07s 0.06s
Machine.make (3 states, 2 events) 0.11s 0.10s
machine.handle (3 states, 2 transitions) 0.21s 0.21s
Machine.transition (10 named branches) 0.30s 0.31s
Machine.invoke (state-dependent Effect) 0.27s 0.27s
machine.handle (depth 24) 0.47s 0.44s
machine.handle (wide depth 16) 0.45s 0.46s
machine.handle (parallel/history/choice) 0.40s 0.40s
machine definition (3 independent implementations) 0.39s 0.38s
machine exact input/output/error/services 0.36s 0.34s
execution adapter readiness 0.36s 0.35s

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

@github-actions

Copy link
Copy Markdown
Contributor

Runtime performance

Median of 5 independent benchmark processes on AMD EPYC 9V74 80-Core Processor with Node v24.19.0.

Pull request baseline

Scenario Effect Machine
Plan counter transitions 109,609 transitions/s
Drain burst with terminal fence 330,298 increments/s
Drain burst with a change observer 313,561 increments/s
Lookup and send to one child 284,829 increments/s
Start and stop a machine 138,677 machines/s
Start and stop a parent with one child 41,210 families/s
Plan transitions through a compound state 100,391 transitions/s
Plan transitions through parallel regions 81,757 transitions/s
Drain burst through a compound state 276,062 events/s
Drain burst through two parallel regions 283,472 events/s
Drain a compound-state burst with a change observer 263,480 events/s

Process runtime reference points

Scenario Effect Machine
Start and stop a raw generic process 25,427 processes/s
Start and stop a raw compiled process 65,007 processes/s
Memory profile Effect Machine
Idle machine 1.8 KiB
Raw generic managed process 13.9 KiB
Raw compiled process 3.2 KiB
Two independent idle machines 3.4 KiB
Idle parent with one child 5.8 KiB
Parent with observed child registry 10.0 KiB
Parent with observed invoked child snapshots 6.3 KiB

Effect Machine change from base

Metric Base Base variability PR PR variability Difference
Plan counter transitions 108,855 transitions/s 0.6% MAD 109,609 transitions/s 1.4% MAD +0.7%
Drain burst with terminal fence 328,366 increments/s 0.5% MAD 330,298 increments/s 1.7% MAD +0.6%
Drain burst with a change observer 310,130 increments/s 0.3% MAD 313,561 increments/s 1.4% MAD +1.1%
Lookup and send to one child 281,750 increments/s 0.5% MAD 284,829 increments/s 1.0% MAD +1.1%
Start and stop a machine 138,122 machines/s 0.4% MAD 138,677 machines/s 0.7% MAD +0.4%
Start and stop a parent with one child 41,039 families/s 0.9% MAD 41,210 families/s 0.9% MAD +0.4%
Plan transitions through a compound state 99,166 transitions/s 0.3% MAD 100,391 transitions/s 1.0% MAD +1.2%
Plan transitions through parallel regions 81,376 transitions/s 0.7% MAD 81,757 transitions/s 1.1% MAD +0.5%
Drain burst through a compound state 277,069 events/s 0.5% MAD 276,062 events/s 0.1% MAD -0.4%
Drain burst through two parallel regions 286,759 events/s 0.4% MAD 283,472 events/s 0.9% MAD -1.1%
Drain a compound-state burst with a change observer 262,817 events/s 0.9% MAD 263,480 events/s 0.4% MAD +0.3%
Idle machine heap per unit 1.8 KiB 0.0% MAD 1.8 KiB 0.1% MAD +0.1%
Raw generic managed process heap per unit 13.9 KiB 0.0% MAD 13.9 KiB 0.0% MAD +0.0%
Raw compiled process heap per unit 3.2 KiB 0.0% MAD 3.2 KiB 0.1% MAD +0.0%
Two independent idle machines heap per unit 3.4 KiB 0.1% MAD 3.4 KiB 0.0% MAD -0.0%
Idle parent with one child heap per unit 5.8 KiB 0.0% MAD 5.8 KiB 0.0% MAD +0.0%
Parent with observed child registry heap per unit 10.0 KiB 0.0% MAD 10.0 KiB 0.0% MAD +0.0%
Parent with observed invoked child snapshots heap per unit 6.3 KiB 0.0% MAD 6.3 KiB 0.0% MAD +0.0%

Process runtime reference change from base

Metric Base Base variability PR PR variability Difference
Start and stop a raw generic process 25,246 processes/s 1.1% MAD 25,427 processes/s 0.6% MAD +0.7%
Start and stop a raw compiled process 65,261 processes/s 0.5% MAD 65,007 processes/s 0.3% MAD -0.4%

Regression guard

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

Versions and interpretation
  • Effect Machine: 0.16.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
SandroMaglione merged commit 7233677 into main Aug 19, 2026
13 checks passed
@SandroMaglione
SandroMaglione deleted the codex/fix-atom-machine-emitted-selectors branch August 19, 2026 03:42
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