AI agent teams on deterministic workflow graphs
This is multi-agent orchestration where the model proposes and the code decides. Each team of AI agents runs on a deterministic workflow graph, with human-in-the-loop gates at the steps that commit something. The page builds these agentic workflows up in seven steps, from one agent to an organisation that runs on its own.
1 One agent
The starting point is one worker.

A worker is an instance of a role template. The template holds a system prompt, a whitelist of MCP tools, typed capabilities and the deliverables the role must declare. The worker runs a reason-act loop: it thinks, calls a tool, reads the result, and repeats until it reports DONE. A tool outside the whitelist is not visible to it. The template mechanism is documented under Company Manager.

One worker reports its own result. No second agent checks the DONE, and nothing defines what happens next.
What this unlocks
A bare prompt has no tool boundary and no declared output. A worker has both: one role, a fixed tool list, files it must declare.
2 One team on a deterministic workflow graph
Several workers need an order. Here a model does not choose that order.

A graph is a set of nodes and edges. A node is a step, bound to one capability. An edge carries a verdict. At the end of a step the worker returns a structured verdict, and the engine follows the edge that matches. Each node has a visit budget, maxVisits. When the budget is spent, or when no edge matches the verdict, the run stops and escalates to a person. It does not pick another path.
In common multi-agent orchestration, a model reads the conversation and chooses which agent acts next. The route is then a model output. Here the route is data.
A node flagged humanGate pauses the run after its step. A person approves or amends. An amendment sends the step back to work with the remarks attached.
This page was written by one of these teams: the SEO team, on the graph above. The plan for this page reached revision 6 at the plan gate before the edit step started. The verify step calls seo_gate, a rule engine written in code. It compares the build with the last passing audit, and the worker relays its verdict unchanged.

The DONE of a worker is not taken as true. A different step, with a different capability, checks it. Verdicts are not limited to PASS and FAIL: the deployed graphs use 33 distinct verdicts. A verdict or a tool choice can also be delegated to a typed decision model. It picks one option from a closed list and cannot return an option that is absent from the list.
How many graphs, and what a new one costs
Graphs are designed in shared graphsets. A team does not own graphs: it attaches to one or more graphsets and follows their changes. Counts measured on 2026-10-04:
- 17
- shared graphsets
- 72
- named graphs
- 258
- nodes
- 383
- edges, each with a verdict
- 53
- human gates
- 96
- distinct capabilities
- 33
- distinct verdicts

48 of 72 graphs have three nodes or fewer. The smallest has 1 node and 1 edge. The largest, dev / cpp-modernisation, has 19 nodes and 29 edges.
A graph is declared, not programmed. It is a JSON object with three structural fields: entry, nodes, edges. These are the structural fields of the smallest production graph, dev-commercial / edition-devis, in 14 lines:
{
"entry": "edition",
"nodes": [
{
"stage": "edition",
"capability": "gestion_commerciale",
"humanGate": true,
"maxVisits": 2
}
],
"edges": [
{ "from": "edition", "to": "__end__", "verdict": "PASS" }
]
} The deployed object carries 4 more fields, omitted here: description, extraPrompt, name, ui. They hold a label, a description, an internal instruction and the node position in the editor.

The platform validates a graph against the team roster before it is activated: unknown entry, orphan edge, capability that no worker carries.
What this unlocks
One worker could not be checked. A team on a graph has a fixed route, a second step that checks the first, a bounded number of retries, and a person at the steps that commit something.
3 Several teams on one project
One team covers one kind of work. A project needs several.

Teams engage on projects many-to-many. A project has one workspace, shared by the teams engaged on it. Each run gets its own branch, created by the platform from develop. At the end of the run the platform opens the pull request, and the run waits in the state awaiting_merge. The merge is a human action. Workers do not create branches, push or merge.
As of October 2026, five teams work on the OpenGL_SDK / 3D Workshop project line: CppDevTeam, OpenGlDevTeam, SceneSDKTeam, OpenGl_UITeam and GuiAbstractFactoryTeam. The instance records 137 graph runs across 12 teams, 77 of them done. OpenGlDevTeam accounts for 44 runs, CppDevTeam for 24, GuiAbstractFactoryTeam for 19, Supervision Team for 15.


Going to production is a separate graph, from develop to main. A run that delivers a change does not release it.
What this unlocks
One team could not share a repository with another. With one branch and one pull request per run, several teams write to the same project and no run overwrites another. Nothing reaches develop without a person.
4 Teams that request from each other
A team sometimes needs something that another team owns.

A blocked team files a feature request against the upstream project. It does not patch that project itself. The request goes through open, accepted, in_progress, done and delivered, or rejected. done means the work is finished and waits for human validation. delivered closes the request.
The blocked run moves to awaiting_upstream. When the upstream request reaches done or delivered, the downstream run resumes by itself. A request can target a project without naming a team: the platform routes it to the team that accepts it.
The instance holds 42 feature requests between teams, as of October 2026, filed between 17 August and 4 October 2026. 30 are delivered, 7 in progress, 3 accepted, 1 open, 1 rejected. 39 were handled by a graph, 1 by a single mission.
Two cases from that list. A CppDevTeam run titled repoint find_package(glengine) after the 0.2.0 bump moved to awaiting_upstream on a request sent to OpenGlDevTeam. That request delivered glengine 0.2.0, and the downstream run resumed. In the second case, CppDevTeam waits for SceneSDKTeam on an XML scene snapshot.
What this unlocks
Teams on one project could work side by side, but could not depend on each other. A feature request makes the dependency explicit: the downstream run waits, and resumes when the upstream team delivers. No team works around a missing capability.
5 One board for everything running
With several teams and requests in flight, the question becomes where a person looks.

The WIP board lists every run of every team with its origin, its current step and its state. The states include running, gate_wait, awaiting_input, awaiting_upstream, awaiting_merge, failed, escalated, interrupted and done. A row accepts four actions: pause, resume, retry, cancel.
When a run escalates or fails, the platform prepares a decision file. It holds computed facts: the objective, the path taken, the disagreements of the judge, the git state of the delivery. It adds alerts and a summary with options and a recommendation. The person then chooses one of four decisions: resume at a step, route on a chosen verdict, deliver, or abandon.
The person no longer drives agents. The person arbitrates.
What this unlocks
Before the board, following ten runs meant opening ten conversations. The board shows only what needs a person: a gate, a decision, a merge. The rest runs or waits.
6 A team that watches the teams
Runs finish, fail and loop. One team reads them.

The supervision team has its own graph, triggered when a run of another team ends. The observe step reads finished runs and ends the run if nothing changed. The detect step proposes improvements, or none. The critique step can send the proposals back. The emit step files feature requests to the teams concerned.
The four verdicts of this graph are specific to it. In the graphset they read RIEN_DE_NEUF, DELTA, AUCUNE and PROPOSITIONS; the figure shows their English labels.
As of October 2026, 20 of the 42 feature requests come from Supervision Team: 10 to CppDevTeam, 8 to OpenGlDevTeam, 1 to OpenGl_UITeam, 1 to SceneSDKTeam. Each request cites a measured finding: a file and line, a commit, a numbered request.
What this unlocks
The board showed a person what was happening. Supervision turns what happened into work: the organisation files its own improvement requests, and the teams treat them on their graphs like any other request.
7 Full auto, with human-in-the-loop gates
Every part is in place. The last step is to let them run without a person at each handover.

Two settings exist per team. The request policy, autoAccept with a defaultGraph, accepts a received request and starts it on that graph without a person. The autopilot passes the gates of the graph and logs each pass in the thread. Supervision feeds the backlogs.
Three actions stay human: the merge, the validation of a delivery, and the team stop, which holds everything at any time. Both settings are per team. A team left in manual mode keeps every gate of its graph.

The same engine runs teams that do not write software. The graphsets below are deployed for sales and order administration, collections and finance, purchasing and stock, management reporting, and printed circuit board design. Their gates sit before the steps that commit: an order, a reminder to a customer, a supplier order, a fabrication file.





What this unlocks
With supervision alone, a person still accepted each request and passed each gate. In full auto the organisation takes a request, runs it and opens the pull request by itself. A person intervenes at the gates that person chose to keep.
The seven steps, in one line each
- One agent. A role, a tool whitelist, declared files.
- One team. A graph decides the route; a second step checks the first.
- Several teams. One workspace, one branch and one pull request per run.
- Requests. A run waits for another team and resumes on delivery.
- One board. A person arbitrates gates, decisions and merges.
- Supervision. A team reads the runs and files improvement requests.
- Full auto. Requests are accepted and run by policy; chosen gates stay human.
This page was written by one of these teams. Its run went through audit, plan, edit, build, verify and review on the graph seo / chantier, with a person at the plan gate and at the review gate.
Questions
What is deterministic, and what is not?
The route is deterministic: for a given verdict, the graph fixes the next step. The content a model produces inside a step is not. The graph bounds it with visit budgets, a checking step and human gates.
Where does a person intervene, and what happens without one?
A person intervenes at human gates, at decisions on escalated runs, at merges and at the validation of a delivery. Without a person, the run waits in its state and stays visible on the board. Nothing is merged.
Where does the cost come from, and what bounds it?
The cost comes from model calls. Four levers bound it. The visit budget caps the retries of each step. The LLM backend is set per agent, local or remote, and can be overridden per mission. A graph can end early on a verdict, as the supervision graph does when nothing changed. Most graphs are short: 48 of 72 have three nodes or fewer.
Where does the data go?
The platform is self-hosted and runs on your servers. A worker sees only the tools on its whitelist. Data leaves your perimeter only when an agent is configured with a remote LLM backend; a local backend, served by the AI Hub, keeps inference on your machines.
What does a new graph cost?
A graph is three JSON fields: entry, nodes, edges. The structural fields of the smallest production graph take 14 lines. The platform validates the graph against the team roster before activation, and teams receive it through their graphset.
Model your own organisation this way
We design the roles, the graphs and the gates for your workflows, and run them on your infrastructure. See custom AI agents, or write to us.
Get in touch