games.cavu.tier-madness.clientFrame
Schema Diff
+13 -1
Compatibility Analysis
Breaking Changes Detected
2 breaking changes, 10 non-breaking changes.
Breaking Changes (2)
- 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 (10)
- 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.frame:variant14" }
- AddedVertex AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame.frame:variant15" }
- 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("#skip") }
- AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant15", 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#skip", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant15", 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.frame:variant14" }AddedVertex { vertex_id: "games.cavu.tier-madness.clientFrame.frame:variant15" }
Additional Notes
- 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("#skip") }
- Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame", tgt: "games.cavu.tier-madness.clientFrame.frame:variant15", 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#skip", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "games.cavu.tier-madness.clientFrame.frame:variant15", 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
+
"#skip",
114
+
"#rematch"
108
115
],
109
116
"type": "union"
110
117
}
111
118
},
112
119
"required": [
113
120
"frame"
114
121
],
115
122
"type": "object"
116
123
},
117
124
"pickCriteria": {
118
125
"description": "The round's criteria picker chooses one of the offered criteria. Not secret.",
119
126
"properties": {
120
127
"criteria": {
121
128
"maxLength": 300,
122
129
"type": "string"
123
130
}
124
131
},
125
132
"required": [
126
133
"criteria"
127
134
],
128
135
"type": "object"
129
136
},
130
137
"place": {
131
138
"description": "Place the card dealt at `index` into a tier. Final once accepted; the next card is dealt.",
132
139
"properties": {
133
140
"index": {
134
141
"maximum": 19,
135
142
"minimum": 0,
136
143
"type": "integer"
137
144
},
138
145
"tier": {
139
146
"ref": "games.cavu.tier-madness.defs#tier",
140
147
"type": "ref"
141
148
}
142
149
},
143
150
"required": [
144
151
"index",
145
152
"tier"
146
153
],
147
154
"type": "object"
148
155
},
156
+
"rematch": {
157
+
"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
+
"properties": {},
159
+
"type": "object"
160
+
},
149
161
"skip": {
150
162
"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
163
"properties": {},
152
164
"type": "object"
153
165
},
154
166
"spectate": {
155
167
"description": "Watch a game by its code, anonymously: no sign-in, and only what anyone may see. Attempts are rate limited.",
156
168
"properties": {
157
169
"code": {
158
170
"maxLength": 9,
159
171
"minLength": 4,
160
172
"type": "string"
161
173
}
162
174
},
163
175
"required": [
164
176
"code"
165
177
],
166
178
"type": "object"
167
179
},
168
180
"start": {
169
181
"description": "Host only: start the game.",
170
182
"properties": {},
171
183
"type": "object"
172
184
},
173
185
"swap": {
174
186
"description": "The round's one swap: two placed cards in different tiers, or none.",
175
187
"properties": {
176
188
"items": {
177
189
"items": {
178
190
"maxLength": 300,
179
191
"type": "string"
180
192
},
181
193
"maxLength": 2,
182
194
"minLength": 0,
183
195
"type": "array"
184
196
}
185
197
},
186
198
"required": [
187
199
"items"
188
200
],
189
201
"type": "object"
190
202
},
191
203
"vote": {
192
204
"description": "Secret pre-game vote: up to 3 categories from the ballot.",
193
205
"properties": {
194
206
"categories": {
195
207
"items": {
196
208
"maxLength": 300,
197
209
"type": "string"
198
210
},
199
211
"maxLength": 3,
200
212
"minLength": 1,
201
213
"type": "array"
202
214
}
203
215
},
204
216
"required": [
205
217
"categories"
206
218
],
207
219
"type": "object"
208
220
}
209
221
},
210
222
"id": "games.cavu.tier-madness.clientFrame",
211
223
"lexicon": 1
212
224
}