Skip to content

Decompose machine semantic internals - #79

Merged
SandroMaglione merged 1 commit into
mainfrom
codex/machine-refactor-model-planner
Aug 10, 2026
Merged

Decompose machine semantic internals#79
SandroMaglione merged 1 commit into
mainfrom
codex/machine-refactor-model-planner

Conversation

@SandroMaglione

Copy link
Copy Markdown
Member

Summary

  • Split the internal model into topology, protocol, configuration, and serialization layers with an inward-only dependency direction.
  • Separate pure command collection, process-side command execution, semantic planning, and compiled execution-plan selection.
  • Extend the TypeScript-resolved architecture check to reject both runtime and type-only semantic-layer inversions.

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 (not applicable; no examples changed)
  • Reviewed the automated type-performance report, when the public TypeScript API or inference changed
  • Reviewed the automated runtime-performance report, when runtime behavior changed

@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.defineStates (3 states) 2,965 2,965 0 (0.0%)
Machine.make (3 states, 2 events) 8,715 8,715 0 (0.0%)
machine.handle (3 states, 2 transitions) 23,492 23,492 0 (0.0%)
machine.handle (depth 8) 117,075 117,075 0 (0.0%)
machine.handle (depth 12) 129,713 129,713 0 (0.0%)
machine.handle (depth 16) 145,055 145,055 0 (0.0%)
machine.handle (depth 24) 183,851 183,851 0 (0.0%)
machine.handle (wide depth 16) 214,189 214,189 0 (0.0%)
machine.handle (parallel/history/choice) 132,667 132,667 0 (0.0%)
machine.handle (4 successive calls) 128,674 128,674 0 (0.0%)
machine exact input/output/error/services 110,584 110,584 0 (0.0%)
execution adapter readiness 127,854 127,854 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.defineStates (3 states) 2,910 2,910 0 (0.0%)
Machine.make (3 states, 2 events) 5,742 5,742 0 (0.0%)
machine.handle (3 states, 2 transitions) 14,777 14,777 0 (0.0%)
machine.handle (depth 8) 109,601 109,601 0 (0.0%)
machine.handle (depth 12) 121,039 121,039 0 (0.0%)
machine.handle (depth 16) 135,181 135,181 0 (0.0%)
machine.handle (depth 24) 171,577 171,577 0 (0.0%)
machine.handle (wide depth 16) 202,224 202,224 0 (0.0%)
machine.handle (parallel/history/choice) 114,331 114,331 0 (0.0%)
machine.handle (4 successive calls) 113,703 113,703 0 (0.0%)
machine exact input/output/error/services 100,670 100,670 0 (0.0%)
execution adapter readiness 102,092 102,092 0 (0.0%)
Check times (informational)
Scenario Base PR
Effect only 0.03s 0.03s
Import effect-machine 0.03s 0.03s
Machine.defineStates (3 states) 0.10s 0.10s
Machine.make (3 states, 2 events) 0.14s 0.15s
machine.handle (3 states, 2 transitions) 0.23s 0.21s
machine.handle (depth 8) 0.48s 0.48s
machine.handle (depth 12) 0.53s 0.53s
machine.handle (depth 16) 0.56s 0.55s
machine.handle (depth 24) 0.63s 0.65s
machine.handle (wide depth 16) 0.73s 0.69s
machine.handle (parallel/history/choice) 0.58s 0.60s
machine.handle (4 successive calls) 0.51s 0.53s
machine exact input/output/error/services 0.48s 0.47s
execution adapter readiness 0.57s 0.54s

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 Intel(R) Xeon(R) 6973P-C with Node v24.18.0.

Pull request baseline

Scenario Effect Machine XState 5 XState 6 alpha
Plan counter transitions 197,341 transitions/s 184,121 transitions/s 24,472 transitions/s
Drain burst with terminal fence 933,362 increments/s 594,142 increments/s 242,589 increments/s
Drain burst with a change observer 867,240 increments/s 585,029 increments/s 242,831 increments/s
Lookup and send to one child 803,936 increments/s 575,490 increments/s 234,487 increments/s
Start and stop a machine 273,224 machines/s 260,485 machines/s 200,965 machines/s
Start and stop a parent with one child 74,716 families/s 99,621 families/s 66,103 families/s
Plan transitions through a compound state 180,127 transitions/s
Plan transitions through parallel regions 143,161 transitions/s
Drain burst through a compound state 924,737 events/s 495,022 events/s 241,374 events/s
Drain burst through two parallel regions 829,452 events/s 389,238 events/s 199,006 events/s
Drain a compound-state burst with a change observer 821,474 events/s

Effect runtime reference points

Scenario Effect Machine Effect runtime primitives
Start and stop a raw generic process 47,592 processes/s
Start and stop a raw compiled process 116,836 processes/s
Start and interrupt a suspended fiber 263,366 fibers/s
Start and stop a queue worker 188,964 workers/s
Start and stop an actor shell 169,205 actors/s
Start and stop two actor shells 99,069 families/s
Update an owner-only mutable snapshot 543,183,053 updates/s
Update a synchronized snapshot 2,703,287 updates/s
Create, resolve, and await a terminal latch 2,658,980 latches/s
Memory profile Effect Machine XState 5 XState 6 alpha Effect runtime primitives
Idle machine 1.5 KiB 3.8 KiB 2.2 KiB
Raw generic managed process 12.1 KiB
Raw compiled process 2.6 KiB
Two independent idle machines 2.9 KiB 7.3 KiB 3.9 KiB
Idle parent with one child 4.8 KiB 5.5 KiB 4.0 KiB
Parent with observed child registry 9.0 KiB
Parent with observed invoked child snapshots 5.0 KiB
Suspended Effect fiber 0.6 KiB
Effect queue with waiting fiber 2.8 KiB
Effect mailbox actor shell 3.2 KiB
Two Effect actor shells 6.8 KiB

Effect Machine change from base

Metric Base Base variability PR PR variability Difference
Plan counter transitions 174,679 transitions/s 6.3% MAD 197,341 transitions/s 1.8% MAD +13.0%
Drain burst with terminal fence 958,170 increments/s 5.5% MAD 933,362 increments/s 3.3% MAD -2.6%
Drain burst with a change observer 916,389 increments/s 2.3% MAD 867,240 increments/s 4.8% MAD -5.4%
Lookup and send to one child 802,736 increments/s 2.3% MAD 803,936 increments/s 1.5% MAD +0.1%
Start and stop a machine 282,486 machines/s 1.9% MAD 273,224 machines/s 3.4% MAD -3.3%
Start and stop a parent with one child 77,676 families/s 0.8% MAD 74,716 families/s 5.3% MAD -3.8%
Plan transitions through a compound state 183,289 transitions/s 0.6% MAD 180,127 transitions/s 5.1% MAD -1.7%
Plan transitions through parallel regions 142,146 transitions/s 0.9% MAD 143,161 transitions/s 4.6% MAD +0.7%
Drain burst through a compound state 946,085 events/s 1.3% MAD 924,737 events/s 6.2% MAD -2.3%
Drain burst through two parallel regions 842,681 events/s 1.7% MAD 829,452 events/s 4.9% MAD -1.6%
Drain a compound-state burst with a change observer 803,879 events/s 1.0% MAD 821,474 events/s 5.9% MAD +2.2%
Idle machine heap per unit 1.5 KiB 0.2% MAD 1.5 KiB 0.2% MAD -0.5%
Raw generic managed process heap per unit 12.1 KiB 0.1% MAD 12.1 KiB 0.0% MAD -0.2%
Raw compiled process heap per unit 2.6 KiB 0.0% MAD 2.6 KiB 0.1% MAD -0.2%
Two independent idle machines heap per unit 2.9 KiB 0.0% MAD 2.9 KiB 0.0% MAD -0.2%
Idle parent with one child heap per unit 4.8 KiB 0.0% MAD 4.8 KiB 0.0% MAD -0.1%
Parent with observed child registry heap per unit 9.0 KiB 0.2% MAD 9.0 KiB 0.2% MAD -0.1%
Parent with observed invoked child snapshots heap per unit 5.0 KiB 0.2% MAD 5.0 KiB 0.0% MAD -0.4%

Effect runtime reference change from base

Metric Base Base variability PR PR variability Difference
Start and stop a raw generic process 47,313 processes/s 2.6% MAD 47,592 processes/s 0.6% MAD +0.6%
Start and stop a raw compiled process 117,028 processes/s 0.5% MAD 116,836 processes/s 0.7% MAD -0.2%
Start and interrupt a suspended fiber 261,028 fibers/s 0.7% MAD 263,366 fibers/s 1.8% MAD +0.9%
Start and stop a queue worker 188,466 workers/s 0.6% MAD 188,964 workers/s 1.1% MAD +0.3%
Start and stop an actor shell 174,948 actors/s 1.0% MAD 169,205 actors/s 3.9% MAD -3.3%
Start and stop two actor shells 108,980 families/s 0.6% MAD 99,069 families/s 2.6% MAD -9.1%
Update an owner-only mutable snapshot 542,888,166 updates/s 0.1% MAD 543,183,053 updates/s 0.2% MAD +0.1%
Update a synchronized snapshot 2,706,243 updates/s 1.4% MAD 2,703,287 updates/s 2.5% MAD -0.1%
Create, resolve, and await a terminal latch 2,618,144 latches/s 0.3% MAD 2,658,980 latches/s 0.5% MAD +1.6%
Versions and interpretation
  • Effect Machine: 0.3.0
  • XState 5: 5.32.5
  • XState 6 alpha: 6.0.0-alpha.31
  • Effect runtime primitives: 4.0.0-beta.107

Higher throughput is better; lower heap is better. Variability is the median absolute deviation across independent processes, relative to their median. Runtime measurements on shared GitHub-hosted hardware remain informational, so small differences should be confirmed across multiple workflow runs.

@SandroMaglione
SandroMaglione merged commit 881575b into main Aug 10, 2026
9 checks passed
@SandroMaglione
SandroMaglione deleted the codex/machine-refactor-model-planner branch August 10, 2026 11:19
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