Skip to content

Compact process supervision - #42

Merged
SandroMaglione merged 1 commit into
mainfrom
codex/compact-process-kernel
Aug 8, 2026
Merged

Compact process supervision#42
SandroMaglione merged 1 commit into
mainfrom
codex/compact-process-kernel

Conversation

@SandroMaglione

Copy link
Copy Markdown
Member

Summary

  • replace five persistent process-termination Deferreds and nested races with one arbitration signal plus the existing join completion
  • run the machine worker and a single supervisor as siblings so stop and failure reserve state, interrupt worker finalizers, and terminalize in one ordered path
  • preserve initialization self-stop, concurrent stop/completion/failure, frozen terminal snapshots, and external failure cleanup semantics
  • add focused external-failure lifecycle coverage and a patch changeset

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
  • Reviewed the automated type-performance report, when the public TypeScript API or inference changed
  • Reviewed the automated runtime-performance report, when runtime behavior changed

Three paired full local benchmark runs against the exact parent commit showed median memory changes of -27.8% for a raw managed process, -22.8% for an idle machine, -23.2% for two independent machines, -13.5% for a parent-child pair, and -12.0% for an observed parent-child pair. Machine and family lifecycle throughput improved by 5.9% and 4.4%; steady-state throughput remained neutral within run-to-run drift.

@github-actions

github-actions Bot commented Aug 8, 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.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.02s 0.02s
Import effect-machine 0.02s 0.02s
Machine.defineStates (3 states) 0.07s 0.07s
Machine.make (3 states, 2 events) 0.11s 0.11s
machine.handle (3 states, 2 transitions) 0.15s 0.17s
machine.handle (depth 8) 0.38s 0.34s
machine.handle (depth 12) 0.39s 0.39s
machine.handle (depth 16) 0.39s 0.40s
machine.handle (depth 24) 0.46s 0.45s
machine.handle (wide depth 16) 0.50s 0.48s
machine.handle (parallel/history/choice) 0.43s 0.40s
machine.handle (4 successive calls) 0.38s 0.39s
machine exact input/output/error/services 0.35s 0.35s
execution adapter readiness 0.43s 0.38s

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

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Runtime performance

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

Pull request baseline

Scenario Effect Machine XState 5 XState 6 alpha
Plan counter transitions 106,359 transitions/s 132,796 transitions/s 123,584 transitions/s
Drain burst with terminal fence 56,176 increments/s 400,195 increments/s 112,669 increments/s
Drain burst with a change observer 44,070 increments/s 396,286 increments/s 111,971 increments/s
Lookup and send to one child 50,703 increments/s 394,177 increments/s 107,518 increments/s
Start and stop a machine 11,001 machines/s 184,502 machines/s 73,443 machines/s
Start and stop a parent with one child 3,823 families/s 66,899 families/s 26,940 families/s
Memory profile Effect Machine XState 5 XState 6 alpha Effect runtime primitives
Idle machine 18.0 KiB 3.8 KiB 6.1 KiB
Raw managed process 13.3 KiB
Two independent idle machines 35.3 KiB 7.3 KiB 11.8 KiB
Idle parent with one child 63.7 KiB 5.5 KiB 8.8 KiB
Parent with observed child registry 72.5 KiB
Suspended Effect fiber 0.7 KiB
Effect queue with waiting fiber 2.8 KiB
Effect mailbox actor shell 3.2 KiB

Effect Machine change from base

Metric Base Base variability PR PR variability Difference
Plan counter transitions 110,589 transitions/s 1.3% MAD 106,359 transitions/s 0.6% MAD -3.8%
Drain burst with terminal fence 56,364 increments/s 1.7% MAD 56,176 increments/s 0.8% MAD -0.3%
Drain burst with a change observer 44,288 increments/s 0.3% MAD 44,070 increments/s 0.6% MAD -0.5%
Lookup and send to one child 50,299 increments/s 2.0% MAD 50,703 increments/s 0.4% MAD +0.8%
Start and stop a machine 10,195 machines/s 1.3% MAD 11,001 machines/s 2.2% MAD +7.9%
Start and stop a parent with one child 3,604 families/s 0.7% MAD 3,823 families/s 0.6% MAD +6.1%
Idle machine heap per unit 23.4 KiB 0.0% MAD 18.0 KiB 0.0% MAD -23.0%
Raw managed process heap per unit 18.4 KiB 0.0% MAD 13.3 KiB 0.0% MAD -27.8%
Two independent idle machines heap per unit 46.0 KiB 0.0% MAD 35.3 KiB 0.0% MAD -23.3%
Idle parent with one child heap per unit 73.7 KiB 0.0% MAD 63.7 KiB 0.0% MAD -13.6%
Parent with observed child registry heap per unit 82.6 KiB 0.0% MAD 72.5 KiB 0.0% MAD -12.2%
Versions and interpretation
  • Effect Machine: 0.3.0
  • XState 5: 5.32.5
  • XState 6 alpha: 6.0.0-alpha.27
  • Effect runtime primitives: 4.0.0-beta.105

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 7c8d86c into main Aug 8, 2026
9 checks passed
@SandroMaglione
SandroMaglione deleted the codex/compact-process-kernel branch August 8, 2026 12:54
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