The promotion gate: an agent never approves its own work order
When an agent writes a task for another agent, someone must decide that it may run. Make approval a separate, logged action by a named person, default it to false, and reserve the whole budget before the first request. A flag in a service file is not approval.
π― For A team lead who lets one agent prepare work for another
- Why self-approval defeats the point of a work order
- How prepare, promote and enqueue stay separate
- Why you reserve the budget for the whole task up front
π¦ Two agents, one loop
A common pattern: a senior agent writes a work order for a cheaper agent, and the order is put in a queue. If the same system that writes the order can also approve it, nobody has decided anything. A mistake in the order goes straight to execution, and the bill follows.
π§© Three separate steps
In our setup the cycle has three steps, each a separate command.
- Prepare. The senior agent writes the order: a specification for the worker and an acceptance contract, in one file, with the field
approvedset to false. - Promote. A named person approves the file. This is a separate action, written to a log with who, when and which file. The agent cannot do it for itself.
- Enqueue. Only an approved file can go into the queue.
A global switch in a service definition that turns the dispatcher on is not approval. Our design note removes one that did exactly that, because a process-wide flag approves everything at once and records nothing about who decided.
π΅ Reserve the whole task
The second rule is about money. A check that the remaining balance is above zero lets one expensive task consume everything. Instead, the budget for the whole task is reserved before the first request. A timeout, a kill or an error leaves the charge marked uncertain and blocks new tasks until a person reconciles it. The whole trajectory counts: tool loops, thinking, critic passes, retries and fallbacks, not only the last answer. An unknown cost is not zero.
π In numbers
Each task token in our transport is tied to a task packet fingerprint, and since 2026-09-21 1,415 tokens have been issued. The transport has recorded 4 reservations. Both are counted from the database on 3 November 2026, 21:53 UTC.
π οΈ Practice: add a gate to your queue
- Add an
approvedfield to your work order format and default it to false. - Write the promote command: it needs the file, a person's name and a reason. It appends a log line and flips the field.
- Make the queue refuse any order whose field is false or whose hash differs from the one the log recorded.
- Remove every global "enable dispatch" switch from your service definitions.
- Reserve the order's budget when you enqueue, not when you start. Refuse to enqueue if the cap would be exceeded.
- Mark timeouts and killed runs as uncertain and stop the lane until someone reconciles.
β Check yourself
- Edit an approved file by one character. The queue refuses it because the hash changed.
- Try to promote with an empty name. It fails.
- Run the dispatcher with no approved orders. It does nothing.
- Pick any order from last week and find who approved it and when.
π§ When this does NOT work
- Rubber-stamp approval. If one person approves fifty orders in a minute, nobody reads them. Limit the batch size.
- Slow lanes. Approval adds minutes. For tiny read-only tasks consider a standing rule instead of a per-order decision.
- Approving the wrong thing. A person sees the summary, not always the tool calls. Show the file hash and the budget in the prompt.
- Single approver. When that person is away, the lane stops. Name a deputy.
- Agents that edit the log. Keep the approval log out of any path an agent can write to.
π Evidence
| What we measured | Task tokens tied to packet fingerprints and budget reservations in our transport database |
| When | 3 November 2026, 21:53 UTC |
| Artifact | The task token and reservation tables, and the design note for the confined worker in our private repository |
| Limit | Counts show that the gate is used, not how often a promotion was refused |
β‘οΈ Next
Write the order itself with Spec-driven development with existing task packets, and recover from a stuck lane with Recovery after a failed, stuck or uncertain run.
Sources
- Spec-driven development with existing task packets: writing the order.
- Recovery after a failed, stuck or uncertain run: stuck lanes.
- Costs, budgets and limits: budgets.
- An AI usage policy and register a small team can enforce: who may do what.
π Article connections
Open the full knowledge graph βPublished article links. Select a node to open its article at the heading.
Article links Β· keyboard / text view
Same topic
- A vector base is a map, not a source: what we learned from retrieval
- When you cannot tell what a model call cost: freeze, then reconcile
- Splitting a big task for a cheap model: the 24,000-byte lesson
- Skills, MCP tools and rules: three ways to give an agent capabilities
- Eight shell and git mistakes our agents made, and the rule for each
- Several agents, one repository: ownership rules from real incidents
Next steps
Related reading
A vector base is a map, not a source: what we learned from retrieval
A vector base finds passages that are close in meaning to your question. It does not know which are true or current. Treat every hit as a pointer: open the file it names, check the hash, and take numbers from the artifact, never from the retrieved paragraph.
AI agents and MCP explainedWhen you cannot tell what a model call cost: freeze, then reconcile
Sometimes a model call times out and you do not know whether the provider charged you. Never record that as zero. Mark it uncertain, stop new paid calls, and let a named person reconcile it with the provider's statement. Refusals before generation are the exception.
AI agents and MCP explainedSplitting a big task for a cheap model: the 24,000-byte lesson
A cheap model does well on one small, well-defined job and badly on a big pile. We cap a task at 24,000 bytes and refuse larger ones before any model is called. Split by unit, one file or one country per task, and check the size before you start.
AI agents and MCP explainedSkills, MCP tools and rules: three ways to give an agent capabilities
Agents get abilities in different ways. A rule constrains what they do, a skill tells them how to do a job, and an MCP tool lets them call a function. Each has its own risk, so declare all three in a register and test that nothing exists unlisted.
π¬ Comments