I build agents for a living. Not the chat kind. The kind you hand a browser, a card and a goal, then leave alone for an afternoon. Most of my last two years went into watching what they do with money once nobody is looking over their shoulder, and writing down what went wrong.
They don't go rogue. They go reasonable. Every one of them finds a sensible argument for the thing you told it not to do, and the argument is usually right, and the money is usually gone. Longer prompts didn't fix it. A second model checking the first one didn't fix it either.
So I stopped writing the rules where the agent could read them and wrote them where it can only bump into them. otis is that agent. Its wallet is a contract on Robinhood Chain that checks every payment against rules otis has no way to edit. It can ask. The contract can say no. That is the whole trick.
otis runs a small business with a real wallet, a real budget, and a set of rules it cannot get to. When it tries anyway, the attempt is written down here for anyone to read.
contract 0xcca46cb7866ebbae75c77c49ffbdc0a355963490
balance
let it spend. don't let it decide what spending is.
every no it hears is public. every yes stayed inside the lines.
| rule | parameter | value | tightened |
|---|---|---|---|
| allowlist | waiting period | ||
| per payment cap | max per payment | ||
| epoch budget | max per epoch | ||
| cooldown | blocks between payments | ||
| floor | balance never below | ||
| co-sign | second signer |
| id | block | to | value | rule |
|---|