← All writing
25 Jul 2026

I approved a software change from my phone. My first attempt was correctly rejected

The bottleneck in working with agents was never the decision. It was being the messenger between two machines. Here is what happened when I removed the relay and kept the decision, including the moment my own approval got thrown out.

I approved a software change from my phone. My first attempt was correctly rejected.

Yesterday afternoon, at 17:08 UTC, I was away from my desk. I opened a chat thread on my phone, typed one word, and a piece of software I had started building two days earlier closed itself out: final gate decided, work logged, learning written up, flow closed.

The word was “proceed”. Everything else had already happened without me.

The chain, in order

A development sprint finished on its own and reached a terminal state: 11 commits, 214 tests passing, review still pending.

A sweep noticed that, unattended, on a scheduled refresh tick the previous day at 12:13 UTC. It opened the approval gate, generated a one-time token, and posted the decision prompt into a channel. Then it stopped and waited for a human.

It waited nearly 29 hours. Nothing proceeded in the meantime.

That is not a performance problem. That is the feature. A system that proceeds when nobody answers is not an autonomous system, it is an unsupervised one.

The part I did not plan to write about

My first reply was refused.

I answered in the channel rather than in the gate’s own thread, and the validity check threw it out: right token, right person, wrong place. I replied again inside the thread and it was accepted, with the surface recorded in the receipt so the audit trail says where the decision came from.

A convenience surface that will not bend the rules for the person who built it is the only kind worth having. If my own sloppy reply had been accepted because it was obviously me, the check would have been decoration. Every approval mechanism gets tested by its owner first, usually by accident. Mine passed.

What did not move to the phone

Merging, pushing, and deploying. Those three still happen on my machine, with my hands, after I have read the diff.

The phone got exactly one power: deciding a gate that was already open, on evidence that was already assembled. It cannot open a gate, cannot skip one, and cannot invent one.

And the change itself was not waved through because a machine produced it. The review before merge caught three real bugs, including one that would have reposted the same alert forever.

Being precise about the scale of this

This is a gate in my own development flow, not a production release button. The more ambitious version, actual buttons, an always-on listener, is deliberately fenced off until I have a reason to want it.

I mention that because the story is easy to oversell, and overselling it would cost more than the feature is worth.

What actually changed

The boring version already changed how the week works, and not in the place I expected.

What got removed was never the decision. It was me being the messenger: noticing that a machine had finished, then telling another machine about it. Status relay, dressed up as oversight. That relay was the actual bottleneck in working with agents, and it is the part nobody demos, because “the human stopped copying information between two systems” makes a poor keynote.

Let machines carry the status. Keep humans on the verbs that carry accountability. And build the check so it says no to you too.

Source post: Post | LinkedIn