Skip to content

ICS Incident Command System ​

Alga implements the Incident Command System (ICS) for structured incident response — a hierarchical command structure with formal role assignments and war-room coordination. Every incident can have a clearly defined chain of command with specific responsibilities for each role.

Why ICS? ​

ICS is the same framework used by emergency responders worldwide, adapted for technology incidents. It solves three problems during high-stress incidents:

  1. Who's in charge? — An Incident Commander owns incident direction and final calls
  2. Who does what? — Roles separate command (decision-making), communications (status updates), and response (hands-on fix)
  3. How do we hand off? — Roles can be ended and reassigned as responders rotate

ICS Roles ​

Role TypeLabelResponsibility
incident_commanderIncident CommanderOwns incident direction, escalation decisions, final calls, and documentation quality
communications_leadCommunicatorOwns status updates, stakeholder communication, summaries, and human-facing messages
responderResponderOwns investigation, mitigation, evidence gathering, and technical recovery work

Each role maps to a required agent capability: incident_commander → command, communications_lead → communicate, responder → investigate. Agents assigned a role must hold the matching capability.

Role Assignments ​

An ICS role assignment (ICSRoleAssignment) tracks:

FieldDescription
role_typeincident_commander, communications_lead, or responder
assignee_typeuser or agent
statusactive or ended
scope_descriptionOptional free-text scope (also used for custom role scoping)
ended_reasonWhy the role ended (replaced, incident_resolved, assigned, agent_offline)
started_at / ended_atRole tenure

Assignments form a parent/child hierarchy via a self-referential parent edge, so a commander can have responder or communicator roles nested beneath it. Agents hold roles through the agent_token edge; users through the user edge.

Assigning ICS Roles ​

Via the API ​

Assign to a user:

bash
curl -X POST http://localhost:8080/api/v1/incidents/{id}/ics/roles \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "role_type": "incident_commander",
    "user_id": "550e8400-e29b-41d4-a716-446655440000"
  }'

Assign to an agent (provide agent_token_id instead of user_id; the two are mutually exclusive):

bash
curl -X POST http://localhost:8080/api/v1/incidents/{id}/ics/roles \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "role_type": "responder",
    "agent_token_id": "770e8400-e29b-41d4-a716-446655440002",
    "scope_description": "Investigate database connection pool exhaustion"
  }'

Auto-Assignment ​

When an incident is processed, the incident worker auto-assigns the Incident Commander role by resolving the on-call user for the affected service (via its on-call schedule and escalation policy). If an on-call user is found, they become IC and a timeline entry is recorded. If none is found, the IC role is left for manual assignment.

Ending and Updating Roles ​

Roles are ended (not deleted) to preserve the role history. Ending sets status=ended with an ended_reason and stamps ended_at. Common end reasons:

  • replaced — a new assignee took over the role
  • incident_resolved — the incident moved to a terminal state
  • assigned — superseded by a new assignment
  • agent_offline — the assigned agent went offline

Incident Document ​

Each incident has a section-based collaborative document used for shared note-taking during response. Sections are version-tracked per section and record the user who last updated them.

SectionPurpose
current_statusCurrent state of the incident
impact_assessmentWhat is affected, severity, blast radius
actions_takenRemediation steps and outcomes
open_questionsUnresolved questions
resourcesLinks and references
timeline_summaryCondensed event timeline
root_causeTechnical root cause (required to resolve)
resolutionHow it was resolved (required to resolve)

impact_assessment, root_cause, and resolution (plus the incident summary) must be filled in before the incident can be resolved.

Document API ​

MethodPathPermissionDescription
GET/api/v1/incidents/{id}/ics/documentincidents:readGet all document sections
PUT/api/v1/incidents/{id}/ics/document/{section}incidents:writeUpdate a section (version-checked)

Role Management API ​

MethodPathPermissionDescription
GET/api/v1/incidents/{id}/ics/rolesincidents:readList ICS role assignments
POST/api/v1/incidents/{id}/ics/rolesincidents:commandAssign ICS role (user or agent)
PATCH/api/v1/incidents/{id}/ics/roles/{roleId}incidents:commandUpdate ICS role assignment
DELETE/api/v1/incidents/{id}/ics/roles/{roleId}incidents:commandEnd ICS role assignment

Google Meet War Rooms ​

When an incident is active, the team needs a place to coordinate in real time. Alga can provision a Google Meet conference space per incident for war-room-style voice/video coordination. The Meet space name and conference URL are stored on the incident; unlinking clears both.

Enabling War Rooms ​

Set these environment variables:

VariableDescription
GOOGLE_MEET_ENABLEDSet to true to enable war-room provisioning
GOOGLE_MEET_CREDENTIALS_PATHPath to a service-account JSON with the Meet API enabled and domain-wide delegation for https://www.googleapis.com/auth/meet.space.admin
GOOGLE_MEET_AUTO_CREATESet to true to auto-create a Meet space per incident

API Endpoints ​

MethodPathPermissionDescription
POST/api/v1/incidents/{id}/google-meetincidents:commandCreate a Meet space for the incident
DELETE/api/v1/incidents/{id}/google-meetincidents:commandUnlink the Meet space

Multi-Agent Coordination ​

When AI agents are assigned ICS roles, they collaborate through a task-driven coordination model: the commander dispatches typed coordination tasks, the assigned responder/communicator agents execute them, and report results back. This replaces ad-hoc coordination with structured, typed work units. See Coordination for the coordination task and message model.

Best Practices ​

  • Keep a single active commander — end the outgoing commander role before or as you assign a new one
  • Formally end roles when no longer needed to keep the role board clean and the history accurate
  • Assign communicators early — stakeholders need updates fast; don't wait until the incident is resolved to communicate
  • Let agents handle routine work — assign agents responder or communicator roles for parallel investigation and status publishing (they must hold the matching capability)

See Also ​

Released under the MIT License.