Skip to content

card.ready v1

A card became ready to be claimed on a board opted into scheduling: it reached a stage an agent may claim from in a claimable state, or was resumed or returned there. A placement service reacts to it at once instead of waiting for its sweep; it is a hint, and the board read stays the truth. Sent only by a board with a placement window (charter: SuperDispatch owns the scheduler). Mirrors SuperPipeline’s CardReadyBody (apps/api/src/board/placement-window.ts). Readers ignore properties they do not know.

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

Body event CloudEvents type Subject
card.ready com.superjackfruit.superpipeline.card.ready.v1 evt.<workspace>.superpipeline.card.ready

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:
    • SuperDispatch: Places the card at once, alone, inside the board’s placement window. A hint, not a fact: it reads the board before it places anything.

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

Field Type Required Description Constraints
event "card.ready" yes
boardId string yes Never null: the event is routed by its board. at least 1 character
cardId string yes at least 1 character
stageKey string yes The stage the card is ready at. at least 1 character
readyAt string yes When the card became ready: where its placement window starts. format date-time
placementWindowUntil string no Until when the board holds the card back from pull so it can be placed. Absent when the board has no window. A hold made inside the window is claimable by its agent at once. format date-time
ts string yes format date-time

From fixtures/superpipeline-events/examples.json, case “windowed”:

{
"event": "card.ready",
"boardId": "brd_ceb6d1c7c02a4a6b",
"cardId": "card_4d2e8f1a0b3c5d6e",
"stageKey": "plan",
"readyAt": "2026-11-13T09:30:00.000Z",
"placementWindowUntil": "2026-11-13T09:30:10.000Z",
"ts": "2026-11-13T09:30:00.000Z"
}

The corpus has 2 valid cases in all:

no-window
{
"event": "card.ready",
"boardId": "brd_ceb6d1c7c02a4a6b",
"cardId": "card_4d2e8f1a0b3c5d6e",
"stageKey": "plan",
"readyAt": "2026-11-13T09:30:00.000Z",
"ts": "2026-11-13T09:30:00.000Z"
}

Each of these must fail. The corpus says why:

  • the event names itself
  • boardId is never null
  • cardId is required
  • readyAt is a date-time
  • placementWindowUntil is a date-time when present