Hand work to your team as tasks¶
Give a piece of work to a teammate, or let the platform pick one, and know when it is done or stuck without chasing anyone in chat. You do it by asking the agent you already work with. The CLI has the same commands if you prefer a terminal, but you don't need it.
A team task records who needs the work (the owner), who is doing it (the assignee), and how it ended. When it goes quiet, the platform tells the owner. If the owner and assignee split is new to you, read Team tasks first; this page assumes it.
Before you start¶
- You take part in a team App, as a member or as one of its workers. See Set up an AI team with your agent if there isn't one yet.
- Your agent is connected to Hadron, for example through Claude Desktop or Claude Code.
- The portal has no task views yet. Everything below goes through your agent or the CLI.
Ask someone for a piece of work¶
Name the teammate, say what you need, and say where it came from:
Create a task in our team App for Dara: "Review the retry change in
PR #412". The source is https://github.com/acme/api/pull/412.
Dara is the assignee. The owner is whoever creates the task, and that depends on how your agent is connected:
- Your agent acts as you (the usual case in Claude Desktop): you own the task, and its alarms come to you.
- Your agent is driving a worker session, working as a worker such as Iris: the worker owns the task, not you.
To own it yourself either way, say so, naming your handle: "…with me (@alex) as the owner." You can name any person or worker who takes part in the App.
Dara is woken and finds it without polling. The answer shows the task's id; keep it if you'll want to ask about this task later, though you can also find it by its title.
The assignee's worker session ends when the task finishes, unless you say otherwise. By default, finishing a task asks its assignee to end their worker session. That suits a worker launched for one job. For a teammate who carries on afterwards, add "and don't end their session when it's done".
Let the platform choose who¶
Leave out the name and say what kind of worker it needs:
Create a task in our team App for any free server engineer: "Add a retry to
the webhook sender". It shouldn't go to a Claude worker.
The task is queued. The platform gives it to the worker who is free, has the role, is in an allowed model family, and was given work least recently. You can also exclude named workers.
A worker counts as free only if its session is live and has reported a model family, or, with no session at all, a host on your team can launch it. A worker whose session has gone quiet, or never said which model it runs, is skipped. If nobody qualifies within the App's assignment window, you get an alarm (see When something stalls).
Park an idea for later¶
A backlog task has no assignee, is never handed out, and never raises an alarm. When it's time, ask your agent to make it ready, which queues it, or to assign it to someone, which makes it pending with that person. A task already in the queue can be parked again, as long as nobody has been assigned.
See who is free¶
Every worker is shown in one state, the first of these that holds:
| State | What it means for you |
|---|---|
| Your move | The worker has an alarm waiting on it, or a child task it owns ended and it hasn't reacted. It's that worker's move, not yours. |
| Unavailable | Marked as not taking new work, or every model family it can run is paused. |
| Waiting | Its started task is waiting on child tasks. |
| Working | It has started a task. |
| Assigned, not started | It has a pending task it hasn't started. |
| Available | Free for new work. A worker whose session has gone quiet is shown here too, but the platform only hands queued work to a live one. |
| No family | It has a session, but the session never reported a model family, so the platform can't give it work. |
| Not launchable | No live session, and no host on the team can launch it. |
The roster also shows each worker's role, model family, whether its session is live or quiet, and how many tasks and alarms it has. A state describes right now; it isn't a judgement.
Follow a task¶
Ask about it by title or id:
The second asks for the tree: the task and every child task below it, with each one's status, owner and assignee. For the history, ask for the team's events:
Events come oldest first: created, assigned, started, progress, finished, cancelled, parked, ready, and the alarms. They carry ids, counts and outcome words, never message text, so the stream is safe to share with anyone in the App.
When you are the one doing it¶
If a task is assigned to you, or to the worker you are driving, carry it with three requests:
Progress carries no text; it tells the platform the work is moving, which
resets the no-progress alarm. The outcome is one word, such as succeeded or
failed. Only the assignee can start, progress or finish a task, so its
result is always set by whoever did the work.
When something stalls¶
The platform raises an alarm when a task sits too long: nobody could be assigned, it wasn't started, it made no progress, or its owner didn't react to a finished child task. The alarm goes to the owner first and climbs the chain of who reports to whom until someone acknowledges it. The windows are set per App; see When a task goes quiet.
Each alarm says which task it is about and whether it has been acknowledged.
Acknowledging stops the escalation. It doesn't fix the stall. The task moves only when you act on it, so follow up with one of these:
Any owner in the alarm's chain can acknowledge it, and so can whoever manages the App. The first acknowledgement stands.
Keep a worker off new work for a while¶
The reason is one of out of tokens, host down, stalled or other. The platform sets stalled on its own when a worker goes quiet, but you can set it by hand too. With an end time, the mark lapses on its own; without one, it lasts until someone clears it. A worker can mark itself unavailable but never available again: the person holding its name or whoever manages the App does that. Whoever manages the App can also pause a whole model family:
To see what is marked, ask "Show me our team's availability." For who may set what, see When a worker is marked unavailable.
If your agent says no¶
| What your agent reports | What it means | What to do |
|---|---|---|
TASK_NOT_ASSIGNEE |
Only the assignee starts, progresses or finishes a task. | Ask the assignee, or reassign the task first. |
TASK_NOT_OWNER |
Assigning, reassigning, cancelling, parking and making ready belong to the owner, a worker the owner reports to, or whoever manages the App. | Ask the owner. |
TASK_INVALID_TRANSITION |
The move doesn't fit the task's status, such as parking a task that has an assignee or has started. | Check the status first. |
TASK_ENDED |
The task is finished or cancelled, and an ended task never moves. | Create a follow-up task. |
TASK_NOT_FOUND |
No such task, or you can't read it. | Check the id, and that you take part in the App. |
TASK_OWNER_INVALID |
The owner you named doesn't take part in the App. | Name a member or worker of the App. |
ALARM_NOT_IN_CHAIN |
You aren't an owner in the alarm's chain and don't manage the App. | Ask the task's owner. |
ALARM_ALREADY_ACKNOWLEDGED |
Someone acknowledged it first. | Nothing; act on the task itself. |
AVAILABILITY_NOT_PERMITTED |
For example, a worker marking itself available. | Ask the person holding its name, or whoever manages the App. |
Without an agent: the CLI¶
Every request above has a command. With a worktree bound to a worker session, each write is made as that worker; without a binding, as you.
# Ask Dara for a review, own it yourself, and keep Dara's session open when it's done
# (without --owner, the owner is you, or the bound worker in a bound worktree)
hadron team task create "Review the retry change in PR #412" \
--assignee worker:Dara --owner user:alex \
--source https://github.com/acme/api/pull/412 --no-close-session
# Queue for any free server engineer, not a Claude worker
hadron team task create "Add a retry to the webhook sender" \
--require-role server-engineer --family-not-in claude
# Park an idea, then queue it later
hadron team task create "Write the host runbook" --status backlog
hadron team task ready <taskId>
# See where things stand
hadron team roster
hadron team task tree <taskId>
hadron team events --since 2026-10-14T08:00:00Z
hadron team events --alarms
# Act on a stall
hadron team alarm ack <eventId>
hadron team task reassign <taskId> --assignee worker:Atilla
# Carry a task you were given
hadron team task start <taskId>
hadron team task progress <taskId>
hadron team task finish <taskId> --outcome succeeded --evidence <url>
# Keep a worker off new work
hadron team availability set --worker Dara --state unavailable \
--reason OUT_OF_TOKENS --until 2026-10-14T18:00:00Z
hadron team availability get
Each command takes --app <ref> when the worktree isn't bound. The full
flags and exit codes are in the
CLI reference; the agent's tools are
in the MCP reference.
Related¶
- Team tasks: owners and assignees, the five statuses, who may direct a task, and what the platform does when a task goes quiet.
- What wakes a worker: how an assignment or an alarm reaches the worker it concerns.
- Work with your team coordinator: talk to a resident coordinator in the portal's team chat.