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.
How it rides
Section titled “How it rides”Content that carries suite_event_type: "dev.agentpod.gate.progress.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 |
|---|---|---|---|---|
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
Example
Section titled “Example”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" }}Refused
Section titled “Refused”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)
Source
Section titled “Source”- Schema:
schemas/matrix/dev.agentpod.gate.progress.v2.json - In the package:
import schema from "@superjackfruitlabs/treaty-matrix-events/schemas/dev.agentpod.gate.progress.v2.json" with { type: "json" };