Skip to content

decision.timeout v1

A waiting decision passed its stage’s timeout (charter: unanswered decisions remind, then escalate §2-3). Each is sent at most once per wait: remindedAt rides on decision.reminded, escalatedAt on decision.escalated. Mirrors SuperPipeline’s DecisionNoticeBody (apps/api/src/board/decision-timeouts.ts). Readers ignore properties they do not know.

Every event below carries dataschema https://raw.githubusercontent.com/SuperJackfruitLabs/treaty/main/schemas/superpipeline/decision.timeout.v1.json.

Body event CloudEvents type Subject
decision.reminded com.superjackfruit.superpipeline.decision.reminded.v1 evt.<workspace>.superpipeline.decision.reminded
decision.escalated com.superjackfruit.superpipeline.decision.escalated.v1 evt.<workspace>.superpipeline.decision.escalated

The subject is the NATS subject the relay files it under; <workspace> is the board’s workspace. See the envelope and subjects.

  • Produced by SuperPipeline, through the relay.
  • Consumed by:
    • SuperExchange: Posts it to the board’s room, for the boards it carries. Receives it through the relay.
    • AgentPod: The hub’s board chat posts it, for the boards it still carries.
    • SuperDispatch: Takes it as a nudge to look at the board soon, on a board opted into scheduling. Reads nothing from its data.

Readers ignore properties they do not know, so a field may be added without a new version.

Field Type Required Description Constraints
event one of "decision.reminded", "decision.escalated" yes
boardId string or null yes Null only on a board not yet initialised; a carrier needs it to route the event.
boardName string yes Empty string when the board has no name, never absent.
cardId string yes
cardTitle string yes
stageKey string yes
stageName string yes
decisionKind one of "gate", "question", "delivery", "attention", "checks" yes
decisionId string yes The gate id (gate, delivery), the elicitation id (question), the wait id (attention) or the check set’s arrival id (checks).
waitingSince string yes format date-time
remindedAt string no format date-time
escalatedAt string no format date-time
ts string yes format date-time

The schema also states these rules across fields, as written:

{
"allOf": [
{
"if": {
"properties": {
"event": {
"const": "decision.reminded"
}
}
},
"then": {
"required": [
"remindedAt"
]
}
},
{
"if": {
"properties": {
"event": {
"const": "decision.escalated"
}
}
},
"then": {
"required": [
"escalatedAt"
]
}
}
]
}

From fixtures/superpipeline-events/examples.json, case “reminded”:

{
"event": "decision.reminded",
"boardId": "brd_134a0ddb6d434478",
"boardName": "Timeout board",
"cardId": "crd_0f3c9a2b7d4e4a11",
"cardTitle": "Add login",
"stageKey": "review",
"stageName": "Review",
"decisionKind": "gate",
"decisionId": "gat_5d1e2f3a4b5c6d7e",
"waitingSince": "2026-11-10T09:00:00.000Z",
"remindedAt": "2026-11-10T10:01:00.000Z",
"ts": "2026-11-10T10:01:00.000Z"
}

The corpus has 2 valid cases in all:

escalated
{
"event": "decision.escalated",
"boardId": "brd_134a0ddb6d434478",
"boardName": "Timeout board",
"cardId": "crd_0f3c9a2b7d4e4a11",
"cardTitle": "Add login",
"stageKey": "review",
"stageName": "Review",
"decisionKind": "checks",
"decisionId": "arr_7e8f9a0b1c2d3e4f",
"waitingSince": "2026-11-10T09:00:00.000Z",
"ts": "2026-11-10T13:01:00.000Z",
"escalatedAt": "2026-11-10T13:01:00.000Z"
}

Each of these must fail. The corpus says why:

  • a reminder says when it reminded
  • an escalation says when it escalated
  • the decision kind is one of five
  • only the two timeout events