games.cavu.tier-madness.defs

chris.pardy.family

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "cardPoints": {
      "description": "Points one card scored for the viewer against the other players.",
      "properties": {
        "item": {
          "maxLength": 300,
          "type": "string"
        },
        "points": {
          "type": "integer"
        }
      },
      "required": [
        "item",
        "points"
      ],
      "type": "object"
    },
    "cardResult": {
      "description": "How one card scored for the viewer.",
      "properties": {
        "doubled": {
          "type": "boolean"
        },
        "fromPlayers": {
          "description": "The part of `points` scored against the other players, already counted during the reveal.",
          "type": "integer"
        },
        "group": {
          "ref": "#tier",
          "type": "ref"
        },
        "item": {
          "maxLength": 300,
          "type": "string"
        },
        "points": {
          "type": "integer"
        },
        "yours": {
          "ref": "#tier",
          "type": "ref"
        }
      },
      "required": [
        "item",
        "yours",
        "group",
        "points",
        "fromPlayers"
      ],
      "type": "object"
    },
    "gamePlayer": {
      "properties": {
        "did": {
          "format": "did",
          "type": "string"
        },
        "initials": {
          "maxLength": 3,
          "minLength": 3,
          "type": "string"
        }
      },
      "required": [
        "did",
        "initials"
      ],
      "type": "object"
    },
    "gameView": {
      "description": "The game as one viewer may see it. Secrets (other players' moves, items not yet dealt to this viewer) are left out until revealed.",
      "properties": {
        "ballot": {
          "description": "Categories to vote on (vote phase).",
          "items": {
            "maxLength": 300,
            "type": "string"
          },
          "type": "array"
        },
        "category": {
          "maxLength": 300,
          "type": "string"
        },
        "code": {
          "description": "The join code, for players and spectators (who already know it).",
          "maxLength": 4,
          "minLength": 4,
          "type": "string"
        },
        "criteria": {
          "maxLength": 300,
          "type": "string"
        },
        "criteriaOptions": {
          "items": {
            "maxLength": 300,
            "type": "string"
          },
          "type": "array"
        },
        "criteriaPicker": {
          "format": "did",
          "type": "string"
        },
        "deadline": {
          "description": "When the server stops waiting on stalled players (ms since epoch), if it's counting down.",
          "type": "integer"
        },
        "game": {
          "maxLength": 64,
          "type": "string"
        },
        "group": {
          "description": "The group's median list (final phase).",
          "items": {
            "ref": "#placement",
            "type": "ref"
          },
          "type": "array"
        },
        "hand": {
          "description": "Cards this viewer may see: during the deal, a player's cards so far (the next is dealt once the previous placement is committed); from the reveal on, the whole round, for everyone.",
          "items": {
            "ref": "#item",
            "type": "ref"
          },
          "type": "array"
        },
        "host": {
          "format": "did",
          "type": "string"
        },
        "joinable": {
          "description": "Whether the lobby still takes players.",
          "type": "boolean"
        },
        "mine": {
          "ref": "#mine",
          "type": "ref"
        },
        "phase": {
          "ref": "#phase",
          "type": "ref"
        },
        "players": {
          "items": {
            "ref": "#player",
            "type": "ref"
          },
          "type": "array"
        },
        "results": {
          "description": "After the reveal: how each of the viewer's cards scored.",
          "items": {
            "ref": "#cardResult",
            "type": "ref"
          },
          "type": "array"
        },
        "reveal": {
          "ref": "#reveal",
          "type": "ref"
        },
        "revealIndex": {
          "description": "Reveal phase: which card (in deal order) is being revealed.",
          "minimum": 0,
          "type": "integer"
        },
        "revealPoints": {
          "description": "Reveal phase: the viewer's points against the other players, for each card revealed so far.",
          "items": {
            "ref": "#cardPoints",
            "type": "ref"
          },
          "type": "array"
        },
        "reveals": {
          "description": "Spectators, once a round is revealed: every item's picks at once, so a spectator screen can play the reveal on timers instead of following the host.",
          "items": {
            "ref": "#reveal",
            "type": "ref"
          },
          "type": "array"
        },
        "round": {
          "minimum": 0,
          "type": "integer"
        },
        "totalRounds": {
          "minimum": 1,
          "type": "integer"
        },
        "viewer": {
          "ref": "#viewer",
          "type": "ref"
        }
      },
      "required": [
        "game",
        "phase",
        "round",
        "totalRounds",
        "players",
        "viewer"
      ],
      "type": "object"
    },
    "item": {
      "description": "A card, sourced from a Wikipedia article.",
      "properties": {
        "extract": {
          "maxLength": 10000,
          "type": "string"
        },
        "id": {
          "maxLength": 300,
          "type": "string"
        },
        "imageUrl": {
          "format": "uri",
          "type": "string"
        },
        "name": {
          "maxLength": 300,
          "type": "string"
        },
        "sourceUrl": {
          "format": "uri",
          "type": "string"
        },
        "summary": {
          "maxLength": 1000,
          "type": "string"
        }
      },
      "required": [
        "id",
        "name",
        "summary"
      ],
      "type": "object"
    },
    "mine": {
      "description": "The viewer's own round so far (only ever sent to that player).",
      "properties": {
        "double": {
          "maxLength": 300,
          "type": "string"
        },
        "doubleChosen": {
          "type": "boolean"
        },
        "placements": {
          "description": "As placed, before any swap.",
          "items": {
            "ref": "#placement",
            "type": "ref"
          },
          "type": "array"
        },
        "swap": {
          "description": "The swap, once chosen ([] = skipped).",
          "items": {
            "maxLength": 300,
            "type": "string"
          },
          "maxLength": 2,
          "type": "array"
        },
        "swapChosen": {
          "type": "boolean"
        }
      },
      "required": [
        "placements"
      ],
      "type": "object"
    },
    "phase": {
      "knownValues": [
        "lobby",
        "vote",
        "pickCriteria",
        "deal",
        "swap",
        "double",
        "waiting",
        "reveal",
        "final",
        "scores",
        "gameover"
      ],
      "type": "string"
    },
    "placement": {
      "properties": {
        "item": {
          "maxLength": 300,
          "type": "string"
        },
        "tier": {
          "ref": "#tier",
          "type": "ref"
        }
      },
      "required": [
        "item",
        "tier"
      ],
      "type": "object"
    },
    "player": {
      "properties": {
        "connected": {
          "type": "boolean"
        },
        "did": {
          "format": "did",
          "type": "string"
        },
        "forfeit": {
          "description": "This round's moves didn't verify, so they don't count.",
          "type": "boolean"
        },
        "host": {
          "type": "boolean"
        },
        "initials": {
          "maxLength": 3,
          "type": "string"
        },
        "progress": {
          "description": "Moves committed this phase, for 'waiting on…' indicators.",
          "minimum": 0,
          "type": "integer"
        },
        "roundPoints": {
          "description": "Points from the last scored round (may be negative).",
          "type": "integer"
        },
        "score": {
          "minimum": 0,
          "type": "integer"
        },
        "scoreAfter": {
          "description": "While a round is being revealed: this player's total once it's banked, so a spectator screen can play the round out on its own clock.",
          "type": "integer"
        }
      },
      "required": [
        "did",
        "initials",
        "score",
        "progress"
      ],
      "type": "object"
    },
    "prompt": {
      "description": "What a rating answers, embedded rather than written as a garden.lexicon.dazzling-boarfish.rating.prompt record. Its scale is the game's.",
      "properties": {
        "langs": {
          "items": {
            "format": "language",
            "type": "string"
          },
          "maxLength": 3,
          "type": "array"
        },
        "text": {
          "maxLength": 1024,
          "type": "string"
        }
      },
      "required": [
        "text"
      ],
      "type": "object"
    },
    "reveal": {
      "properties": {
        "item": {
          "ref": "#item",
          "type": "ref"
        },
        "votes": {
          "items": {
            "ref": "#vote",
            "type": "ref"
          },
          "type": "array"
        }
      },
      "required": [
        "item",
        "votes"
      ],
      "type": "object"
    },
    "scale": {
      "description": "A rating scale, embedded rather than written as a garden.lexicon.dazzling-boarfish.rating.scale record: the same fields, minus record bookkeeping.",
      "properties": {
        "code": {
          "refs": [
            "garden.lexicon.dazzling-boarfish.rating.scale#nominal",
            "garden.lexicon.dazzling-boarfish.rating.scale#ordinal",
            "garden.lexicon.dazzling-boarfish.rating.scale#interval",
            "garden.lexicon.dazzling-boarfish.rating.scale#ratio"
          ],
          "type": "union"
        },
        "description": {
          "maxLength": 1024,
          "type": "string"
        },
        "langs": {
          "items": {
            "format": "language",
            "type": "string"
          },
          "maxLength": 3,
          "type": "array"
        },
        "name": {
          "maxLength": 256,
          "type": "string"
        }
      },
      "required": [
        "name",
        "code"
      ],
      "type": "object"
    },
    "tier": {
      "knownValues": [
        "S",
        "A",
        "B",
        "C",
        "D",
        "F"
      ],
      "type": "string"
    },
    "viewer": {
      "properties": {
        "did": {
          "format": "did",
          "type": "string"
        },
        "role": {
          "knownValues": [
            "host",
            "player",
            "spectator"
          ],
          "type": "string"
        }
      },
      "required": [
        "role"
      ],
      "type": "object"
    },
    "vote": {
      "description": "Where one player put the item being revealed.",
      "properties": {
        "did": {
          "format": "did",
          "type": "string"
        },
        "tier": {
          "ref": "#tier",
          "type": "ref"
        }
      },
      "required": [
        "did",
        "tier"
      ],
      "type": "object"
    }
  },
  "id": "games.cavu.tier-madness.defs",
  "lexicon": 1
}

Validate Record

Validate a record against games.cavu.tier-madness.defs

Validation Options
Automatically resolve and include external schemas for full validation
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:dp7v5b5kejmmzzpwmqyf5wj6
CID
bafyreigvkqkhqrzkv2s7mfzizw2ieeitbwlafxcsgl3qgkmbywpe4d435q
Indexed At
2026-10-02 18:09 UTC
AT-URI
at://did:plc:dp7v5b5kejmmzzpwmqyf5wj6/com.atproto.lexicon.schema/games.cavu.tier-madness.defs

Version History (3 versions)

Referenced Schemas (4)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • Declares a game: the roster in seat order and the ballot. Written by the host player, from their own PDS, to the game's commitment space (rkey = game id). With each player's round records and moves it is enough to repla…

  • One player's account of a finished round, written by every player from their own PDS to the game's commitment space (rkey = `{game}-r{round}`) once the round's reveal starts. Written at the end rather than the start so …

  • One secret move by a player, written (by the game server, on the player's behalf, or by the player) to the round's secret space (skey `{game}-r{round}`). Only the game server can read it until that round's reveal, when …

  • Frames a client sends up the games.cavu.tier-madness.subscribeGame socket. Intents only: the server validates each, records it in the player's own PDS (secret move + public commitment), and only then applies it.

Lexicon Garden

@