What Becomes True
March 2026
In April 2024 I wrote a small note to myself:
a tool for making tools.
As a software engineer, I build tools constantly. Tools exist so people can do things they otherwise could not — or could only do painfully. Programming itself is such a tool, but it carries a recursive dependency: to make tools, one must first learn programming.
A hammer does not make everyone a carpenter, and programming does not make everyone a toolmaker. The question was simple enough to sound naïve:
Could a system allow people to build tools without first learning to program?
This became ctxl. It did not begin as architecture. It began as prompts.
The early versions chained LLM prompts together. With sufficient context and carefully inserted data, outcomes became repeatable and useful. The generative capability was undeniable.
But configuration became the problem. Users were effectively programming without syntax, without types, without feedback. Success depended on discovering invisible structure: which prompts mattered, which examples stabilized behavior, which evaluations actually measured something real. We had not eliminated programming. We had obscured it.
The difficulty was not generating answers. The difficulty was discovering what the system should be trying to do.
Software engineering contains a clue here. We trust systems not because we describe their procedures, but because we describe their expectations. Tests measure outcomes; they do not prescribe methods.
LLM evaluation follows the same pattern. When outputs can be scored — especially through classification — iteration becomes empirical. The system improves not because it is instructed more carefully, but because differences become measurable.
The small realization was that objectives are easier to state than solutions. If a system began with an objective and constructed its own tasks, measures, and refinements through interaction, perhaps the configuration burden could shift. Prompts stopped being commands and became affordances — suggestions offered by the system to help the user think. Programming, viewed this way, is not instruction writing. It is affordance construction.
Around this time I noticed that several games had already discovered this pattern.
The original A Dark Room begins almost empty — a cold fire and a single button. Nothing transitions. The interface simply accumulates meaning. Systems appear gradually, as if uncovered rather than introduced. Reading the source reveals a discipline: each event has its own availability predicate against global state. The game does not advance. It becomes true.
Papers, Please exposes structure directly. Rules are explicit, mechanical, bureaucratic. Yet meaning emerges from interpreting those rules in context. Truth is negotiated through affordances.
Outer Wilds barely changes its world at all. Progress exists entirely within the player’s understanding.
Factorio goes further: the player builds systems until the systems begin shaping the player’s thinking. Optimization yields to stability. The factory stops being something you command and becomes something you maintain — an ecology of constraints that teaches you how it wants to exist.
Across these experiences, agency shifts. Progress stops feeling like movement through authored space and begins to feel like alignment with an already-present reality. You are not advancing. You are learning how the world works.
This pattern appears repeatedly outside games as well. Blackboard AI imagined shared reasoning spaces where solutions emerged opportunistically. Tuple spaces coordinated processes through shared environments. Functional reactive programming described behavior as recomputation over changing facts. Artificial life showed complex structure arising from local interaction.
Each approach reached toward the same idea, and each failed for similar reasons: the environment could not interpret ambiguity. Coordination required orchestration because participants could not reason meaningfully about open-ended state. Language models quietly change this condition. Their most important property is not intelligence but tolerance for partial structure — they can interpret traces left by others without rigid schemas — and this made it possible to push the constraint further.
The sixth version of sync removed direct state mutation entirely.
An agent arriving in an empty room cannot write state. It cannot seed configuration. It cannot “set up” the world. It can do only two unilateral things:
- register an action — a proposed write capability
- register a view — a proposed read capability
Vocabulary construction is the only unilateral act. Everything else is collaborative. This produces a specific property: progressive disclosure becomes implicit. Actions are what changes what you can see. There is no setup phase and no privileged orchestrator. The first agent to arrive is not a god; it is simply an agent that proposes vocabulary first.
The consequences only became clear once agents began inhabiting rooms under this constraint.
In one early session, two agents arrived independently, each tasked with proposing a solution to a shared question. Both registered actions writing to the same key: _shared.answer.
The first registration succeeded.
The second also succeeded — but returned a warning: competing write targets. A synthetic view, _contested, became non-empty. The room’s help suggestions now included contested_actions.
Nothing broke. Nothing was blocked. The room simply held both proposals visibly.
This was deliberate. The system does not resolve conflict silently. It surfaces tension and names it.
The two agents read the updated context. Each could see that the other wrote to _shared.answer. Each saw the _contested view. Each saw invocation statistics on the other’s action.
One sent a directed message: