Blog

Spooky Reaction At A Distance

Phase One 5 Jun 2026

One of the quiet superpowers of Program is that when you are writing a piece of code, you only have to think about the local part in front of you. The long-range effects, the way a small change has to ripple out to the rest of the application, are the system's problem, not yours. You write modular, composable code, and the wiring that would normally connect it all up just isn't there to write.

In the downward direction this is familiar: state flows down through calculations into the interface, and that is what every reactive framework already does well. The trouble has always been the other direction, getting a change made in the interface back up into the source of truth. That is where the field fragments into a hundred patterns and libraries, all solving the same problem slightly differently.

The observation Program is built on is this: the upward direction can flow back through the very same code paths that the downward direction already established. You laid out a path from state to screen on the way down; the way back up is just that path run in reverse. There is nothing new to wire; the route already exists.

state calculation interface down up, the same path, reversed
The downward path and the upward path are the same path; the reverse just runs it backwards.

This is the "spooky" part: you change something in one little component, and a value several layers away updates, with no apparent connection between them in your code. There is no real action at a distance, the change simply travelled the path backwards, but locally it can feel like magic, in the good way.

The catch worth naming

There is an honest caveat. Run all these reverses backwards and the changes fan out into a tree, from one interaction down to the pieces of state it touches. As long as that stays a tree, everything is clean. If two branches reach round and write the same state with conflicting values, it is no longer a tree but a graph, and that is a genuine problem, and a long-range one, exactly the kind that is hard to reason about by hand. In practice it is rare; programs with interfaces are not usually shaped that way. The plan is to catch it with a checker that looks at the program as a whole, so you never have to trace every reverse by hand to be sure. That part is still active research.

← Back to the blog