The thesis · Second pair of hands
A second pair
of hands.
You don’t prompt it. You point at what you mean, say what you want, and it works beside you — proposing, never imposing.
Built for a wide screen — a live model tracks each step in a right-hand column, and figures sit inline. On narrow screens the panel is hidden; the live demo has the full interactive version.
01 · Point and talk
Stop describing. Start pointing.
The prompt box asks you to translate what you want into a paragraph of instructions. A second pair of hands skips the translation: you put the cursor on the thing — a line of code, a cell, a sentence — and just say what’s wrong.
“This one throws on null — guard it.” No context to paste, no prompt to engineer. It already sees what you’re pointing at.1
02 · Propose, don’t impose
It offers a move. You keep the pen.
It doesn’t rewrite your file behind your back. It lays a confident diff beside your code and waits — three lines, optional-chained, the crash gone.
Accepting is one keystroke. So is rejecting. The default is always you decide — the agent’s job is to make deciding fast, not to make the decision for you.
03 · Show the work at the tip
Every claim carries its receipt.
Confidence isn’t a vibe; it’s a label. A cell anchored to your actuals reads [A] anchored. A forecast that needs a second look reads [B] verify.
You never have to guess which number is real. The provenance travels with the value, right where your eyes already are — and it’s one of four postures the agent ever takes.2
04 · The honest move
Sometimes the best answer is “I don’t know.”
Here’s the state most tools hide. When a planless user shows up, should the code default to free, or throw? That’s a product decision, not a code one.
05 · Know where not to go
It stays out of the room it shouldn’t enter.
Land on a compensation-sensitive workspace and the second pair of hands goes quiet: native cursor, dimmed palette, nothing read, nothing proposed.3
06 · One grammar, end to end
Decide once. It closes the loop.
You answer the one question it held — “default to free, log a warning” — and it finishes: guard applied, test written to that contract, the file green.
The same four-state grammar holds whether the surface is an editor, a spreadsheet, a portal, or an inbox — which is what makes it a language, not a feature.
The prototype
See it move.
The model you’ve been watching is the real prototype — scripted across six end-to-end flows: a bug fixed by pointing, a forecast you can defend cell by cell, an endpoint stood up by voice, drafts that wait, and a workspace it won’t touch.
Open the live demo →Notes
- Crash rate is illustrative — the scenario is scripted, not measured. See the flows.
- Posture grammar: confident · partial · held · quiet. The full grammar lives on the Grammar page.
- Quiet mode is enforced by tenant policy on sensitive surfaces — the agent reverts to the native cursor and reads nothing.
export async function resolveUserPlan(userId: string) { const user = await db.users.find(userId) const tier = user.plan.tier return PLANS[tier] ?? PLANS.free}user.plan.tier dereferences a plan that free-tier rows don't have. It throws for ~3% of traffic. I can guard it — but the fallback behaviour is yours to set.