Skip to content

dev.superpipeline.attention.v2

Nothing is frozen on a waiting card, so it carries no subject.

An m.room.message whose content carries suite_event_type: "dev.superpipeline.attention.v2".

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
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

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"
}

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)