games.cavu.tier-madness.clientFrame

chris.pardy.family

Schema Diff

+15 -0

From

CID
bafyreibigp46wis...
Indexed At
2026-10-02 19:51 UTC
View this version

To

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

Compatibility Analysis

Breaking Changes Detected

5 breaking changes, 9 non-breaking changes.

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

Compare Other Versions

Lexicon Garden

@