Skip to content

Ticket lifecycle

StatusDescription
openCreated, not yet started
in_progressAn agent is working on it
blockedWaiting on a dependency or user input
doneCompleted successfully
failedThe agent failed to complete the work
cancelledCancelled by the user or system
open ──→ in_progress ──→ done
│ │ │
│ ├──→ failed
│ ├──→ cancelled
│ └──→ blocked ──→ in_progress
└──→ cancelled

Valid transitions:

FromToTrigger
openin_progressAgent dispatched via TicketDispatcher
opencancelledUser cancels
in_progressdoneAgent completes with valid output
in_progressfailedAgent fails or output validation fails
in_progresscancelledUser cancels
in_progressblockedAgent reports a blocker
blockedin_progressBlocker resolved
blockedcancelledUser cancels
ProviderDescription
localControl Center only — no external sync
linearSynced bidirectionally with Linear
FieldTypeDescription
idStringUUID primary key
workspaceIdStringOwning workspace
titleStringShort summary
descriptionString?Detailed Markdown description
statusTicketStatusCurrent lifecycle state
priorityTicketPriorityPriority level
providerTicketProviderlocal or linear
externalKeyString?ID in the external provider
urlString?URL to the external issue
assignedAgentIdString?Assigned agent
assignedTeamIdString?Assigned team
delegatedByAgentIdString?Which agent delegated this
channelIdString?Conversation channel
modeConversationModeDispatch conversation mode
pipelineRunIdString?Pipeline that created this
projectIdString?Project grouping
parentTicketIdString?Parent ticket for hierarchy
expectedOutputSchemaString?JSON Schema for output validation
outputJsonString?Actual output when done
errorMessageString?Error if failed
executionLockedAtDateTime?Optimistic concurrency lock
EventFired when
TicketCreatedTicket is created
TicketAssignedTicket is assigned to an agent
TicketStartedAgent begins work
TicketCompletedWork finishes successfully
TicketFailedAgent fails
TicketCancelledTicket is cancelled
TicketStatusChangedAny status change
TicketReassignedTicket reassigned to another agent
TicketDelegatedAgent delegates to another agent
TicketCollaboratorAddedCollaborator joins
TicketDetailsUpdatedMetadata changes
Link typeDescription
blocksSource blocks target
relatesToRelated tickets
duplicateOfSource 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:

  1. Listens for TicketAssigned events
  2. Runs readiness check (agent available, workspace ready)
  3. Ensures a conversation channel exists
  4. Transitions openin_progress
  5. Dispatches the agent once