games.cavu.tier-madness.clientFrame

chris.pardy.family

Schema Diff

+13 -1

From

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

To

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

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
}

Compare Other Versions

Lexicon Garden

@