Most "agentic" platforms assume the human supervisor is glued to a desktop. The agent hits a decision gate, posts a message into some web console, and waits. The operator is on the metro, in a meeting, having dinner — and the workflow sits paused for two hours. The SLA dies, the customer churns, the agent is blamed for being too cautious.
The agent was not too cautious. The control plane was too stationary.
The Approval Gate Is The Real Surface
Inside AACFlow, every workflow can declare a human_in_the_loop block — a hard stop where an agent must wait for an explicit approve or reject before continuing. This is the surface that actually matters. Tool calls are cheap. Decisions are scarce. Whoever owns the decisions owns the workforce.
We treat the approval gate as a first-class realtime event, not a row to be polled. When an agent hits a gate, three things happen at the same time:
- A row gets written into
pausedExecutionswith the context the agent had at the moment it stopped. - A Socket.IO event fires to every connected client of that workspace — desktop, mobile web, embedded view.
- An out-of-band notification leaves the building — Telegram via MTProto, push via FCM or APNs, optionally an SMS.
The operator does not need to be in the app. The app finds the operator.



