Repository navigation
Serve planned snapshots from machine atoms on the server and hydrate MachineState without suspending - #239
Merged
Conversation
Every AtomMachine bridge atom now declares an Effect Atom server value derived from one lazily planned startup snapshot per bridge, so server reads never start a machine. MachineState renders through useSyncExternalStore without suspending, hydrating the planned snapshot into the live machine without remounting form inputs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHnF2EL6ReDTKwoM9TVH7L
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHnF2EL6ReDTKwoM9TVH7L
Contributor
Type performanceMeasured with TypeScript 6.0.3 and
Marginal instantiations are measured against the matching setup without that API call:
Check times (informational)
Type instantiations are the comparison metric. Check time varies with runner load and is informational only. |
Contributor
Runtime performanceMedian of 5 independent benchmark processes on Pull request baseline
Process runtime reference points
Effect Machine change from base
Process runtime reference change from base
Regression guardNo large, noise-adjusted throughput or heap regressions detected. Versions and interpretation
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. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MHnF2EL6ReDTKwoM9TVH7L
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
AtomMachinebridge atom on the server (Atom.getServerValue, and therefore the server render of@effect/atom-reacthooks) no longer starts the machine. Every exported atom now carries an Effect Atom server value derived from one lazily computed, cached startup plan per bridge (generic plannerplanInitialSync; resumed bridges use their normalized resumed snapshot). Client starts never compute the plan.ref,send,stop:Initialsnapshot:Success({ status: "active", state }), waiting (donewhen the plan completes)result:Success(state), waitingselect/selectSnapshot/matches/can: projection of the planned state, waitingchild(Child):Success(Option.some(childState))when the planned parent configuration invokes the fixed descriptor (same entry order, entry context and synchronousinputmapper as the runtime), otherwiseSuccess(Option.none()); child projections followfamily/familyChildprojections: server value of the projected bridge atomInitial, never a defectMachineState(react) no longer suspends. It reads throughuseSyncExternalStore(server snapshot = the atom's server value), so SSR and hydration render the planned snapshot and the same tree then receives live snapshots: inputs keep their DOM node, text and focus. New optionalpendingprop renders before any snapshot exists; once a snapshot has rendered it is kept while the machine is still starting (e.g. a bound runtime layer still building after hydration). Failures still throw to the nearest error boundary.effect-atom-react.mdserver-rendering semantics, Provider/Suspense guidance and a new "Server rendering and hydration" section; react README updated.Changeset
@typeonce/effect-machineand@typeonce/effect-machine-react)Validation
pnpm check(all steps;format:checkrun locally with the same dprint plugin versions on changed files because the plugin download is blocked in the local environment)Generated by Claude Code