dev.superpipeline.attention.v2
Nothing is frozen on a waiting card, so it carries no subject.
How it rides
Section titled “How it rides”An m.room.message whose content carries suite_event_type: "dev.superpipeline.attention.v2".
Who sends it, who reads it
Section titled “Who sends it, who reads it”- Sent by AgentPod, SuperExchange.
- Read by SuperMessage.
The carrier is whichever service carries the board’s chat: AgentPod’s hub, or SuperExchange for a board that has moved to it.
Fields
Section titled “Fields”| Field | Type | Required | Description | Constraints |
|---|---|---|---|---|
msgtype |
"m.text" |
yes | ||
body |
string | yes | ||
suite_event_type |
"dev.superpipeline.attention.v2" |
yes | ||
schema_version |
integer | yes | at least 1 | |
board_id |
string | yes | at least 1 character | |
card_id |
string | yes | at least 1 character | |
card_title |
string | yes | ||
stage_key |
string | yes | ||
stage_name |
string | yes | at most 200 characters | |
wait_id |
string | yes | at least 1 character; at most 200 characters | |
reason |
string | yes | at least 1 character; at most 64 characters | |
detail |
string or null | yes | ||
summary |
string or null | yes | ||
failure_count |
integer or null | yes | at least 1 | |
options |
array of object | yes | at least 1 item; at most 20 items | |
options[].id |
string | yes | pattern ^(resume_here|archive|resume_at:.+)$; at most 200 characters |
|
options[].label |
string | yes | at least 1 character; at most 200 characters | |
options[].meaning |
one of "approve", "reject", "revise", "choose", "defer" |
yes | ||
options[].needs_comment |
boolean | yes | ||
options[].input |
object | no | ||
options[].input.kind |
one of "text", "url" |
yes | ||
options[].input.label |
string | yes | at most 200 characters | |
options[].input.required |
boolean | yes | ||
options[].input.max_length |
integer | yes | at least 1; at most 4000 | |
deadline |
object | no | ||
deadline.remind_at |
string | no | 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 |
|
deadline.escalate_at |
string | no | 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 |
|
deep_link |
string | no |
The schema also states these rules across fields, as written:
{ "not": { "required": [ "subject" ] }}x-uniqueBy: the values at these paths must not repeat, the one rule JSON Schema cannot state. a[].b is field b of each item of list a.
options[].id
Example
Section titled “Example”From fixtures/matrix-events/examples.json, case “a blocked card with an earlier stage to resume at”:
{ "msgtype": "m.text", "body": "A card is waiting on you — \"Ship the release\" at Build is blocked.\n\nStaging DB down\n\n```\nthe staging database is down\n```\n\n- Resume here\n- Resume at Plan\n- Archive\n\nChoose in an updated app, or [open the card](https://superpipeline.dev/b/brd_7c1f/c/crd_6b40) on the board.", "suite_event_type": "dev.superpipeline.attention.v2", "schema_version": 1, "board_id": "brd_7c1f", "card_id": "crd_6b40", "card_title": "Ship the release", "stage_key": "build", "stage_name": "Build", "wait_id": "wait_0123456789abcdef", "reason": "blocked", "detail": "the staging database is down", "summary": "Staging DB down", "failure_count": null, "options": [ { "id": "resume_here", "label": "Resume here", "meaning": "approve", "needs_comment": false, "input": { "kind": "text", "label": "What should the next attempt do?", "required": true, "max_length": 2730 } }, { "id": "resume_at:plan", "label": "Resume at Plan", "meaning": "choose", "needs_comment": false, "input": { "kind": "text", "label": "What should the next attempt do?", "required": true, "max_length": 2730 } }, { "id": "archive", "label": "Archive", "meaning": "reject", "needs_comment": false } ], "deep_link": "https://superpipeline.dev/b/brd_7c1f/c/crd_6b40"}The corpus has 4 valid cases in all:
a repeated failure at the first stage: no earlier stage, no summary, no link
{ "msgtype": "m.text", "body": "A card is waiting on you — \"Plan the release\" at Plan has failed 2 times.\n\n```\nflaky\n```\n\n- Resume here\n- Archive\n\nChoose in an updated app, or open the card on the board.", "suite_event_type": "dev.superpipeline.attention.v2", "schema_version": 1, "board_id": "brd_7c1f", "card_id": "crd_6b41", "card_title": "Plan the release", "stage_key": "plan", "stage_name": "Plan", "wait_id": "wait_fedcba9876543210", "reason": "repeated-failure", "detail": "flaky", "summary": null, "failure_count": 2, "options": [ { "id": "resume_here", "label": "Resume here", "meaning": "approve", "needs_comment": false, "input": { "kind": "text", "label": "What should the next attempt do?", "required": true, "max_length": 2730 } }, { "id": "archive", "label": "Archive", "meaning": "reject", "needs_comment": false } ]}deadline: a waiting card with both deadlines
{ "msgtype": "m.text", "body": "A card is waiting on you — \"Launch post\" at Draft is blocked.\n\n```\nthe staging database is down\n```\n\n- Archive\n\nChoose in an updated app, or [open the card](https://superpipeline.dev/b/brd_7c1f/c/crd_6b40) on the board.", "suite_event_type": "dev.superpipeline.attention.v2", "schema_version": 1, "board_id": "brd_7c1f", "card_id": "crd_6b40", "card_title": "Launch post", "stage_key": "draft", "stage_name": "Draft", "wait_id": "wait_0123456789abcdef", "reason": "blocked", "detail": "the staging database is down", "summary": null, "failure_count": null, "options": [ { "id": "archive", "label": "Archive", "meaning": "reject", "needs_comment": false } ], "deadline": { "remind_at": "2026-11-08T15:00:00.000Z", "escalate_at": "2026-11-08T18:00:00.000Z" }, "deep_link": "https://superpipeline.dev/b/brd_7c1f/c/crd_6b40"}built: a card that keeps failing; a forward move is not offered
{ "msgtype": "m.text", "body": "A card is waiting on you — \"Ship the release\" at Build has failed 3 times.\n\nThe build keeps timing out\n\n```\nnpm ci timed out after 600s\n```\n\n- Resume here\n- Resume at Plan\n- Archive\n\nChoose in an updated app, or [open the card](https://superpipeline.dev/b/brd_7c1f/c/crd_6b40) on the board.", "suite_event_type": "dev.superpipeline.attention.v2", "schema_version": 1, "board_id": "brd_7c1f", "card_id": "crd_6b40", "card_title": "Ship the release", "stage_key": "build", "stage_name": "Build", "wait_id": "wait_0123456789abcdef", "reason": "repeated-failure", "detail": "npm ci timed out after 600s", "summary": "The build keeps timing out", "failure_count": 3, "options": [ { "id": "resume_here", "label": "Resume here", "meaning": "approve", "needs_comment": false, "input": { "kind": "text", "label": "What should the next attempt do?", "required": true, "max_length": 2730 } }, { "id": "resume_at:plan", "label": "Resume at Plan", "meaning": "choose", "needs_comment": false, "input": { "kind": "text", "label": "What should the next attempt do?", "required": true, "max_length": 2730 } }, { "id": "archive", "label": "Archive", "meaning": "reject", "needs_comment": false } ], "deep_link": "https://superpipeline.dev/b/brd_7c1f/c/crd_6b40"}Refused
Section titled “Refused”Each of these must fail. The corpus says why:
- no wait_id: an answer could not name the wait (refused by
schema) - a forward move offered from chat (refused by
schema) - a resume whose instruction is optional (refused by
schema) - a resume input in the board’s camelCase, not the wire’s snake_case (refused by
schema) - a resume input longer than the board takes (refused by
schema) - a subject on a waiting card: nothing is frozen (refused by
schema) - no options: nothing to answer with (refused by
schema)
Source
Section titled “Source”- Schema:
schemas/matrix/dev.superpipeline.attention.v2.json - In the package:
import schema from "@superjackfruitlabs/treaty-matrix-events/schemas/dev.superpipeline.attention.v2.json" with { type: "json" };