GitHub
Autonomy

It can readeverything.It can spendnothing.

The assistant sees orders, customers, stock and reviews, because they are tables in one database rather than four products. What it may do with them is a separate question, and the answer is set in code.

The problem

A bot witha write keyis a bot withyour money.

Most assistants are given a credential and a prompt telling them to be careful. A prompt is not a boundary. The first time one is talked into a refund it should never have made, the instruction that was supposed to stop it is the thing that failed.

What actually happens
propose_refund
Refund order #4821 in full — the customer says it arrived broken.

A card appeared in the admin. Nothing moved until someone clicked it.held for approval

The ceiling
01

Read

The default. Tools that answer questions run inside the loop and return data.

02

Propose

A tool that would change something writes a proposal and a signed approval token instead.

03

Execute

Only ever reached by an operator approving the card. The model has no path to it.

Why a prompt cannot undo it

Money is propose-only by construction

Declaring an execute tool on refunds, payments or stock throws when the tool map is built. The store does not start, so the mistake never reaches production.

The click is the authorization

Approval runs the canonical action directly. There is no token the model can mint for itself and no second prompt it can satisfy on its own.

Dismissed and expired are recorded too

The run ledger keeps what was suggested and refused, not only what was approved — so a review shows what the assistant has been trying to do.

Reach

Your assistant,not ours.

The same tool kit is reachable over MCP with a scoped key, so an outside assistant gets exactly the surface the admin has — including the part where a change only ever becomes a card. Turn the provider off and the AI screens hide rather than half-work.

Give it the whole store. Keep the keys.

Read tools answer. Everything else waits for a human.

Read by defaultApproval-gated writesSelf-hosted