Skip to content

dev.superpipeline.decision.reminded.v1

The reminder posted when a waiting decision passes its stage’s reminder time, in reply to the waiting card (m.in_reply_to). A reminder of overdue checks has no card and stands alone. Readers ignore properties they do not know.

An m.room.message whose content carries suite_event_type: "dev.superpipeline.decision.reminded.v1".

The carrier is whichever service carries the board’s chat: AgentPod’s hub, or SuperExchange for a board that has moved to it.

Field Type Required Description Constraints
msgtype "m.text" yes
body string yes
schema_version integer yes at least 1
board_id string yes at least 1 character
card_id string yes at least 1 character
decision_kind one of "gate", "question", "delivery", "attention", "checks" yes
decision_id string yes at least 1 character
waiting_since string yes pattern ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?(Z|[+-]\d{2}:\d{2})$; at most 40 characters
suite_event_type "dev.superpipeline.decision.reminded.v1" yes
reminded_at string yes pattern ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?(Z|[+-]\d{2}:\d{2})$; at most 40 characters
m.relates_to object no
m.relates_to.m.in_reply_to object yes
m.relates_to.m.in_reply_to.event_id string yes at least 1 character

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

{
"allOf": [
{
"not": {
"required": [
"escalated_at"
]
}
},
{
"not": {
"required": [
"deep_link"
]
}
},
{
"if": {
"properties": {
"decision_kind": {
"not": {
"const": "checks"
}
}
}
},
"then": {
"required": [
"m.relates_to"
]
}
}
]
}

From fixtures/matrix-events/examples.json, case “a gate reminded after three hours”:

{
"msgtype": "m.text",
"body": "Still waiting: \"Launch post\" has waited 3 h for an approval.",
"suite_event_type": "dev.superpipeline.decision.reminded.v1",
"schema_version": 1,
"board_id": "brd_7c1f",
"card_id": "crd_6b40",
"decision_kind": "gate",
"decision_id": "gate_8f3a",
"waiting_since": "2026-11-08T12:00:00.000Z",
"reminded_at": "2026-11-08T15:00:30.000Z",
"m.relates_to": {
"m.in_reply_to": {
"event_id": "$gateEventId"
}
}
}

The corpus has 3 valid cases in all:

checks: overdue checks reminded
{
"msgtype": "m.text",
"body": "Still waiting: \"Ship the release\" has waited 1 h for its checks.",
"suite_event_type": "dev.superpipeline.decision.reminded.v1",
"schema_version": 1,
"board_id": "brd_7c1f",
"card_id": "crd_8a40",
"decision_kind": "checks",
"decision_id": "arr_5d02",
"waiting_since": "2026-11-09T09:00:00.000Z",
"reminded_at": "2026-11-09T10:00:00.000Z"
}
built: a gate reminded after three hours
{
"msgtype": "m.text",
"body": "Still waiting: \"Ship the release notes\" has waited 3 h for an approval.",
"suite_event_type": "dev.superpipeline.decision.reminded.v1",
"schema_version": 1,
"board_id": "brd_7c1f",
"card_id": "crd_6b40",
"decision_kind": "gate",
"decision_id": "gate_8f3a",
"waiting_since": "2030-01-01T09:00:00.000Z",
"reminded_at": "2030-01-01T12:00:00.000Z",
"m.relates_to": {
"m.in_reply_to": {
"event_id": "$cardEvent"
}
}
}

Each of these must fail. The corpus says why:

  • no m.relates_to. A client cannot tell which card it is about. (refused by schema)
  • an m.reference rather than a reply. A notice is a reply to the card; an m.reference is an answer or a receipt. (refused by schema)
  • no decision_id (refused by schema)
  • a decision_kind outside gate | question | delivery | attention (refused by schema)
  • no reminded_at (refused by schema)