com.gamethesky.skytanks.run

gamethesky.com

Schema Diff

+40 -0

From

CID
bafyreigv6n2mpgk...
Indexed At
2026-10-21 04:25 UTC
View this version

To

CID
bafyreic5lx6vpwd...
Indexed At
2026-10-21 06:42 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

3 breaking changes, 9 non-breaking changes.

Breaking Changes (3)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.slot", kind: "prop", name: Some("slot") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.image", kind: "prop", name: Some("image") }
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.name", kind: "prop", name: Some("name") }
Non-Breaking Changes (9)
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.image" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.name" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.slot" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run:body.faces" }
  • AddedVertex AddedVertex { vertex_id: "com.gamethesky.skytanks.run:body.faces:items" }
  • AddedEdge AddedEdge { src: "com.gamethesky.skytanks.run:body", tgt: "com.gamethesky.skytanks.run:body.faces", kind: "prop", name: Some("faces") }
  • AddedEdge AddedEdge { src: "com.gamethesky.skytanks.run:body.faces", tgt: "com.gamethesky.skytanks.run:body.faces:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "com.gamethesky.skytanks.run:body.faces:items", tgt: "com.gamethesky.skytanks.run#face", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face" }
  • AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.image" }
  • AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.name" }
  • AddedVertex { vertex_id: "com.gamethesky.skytanks.run#face.slot" }
  • AddedVertex { vertex_id: "com.gamethesky.skytanks.run:body.faces" }
  • AddedVertex { vertex_id: "com.gamethesky.skytanks.run:body.faces:items" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.slot", kind: "prop", name: Some("slot") }
  • Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.image", kind: "prop", name: Some("image") }
  • Breaking: RequiredEdgeAdded { vertex_id: "com.gamethesky.skytanks.run#face", src: "com.gamethesky.skytanks.run#face", tgt: "com.gamethesky.skytanks.run#face.name", kind: "prop", name: Some("name") }
  • Non-breaking: AddedEdge { src: "com.gamethesky.skytanks.run:body", tgt: "com.gamethesky.skytanks.run:body.faces", kind: "prop", name: Some("faces") }
  • Non-breaking: AddedEdge { src: "com.gamethesky.skytanks.run:body.faces", tgt: "com.gamethesky.skytanks.run:body.faces:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "com.gamethesky.skytanks.run:body.faces:items", tgt: "com.gamethesky.skytanks.run#face", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 +
    "face": {
5 +
      "description": "One of the player's own faces, as it rode in a run: which rival slot, the name under it, and the picture.",
6 +
      "properties": {
7 +
        "image": {
8 +
          "accept": [
9 +
            "image/jpeg"
10 +
          ],
11 +
          "description": "The face: a 256×256 JPEG, 64 KB at most, cropped to the middle of the photo. Readers refuse a bigger one.",
12 +
          "maxSize": 65536,
13 +
          "type": "blob"
14 +
        },
15 +
        "name": {
16 +
          "description": "The name under the face, 40 characters at most.",
17 +
          "maxGraphemes": 40,
18 +
          "maxLength": 160,
19 +
          "type": "string"
20 +
        },
21 +
        "slot": {
22 +
          "description": "The rival slot the face rode in, 0 first. The slots are filled by `faces` at their slot numbers and then by `rivals` in order, so a face sits ahead of the handles, as it did on the player's screen.",
23 +
          "maximum": 5,
24 +
          "minimum": 0,
25 +
          "type": "integer"
26 +
        }
27 +
      },
28 +
      "required": [
29 +
        "slot",
30 +
        "name",
31 +
        "image"
32 +
      ],
33 +
      "type": "object"
34 +
    },
4 35
    "main": {
5 36
      "description": "One Sky Tanks run, published by the player into their own repo. The record stores every input rather than trusting a score: the sim is deterministic, so replaying the log on the same seed reproduces the run exactly. Owning the record is the identity proof, and replaying it is the score proof; score, ticks, level and the rest are advisory and never trusted by a board.",
6 37
      "key": "tid",
7 38
      "record": {
8 39
        "properties": {
9 40
          "cleared": {
10 41
            "description": "Advisory: mazes cleared.",
11 42
            "maximum": 18,
12 43
            "minimum": 0,
13 44
            "type": "integer"
14 45
          },
15 46
          "createdAt": {
16 47
            "format": "datetime",
17 48
            "type": "string"
18 49
          },
19 50
          "difficulty": {
20 51
            "description": "The difficulty the run was played at; absent means normal. A verifier must replay at it, and each has its own board.",
21 52
            "knownValues": [
22 53
              "easy",
23 54
              "normal",
24 55
              "hard"
25 56
            ],
26 57
            "type": "string"
27 58
          },
59 +
          "faces": {
60 +
            "description": "The player's own photo faces that rode in rival tanks, included on purpose (the game asks, off by default) so a replay anywhere shows them; each photo is a public blob in the player's repo. Looks only, like `rivals`: a face takes its slot ahead of the handles, the rivals' play is the sim's, and a verifier ignores this field entirely. Six at most.",
61 +
            "items": {
62 +
              "ref": "#face",
63 +
              "type": "ref"
64 +
            },
65 +
            "maxLength": 6,
66 +
            "type": "array"
67 +
          },
28 68
          "kills": {
29 69
            "description": "Advisory: rival tanks wrecked.",
30 70
            "minimum": 0,
31 71
            "type": "integer"
32 72
          },
33 73
          "level": {
34 74
            "description": "Advisory: the maze the run ended on, 1 to 18, three a world.",
35 75
            "maximum": 18,
36 76
            "minimum": 1,
37 77
            "type": "integer"
38 78
          },
39 79
          "log": {
40 80
            "description": "The whole run as the only input the game takes. Comma-separated `<dtick>.<k>.<a>` entries: dtick is 60 Hz ticks since the previous entry; k 1 holds (a 1) or lets go (a 0) of the trigger; k 4 gives up; k 5 sets the tank's controls to a = (throttle + 1) * 3 + (turn + 1), each -1, 0 or 1. Only inputs the sim accepted are logged. Example: `96.5.7,30.1.1,18.1.0`.",
41 81
            "maxLength": 400000,
42 82
            "type": "string"
43 83
          },
44 84
          "rivals": {
45 85
            "description": "Handles whose faces the rival tanks wore (people the player follows). Looks only: the rivals' play is the sim's and doesn't depend on this.",
46 86
            "items": {
47 87
              "maxLength": 253,
48 88
              "type": "string"
49 89
            },
50 90
            "maxLength": 6,
51 91
            "type": "array"
52 92
          },
53 93
          "score": {
54 94
            "description": "Advisory: points. Higher ranks higher.",
55 95
            "minimum": 0,
56 96
            "type": "integer"
57 97
          },
58 98
          "seed": {
59 99
            "description": "The mazes: `arcade` (the same for everyone), or a UTC date `YYYY-MM-DD` for that day's. Each has its own board.",
60 100
            "maxLength": 16,
61 101
            "type": "string"
62 102
          },
63 103
          "simVersion": {
64 104
            "description": "Which rules produced this log. A verifier must replay under the matching version or refuse the run.",
65 105
            "minimum": 1,
66 106
            "type": "integer"
67 107
          },
68 108
          "ticks": {
69 109
            "description": "Advisory: 60 Hz ticks from the first count to the end of the run.",
70 110
            "minimum": 1,
71 111
            "type": "integer"
72 112
          },
73 113
          "won": {
74 114
            "description": "Advisory: all eighteen mazes cleared.",
75 115
            "type": "boolean"
76 116
          }
77 117
        },
78 118
        "required": [
79 119
          "simVersion",
80 120
          "seed",
81 121
          "log",
82 122
          "ticks",
83 123
          "score",
84 124
          "level",
85 125
          "createdAt"
86 126
        ],
87 127
        "type": "object"
88 128
      },
89 129
      "type": "record"
90 130
    }
91 131
  },
92 132
  "id": "com.gamethesky.skytanks.run",
93 133
  "lexicon": 1
94 134
}

Compare Other Versions

Lexicon Garden

@