| Status | Description |
|---|
open | Created, not yet started |
in_progress | An agent is working on it |
blocked | Waiting on a dependency or user input |
done | Completed successfully |
failed | The agent failed to complete the work |
cancelled | Cancelled by the user or system |
open ──→ in_progress ──→ done
│ └──→ blocked ──→ in_progress
Valid transitions:
| From | To | Trigger |
|---|
open | in_progress | Agent dispatched via TicketDispatcher |
open | cancelled | User cancels |
in_progress | done | Agent completes with valid output |
in_progress | failed | Agent fails or output validation fails |
in_progress | cancelled | User cancels |
in_progress | blocked | Agent reports a blocker |
blocked | in_progress | Blocker resolved |
blocked | cancelled | User cancels |
| Provider | Description |
|---|
local | Control Center only — no external sync |
linear | Synced bidirectionally with Linear |
| Field | Type | Description |
|---|
id | String | UUID primary key |
workspaceId | String | Owning workspace |
title | String | Short summary |
description | String? | Detailed Markdown description |
status | TicketStatus | Current lifecycle state |
priority | TicketPriority | Priority level |
provider | TicketProvider | local or linear |
externalKey | String? | ID in the external provider |
url | String? | URL to the external issue |
assignedAgentId | String? | Assigned agent |
assignedTeamId | String? | Assigned team |
delegatedByAgentId | String? | Which agent delegated this |
channelId | String? | Conversation channel |
mode | ConversationMode | Dispatch conversation mode |
pipelineRunId | String? | Pipeline that created this |
projectId | String? | Project grouping |
parentTicketId | String? | Parent ticket for hierarchy |
expectedOutputSchema | String? | JSON Schema for output validation |
outputJson | String? | Actual output when done |
errorMessage | String? | Error if failed |
executionLockedAt | DateTime? | Optimistic concurrency lock |
| Event | Fired when |
|---|
TicketCreated | Ticket is created |
TicketAssigned | Ticket is assigned to an agent |
TicketStarted | Agent begins work |
TicketCompleted | Work finishes successfully |
TicketFailed | Agent fails |
TicketCancelled | Ticket is cancelled |
TicketStatusChanged | Any status change |
TicketReassigned | Ticket reassigned to another agent |
TicketDelegated | Agent delegates to another agent |
TicketCollaboratorAdded | Collaborator joins |
TicketDetailsUpdated | Metadata changes |
| Link type | Description |
|---|
blocks | Source blocks target |
relatesTo | Related tickets |
duplicateOf | Source is a duplicate of target |
TicketWorkflowService manages all mutations:
- Optimistic concurrency via
version field and executionLockedAt
- Workspace isolation — every mutation validates
workspaceId ownership
- Single chokepoint — all mutations go through
_mutate which validates scope
TicketDispatcher handles the assigned→dispatch flow:
- Listens for
TicketAssigned events
- Runs readiness check (agent available, workspace ready)
- Ensures a conversation channel exists
- Transitions
open → in_progress
- Dispatches the agent once