Skip to content

Add interactive text machine visualizer - #168

Draft
SandroMaglione wants to merge 9 commits into
mainfrom
codex/interactive-text-visualizer
Draft

Add interactive text machine visualizer#168
SandroMaglione wants to merge 9 commits into
mainfrom
codex/interactive-text-visualizer

Conversation

@SandroMaglione

@SandroMaglione SandroMaglione commented Aug 23, 2026

Copy link
Copy Markdown
Member

Summary

  • Add a local Vite prototype that projects public machine inspection data into a serializable visualization document.
  • Keep the main tree focused on state topology, with initial, active, structural, transition-count, and activity-count markers.
  • Move outgoing transitions, incoming transitions, branches, updates, activities, and event registrations into a structured inspector.
  • Add breadcrumb, source, target, update-owner, enabled-event, and active-state navigation.
  • Add accessible tree semantics and keyboard navigation without bringing in a UI dependency.
  • Accept ready, partial, and error sources so a later scanner can retain useful topology while a machine is incomplete.
  • Adopt an Effect-style pnpm workspace: the published library now lives under packages/effect-machine, while the private prototype lives under packages/devtools.
  • Keep devtools implementation modules internal, block internal package exports, and enforce the package boundary with an architecture check.

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
  • pnpm visualizer:build
  • pnpm perf:types
  • Automated runtime- and memory-performance measurement passed or was not required

Browser verification covered state-only rendering, full-subtree selection, collapse and expand behavior, active-state reveal, enabled-event inspection, transition target navigation, related-state highlighting, keyboard focus movement, text-selection prevention, clearing the current inspection, and a clean browser console after the package extraction.

@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,787 10,787 0 (0.0%)
machine.handle (3 states, 2 transitions) 28,551 28,551 0 (0.0%)
fluent transition (10 named branches) 122,775 122,775 0 (0.0%)
fluent invocation (state-dependent Effect) 108,429 108,429 0 (0.0%)
machine.handle (depth 24) 207,970 207,970 0 (0.0%)
machine.handle (wide depth 16) 236,332 236,332 0 (0.0%)
machine.handle (parallel/history/choice) 144,812 144,812 0 (0.0%)
machine definition (3 independent implementations) 143,617 143,617 0 (0.0%)
machine exact input/output/error/services 129,873 129,873 0 (0.0%)
execution adapter readiness 136,469 136,469 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,740 7,740 0 (0.0%)
machine.handle (3 states, 2 transitions) 17,764 17,764 0 (0.0%)
fluent transition (10 named branches) 112,498 112,498 0 (0.0%)
fluent invocation (state-dependent Effect) 99,018 99,018 0 (0.0%)
machine.handle (depth 24) 187,474 187,474 0 (0.0%)
machine.handle (wide depth 16) 217,043 217,043 0 (0.0%)
machine.handle (parallel/history/choice) 124,167 124,167 0 (0.0%)
machine definition (3 independent implementations) 127,576 127,576 0 (0.0%)
machine exact input/output/error/services 115,217 115,217 0 (0.0%)
execution adapter readiness 106,299 106,299 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.21s 0.17s
machine.handle (3 states, 2 transitions) 0.28s 0.27s
fluent transition (10 named branches) 0.59s 0.59s
fluent invocation (state-dependent Effect) 0.56s 0.57s
machine.handle (depth 24) 0.89s 0.88s
machine.handle (wide depth 16) 0.90s 0.90s
machine.handle (parallel/history/choice) 0.70s 0.71s
machine definition (3 independent implementations) 0.70s 0.72s
machine exact input/output/error/services 0.67s 0.67s
execution adapter readiness 0.68s 0.66s

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) Platinum 8370C CPU @ 2.80GHz with Node v24.19.0.

Pull request baseline

Scenario Effect Machine
Plan counter transitions 115,618 transitions/s
Drain burst with terminal fence 363,278 increments/s
Drain burst with a change observer 343,571 increments/s
Lookup and send to one child 302,303 increments/s
Start and stop a machine 137,043 machines/s
Start and stop a parent with one child 37,954 families/s
Plan transitions through a compound state 101,989 transitions/s
Plan transitions through parallel regions 84,145 transitions/s
Drain burst through a compound state 289,774 events/s
Drain burst through two parallel regions 284,430 events/s
Drain a compound-state burst with a change observer 274,591 events/s

Process runtime reference points

Scenario Effect Machine
Start and stop a raw generic process 23,478 processes/s
Start and stop a raw compiled process 63,259 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 114,157 transitions/s 1.7% MAD 115,618 transitions/s 1.9% MAD +1.3%
Drain burst with terminal fence 365,249 increments/s 0.6% MAD 363,278 increments/s 1.3% MAD -0.5%
Drain burst with a change observer 345,822 increments/s 1.3% MAD 343,571 increments/s 1.6% MAD -0.7%
Lookup and send to one child 301,665 increments/s 0.4% MAD 302,303 increments/s 1.3% MAD +0.2%
Start and stop a machine 134,590 machines/s 3.0% MAD 137,043 machines/s 1.8% MAD +1.8%
Start and stop a parent with one child 37,132 families/s 0.6% MAD 37,954 families/s 2.3% MAD +2.2%
Plan transitions through a compound state 101,235 transitions/s 1.2% MAD 101,989 transitions/s 1.5% MAD +0.7%
Plan transitions through parallel regions 85,931 transitions/s 1.3% MAD 84,145 transitions/s 1.1% MAD -2.1%
Drain burst through a compound state 293,066 events/s 0.9% MAD 289,774 events/s 0.8% MAD -1.1%
Drain burst through two parallel regions 295,979 events/s 0.4% MAD 284,430 events/s 1.2% MAD -3.9%
Drain a compound-state burst with a change observer 279,066 events/s 0.9% MAD 274,591 events/s 0.9% MAD -1.6%
Idle machine heap per unit 1.8 KiB 0.2% MAD 1.8 KiB 0.2% MAD +0.5%
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.0% MAD +0.0%
Two independent idle machines heap per unit 3.4 KiB 0.0% 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.1%

Process runtime reference change from base

Metric Base Base variability PR PR variability Difference
Start and stop a raw generic process 23,632 processes/s 2.2% MAD 23,478 processes/s 1.3% MAD -0.7%
Start and stop a raw compiled process 64,604 processes/s 4.0% MAD 63,259 processes/s 1.9% MAD -2.1%

Regression guard

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

Versions and interpretation
  • Effect Machine: 0.22.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.

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