Skip to content

dev.agentpod.gate.progress.v2

The progress reply for an approval recorded on a quorum gate that still waits for more, referencing the gate’s own event so a client updates that card’s count. Readers ignore properties they do not know. x-uniqueBy lists paths whose values must not repeat (JSON Schema cannot say so): a[].b is field b of each item of list a.

Content that carries suite_event_type: "dev.agentpod.gate.progress.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
suite_event_type "dev.agentpod.gate.progress.v2" yes
schema_version integer yes at least 1
gate_id string yes at least 1 character
board_id string yes at least 1 character
card_id string yes at least 1 character
approved_by string or null yes
approval object yes
approval.principal_id string yes at least 1 character; at most 128 characters
approval.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
approval.variant_id string no at least 1 character; at most 64 characters
chosen_variant object no
chosen_variant.id string yes at least 1 character
chosen_variant.label string yes
quorum object yes
quorum.required integer yes at least 2; at most 5
quorum.from one of "deciders", "admins" yes
quorum.approvals array of object yes at most 32 items
quorum.approvals[].principal_id string yes at least 1 character; at most 128 characters
quorum.approvals[].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
quorum.approvals[].variant_id string no at least 1 character; at most 64 characters
m.relates_to object yes
m.relates_to.rel_type "m.reference" yes
m.relates_to.event_id string yes at least 1 character

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.

  • quorum.approvals[].principal_id

From fixtures/matrix-events/examples.json, case “quorum: the first of two approvals”:

{
"suite_event_type": "dev.agentpod.gate.progress.v2",
"schema_version": 1,
"gate_id": "gate_6e19",
"board_id": "brd_7c1f",
"card_id": "crd_8a40",
"approved_by": "rakesh",
"approval": {
"principal_id": "prn_first",
"at": "2026-11-09T10:00:00.000Z"
},
"quorum": {
"required": 2,
"from": "admins",
"approvals": [
{
"principal_id": "prn_first",
"at": "2026-11-09T10:00:00.000Z"
}
]
},
"m.relates_to": {
"rel_type": "m.reference",
"event_id": "$gateEventId"
}
}

The corpus has 2 valid cases in all:

built: one of two approvals
{
"suite_event_type": "dev.agentpod.gate.progress.v2",
"schema_version": 1,
"gate_id": "gate_8f3a",
"board_id": "brd_7c1f",
"card_id": "crd_6b40",
"approved_by": "rakesh",
"approval": {
"principal_id": "prn_00e5464a206549ff8c78",
"at": "2030-01-01T09:00:00.000Z"
},
"quorum": {
"required": 2,
"from": "deciders",
"approvals": [
{
"principal_id": "prn_00e5464a206549ff8c78",
"at": "2030-01-01T09:00:00.000Z"
}
]
},
"m.relates_to": {
"rel_type": "m.reference",
"event_id": "$gateEvent"
}
}

Each of these must fail. The corpus says why:

  • a quorum of one: a gate that passes on one approval sends no progress (refused by schema)
  • a reply relation: progress references the gate’s own event (refused by schema)
  • one person counted twice (refused by unique)