Edit the running app, not its code
Last reviewed: July 2026.
Code-editing agents – Cursor, Aider, and their peers – operate on source-file text. The file system is their source of truth; the compiler catches their mistakes; the dev server's reload cycle is their feedback loop. That model is powerful and general, and for editing programs it is clearly right. For iteratively editing a running interface, it drags along costs the task doesn't need: every change is a text diff that can drift, every verification is a compile-and-restart, and the thing being edited (the live UI, with its state and history) is only indirectly related to the thing being touched (text files).
Fuaran splits the lifecycle so the AI never sees source at all:
- At rest, the app is typed source – human-authored, code-reviewed, version- controlled, compiled to the client bundle. Nothing unusual.
- In flight, the app is a live typed tree – and that is what the AI edits. It receives a wire snapshot of the current tree, emits typed operations against it, and the apply engine mutates the live structure, which re-renders. No file is parsed, generated, or rewritten during the session; the source on disk is exactly as the human last committed it.
- What persists is the operation stream – an append-only, hash-chained record of what the agent did, replayable to reconstruct any turn (see The interface as a value). The tree is derivable from the history; the history is the artefact.
The feedback loop changes character with the substrate. A text edit is verified by compiling and hoping; a typed operation is verified by the apply engine at the moment of application, and a rejected operation returns the fix (Errors that enumerate the fix). Text edits drift – the same instruction applied to slightly different text does slightly different things; structural operations don't – the same operation against the same tree does the same thing, every time, which is what makes the history replayable.
The two models are complementary, not rivals. When a session's work should become permanent, the resulting tree can be projected back to typed source and committed, alongside the operation stream as provenance; the human reviews a real diff, in the repository, through the normal machinery. The division of labour is the point: source files are for the changes humans should review; the live tree is for the changes users are waiting on. Collapsing that distinction – making an AI restyle a button by editing a file, recompiling, and reloading – was always an accident of tooling, not a requirement of the problem.