games.cavu.defs

chris.pardy.family

Documentation

attestation object

badge.blue CID-first attestation over the grant: DAG-CBOR(grant) -> SHA-256 -> CIDv1(dag-cbor), signed with low-S ECDSA by the key `key` (a DID URL resolving to a verification method in the launch service's DID document).

Properties

cid string cid Required

A content identifier (CID) referencing immutable data.

key string Required

No description available.

maxLength: 512 bytes
signature bytes Required

No description available.

maxLength: 128
View raw schema
{
  "description": "badge.blue CID-first attestation over the grant: DAG-CBOR(grant) -> SHA-256 -> CIDv1(dag-cbor), signed with low-S ECDSA by the key `key` (a DID URL resolving to a verification method in the launch service's DID document).",
  "properties": {
    "cid": {
      "format": "cid",
      "type": "string"
    },
    "key": {
      "maxLength": 512,
      "type": "string"
    },
    "signature": {
      "maxLength": 128,
      "type": "bytes"
    }
  },
  "required": [
    "key",
    "cid",
    "signature"
  ],
  "type": "object"
}
capability union

What a game may do through the host. Games declare these on their games.cavu.game record; the host enforces them per bound session. Unknown members are refused (and, later, will require step-up consent).

View raw schema
{
  "closed": false,
  "description": "What a game may do through the host. Games declare these on their games.cavu.game record; the host enforces them per bound session. Unknown members are refused (and, later, will require step-up consent).",
  "refs": [
    "#standard",
    "#repoWrite",
    "#repoDelete"
  ],
  "type": "union"
}
gameRecords token

This game's own records in the shared collections: games.cavu.score and games.cavu.save at rkey '<slug>' or '<slug>:...'. Plain language: 'Save your <game> scores and progress to your account.'

Referencegames.cavu.defs#gameRecords

Tokens have no data representation. Use the reference string as a value.

View raw schema
{
  "description": "This game's own records in the shared collections: games.cavu.score and games.cavu.save at rkey '<slug>' or '<slug>:...'. Plain language: 'Save your <game> scores and progress to your account.'",
  "type": "token"
}
grant object

What a launch service attests to. A client that verifies the attestation against the launch service's published key opens `url`, wherever it points (it encodes room and instance placement). If `hostService` is present, the game presents this grant plus a DPoP proof made with the key whose thumbprint is `jkt` to the host's games.cavu.bindSession; nothing else is needed from the launch service. Grants are short-lived: they bound the time to bind, not the play session.

Properties

expiresAt string datetime Required

An RFC 3339 formatted timestamp.

game string at-uri Required

The games.cavu.game record being launched.

hostService ref #hostService Optional

No description available.

issuedAt string datetime Required

An RFC 3339 formatted timestamp.

jkt string Optional

RFC 7638 JWK thumbprint of the game server key allowed to bind this grant at the host. Required when hostService is present.

maxLength: 64 bytes
joinCode string Optional

No description available.

maxLength: 64 bytes
player string did Optional

The player. Absent for a guest grant (only allowed when the game declares `guests`).

room string Optional

The room the launch service placed this player in.

maxLength: 128 bytes
url string uri Required

Launch URL to open. Need not be on the launch service's host.

View raw schema
{
  "description": "What a launch service attests to. A client that verifies the attestation against the launch service's published key opens `url`, wherever it points (it encodes room and instance placement). If `hostService` is present, the game presents this grant plus a DPoP proof made with the key whose thumbprint is `jkt` to the host's games.cavu.bindSession; nothing else is needed from the launch service. Grants are short-lived: they bound the time to bind, not the play session.",
  "properties": {
    "expiresAt": {
      "format": "datetime",
      "type": "string"
    },
    "game": {
      "description": "The games.cavu.game record being launched.",
      "format": "at-uri",
      "type": "string"
    },
    "hostService": {
      "ref": "#hostService",
      "type": "ref"
    },
    "issuedAt": {
      "format": "datetime",
      "type": "string"
    },
    "jkt": {
      "description": "RFC 7638 JWK thumbprint of the game server key allowed to bind this grant at the host. Required when hostService is present.",
      "maxLength": 64,
      "type": "string"
    },
    "joinCode": {
      "maxLength": 64,
      "type": "string"
    },
    "player": {
      "description": "The player. Absent for a guest grant (only allowed when the game declares `guests`).",
      "format": "did",
      "type": "string"
    },
    "room": {
      "description": "The room the launch service placed this player in.",
      "maxLength": 128,
      "type": "string"
    },
    "url": {
      "description": "Launch URL to open. Need not be on the launch service's host.",
      "format": "uri",
      "type": "string"
    }
  },
  "required": [
    "url",
    "game",
    "issuedAt",
    "expiresAt"
  ],
  "type": "object"
}
hostService object

The player's game host (the service holding their PDS session), echoed from the intent.

Properties

nonce string Required

Single-use, minted by the host for this player; consumed at bindSession.

maxLength: 128 bytes
service string uri Required

Base URL of the host's XRPC service. The game must present the grant nowhere else.

View raw schema
{
  "description": "The player's game host (the service holding their PDS session), echoed from the intent.",
  "properties": {
    "nonce": {
      "description": "Single-use, minted by the host for this player; consumed at bindSession.",
      "maxLength": 128,
      "type": "string"
    },
    "service": {
      "description": "Base URL of the host's XRPC service. The game must present the grant nowhere else.",
      "format": "uri",
      "type": "string"
    }
  },
  "required": [
    "service",
    "nonce"
  ],
  "type": "object"
}
repoDelete object

Delete records in one collection. Destructive: always step-up (confirmation or pre-approval on the host), never part of a standard set.

Properties

collection string nsid Required

A namespaced identifier (e.g., app.bsky.feed.post).

reason string Optional

No description available.

maxLength: 300 bytes
rkey string Optional

No description available.

maxLength: 128 bytes
View raw schema
{
  "description": "Delete records in one collection. Destructive: always step-up (confirmation or pre-approval on the host), never part of a standard set.",
  "properties": {
    "collection": {
      "format": "nsid",
      "type": "string"
    },
    "reason": {
      "maxLength": 300,
      "type": "string"
    },
    "rkey": {
      "maxLength": 128,
      "type": "string"
    }
  },
  "required": [
    "collection"
  ],
  "type": "object"
}
repoWrite object

Create/update records in one collection, optionally limited to an rkey shape. Anything not covered by a standard set needs this explicit form (and, outside first-party games, step-up consent).

Properties

collection string nsid Required

A namespaced identifier (e.g., app.bsky.feed.post).

reason string Optional

Plain-language explanation shown to the player.

maxLength: 300 bytes
rkey string Optional

'*' (any), 'date' (YYYY-MM-DD), or a literal rkey. Default '*'.

maxLength: 128 bytes
View raw schema
{
  "description": "Create/update records in one collection, optionally limited to an rkey shape. Anything not covered by a standard set needs this explicit form (and, outside first-party games, step-up consent).",
  "properties": {
    "collection": {
      "format": "nsid",
      "type": "string"
    },
    "reason": {
      "description": "Plain-language explanation shown to the player.",
      "maxLength": 300,
      "type": "string"
    },
    "rkey": {
      "description": "'*' (any), 'date' (YYYY-MM-DD), or a literal rkey. Default '*'.",
      "maxLength": 128,
      "type": "string"
    }
  },
  "required": [
    "collection"
  ],
  "type": "object"
}
rpgActorSheet token

The player's rpg.actor character sheet for this game only: actor.rpg.stats at rkey = the game's slug. Plain language: 'Keep your <game> sheet on rpg.actor up to date.'

Referencegames.cavu.defs#rpgActorSheet

Tokens have no data representation. Use the reference string as a value.

View raw schema
{
  "description": "The player's rpg.actor character sheet for this game only: actor.rpg.stats at rkey = the game's slug. Plain language: 'Keep your <game> sheet on rpg.actor up to date.'",
  "type": "token"
}
signature object

badge.blue CID-first inline attestation by the issuing game service (e.g. did:web:play.cavu.games#score-20261006-1730). Signs the record minus `signatures`, plus $sig {$type, key, issuedAt, repository}; readers must also check the record's `game`/`period` against its rkey (the rkey is not signed).

Properties

cid string Optional

No description available.

maxLength: 128 bytes
issuedAt string datetime Required

An RFC 3339 formatted timestamp.

key string Required

No description available.

maxLength: 512 bytes
signature bytes Required

No description available.

maxLength: 128
View raw schema
{
  "description": "badge.blue CID-first inline attestation by the issuing game service (e.g. did:web:play.cavu.games#score-20261006-1730). Signs the record minus `signatures`, plus $sig {$type, key, issuedAt, repository}; readers must also check the record's `game`/`period` against its rkey (the rkey is not signed).",
  "properties": {
    "cid": {
      "maxLength": 128,
      "type": "string"
    },
    "issuedAt": {
      "format": "datetime",
      "type": "string"
    },
    "key": {
      "maxLength": 512,
      "type": "string"
    },
    "signature": {
      "maxLength": 128,
      "type": "bytes"
    }
  },
  "required": [
    "key",
    "issuedAt",
    "signature"
  ],
  "type": "object"
}
slug string

A game's slug: [a-z0-9-], the rkey of its games.cavu.game catalog record. Records a game writes are keyed '<slug>' or '<slug>:<...>'; slugs never contain ':'.

ConstraintsmaxLength: 64 bytes
View raw schema
{
  "description": "A game's slug: [a-z0-9-], the rkey of its games.cavu.game catalog record. Records a game writes are keyed '<slug>' or '<slug>:<...>'; slugs never contain ':'.",
  "maxLength": 64,
  "type": "string"
}
standard object

A named capability set defined and reviewed by the host. Players see one plain-language line per set.

Properties

set string Required

No description available.

Known values: games.cavu.defs#gameRecords, games.cavu.defs#rpgActorSheet
View raw schema
{
  "description": "A named capability set defined and reviewed by the host. Players see one plain-language line per set.",
  "properties": {
    "set": {
      "knownValues": [
        "games.cavu.defs#gameRecords",
        "games.cavu.defs#rpgActorSheet"
      ],
      "type": "string"
    }
  },
  "required": [
    "set"
  ],
  "type": "object"
}

Lexicon Garden

@