app.golfthesky.round

golfthesky.app

Schema Diff

+54 -2

From

CID
bafyreihfa7qt2by...
Indexed At
2026-10-09 06:02 UTC
View this version

To

CID
bafyreidl45ckrih...
Indexed At
2026-10-09 15:49 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@