games.cavu.tier-madness.clientFrame
Schema Diff
+28 -1
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
}