Grey Queue State Machine

Sprint: SPRINT_20260118_018_Unknowns_queue_enhancement (UQ-005)

State Diagram

stateDiagram-v2
    [*] --> Pending: Entry created

    Pending --> Processing: Start processing
    Pending --> UnderReview: Assign to reviewer
    Pending --> Expired: TTL exceeded
    Pending --> Dismissed: Manual dismissal

    Processing --> Retrying: Processing failed (retry)
    Processing --> UnderReview: Needs human review
    Processing --> Resolved: Successfully resolved
    Processing --> Failed: Max attempts exhausted

    Retrying --> Processing: Retry attempt
    Retrying --> Failed: Max attempts exhausted
    Retrying --> Expired: TTL exceeded

    UnderReview --> Escalated: Escalate to security
    UnderReview --> Resolved: Reviewer resolves
    UnderReview --> Rejected: Reviewer rejects
    UnderReview --> Pending: Unassign (reset)

    Escalated --> Resolved: Security resolves
    Escalated --> Rejected: Security rejects
    Escalated --> UnderReview: De-escalate

    Rejected --> Pending: Reopen
    Failed --> Pending: Reset for retry
    Dismissed --> Pending: Reopen

    Resolved --> [*]
    Expired --> [*]

States

StateDescriptionEntry CriteriaExit Criteria
PendingAwaiting initial processingEntry createdProcessing started, assigned, expired, or dismissed
ProcessingActively being processed by automationProcessing startedRetry, human review, resolved, or failed
RetryingWaiting for retry after failed attemptProcessing failedRetry attempt, max attempts, or TTL
UnderReviewAssigned to human reviewerNeeds human decisionEscalated, resolved, rejected, or unassigned
EscalatedPromoted to security teamReviewer escalatesSecurity team decision
ResolvedEvidence now sufficient (terminal)Automated or manual resolutionN/A
RejectedInvalid or not actionableReviewer/security rejectsCan be reopened
FailedExhausted all retries (terminal-ish)Max attempts exceededCan be reset
ExpiredTTL exceeded (terminal)Time limit reachedN/A
DismissedManually dismissed (terminal-ish)Operator dismissalCan be reopened

State Requirements

UnderReview

Escalated

Rejected

Valid Transitions

Pending       → [Processing, UnderReview, Expired, Dismissed]
Processing    → [Retrying, UnderReview, Resolved, Failed]
Retrying      → [Processing, Failed, Expired]
UnderReview   → [Escalated, Resolved, Rejected, Pending]
Escalated     → [Resolved, Rejected, UnderReview]
Resolved      → []  (terminal)
Rejected      → [Pending]
Failed        → [Pending]
Expired       → []  (terminal)
Dismissed     → [Pending]

Transition Audit

All transitions are recorded in grey_queue_state_transitions table:

ColumnDescription
entry_idGrey queue entry reference
from_statePrevious state
to_stateNew state
transitioned_byUser who triggered transition
reasonOptional reason for transition
transitioned_atTimestamp
metadataAdditional context (JSONB)

API Endpoints

EndpointTransition
POST /api/grey-queue/{id}/assign→ UnderReview
POST /api/grey-queue/{id}/escalate→ Escalated
POST /api/grey-queue/{id}/reject→ Rejected
POST /api/grey-queue/{id}/reopen→ Pending
POST /api/grey-queue/{id}/resolve→ Resolved
POST /api/grey-queue/{id}/dismiss→ Dismissed
GET /api/grey-queue/{id}/transitionsGet valid next states

Code Reference