A model works a task out once. After that the task is replayed by plain code, with no model involved, and help is called only when a check fails.
The head chef is expensive and improvises. You do not want improvising every night. So the chef cooks the dish one time and writes a recipe card while doing it.
In Handrail the chef is the model. The recipe card is a capability: a list of steps, and beside every step a sticker saying how risky it is.
One model-driven run becomes one reviewable card.
read only looking. navigate changing screen. stage pencil, can be erased. commit ink, real and hard to undo. A card with one step missing its sticker is refused.
Every night after that, a line cook follows the card exactly. The chef's hat stays on the hook. Same dish, every plate.
In Handrail the line cook is the replay engine. For each step it does the same six small things in the same order, and it never asks a model.
Each step passes six checkpoints. The square is a ledger entry, made only for steps that change something.
| Step | Right screen? | Find control | Ledger | Act | Settle | Expected screen? |
|---|
The kitchen never walks into the dining room. It talks to a waiter, and the waiter accepts six requests only. A browser, a green-screen terminal and a Mac app are three dining rooms, each with its own waiter.
The waiter is the surface. What it hands back is a numbered menu of things that are legal right now. A model can only say a number.
The sign-on page of the mock bank, turned into a menu.
The worst a confused model can do is pick a wrong row from a list of real, legal actions. Nothing it says ever becomes a selector, a coordinate or code.
A cashier writes "paying out" in the ledger before handing over cash, then "paid" after. If the lights go out in between, the ledger shows a payment in doubt. Nobody pays a second time on a guess.
That ledger is the journal. A commit step written dispatched and never observed is never pressed again. This is the rule the whole project is built around.
Try to make the bank post the hold twice.
When a check fails the line cook does not improvise. There are three steps to climb, cheapest first: ring the bell, ask the helper, call a person.
Whoever answers only proposes. The engine checks the answer itself before acting on it. That check is the handrail.
Pick what went wrong on the screen.
| Picture | Idea | File | State |
|---|---|---|---|
| Recipe card | Capability with effect stickers | schema/capability.py, schema/effects.py | built |
| Line cook | Replay engine | replay/engine.py | built |
| Waiter | Surface, six verbs | surface/base.py | built |
| Menu | Operations table | surface/browser/operations.py | built |
| Directions to a house | Locator ladder, probed for uniqueness | surface/browser/locators.py | built |
| Checking the face | Structural fingerprint | surface/browser/fingerprint.py | built |
| Cashier's ledger | Write-ahead journal | replay/journal.py | built |
| Flight recorder | Hash-chained evidence log | kernel/evidence.py | built |
| Real dining room | Playwright behind the six verbs | surface/browser/surface.py | next |
| Chef | Authoring loop and compiler | author/, compile/ | milestone 3 |
| Bell on step 1 | Classifier port, Laya and Jev | escalate/ | milestone 5 |
| Helper and person | Bridge and human takeover | escalate/bridge.py, serve/console.py | milestone 6 |