games.cavu.tier-madness.clientFrame

chris.pardy.family

Schema Diff

+28 -1

From

CID
bafyreigvpoclku3...
Indexed At
2026-10-02 18:09 UTC
View this version

To

CID
bafyreiepvvdvy37...
Indexed At
2026-10-05 15:12 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

3 breaking changes, 15 non-breaking changes.

Breaking Changes (3)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "games.cavu.tier-madness.clientFrame#setRounds", src: "games.cavu.tier-madness.clientFrame#setRounds", tgt: "games.cavu.tier-madness.clientFrame#setRounds.totalRounds", kind: "prop", name: Some("totalRounds") }
  • RemovedEdge RemovedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant13", kind: "variant", name: Some("#skip") }
  • RemovedEdge RemovedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant13", tgt: "games.cavu.tier-madness.clientFrame#skip", kind: "ref", name: None }
Non-Breaking Changes (15)
  • AddedVertex AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame#addBot" }
  • AddedVertex AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame#rematch" }
  • AddedVertex AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame#setRounds" }
  • AddedVertex AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame#setRounds.totalRounds" }
  • AddedVertex AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame.frame:variant14" }
  • AddedVertex AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame.frame:variant15" }
  • AddedVertex AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame.frame:variant16" }
  • AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant13", kind: "variant", name: Some("#addBot") }
  • AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant14", kind: "variant", name: Some("#setRounds") }
  • AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant15", kind: "variant", name: Some("#skip") }
  • AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant16", kind: "variant", name: Some("#rematch") }
  • AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant13", tgt: "games.cavu.tier-madness.clientFrame#addBot", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant14", tgt: "games.cavu.tier-madness.clientFrame#setRounds", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant15", tgt: "games.cavu.tier-madness.clientFrame#skip", kind: "ref", name: None }
  • AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant16", tgt: "games.cavu.tier-madness.clientFrame#rematch", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame#addBot" }
  • AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame#rematch" }
  • AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame#setRounds" }
  • AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame#setRounds.totalRounds" }
  • AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame.frame:variant14" }
  • AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame.frame:variant15" }
  • AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame.frame:variant16" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "games.cavu.tier-madness.clientFrame#setRounds", src: "games.cavu.tier-madness.clientFrame#setRounds", tgt: "games.cavu.tier-madness.clientFrame#setRounds.totalRounds", kind: "prop", name: Some("totalRounds") }
  • Breaking: RemovedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant13", kind: "variant", name: Some("#skip") }
  • Breaking: RemovedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant13", tgt: "games.cavu.tier-madness.clientFrame#skip", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant13", kind: "variant", name: Some("#addBot") }
  • Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant14", kind: "variant", name: Some("#setRounds") }
  • Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant15", kind: "variant", name: Some("#skip") }
  • Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant16", kind: "variant", name: Some("#rematch") }
  • Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant13", tgt: "games.cavu.tier-madness.clientFrame#addBot", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant14", tgt: "games.cavu.tier-madness.clientFrame#setRounds", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant15", tgt: "games.cavu.tier-madness.clientFrame#skip", kind: "ref", name: None }
  • Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant16", tgt: "games.cavu.tier-madness.clientFrame#rematch", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 +
    "addBot": {
5 +
      "description": "Host only, in the lobby: seat a bot (Jev, TypeSafe's System One model) that plays like anyone else. One per game; remove it with #kick.",
6 +
      "properties": {},
7 +
      "type": "object"
8 +
    },
4 9
    "advance": {
5 10
      "description": "Host only: move the reveal along (next card, next screen).",
6 11
      "properties": {},
7 12
      "type": "object"
8 13
    },
9 14
    "auth": {
10 15
      "description": "Sign in as a player: an atproto service-auth JWT from the player's PDS (com.atproto.server.getServiceAuth) with aud = the game server's DID and lxm = games.cavu.tier-madness.subscribeGame. Spectators don't sign in.",
11 16
      "properties": {
12 17
        "token": {
13 18
          "maxLength": 4096,
14 19
          "type": "string"
15 20
        }
16 21
      },
17 22
      "required": [
18 23
        "token"
19 24
      ],
20 25
      "type": "object"
21 26
    },
22 27
    "create": {
23 28
      "description": "Signed in: host a new game. The server replies with #created (the join code, and the hash the host puts in its lobby record).",
24 29
      "properties": {
25 30
        "initials": {
26 31
          "maxLength": 3,
27 32
          "minLength": 3,
28 33
          "type": "string"
29 34
        },
30 35
        "totalRounds": {
31 36
          "maximum": 20,
32 37
          "minimum": 1,
33 38
          "type": "integer"
34 39
        }
35 40
      },
36 41
      "required": [
37 42
        "initials"
38 43
      ],
39 44
      "type": "object"
40 45
    },
41 46
    "double": {
42 47
      "description": "Double down on one placed card, or none.",
43 48
      "properties": {
44 49
        "item": {
45 50
          "maxLength": 300,
46 51
          "type": "string"
47 52
        }
48 53
      },
49 54
      "type": "object"
50 55
    },
51 56
    "join": {
52 57
      "description": "Signed in: join a game's lobby by its 4-character code (Crockford base32; case and separators don't matter). Attempts are rate limited.",
53 58
      "properties": {
54 59
        "code": {
55 60
          "maxLength": 9,
56 61
          "minLength": 4,
57 62
          "type": "string"
58 63
        },
59 64
        "initials": {
60 65
          "maxLength": 3,
61 66
          "minLength": 3,
62 67
          "type": "string"
63 68
        }
64 69
      },
65 70
      "required": [
66 71
        "code",
67 72
        "initials"
68 73
      ],
69 74
      "type": "object"
70 75
    },
71 76
    "kick": {
72 77
      "description": "Host only, in the lobby: remove a player.",
73 78
      "properties": {
74 79
        "did": {
75 80
          "format": "did",
76 81
          "type": "string"
77 82
        }
78 83
      },
79 84
      "required": [
80 85
        "did"
81 86
      ],
82 87
      "type": "object"
83 88
    },
84 89
    "leave": {
85 90
      "description": "Leave the lobby (before the game starts).",
86 91
      "properties": {},
87 92
      "type": "object"
88 93
    },
89 94
    "main": {
90 95
      "description": "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.",
91 96
      "properties": {
92 97
        "frame": {
93 98
          "refs": [
94 99
            "#auth",
95 100
            "#create",
96 101
            "#join",
97 102
            "#spectate",
98 103
            "#leave",
99 104
            "#start",
100 105
            "#vote",
101 106
            "#pickCriteria",
102 107
            "#place",
103 108
            "#swap",
104 109
            "#double",
105 110
            "#advance",
106 111
            "#kick",
107 -
            "#skip"
112 +
            "#addBot",
113 +
            "#setRounds",
114 +
            "#skip",
115 +
            "#rematch"
108 116
          ],
109 117
          "type": "union"
110 118
        }
111 119
      },
112 120
      "required": [
113 121
        "frame"
114 122
      ],
115 123
      "type": "object"
116 124
    },
117 125
    "pickCriteria": {
118 126
      "description": "The round's criteria picker chooses one of the offered criteria. Not secret.",
119 127
      "properties": {
120 128
        "criteria": {
121 129
          "maxLength": 300,
122 130
          "type": "string"
123 131
        }
124 132
      },
125 133
      "required": [
126 134
        "criteria"
127 135
      ],
128 136
      "type": "object"
129 137
    },
130 138
    "place": {
131 139
      "description": "Place the card dealt at `index` into a tier. Final once accepted; the next card is dealt.",
132 140
      "properties": {
133 141
        "index": {
134 142
          "maximum": 19,
135 143
          "minimum": 0,
136 144
          "type": "integer"
137 145
        },
138 146
        "tier": {
139 147
          "ref": "games.cavu.tier-madness.defs#tier",
140 148
          "type": "ref"
141 149
        }
142 150
      },
143 151
      "required": [
144 152
        "index",
145 153
        "tier"
146 154
      ],
147 155
      "type": "object"
148 156
    },
157 +
    "rematch": {
158 +
      "description": "Signed in, at game over: start a rematch with the same table, hosted by whoever asks first (with the same number of rounds, and the bot if there was one). If one's already started, join it. The old game's view points everyone at it (#rematch in gameView).",
159 +
      "properties": {},
160 +
      "type": "object"
161 +
    },
162 +
    "setRounds": {
163 +
      "description": "Host only, in the lobby: how many rounds the game will have.",
164 +
      "properties": {
165 +
        "totalRounds": {
166 +
          "maximum": 7,
167 +
          "minimum": 3,
168 +
          "type": "integer"
169 +
        }
170 +
      },
171 +
      "required": [
172 +
        "totalRounds"
173 +
      ],
174 +
      "type": "object"
175 +
    },
149 176
    "skip": {
150 177
      "description": "Host only: stop waiting on stalled players now (as if the deadline passed): unvoted players don't vote, an absent picker's criteria is picked for them, unfinished players sit the round out.",
151 178
      "properties": {},
152 179
      "type": "object"
153 180
    },
154 181
    "spectate": {
155 182
      "description": "Watch a game by its code, anonymously: no sign-in, and only what anyone may see. Attempts are rate limited.",
156 183
      "properties": {
157 184
        "code": {
158 185
          "maxLength": 9,
159 186
          "minLength": 4,
160 187
          "type": "string"
161 188
        }
162 189
      },
163 190
      "required": [
164 191
        "code"
165 192
      ],
166 193
      "type": "object"
167 194
    },
168 195
    "start": {
169 196
      "description": "Host only: start the game.",
170 197
      "properties": {},
171 198
      "type": "object"
172 199
    },
173 200
    "swap": {
174 201
      "description": "The round's one swap: two placed cards in different tiers, or none.",
175 202
      "properties": {
176 203
        "items": {
177 204
          "items": {
178 205
            "maxLength": 300,
179 206
            "type": "string"
180 207
          },
181 208
          "maxLength": 2,
182 209
          "minLength": 0,
183 210
          "type": "array"
184 211
        }
185 212
      },
186 213
      "required": [
187 214
        "items"
188 215
      ],
189 216
      "type": "object"
190 217
    },
191 218
    "vote": {
192 219
      "description": "Secret pre-game vote: up to 3 categories from the ballot.",
193 220
      "properties": {
194 221
        "categories": {
195 222
          "items": {
196 223
            "maxLength": 300,
197 224
            "type": "string"
198 225
          },
199 226
          "maxLength": 3,
200 227
          "minLength": 1,
201 228
          "type": "array"
202 229
        }
203 230
      },
204 231
      "required": [
205 232
        "categories"
206 233
      ],
207 234
      "type": "object"
208 235
    }
209 236
  },
210 237
  "id": "games.cavu.tier-madness.clientFrame",
211 238
  "lexicon": 1
212 239
}

Compare Other Versions

Lexicon Garden

@