Teams - andreaderuvo/argus GitHub Wiki
Several agents taking turns on one goal, with a check between turns that decides by numbers, not opinions β directed by Argus on the server, so a team goes on with every browser shut.
flowchart LR
planner["planner"] --> exec["executor"]
exec --> check{{"cargo test --release"}}
check -->|PASS| rev["reviewer Β· judges"]
check -->|FAIL| exec
rev -->|OK, REDO| planner
rev -->|DONE| done((done))
That diagram is a team: paste it into Draw or write and Argus draws it; give it a goal and a folder and press Start. This page explains every part of it.
- In one minute
- Starting one
- What a turn is, step by step
- How an agent reports its turn β the Argus tools, the shell, the file
- The shapes that ship
- Drawing your own β clicks, Mermaid, YAML
- Asking an agent to design one β it writes, checks and proposes; you start
- Roles, models and packs
- Watching it
- Pause, Stop, Reset, Restart β and what "from clean" means for your team
- When something is stuck
- Questions
| Word | What it is |
|---|---|
| Step | A box in the graph: an agent (Claude, Codex, Gemini⦠with a role), a check (a command), a join (waits for every arrow in) or done. |
| Arrow | Who goes next, and when: always, or only if the check said PASS/FAIL, or the judge said OK/REDO/DONE/BLOCKED. |
| Turn | One agent doing one piece of work and reporting it. |
| Round | One pass through the graph. Going back to a step that already ran this round starts the next one. |
| Judge | An agent whose report carries a verdict: OK (keep it, go on), REDO (say what is wrong), DONE (the goal is met), BLOCKED (a person must decide). |
| Check | A command run by Argus in a session of its own β tests, a benchmark. Its exit code is PASS or FAIL. No agent can argue with it. |
| The director | A loop on the server, every 3 s: whose turn is it, has it reported, does the flow say check, what does the verdict say. |
| The log |
TEAM.argus.md in the team's folder: every turn, check and decision, signed and in order. |
Each agent runs in a tmux session of its own, <team>-<step>, in a window of the desk: you can
watch it, type into it, or take over at any moment. Argus never reads a screen to know what
happened β the agents tell it.
Team in the desk's toolbar (it needs --allow-write: a team writes into the project). Up
front, three things:
- What should the team get done? In words: make the alignment faster without changing its results. The shape follows from the words β faster picks Optimise, crash picks Fix a bug, paper picks Write β and a card changes it. Four cards are shown (Build and review, Optimise, Fix a bug, Write) plus yours and any proposed by an agent; N moreβ¦ shows the rest, and find a team above them filters every card by name, description, pack or role.
- The team β the graph, drawn. Click a step to change it (below), or Draw or write.
-
In β the folder. Required, never defaulted to your home: the team writes its log and
its files there. Choose⦠walks the folders Argus serves, or makes a new one; a folder that
does not exist is made when the team starts. Under the box it says there, to be made, or
outside the folders Argus serves β that last one means the path is not under any of the
rootsin the config, and Start stays off.
Before you start, the sheet says what each agent chosen would be missing in a team, with the
fix where there is one: no Argus plugin, or an old one (Install / update β without it the agent
reports by writing to the log, which works but nobody checks until the next round); Codex asking
before team_task and team_done (Allow them β in a team nobody is there to say yes; it writes
approval_mode = "approve" for the two in ~/.codex/config.toml, keeping a copy); Codex's hooks
never heard yet (open Codex once and accept them, or there is no Stop guard); Gemini (no Stop guard);
a shell (not an agent: it takes no turn). Nothing stops you starting anyway.
When a step is a check with no command yet, the check asks for one, suggested from the folder
(cargo test --release, a benchmark script, python3 -m pytest -q, npm test, make test,
nextflow run main.nf -profile test). That one box fills every check step without a command; to
give two checks different commands, click each step.
Everything else is under More, and good as suggested:
-
Who does what β which of your launchers runs each agent step; a different agent per step where there is a choice (two minds, not one twice). In a git repository, each step has in its own copy: ticked, it works in a worktree on a branch
team/<team>-<step>, so your checkout is not touched. -
What they may do without asking β ask me / edit files freely (the default) / everything, no questions, turned into each agent's own option (
--permission-mode acceptEdits,--dangerously-skip-permissions, Codex's sandbox and--yolo) where its version has it. Everything is said in red under the folder, whoever chose it. -
How much it goes on alone
- Ask me at the end of each round: you press Continue. The safest way to start.
- Go on, stop if something goes wrong: it stops at the second failed check in a row.
- Go on until the goal: it keeps trying through failed checks, until a judge says DONE or the rounds run out (10 by default, 30 at most).
Whatever you chose, BLOCKED (from anyone) stops it and asks you, and so does a verdict with no arrow drawn for it.
-
At most, rounds, and the buttons for files and packs (below).
-
Arrange the desk β as a grid (the default), in columns, in rows, or leave it as it is: how the team's windows are laid out when it starts and each time one of its agents arrives, so they sit side by side instead of one on top of the other. A pinned window stays where you put it.
More opens by itself when something in it needs you β no agent among your launchers, or a start that was refused.
sequenceDiagram
participant D as Argus (director)
participant A as agent (its own session)
participant L as TEAM.argus.md
participant C as check (its own session)
D->>A: starts it, first prompt on its command line
A->>D: team_task β goal, duty, round, what came before
Note over A: one turn of work
A->>D: team_done β summary (+ verdict if it judges)
D->>L: writes the turn, signed
A--xD: tries to stop without reporting? the Stop guard sends it back (twice at most)
D->>C: runs the check, if the flow says so
C->>L: PASS / FAIL, exit code and the last lines
D->>D: follows the arrow for PASS/FAIL or the verdict
-
An agent starts when its turn first comes, not all at once. Its first prompt travels on its
command line (
claude "β¦",codex "β¦",gemini -i "β¦"), so it runs as soon as the agent is ready, whatever the agent asks first; and the folder is recorded as trusted in Claude Code and Codex beforehand β the answer you would give to "trust this folder?". - The prompt says who it is, the goal, the folder, its duty, who came before it this round, a failed check to deal with first, and how to report.
- It reports. Argus checks the report (is it this agent's turn? has it reported already? did a judge give a verdict?) and writes it into the log.
- The check, when the arrow leads to one, is typed into the team's check session as if you had typed it. Its exit code decides; its last lines go in the log, in front of whoever is next.
- The next turn goes to whoever the arrow says. A join waits for every arrow coming in; two steps after one arrow start together.
Three ways, in the order Argus offers them. The first is the one to have.
With the Argus plugin installed in Claude Code or Codex, the agent has two tools (Gemini CLI gets the tools too, from the extension, but no hooks and no skills β so no Stop guard):
-
team_taskβ its task, structured: the team, the goal, its role and duty, the round of the maximum, whether it is its turn, what the steps before it said last, the work it should read, and the last check (PASS/FAIL, how long). -
team_done{summary, status?, details?}β its report. A judge must givestatus(OK, REDO, DONE, BLOCKED); anyone may say BLOCKED. Refused, with the reason, when it is not its turn, when it already reported, or when a judge left the verdict out β so a mistake is said to the agent there and then, not discovered in the log an hour later.
The plugin also brings the argus-team skill β the protocol in one page, so the agent knows it
without being told in every prompt β and the Stop guard: when an agent in a team tries to end
its turn without having reported, the plugin's Stop hook refuses the stop and tells it to report
first. It says so twice at most per turn, so an agent that cannot report is never held for
ever. Outside a team the hook is the ordinary bell. (Measured on Claude Code and on Codex 0.160:
both carry on with the reason as their next instruction.)
argus-say task # the same as team_task, as JSON
argus-say turn "made the hash join 30% faster" # the same as team_done
argus-say turn --status REDO "the benchmark is not the one asked for"
argus-say turn --status OK --file notes.md "keep it; next: the index"It finds its session from tmux and Argus from the config (https too). Any agent that can run a command can use it.
With neither, the prompt shows the block to append to the log, as a heredoc so the shell runs nothing in it:
cat >> TEAM.argus.md <<'ARGUS_TURN'
@TURN who=EXECUTOR round=2
made the hash join 30% faster; tests pass
@END
ARGUS_TURNThe director reads @TURN β¦ @END blocks too, so a team runs with any agent at all. A report made
with the tools is written in exactly this form β the log reads the same whichever way it came.
| Shape | Who decides | |
|---|---|---|
| Build and review | executor β reviewer | the reviewer |
| Optimise | executor β check β reviewer | the reviewer, from the change and the numbers |
| Fix a bug | executor β check | the check: it passes, the bug is fixed |
| Write | researcher β writer β two critics in parallel (method, style) β join | the critics |
| Tournament | planner β two executors in parallel, each with its own check β join β reviewer | the reviewer keeps the better |
| Split the work | planner β two executors at once in the same folder, each on its files β join β check β reviewer | the check, then the reviewer |
| Feature with tests | planner β coder β check β reviewer β docs | the tests, then the reviewer |
A failed check is not worth a review: its FAIL arrow goes straight back to whoever wrote the code (in Split the work, to the planner, who divides the work again), with the failure in front of it. A Write team ends when both critics say DONE.
Four ways to the same graph β clicks on the picture, drawing with blocks and arrows, Mermaid, YAML β and the drawing and the text follow each other; use whichever is quicker.
Click a step and a panel opens under the picture: its name, its role, whether it judges, its duty in your words; for a check, the command and whose work it checks; its arrows (condition and target β change, remove, add); and + agent after, + agent in parallel, + check after, + join after, the team starts here, Remove this step (its arrows are wired around it).
Draw or write opens the team twice, side by side: the text on the left, the canvas on the right β and each writes the other as you go. Draw, and the Mermaid (or YAML) is rewritten; type, and the drawing follows.
-
The palette over the canvas: Agent, Judge, Check, Join, Done. Drag one
- onto a step: it comes after it (and takes over where that step led);
- onto an arrow: it goes in between β a check dropped between two agents also sends a FAIL back to the first, a judge sends REDO back to whoever did the work;
- into the empty space: a new step on its own, to connect. A tap on a block (or Enter) puts it after the step that is picked.
- Arrows: pull one from the β on a step's right edge onto another step. It gets the condition that step can give next β a check PASS, then FAIL; a judge OK forward, REDO back, DONE to the end; anyone else always. Let go in the empty space and a new agent is made there, already connected.
- Click a step for what can be changed: its name, role, whether it judges, its own worktree, its duty; a check's command and whose work it checks; the team starts here. Click an arrow for when it goes β the conditions that step can give, as buttons.
- Delete removes what is picked (a step's arrows are joined up around it), Ctrl+Z undoes and Ctrl+Shift+Z redoes, every change.
The layout is drawn for you, left to right in the order things happen β the order of a flow is its meaning, and Mermaid keeps no positions, so there is nothing to arrange or tidy. A team wider than the canvas is shown smaller rather than scrolled. While the text does not read (you are in the middle of typing a line), the canvas waits, greyed, rather than draw over it.
The same canvas sits beside the text when a team.yaml (or a team .mmd) is opened from Files:
drawing there keeps what a drawing cannot say β the goal, gate, rounds, permissions, reset.
Draw or write opens on the team as a Mermaid flowchart, with the graph drawn beside it as you type; every problem is underlined on its line (the editor, below) and Apply puts it in the picture once no error is left. GitHub, GitLab and most editors draw the same text, so a team can live in a README.
| You write | It means |
|---|---|
flowchart LR (or graph TD) |
the first line |
quant["quant developer"] |
an agent step, quant, with role quant developer
|
risk["risk manager Β· judges"] |
β¦that judges (the word judges anywhere in the label) |
check{{"pytest -q"}} |
a check and its command; its work is the agent pointing into it |
j{join} |
a join |
done or done((done))
|
the end |
a --> b |
always |
a -->|PASS| b, a -->|OK, REDO| b
|
only on that result or verdict (several, with commas) |
a --> b --> c |
a chain |
a --> b & c, b & c --> j
|
parallel branches, and joining them |
%% start: a, b |
where it starts (the first step otherwise) |
%% name: β¦, %% goal: β¦
|
the team's name and goal β Mermaid ignores comments, so it still draws |
id(label) |
an agent too, like id[label]
|
Step names (the ids): a lowercase letter, then lowercase letters, digits and -, at most 20
characters; in Mermaid Bench_A is accepted and becomes bench-a. -.->, ==> and --- are
read as -->; style, classDef, class, linkStyle, subgraph, direction and click lines
are ignored. A check's work is the agent pointing into it β when exactly one does; otherwise say
it in YAML with of:. What a
diagram cannot say β a step's own duty, its worktree, what it reads β is kept from the team
being edited, step by step, so drawing never throws them away. The tab remembers which of Mermaid
and YAML you used last.
Draw or write in Team, and any team.yaml opened from Files (the pencil), use the same editor.
Argus checks the text while you type and shows every problem where it is:
- the word is underlined β red for an error, amber for a warning β and its line number is marked in the gutter (hover it for the message);
- under the text, the list: line, what is wrong, and a Fix button when the answer is
obvious β
fixrβ change to fixer,judges:β rename to judge,gate: autpβ change to auto, anif REDOfrom a step that does not judge β make it a judge, the same arrow twice β remove this line. A click on a row goes to its line; - a line over the list: no problems and what the team is (2 agents, judged by review, starts at executor), or how many errors and warnings are left.
| Kind | What it means | Examples |
|---|---|---|
| Error | Argus will not run it as written | a { never closed, a tab, rounds: ten, fixr -> tests when there is no fixr, a -> a with no condition, a key written twice |
| Warning | legal, and almost certainly not what you meant |
worktre: (not read), if OK from a step that does not judge, if PASS from an agent, a step named in Mermaid but never drawn with a shape |
Completion comes from the same schema: keys at the top, in a step and in reset:; the values
each takes (role: β planner, executor, reviewerβ¦, gate: β ask, auto, goal, judge: β true);
step names after - , after -> (with done), in of:, reads: and start:; after if, only
the conditions that step can give (a check: PASS, FAIL; a judge: OK, REDO, DONE, BLOCKED). Values
and names are offered at once, keys once you type a letter; Ctrl+Space asks anywhere. β β
choose, Enter or Tab take, Escape closes.
The picture and the text point at each other: a click on a step puts the cursor on its line;
the cursor in a step lights it in the picture. Enter keeps the indentation (one level more after
key:, a new - in a list), Tab and Shift+Tab indent, Ctrl+/ comments lines out, Ctrl+S
saves (in Team: applies).
A team.yaml in Files. Read, it shows a card over its text: Team file, whether it reads, the team drawn, and Open in Team, which opens Team on that folder with this team chosen. The pencil opens the editor with the team drawn beside it. Save with errors left asks once more β Save anyway keeps a half-written file; Argus will not start it until it reads.
Either way round. A team.yaml can be edited as a diagram: the YAML | Diagram (Mermaid)
switch over the editor rewrites it as a flowchart, you draw, and Save writes YAML again β
keeping what a flowchart cannot say (duties, worktrees, reads) and the keys around the graph
(gate, rounds, permissions, reset), from the file as it was. The other way, a diagram you
keep as a file (.mmd, .mermaid) is recognised as a team when it is meant as one β it names
itself (%% name:) or has a check, a done, a judge or a result on an arrow; any other flowchart
is left alone. Its preview gets a card, A team, drawn, and Save as team.yaml makes it the
folder's team: if a team.yaml is already there, the button asks once more (Replace team.yaml)
and the old file's duties and settings are kept. Then Open in Team.
An agent gets the same answers: team_check lists every problem with its line and its fix.
The other tab of Draw or write, and Save as YAML under More. The whole team, duties
included; a team.yaml in the folder (or at the top of its repository) is offered as a card of its
own whenever that folder is chosen:
name: Quick fix
goal: fix the crash on empty input
permissions: edit # ask | edit | everything
steps:
fixer: {role: executor, worktree: true, duty: "Find the cause before changing anything."}
tests: {check: pytest -q, of: fixer}
flow:
- fixer -> tests
- tests -> done if PASS
- tests -> fixer if FAILChecked while you type. A team file has a JSON Schema,
team.schema.json (in the repository as
docs/team.schema.json, and served by your own Argus at /team.schema.json). Every team.yaml
Argus writes starts with the line that points an editor at it:
# yaml-language-server: $schema=https://andreaderuvo.github.io/argus/team.schema.jsonWith it, VS Code (the YAML extension by Red Hat), Neovim, JetBrains β anything speaking
yaml-language-server β underlines a wrong key as you type (judges: β did you mean judge:), a
value that is not allowed (gate: maybe), a step name with capitals, an arrow that is not one,
a reset.files path outside the folder; it completes keys and shows what each one means. Add the
line by hand to a file you wrote yourself.
The schema checks the shape. What only the whole team can tell β an arrow to a step that is not
there, a step that would restart itself for ever, an arrow on a result its step never gives β is
checked by Argus when it reads the file: the editor and an agent's team_check
say both, each on its line. Argus checks the schema itself, so a machine without the jsonschema
package gets the same.
Keys. Top level: name, goal, gate (ask, auto, goal), rounds (1β30), permissions
(ask, edit, everything), start, steps, flow, reset (what "from clean" means). A step: role, judge, duty, worktree,
reads; a check: check (its command) and of; a join: join: true. Flow: a -> b,
a -> b, c (parallel), β¦ if PASS, if OK, REDOβ¦ β fan-in is one line per arrow (a -> j,
b -> j). Besides team.yaml, Argus reads team.yml and .argus/team.yaml.
Argus refuses a graph it cannot run β an arrow to a step that is not there, a step that would
start itself for ever, a join nothing leads into, no start, more than 12 steps or 8 agents, a role
name over 30 characters or a duty over 4,000 β and says what is wrong. And it warns (in the
editor, and to an agent in team_check) of what it would run but you almost certainly did not
mean: an arrow on a result its step never gives (if DONE from a step that does not judge,
if OK from a check, if PASS from an agent), a key it does not read (judges: for judge:),
a team that nothing ends.
You can ask an agent for the team itself, in words: "make me a team that speeds up the parser: someone who tries ideas, the benchmark as the check, a reviewer who keeps the faster one". With the Argus plugin it knows how, and it goes like this:
sequenceDiagram
participant You
participant A as the agent
participant Argus
You->>A: "make me a team thatβ¦"
Note over A: writes it β Mermaid or YAML<br/>(the argus-team-author skill)
A->>Argus: team_check(text)
Argus-->>A: "line 4: 'maybe' is not a condition"
A->>Argus: team_check(fixed text)
Argus-->>A: OK β 2 agents, 1 check, judged by rev, starts at quant
A->>Argus: team_propose(text, folder)
Argus->>Argus: writes <folder>/team.yaml
Argus-->>You: bell: "proposes a team: Faster parser β β¦"
You->>Argus: tap β Team opens on that folder, the team chosen
You->>Argus: look, change, Start
-
It writes the team in the same language you would β a Mermaid flowchart
(with
%% name:and%% goal:comments) or YAML. The plugin'sargus-team-authorskill teaches it: the shapes, the arrows, the roles, the rules Argus checks, and what makes a good team (let a command decide, one judge, worktrees for parallel executors, small). -
It checks it with the tool
team_check: OK with a one-line summary β agents, checks, who judges, where it starts β or the line that is wrong. It fixes and checks again. Nothing is started or written. -
It proposes it with
team_proposeand the project's folder. Argus checks it once more, writes it asteam.yamlin that folder β the first line says who proposed it β and rings you. Tap the bell: the sheet opens on that folder with the proposed team chosen, its goal filled in. Missed the bell? The proposal waits: a dashed line over the desk (claude-1 proposes a team: β¦ β Open Β· Dismiss) and a card marked proposed first in Team, whatever folder the box holds β choosing it moves the folder to the proposal's. It stays until a team is started in that folder, you dismiss it (the file stays), or its file is gone or made yours. - You start it β or change it first, or ignore it. Or say to the agent "start it in the desk Trading": it requests it, and you get the question β the folder, the goal, which agent runs each step, what they may do β with Do it / No. On Do it the team starts and its windows land in that desk. An agent never starts a team on its own: a team writes files and runs a command, and that stays your decision. See What an agent can do.
A team.yaml you wrote yourself is never overwritten: the proposal is refused and the agent is
told to ask you. One an agent proposed earlier is replaced (version 2). Delete the first line and
the file is yours. From a shell, the same as tools: argus-say team-check team.mmd and
argus-say team-propose team.mmd --in ~/work/parser.
- A role of your own: write a step's duty, then Save as a role of mine β the name, the duty and whether it judges are kept with your preferences, on every device. A duty can name the agent's own skills: "use your /security-review skill on the diff".
- A model of your own: Save as my model keeps the shape (not the sessions) as a card.
-
Packs are roles and models in one JSON or YAML file, to share: Examples⦠lists those this
copy ships (trading research, security review, paper review), Open a fileβ¦ takes one β or a team written as YAML β from
disk, Export mine writes yours, Remove a pack⦠takes back exactly what a pack brought.
A model in a pack may carry a goal and
permissions. Nothing in a pack is ever a default. - Where a card comes from is on it: Argus, yours, the pack's name, or team.yaml. The β on a card of yours forgets it; teams already started are not touched.
The team is a window of the desk, opened with it: its graph, large and live β a pulse while an agent works, amber when it has stopped β the round, the last check (PASS/FAIL and how long), Continue βΆ, Pause βΈ (the turn under way finishes; nothing new starts), Stop β , Restart, Reset, Log, Goal (the goal, whole, to read again) (opened beside) and Story, newest first, filling the window under the graph and keeping your place as it grows. Over the desk a one-row line per team says the same, with Graph to bring the window back. When the team needs you, the line turns amber and the bell rings with the reason.
Stop asks whether to end the team's sessions too β its agents and its checks, with what runs in them. The log, the files and any worktree stay. Restart and Reset are the next section.
From an agent, or a script: team_task / teams (MCP), argus-say teams, GET /api/teams.
Four things you can do to a team, each with one meaning:
| What it does | Its files | Its sessions | |
|---|---|---|---|
| Pause | the turn under way finishes, then nothing new starts; Continue goes on from there | kept | kept |
| Stop | the team ends | kept | kept, or ended if you tick the box |
| Reset | on a stopped or finished team: carries out its reset:
|
as reset: says |
kept |
| Restart | Stop, then Reset, then its team file read again, then round 1 with new agents | as reset: says |
the agents' and checks' end, and start again fresh |
What "from clean" means is declared by the team, once, in its file β because only the team knows which of its files are a run's state (a ledger, positions, a journal, a cache) and which are its code and its data:
reset:
files: [ledger.csv, JOURNAL.md, "state/*.json"] # paths or globs, inside the team's folder
run: python3 reset_paper.py # optional: a command, run in the folder afterwards
log: archive # TEAM.argus.md: archive (default) | keep | clear-
Nothing is touched before you press. Reset and Restart first show the exact list β the globs
already resolved:
state/*.jsonβstate/a.json,state/b.jsonβ the command, and what becomes of the log. -
Only inside the team's folder. Absolute paths and
..are refused when the file is read; a symlink pointing out of the folder is skipped;.git,team.yaml(team.yml,.argus/) and the log are never deleted by a glob. Only files: folders stay, emptied. -
The log is archived by default β
TEAM.argus.20261007-153000.mdbeside the new one β so the story of every run is kept.keepleaves it growing;cleardeletes it. -
runruns in the team's folder in a login shell, after the deletions, for at most ten minutes; its exit code goes in the team's story. -
No
reset:β Reset deletes nothing and only archives the log. A team that does not declare it never loses a file by accident. -
Restart keeps the team: the same id and name, the same launchers and options, the same desk
β the window watching it goes on watching it β and it reads the team file again when the team
came from one (a
team.yaml, a proposal), so it is how an editedteam.yamltakes effect. A step the new file adds gets the launcher of the first agent. A team started from a template or a card of yours restarts with the same graph. - Restart leaves a clean desk: the windows of sessions that have ended β an earlier run's, a shell you closed β leave the team's desk; the team's own stay, and fill again on their turn.
-
From an agent:
requestteam_resetorteam_restartβ put to you as Do it / No, with the list of files, unless you ticked it in Settings β Agents (then it runs at once).
A team's agents end their turns all the time, and that is the director's business, not yours: the
next turn is given without you. So by default a team's agents ring nothing when they end a
turn, and their waits do not count as waiting for you β no amber, no Got it, all for them.
You hear from a team when it needs you (a round to approve with ask, a check failed twice,
BLOCKED, a turn not reported) and when an agent is stuck on a permission, which rings as
always. More β Ring me when each agent ends its turn brings the old way back for that team; for
a team an agent starts, ring_turns: true in the request.
| You see | Why, and what to do |
|---|---|
| X has not started β its prompt may be waiting for Enter | The agent asked something before running its first prompt (a permissions warning, a hooks review). Open its window and answer; Argus never types blind into an agent. |
| X has not started β its prompt may be waiting for Enter (after 45 s) | see the row above |
| X stopped without reporting its turn: reminded | Two minutes after its turn began, if it sits waiting with no report: Argus sent it the reminder once. Five minutes: you are asked, and Continue retries that step. With the plugin this rarely happens β the Stop guard catches it first. |
| the check X did not start (its line in Y came out mangled?): typed again | Nothing ran in the check's session and it left neither a log nor an exit code: its line was spoiled before it ran β a browser or phone terminal answers tmux's queries late, as keys (1;2c0;276;0c), and they can land on the shell's line. Since 2026-10-09 the line is emptied first (Ctrl-U) and opens with : ;, so this should not happen; if it does, Argus types it once more, looked at 30 s after the start and every 10 s β only when nothing is running in the pane, so a check that runs for hours is never touched. |
| the check X did not start, twice | Look at that session's pane: the shell may be in a state no line gets through (a half-typed quote, a prompt asking something). Fix it there, then Continue types the check again. |
| the check X ended without an exit code | It ran (its log is there) but stopped before writing its code β stopped by hand with Ctrl-C, killed, the session closed. Not typed again on its own; Continue runs it again. |
| A check fails every round | Read its last lines in the log (the last 25), or its session <team>-<check step> (Optimise-check, Tournament-check-a). Two FAILs in a row stop a team on stop if something goes wrong. |
team_done says it is not your turn
|
Another step has the turn; the agent should stop and wait. |
could not associate with the session / team_done does not know whose turn |
Codex starts its MCP servers with a bare environment, without TMUX_PANE: since 0.1.13 the tools ask Argus, which finds the session from the process's parents (GET /api/tmux/whoami). Update the plugin, reload or restart the agent |
The agent has no team_task tool |
The plugin is not installed, or not reloaded: Settings β Interruptions (or Alt+V) shows it, and offers install, update and reload. argus-say works meanwhile. |
| Argus is served over https and the hooks never ring | Plugin 0.1.7 or later: the hooks, argus-say and the tools read the scheme and port from Argus's config. Update the plugin. |
| Two teams with the same name | Not any more: a name already taken is numbered (Optimise-2). Names are made session-safe: Kraken paper runs as Kraken-paper β use that name when asking an agent to pause or stop it. |
I changed team.yaml while the team runs. What happens? Nothing, to that team. Start takes a copy
of the team β steps, arrows, roles, duties, the check's command, the rounds β and the director
follows that copy to the end; it never reads the file again. The change shows the next time Team
is opened on that folder, as its card. To make it count: Restart β it reads the file again
(see Pause, Stop, Reset, Restart); or Stop, open Team on the folder,
Start. A
file the agents read by themselves (a RULES.md their duty names) is different: they see an edit
at their next turn, if their duty says to read it every turn.
Why not let the agents talk to each other? Because then nobody decides. Here the graph decides who goes next, the check decides whether it works, the judge decides whether it is good β and every one of those decisions is in the log, signed.
Why a file at all, now that there are tools? It is the record you read, keep under git, and hand to the next agent. The tools are how a turn arrives; the log is where it stays.
Can a team run with the browser shut? Yes: the director is on the server. You find it where you left it, and the bell (and ntfy, if you set it up) tells you when it needs you.
Can I use a skill of my own in a team? Write it into the duty of a role: "use your /kraken-backtest skill". The agent uses its own skills; Argus only says when.
What may a team do? Only with the full token and --allow-write: it writes a log into the
project, can make worktrees, and its check is a command line. An agent's key cannot start one by
itself: it reads its task, reports its turn, checks and proposes a team β and requests a start,
continue, pause or stop, which you approve with Do it (What an agent can do).
Starting one also records the team's folder as trusted in Claude Code (~/.claude.json) and Codex
(~/.codex/config.toml).
Where is it kept? Beside the config: teams.json (every team and its state), proposals.json
(proposals not yet taken up, the last 20) and teams/<id>/ (each check's output, per round). The
log of turns is TEAM.argus.md in the team's folder.
Can an agent write a team? Yes β see Asking an agent to design one.
The language is small enough that it gets it right, and team_check tells it when it does not.
The API: GET /api/teams, GET /api/teams/suggest?path=&goal=, POST /api/teams,
POST /api/teams/{id}/go|pause|stop|reset|restart, GET /api/teams/{id}/reset (the plan), DELETE /api/teams/{id}, POST /api/teams/yaml,
POST /api/teams/mermaid, and for agents GET /api/teams/task, POST /api/teams/done,
GET /api/teams/expecting, POST /api/teams/check, POST /api/teams/propose; packs:
GET /api/teams/packs, POST /api/teams/pack; proposals: DELETE /api/teams/proposals?folder=;
requests: GET /api/agent/actions, POST /api/agent/request, GET /api/agent/request/{id}. See
The API.