Coconut

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.

Open the live demo → Scroll — the model on the right moves as the argument does ↓

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.

Fig. 1 Point & talk — the cursor over a listening waveform.

“This one throws on null — guard it.” No context to paste, no prompt to engineer. It already sees what you’re pointing at.1

Prompting
paragraph + round-trips
Pointing
one point, one sentence
Fig. 2 Two ways to ask for the same change.

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.

78%
PARTIAL · VERIFY
forecast · verify before quoting
Fig. 3 A calibrated-confidence readout — it sweeps as it enters view.

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

CONFIDENT
It can cite the move. Click to accept.
PARTIAL
Drafted, but verify before it ships.
I DON'T KNOW
Only you know this one. It stops rather than guess.
QUIET MODE
A region it won’t touch. Quiet.
Fig. 4 The four-state posture grammar.

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.

Spot the bug
Propose a guard
?Fallback · yours
Write the test
Fig. 5 The run pauses on the one step only you can answer.

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.

point+ talkCONFIDENTPARTIALI DON'T KNOWQUIET MODE
Fig. 6 One move reads the surface and resolves to one state.

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

  1. Crash rate is illustrative — the scenario is scripted, not measured. See the flows.
  2. Posture grammar: confident · partial · held · quiet. The full grammar lives on the Grammar page.
  3. Quiet mode is enforced by tenant policy on sensitive surfaces — the agent reverts to the native cursor and reads nothing.
plan.ts — agent-api
code.dev/agent-api/src/plan.ts
EXPLORER · agent-api
agent-api/src/plan.ts
1 issue spotted
1export async function resolveUserPlan(userId: string) {
2 const user = await db.users.find(userId)
3 const tier = user.plan.tier
4 return PLANS[tier] ?? PLANS.free
5}
resolveUserPlan · posture
PARTIAL
A latent crash, not a style nit.
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.
logs · NPE · resolveUserPlan · 412 hits / 7d
PARTIALReading the line58%