Skip to content

Add consumer machine type extractors - #150

Merged
SandroMaglione merged 1 commit into
mainfrom
codex/add-consumer-type-extractors
Aug 19, 2026
Merged

Add consumer machine type extractors#150
SandroMaglione merged 1 commit into
mainfrom
codex/add-consumer-type-extractors

Conversation

@SandroMaglione

Copy link
Copy Markdown
Member

Summary

  • add Machine.Value and Machine.SnapshotAt for definition- or machine-bound state extraction
  • allow Machine.Snapshot to extract from either typeof States or typeof machine
  • make Machine.Machine.Input return decoded startup input, with InputSchema retaining schema access
  • document canonical consumer annotations and rejected transition-context extraction patterns

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

Local validation also confirmed unchanged Pokémon type instantiations and negligible Playground impact from adopting the new public extractors.

@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,759 10,759 0 (0.0%)
machine.handle (3 states, 2 transitions) 28,192 28,192 0 (0.0%)
fluent transition (10 named branches) 106,006 106,006 0 (0.0%)
fluent invocation (state-dependent Effect) 92,756 92,756 0 (0.0%)
machine.handle (depth 24) 192,588 192,588 0 (0.0%)
machine.handle (wide depth 16) 220,950 220,950 0 (0.0%)
machine.handle (parallel/history/choice) 128,389 128,389 0 (0.0%)
machine definition (3 independent implementations) 127,342 127,342 0 (0.0%)
machine exact input/output/error/services 113,853 113,924 +71 (+0.1%)
execution adapter readiness 118,896 118,896 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,712 7,712 0 (0.0%)
machine.handle (3 states, 2 transitions) 17,433 17,433 0 (0.0%)
fluent transition (10 named branches) 95,757 95,757 0 (0.0%)
fluent invocation (state-dependent Effect) 83,491 83,491 0 (0.0%)
machine.handle (depth 24) 171,892 171,892 0 (0.0%)
machine.handle (wide depth 16) 201,461 201,461 0 (0.0%)
machine.handle (parallel/history/choice) 108,126 108,126 0 (0.0%)
machine definition (3 independent implementations) 111,373 111,373 0 (0.0%)
machine exact input/output/error/services 99,342 99,413 +71 (+0.1%)
execution adapter readiness 89,084 89,084 0 (0.0%)
Check times (informational)
Scenario Base PR
Effect only 0.03s 0.03s
Import effect-machine 0.03s 0.03s
Machine.states (3 states) 0.11s 0.11s
Machine.make (3 states, 2 events) 0.17s 0.17s
machine.handle (3 states, 2 transitions) 0.27s 0.26s
fluent transition (10 named branches) 0.52s 0.51s
fluent invocation (state-dependent Effect) 0.53s 0.50s
machine.handle (depth 24) 0.82s 0.82s
machine.handle (wide depth 16) 0.85s 0.83s
machine.handle (parallel/history/choice) 0.65s 0.64s
machine definition (3 independent implementations) 0.67s 0.64s
machine exact input/output/error/services 0.58s 0.59s
execution adapter readiness 0.60s 0.58s

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.19.0.

Pull request baseline

Scenario Effect Machine
Plan counter transitions 175,799 transitions/s
Drain burst with terminal fence 578,617 increments/s
Drain burst with a change observer 537,287 increments/s
Lookup and send to one child 489,963 increments/s
Start and stop a machine 225,225 machines/s
Start and stop a parent with one child 65,041 families/s
Plan transitions through a compound state 156,042 transitions/s
Plan transitions through parallel regions 125,171 transitions/s
Drain burst through a compound state 466,969 events/s
Drain burst through two parallel regions 462,513 events/s
Drain a compound-state burst with a change observer 437,855 events/s

Process runtime reference points

Scenario Effect Machine
Start and stop a raw generic process 44,707 processes/s
Start and stop a raw compiled process 104,210 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.4 KiB

Effect Machine change from base

Metric Base Base variability PR PR variability Difference
Plan counter transitions 186,279 transitions/s 0.6% MAD 175,799 transitions/s 2.7% MAD -5.6%
Drain burst with terminal fence 602,159 increments/s 5.1% MAD 578,617 increments/s 3.1% MAD -3.9%
Drain burst with a change observer 527,535 increments/s 4.3% MAD 537,287 increments/s 1.6% MAD +1.8%
Lookup and send to one child 499,353 increments/s 1.8% MAD 489,963 increments/s 0.2% MAD -1.9%
Start and stop a machine 221,141 machines/s 2.6% MAD 225,225 machines/s 2.5% MAD +1.8%
Start and stop a parent with one child 65,240 families/s 1.5% MAD 65,041 families/s 3.1% MAD -0.3%
Plan transitions through a compound state 146,791 transitions/s 2.4% MAD 156,042 transitions/s 2.0% MAD +6.3%
Plan transitions through parallel regions 121,094 transitions/s 3.7% MAD 125,171 transitions/s 1.5% MAD +3.4%
Drain burst through a compound state 429,361 events/s 5.5% MAD 466,969 events/s 1.8% MAD +8.8%
Drain burst through two parallel regions 445,634 events/s 2.0% MAD 462,513 events/s 3.2% MAD +3.8%
Drain a compound-state burst with a change observer 435,140 events/s 2.4% MAD 437,855 events/s 1.3% MAD +0.6%
Idle machine heap per unit 1.8 KiB 0.1% 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.3% MAD 3.2 KiB 0.0% MAD -0.0%
Two independent idle machines heap per unit 3.4 KiB 0.1% MAD 3.4 KiB 0.0% MAD -0.1%
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.4 KiB 0.0% MAD 6.4 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 44,142 processes/s 6.0% MAD 44,707 processes/s 2.2% MAD +1.3%
Start and stop a raw compiled process 101,482 processes/s 5.2% MAD 104,210 processes/s 0.8% MAD +2.7%

Regression guard

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

Versions and interpretation
  • Effect Machine: 0.17.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 9e54de3 into main Aug 19, 2026
13 checks passed
@SandroMaglione
SandroMaglione deleted the codex/add-consumer-type-extractors branch August 19, 2026 14:03
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