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