Skip to content

gate.approval_recorded v1

An approval on a quorum gate that did not yet reach its quorum (charter 2026-11-09, a gate may need more than one approver §7). The gate is still pending; the approval that reaches the quorum resolves it and sends none. Mirrors SuperPipeline’s GateApprovalRecordedBody (apps/api/src/board/views.ts). Readers ignore properties they do not know.

Every event below carries dataschema https://raw.githubusercontent.com/SuperJackfruitLabs/treaty/main/schemas/superpipeline/gate.approval_recorded.v1.json.

Body event CloudEvents type Subject
gate.approval_recorded com.superjackfruit.superpipeline.gate.approval_recorded.v1 evt.<workspace>.superpipeline.gate.approval_recorded

The subject is the NATS subject the relay files it under; <workspace> is the board’s workspace. See the envelope and subjects.

  • Produced by SuperPipeline, through the relay.
  • Consumed by:
    • SuperExchange: Posts it to the board’s room, for the boards it carries. Receives it through the relay.
    • AgentPod: The hub’s board chat posts it, for the boards it still carries.
    • SuperDispatch: Takes it as a nudge to look at the board soon, on a board opted into scheduling. Reads nothing from its data.

Readers ignore properties they do not know, so a field may be added without a new version.

Field Type Required Description Constraints
event "gate.approval_recorded" yes
boardId string or null yes Null only on a board not yet initialised; a carrier needs it to route the event.
cardId string yes
gateId string yes
approval object yes
approval.principalId string yes
approval.at string yes format date-time
approval.variantId string no
quorum object yes The gate’s quorum after this approval; approvals oldest first, this one among them.
quorum.required integer yes at least 1
quorum.from one of "deciders", "admins" yes
quorum.approvals array of object yes
quorum.approvals[].principalId string yes
quorum.approvals[].at string yes format date-time
quorum.approvals[].variantId string no

From fixtures/superpipeline-events/examples.json, case “first-of-two”:

{
"event": "gate.approval_recorded",
"boardId": "brd_134a0ddb6d434478",
"cardId": "crd_0f3c9a2b7d4e4a11",
"gateId": "gat_5d1e2f3a4b5c6d7e",
"approval": {
"principalId": "usr_a",
"at": "2026-11-10T09:30:00.000Z"
},
"quorum": {
"required": 2,
"from": "deciders",
"approvals": [
{
"principalId": "usr_a",
"at": "2026-11-10T09:30:00.000Z"
}
]
}
}

The corpus has 2 valid cases in all:

variant-gate
{
"event": "gate.approval_recorded",
"boardId": "brd_134a0ddb6d434478",
"cardId": "crd_0f3c9a2b7d4e4a11",
"gateId": "gat_5d1e2f3a4b5c6d7e",
"approval": {
"principalId": "usr_b",
"at": "2026-11-10T09:40:00.000Z",
"variantId": "short"
},
"quorum": {
"required": 3,
"from": "admins",
"approvals": [
{
"principalId": "usr_a",
"at": "2026-11-10T09:30:00.000Z",
"variantId": "short"
},
{
"principalId": "usr_b",
"at": "2026-11-10T09:40:00.000Z",
"variantId": "short"
}
]
}
}

Each of these must fail. The corpus says why:

  • quorum is required
  • an approval names who approved
  • quorum.from is deciders or admins