app.golfthesky.round
Schema Diff
+54 -2
Compatibility Analysis
Breaking Changes Detected
4 breaking changes, 14 non-breaking changes.
Breaking Changes (4)
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.golfthesky.round#player", src: "app.golfthesky.round#player", tgt: "app.golfthesky.round#player.did", kind: "prop", name: Some("did") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.golfthesky.round#player", src: "app.golfthesky.round#player", tgt: "app.golfthesky.round#player.handle", kind: "prop", name: Some("handle") }
- RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "app.golfthesky.round#player", src: "app.golfthesky.round#player", tgt: "app.golfthesky.round#player.holes", kind: "prop", name: Some("holes") }
- ConstraintTightened ConstraintTightened { vertex_id: "app.golfthesky.round#hole.holeId", sort: "knownValues", old_value: "[\"opening-drive\",\"dogleg\",\"sky-ramp\",\"slick-slope\",\"bunker-alley\",\"island-hop\"]", new_value: "[\"opening-drive\",\"dogleg\",\"sky-ramp\",\"slick-slope\",\"bunker-alley\",\"island-hop\",\"first-light\",\"sticky-situation\",\"ice-cave\",\"archipelago\",\"clockwork\",\"mill-race\",\"skyhook\",\"paddle-alley\",\"crater\"]" }
Non-Breaking Changes (14)
- AddedVertex AddedVertex { vertex_id: "app.golfthesky.round#player" }
- AddedVertex AddedVertex { vertex_id: "app.golfthesky.round#player.did" }
- AddedVertex AddedVertex { vertex_id: "app.golfthesky.round#player.handle" }
- AddedVertex AddedVertex { vertex_id: "app.golfthesky.round#player.holes" }
- AddedVertex AddedVertex { vertex_id: "app.golfthesky.round#player.holes:items" }
- AddedVertex AddedVertex { vertex_id: "app.golfthesky.round:body.players" }
- AddedVertex AddedVertex { vertex_id: "app.golfthesky.round:body.players:items" }
- AddedVertex AddedVertex { vertex_id: "app.golfthesky.round:body.target" }
- AddedEdge AddedEdge { src: "app.golfthesky.round#player.holes", tgt: "app.golfthesky.round#player.holes:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "app.golfthesky.round#player.holes:items", tgt: "app.golfthesky.round#hole", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "app.golfthesky.round:body", tgt: "app.golfthesky.round:body.players", kind: "prop", name: Some("players") }
- AddedEdge AddedEdge { src: "app.golfthesky.round:body", tgt: "app.golfthesky.round:body.target", kind: "prop", name: Some("target") }
- AddedEdge AddedEdge { src: "app.golfthesky.round:body.players", tgt: "app.golfthesky.round:body.players:items", kind: "items", name: None }
- AddedEdge AddedEdge { src: "app.golfthesky.round:body.players:items", tgt: "app.golfthesky.round#player", kind: "ref", name: None }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "app.golfthesky.round#player" }AddedVertex { vertex_id: "app.golfthesky.round#player.did" }AddedVertex { vertex_id: "app.golfthesky.round#player.handle" }AddedVertex { vertex_id: "app.golfthesky.round#player.holes" }AddedVertex { vertex_id: "app.golfthesky.round#player.holes:items" }AddedVertex { vertex_id: "app.golfthesky.round:body.players" }AddedVertex { vertex_id: "app.golfthesky.round:body.players:items" }AddedVertex { vertex_id: "app.golfthesky.round:body.target" }
Constraint Changes
- ConstraintTightened ConstraintTightened { vertex_id: "app.golfthesky.round#hole.holeId", sort: "knownValues", old_value: "[\"opening-drive\",\"dogleg\",\"sky-ramp\",\"slick-slope\",\"bunker-alley\",\"island-hop\"]", new_value: "[\"opening-drive\",\"dogleg\",\"sky-ramp\",\"slick-slope\",\"bunker-alley\",\"island-hop\",\"first-light\",\"sticky-situation\",\"ice-cave\",\"archipelago\",\"clockwork\",\"mill-race\",\"skyhook\",\"paddle-alley\",\"crater\"]" }
Additional Notes
- Breaking: RequiredEdgeAdded { vertex_id: "app.golfthesky.round#player", src: "app.golfthesky.round#player", tgt: "app.golfthesky.round#player.did", kind: "prop", name: Some("did") }
- Breaking: RequiredEdgeAdded { vertex_id: "app.golfthesky.round#player", src: "app.golfthesky.round#player", tgt: "app.golfthesky.round#player.handle", kind: "prop", name: Some("handle") }
- Breaking: RequiredEdgeAdded { vertex_id: "app.golfthesky.round#player", src: "app.golfthesky.round#player", tgt: "app.golfthesky.round#player.holes", kind: "prop", name: Some("holes") }
- Non-breaking: AddedEdge { src: "app.golfthesky.round#player.holes", tgt: "app.golfthesky.round#player.holes:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "app.golfthesky.round#player.holes:items", tgt: "app.golfthesky.round#hole", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "app.golfthesky.round:body", tgt: "app.golfthesky.round:body.players", kind: "prop", name: Some("players") }
- Non-breaking: AddedEdge { src: "app.golfthesky.round:body", tgt: "app.golfthesky.round:body.target", kind: "prop", name: Some("target") }
- Non-breaking: AddedEdge { src: "app.golfthesky.round:body.players", tgt: "app.golfthesky.round:body.players:items", kind: "items", name: None }
- Non-breaking: AddedEdge { src: "app.golfthesky.round:body.players:items", tgt: "app.golfthesky.round#player", kind: "ref", name: None }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"hole": {
5
5
"properties": {
6
6
"holeId": {
7
7
"description": "Permanent identity of the hole within the course.",
8
8
"knownValues": [
9
9
"opening-drive",
10
10
"dogleg",
11
11
"sky-ramp",
12
12
"slick-slope",
13
13
"bunker-alley",
14
-
"island-hop"
14
+
"island-hop",
15
+
"first-light",
16
+
"sticky-situation",
17
+
"ice-cave",
18
+
"archipelago",
19
+
"clockwork",
20
+
"mill-race",
21
+
"skyhook",
22
+
"paddle-alley",
23
+
"crater"
15
24
],
16
25
"maxLength": 64,
17
26
"type": "string"
18
27
},
19
28
"shots": {
20
-
"description": "The whole hole as the only input the game takes. Comma-separated `<dtick>.<yaw>.<pitch>.<power>` entries: dtick is 120 Hz ticks since the previous shot, yaw is milliradians (0–6283), pitch whole degrees, power 1–100. Example: `360.1571.24.80,540.1600.2.30`.",
29
+
"description": "The whole hole as the only input the game takes. Comma-separated `<dtick>.<angle>.<mod>.<power>` entries: dtick is 120 Hz ticks since the previous entry, angle is milliradians counter-clockwise from +x (0–6283), mod is the ball type applied to that swing (0 none, 1 sticky, 2 super, 3 nitro, 4 air brakes, 5 sniper), power 1–100. An entry with power 0 is an event, not a swing: mod 4 is an Air Brakes tap, mod 5 a Mulligan. Power-ups cost energy; a verifier recomputes energy from the clock (starts at 4, +1 every 360 ticks, max 10; costs sticky 4, super 3, nitro 4, brakes 5, mulligan 6, sniper 6) and refuses a log that overspends. Example: `360.785.0.80,540.0.4.0`.",
21
30
"maxLength": 8000,
22
31
"type": "string"
23
32
},
24
33
"strokes": {
25
34
"description": "Advisory stroke count, including out-of-bounds penalties.",
26
35
"minimum": 0,
27
36
"type": "integer"
28
37
},
29
38
"ticks": {
30
39
"description": "Advisory: the tick the ball dropped. Absent if the hole was never finished.",
31
40
"minimum": 1,
32
41
"type": "integer"
33
42
}
34
43
},
35
44
"required": [
36
45
"holeId",
37
46
"shots",
38
47
"strokes"
39
48
],
40
49
"type": "object"
41
50
},
42
51
"main": {
43
52
"description": "One Golf the Sky round, published by the player into their own repo. The record stores every shot rather than a score: the game's ball physics are deterministic, so re-simulating the shots reproduces the round exactly. Owning the record is the identity proof, and replaying it is the score proof — strokes and ticks in this record are advisory and never trusted by a leaderboard.",
44
53
"key": "tid",
45
54
"record": {
46
55
"properties": {
47
56
"courseId": {
48
57
"description": "Permanent identity of the course played. Append-only: ids are never reordered, renamed, or reused.",
49
58
"knownValues": [
50
59
"skyline-links"
51
60
],
52
61
"maxLength": 64,
53
62
"type": "string"
54
63
},
55
64
"createdAt": {
56
65
"format": "datetime",
57
66
"type": "string"
58
67
},
59
68
"field": {
60
69
"description": "How many players were in that live round.",
61
70
"minimum": 1,
62
71
"type": "integer"
63
72
},
64
73
"holes": {
65
74
"items": {
66
75
"ref": "#hole",
67
76
"type": "ref"
68
77
},
69
78
"maxLength": 18,
70
79
"type": "array"
71
80
},
72
81
"mode": {
73
82
"description": "solo: against local bots. live: against other players on a synced clock — the only mode in which placing means anything.",
74
83
"knownValues": [
75
84
"solo",
76
85
"live"
77
86
],
78
87
"type": "string"
79
88
},
80
89
"placing": {
81
90
"description": "Advisory finishing position in a live round, 1 = won.",
82
91
"minimum": 1,
83
92
"type": "integer"
84
93
},
94
+
"players": {
95
+
"description": "Everyone else who played this round, each with their own shot logs, so a replay of this one record shows the whole field. Bots carry a did of the form bot:N. Advisory, like placing: only the owner's own holes are theirs to prove.",
96
+
"items": {
97
+
"ref": "#player",
98
+
"type": "ref"
99
+
},
100
+
"maxLength": 7,
101
+
"type": "array"
102
+
},
85
103
"simVersion": {
86
104
"description": "Which physics produced these shots. A verifier must replay under the matching version or refuse the round.",
87
105
"minimum": 1,
88
106
"type": "integer"
107
+
},
108
+
"target": {
109
+
"description": "The pills (hole wins) the round was played to.",
110
+
"maximum": 9,
111
+
"minimum": 1,
112
+
"type": "integer"
89
113
}
90
114
},
91
115
"required": [
92
116
"courseId",
93
117
"simVersion",
94
118
"holes",
95
119
"createdAt"
96
120
],
97
121
"type": "object"
98
122
},
99
123
"type": "record"
124
+
},
125
+
"player": {
126
+
"properties": {
127
+
"did": {
128
+
"description": "Their DID, or bot:N for a local bot.",
129
+
"maxLength": 300,
130
+
"type": "string"
131
+
},
132
+
"handle": {
133
+
"description": "Their handle when the round was played (advisory).",
134
+
"maxLength": 100,
135
+
"type": "string"
136
+
},
137
+
"holes": {
138
+
"items": {
139
+
"ref": "#hole",
140
+
"type": "ref"
141
+
},
142
+
"maxLength": 18,
143
+
"type": "array"
144
+
}
145
+
},
146
+
"required": [
147
+
"did",
148
+
"handle",
149
+
"holes"
150
+
],
151
+
"type": "object"
100
152
}
101
153
},
102
154
"id": "app.golfthesky.round",
103
155
"lexicon": 1
104
156
}