Smart Agent Teams

Statuses and enums

Every status and enumerated value in SAT, what each one means, and what moves an object between them.

These are the exact values the API accepts and returns. They are defined in apps/api/company/schemas.py and apps/api/database/company_models.py, and the labels and order the web app and CLI show come from libs/api-client/src/vocabulary.ts.

Task status

TaskStatus. Default for new tasks: todo.

ValueLabelMeaningSet by
backlogBacklogCaptured, not ready to work onA person or agent. Assigning a backlog task does not wake the agent.
todoTodoReady to startDefault on create; a person or agent
in_progressIn progressBeing worked on. Moving here stamps started_at the first time.The runner, when a run starts on a backlog or todo task; a person or agent
in_reviewIn reviewWork is done and waits for a person to check itThe runner, when a run succeeds (default --on-success in_review); a person or agent
blockedBlockedCannot continue without helpThe runner, when the agent's reply starts with BLOCKED:; a person or agent
doneDoneFinished. Moving here stamps completed_at; leaving done clears it.A person or agent; the runner with --on-success done
cancelledCancelledWill not be doneA person or agent

Board columns, in order: backlog, todo, in_progress, in_review, blocked, done. Any status can move to any other; there is no enforced workflow. Assigning (or reassigning) a task whose status is not backlog, done or cancelled to an available agent queues an assignment run.

Task priority

TaskPriority. Default: medium.

ValueLabel
urgentUrgent
highHigh
mediumMedium
lowLow
noneNo priority

Goal status

GoalStatus. Default: active.

ValueMeaning
plannedAgreed but not started
activeBeing pursued
achievedReached
abandonedDropped

Goal status is set only by people and agents; it does not change automatically when linked tasks finish. Progress (tasks_done of tasks_total) is computed separately.

Project status

Default: active. Accepted on update only (CompanyProjectUpdate).

ValueMeaning
activeIn progress
pausedOn hold
completedFinished
archivedKept for history

Project status is informational. It does not stop tasks, runs or spend in the project.

Agent status

AgentStatus. There is no endpoint to set it directly; it changes through actions and runs.

ValueLabelMeaningEntered whenLeft when
idleIdleAvailable for workHired without approval; a hire is approved; resumed; a run finishes (not failed) and no other run is running; a budget override is approvedA run is claimed or started, the agent is paused or terminated
runningRunningExecuting at least one runA run is claimed, or a run is reported runningIts last running run finishes
pausedPausedNot woken and its runs are not claimedPOST /agents/{agent_id}/pause; the agent reaches its monthly budget (a budget_override approval is opened)Resumed, or its budget override is approved
pending_approvalAwaiting approvalProposed hire waiting for a decisionHired with request_approval: trueThe hire_agent approval is approved (idle) or rejected (terminated)
terminatedTerminatedRetired. Leaves the org chart; history stays. Its queued and running runs are cancelled.POST /agents/{agent_id}/terminate; a hire is rejectedNever
errorErrorIts last run failedA run finishes failed (including lease expiry) and no other run is runningThe next run is claimed (running)

Dormant statuses are paused, pending_approval and terminated. Dormant agents are not woken by assignments, routines or heartbeats, wake answers 400 INVALID_STATE, and runners skip their queued runs. error is not dormant.

Run status

RunStatus.

ValueLabelMeaningSet by
queuedQueuedWaiting for a runnerCreated by a wake, an assignment or a routine trigger. A run cannot go back to queued.
runningRunningClaimed by a runner, or reported runningPOST /runs/claim (stamps runner_id, heartbeat_at, started_at)
succeededSucceededFinished successfullyThe runner's final PATCH /runs/{run_id}
failedFailedFinished with an error, or its lease expiredThe runner; lease expiry (error is "... stopped reporting (lease expired)")
cancelledCancelledStopped by a person, or because its agent was terminatedPOST /runs/{run_id}/cancel; terminating the agent

succeeded, failed and cancelled are finished: ended_at is stamped, the agent's budget is checked, and any further report answers 400 RUN_FINISHED.

Run trigger

Why the run was queued (runs.trigger).

ValueMeaning
manualPOST /agents/{agent_id}/wake, from a person, sat agents wake, or the scheduler's agent heartbeats. The transcript's first entry gives the reason, for example heartbeat.
assignmentA task was created for or reassigned to the agent
routineA routine was triggered (POST /routines/{routine_id}/trigger)
heartbeatDefined as an allowed value, but no endpoint creates runs with it today. Scheduler heartbeats are recorded as manual.

Approval status

ApprovalStatus. Default: pending.

ValueMeaningSet by
pendingWaiting for a decisionCreated
approvedApproved; decided_by_user_id, decided_at and an optional decision_note are recordedPOST /approvals/{approval_id}/approve
rejectedRejected; the same fields are recordedPOST /approvals/{approval_id}/reject

A decided approval cannot be decided again (400 ALREADY_DECIDED). Any member can decide.

Approval type

ValueCreated whenApproveReject
hire_agentAn agent is hired with request_approval: trueAgent becomes idleAgent becomes terminated
budget_overrideA finished run brings an agent to its monthly budget; the agent is paused. At most one pending per agent.Sets the budget to new_budget_cents if given, else raises a non-zero budget to this month's spend plus the original budget; a paused agent becomes idleAgent stays paused
actionNo endpoint creates it todayRecords the decision onlyRecords the decision only

Member role

ValueMeaning
ownerCreated the company. Same powers as admin.
adminMay change the company (PATCH /api/companies/{company_id}). Not assignable through the API yet.
memberEvery other company action. Not assignable through the API yet.

Comment kind

CommentCreate.kind. Default: comment.

ValueMeaning
commentAn ordinary message. The runner posts an agent's final reply as a comment.
questionA question that needs an answer. The runner posts a BLOCKED: reply as a question.
planA plan of work

The task_comments.kind column is documented in the model as also allowing system, but the API does not accept or create it.

Audit actor type

audit_events.actor_type.

ValueMeaningactor_name
userA person made the changeThe user's name
agentAn agent made the change through a running run (run_id)The agent's name
systemSAT made the change: run claims and finishes, budget pauses, lease expiryThe agent's name when one is involved, otherwise system

Transcript role

TranscriptEntry.role. Default: agent.

ValueMeaning
agentThe agent's own messages
toolTool calls and their results (commands, file edits)
systemRunner and API notes: queued, claimed, workspace, unparsed output
userInput addressed to the agent

Roles and adapters

Agent roles

role is free text (up to 50 characters, default engineer). The web app and CLI offer these values (ROLES):

ceo, cto, cmo, cfo, engineer, designer, qa, devops, researcher, writer, support

Adapters

adapter is free text (up to 50 characters, default claude_code). The web app and CLI offer these values (ADAPTERS):

ValueLabelIn sat runner
claude_codeClaude CodeImplemented (claude on PATH)
codexCodexImplemented (codex on PATH)
cursorCursorNot implemented; runs fail
geminiGemini CLINot implemented; runs fail
opencodeOpenCodeNot implemented; runs fail
httpHTTP webhookNot implemented; runs fail

The runner also has a built-in echo adapter, used for every agent with --simulate. See Adapters.

Preferences

Account preferences (PATCH /api/me/preferences) use these enumerations.

FieldValues
themelight, dark, system
densitycomfortable, compact
date_styleshort, medium, long
dashboard.range_days7, 14, 30
tasks.viewlist, board
accent, avatar_colorroyal, sky, slate, ink

See Views and preferences.

On this page