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.
CloudEvents
Section titled “CloudEvents”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.
Who sends it, who reads it
Section titled “Who sends it, who reads it”- 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.
Fields
Section titled “Fields”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" ] } } ]}Example
Section titled “Example”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"}Refused
Section titled “Refused”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
Source
Section titled “Source”- Schema:
schemas/superpipeline/decision.timeout.v1.json - In the package:
import schema from "@superjackfruitlabs/treaty-event-schemas/superpipeline/decision.timeout.v1.json" with { type: "json" };