My AI runs the operation. I hold the cash.
I’m learning to cast metal. Lead-free pewter first: melts at 230°C, takes fine detail, ages beautifully. To cast metal you need metal, and in the UAE that means scrap dealers, marketplace listings and flea markets.
Sourcing scrap is knowledge work wearing overalls. Research, verification, outreach, negotiation, logistics. My hands are only needed at the very end, when metal changes hands. So I gave everything before that point to my AI assistant. This post is about how that handover is structured.
For context: fifteen years in software, most recently Principal Engineer at Property Finder, now on a deliberate career break, doing physical things while the assistant does the knowledge work. This project is the cleanest demonstration of the split so far.
The overnight shift
While I slept, the agent researched UAE metal suppliers. Not one pass: one agent gathered claims, others tried to knock them down. Phone numbers were corroborated across independent directories. A number in one listing is a rumour; the same number in three directories is a lead. One dealer’s number failed corroboration and got flagged: may answer as a different company, ask who they are before proceeding. That flag alone would have saved me twenty awkward minutes.
By morning it had produced: a purchase cart with verified live links, including a note that the casting silicone had one unit left in stock and should be ordered today; a shortlist of scrap dealers across industrial areas in three emirates, aluminium-first because the survey found no tin or pewter specialist in any area it checked; and fourteen outreach messages staged: scrap dealers, a marketplace lot of old trophies with an opening offer attached, a used AED 35 hotplate to melt on.
Sending, but on my channels
The messages go out through bridges attached to my own logged-in WhatsApp and marketplace sessions. My accounts, my name, channels I read anyway. Sends are paced like a human, one message per 40 to 80 seconds. Every message mirrors into my own apps in real time, so I see everything the agent says the moment it says it, and I can veto anything.
Disclosure is load-bearing
Every first message to a counterparty opens with a full intro: this is Oleg’s assistant, writing on his behalf. Every message after that carries a prefix so the origin stays visible. This is enforced in the adapter code, not left to the model’s judgment, and it never gets dropped to improve response rates. If someone won’t deal with an assistant, they get escalated to me, a human.
Counterparties deserve to know. That’s the whole argument. A scrap dealer who thinks he’s chatting with me is having a conversation he never agreed to.
The envelope
The agent negotiates and closes deals autonomously up to AED 300 per deal. Above that, or past the running budget, it asks first.
And regardless of the number: money and binding commitments are always mine. Cash, in person. Nothing gets spent until I’m physically standing in a yard handing over notes. Anything that commits money lands in a queue file as a proposal, carrying the recipient, the cost, the effect and the full message body, and sits there until I flip its status.
One more rule: honest exits. If I override a deal the agent already agreed, the counterparty hears the truth: “Oleg decided against it.” The agent’s autonomy does not extend to lying on my behalf about my decisions.
The contract is the product
The interesting part is not model capability. Any frontier model can draft a polite inquiry about aluminium ingots. The interesting part is the set of mechanisms that make autonomy grantable:
- Disclosure. Counterparties know what they’re talking to.
- A bounded envelope per deal, with a hard stop at money.
- Every commitment stays a proposal until a human flips it.
- Mirroring, so the whole conversation lands on channels I already read.
- Honest exits: my veto never becomes its lie.
Each mechanism replaces something you would otherwise need blind trust for. It’s the same reason we trust deploys. Not because engineers stopped making mistakes, but because CI, staging, canaries and rollback exist. An agent with a 300-dirham envelope, a mirrored channel and a proposal queue is a canary deploy of a coworker.
Capability decides whether the agent is useful. The contract decides whether you can let go of it.
Go-day morning
I said “go” and went to make coffee.
The two marketplace sends went out at 05:39 and 05:40, the first carrying the opening offer on the trophy lot. WhatsApp sends started at 06:16. The bridge wedged twice on boot. First, an orphaned process from an earlier run was holding the session; the agent killed it and shipped a lockfile so it can’t recur. Then the WhatsApp Web library hit a known initialisation race on the current web build, which the agent diagnosed with CDP probes, matched to an upstream issue and patched with a watchdog. I debugged none of this. I read about it afterwards in the log.
Thirteen of fourteen delivered by 06:31. The fourteenth number turned out not to be on WhatsApp at all. Three failed attempts, then parked, at which point the agent dug up an alternate number for the same dealer and sent there instead.
06:40: fourteen of fourteen delivered. Disclosed, paced, mirrored, logged.
My total contribution that morning was the word “go” and the coffee. Later this week I contribute the part the agent structurally cannot: driving out with cash in my pocket to stand in front of a person and buy metal. That’s the division of labour working exactly as designed: it does the thinking, I do the showing up.