dev.knotless.repo

lexicons.knotless.dev

Schema Diff

+22 -0

From

CID
bafyreico7z4ap74...
Indexed At
2026-10-29 04:59 UTC
View this version

To

CID
bafyreigaidny6co...
Indexed At
2026-10-29 14:35 UTC
View this version

Compatibility Analysis

Breaking Changes Detected

1 breaking change, 7 non-breaking changes.

Breaking Changes (1)
  • RequiredEdgeAdded RequiredEdgeAdded { vertex_id: "dev.knotless.repo#reader", src: "dev.knotless.repo#reader", tgt: "dev.knotless.repo#reader.did", kind: "prop", name: Some("did") }
Non-Breaking Changes (7)
  • AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reader" }
  • AddedVertex AddedVertex { vertex_id: "dev.knotless.repo#reader.did" }
  • AddedVertex AddedVertex { vertex_id: "dev.knotless.repo:body.readers" }
  • AddedVertex AddedVertex { vertex_id: "dev.knotless.repo:body.readers:items" }
  • AddedEdge AddedEdge { src: "dev.knotless.repo:body", tgt: "dev.knotless.repo:body.readers", kind: "prop", name: Some("readers") }
  • AddedEdge AddedEdge { src: "dev.knotless.repo:body.readers", tgt: "dev.knotless.repo:body.readers:items", kind: "items", name: None }
  • AddedEdge AddedEdge { src: "dev.knotless.repo:body.readers:items", tgt: "dev.knotless.repo#reader", kind: "ref", name: None }

Migration Guidance

Added Elements

  • AddedVertex { vertex_id: "dev.knotless.repo#reader" }
  • AddedVertex { vertex_id: "dev.knotless.repo#reader.did" }
  • AddedVertex { vertex_id: "dev.knotless.repo:body.readers" }
  • AddedVertex { vertex_id: "dev.knotless.repo:body.readers:items" }

Additional Notes

  • Breaking: RequiredEdgeAdded { vertex_id: "dev.knotless.repo#reader", src: "dev.knotless.repo#reader", tgt: "dev.knotless.repo#reader.did", kind: "prop", name: Some("did") }
  • Non-breaking: AddedEdge { src: "dev.knotless.repo:body", tgt: "dev.knotless.repo:body.readers", kind: "prop", name: Some("readers") }
  • Non-breaking: AddedEdge { src: "dev.knotless.repo:body.readers", tgt: "dev.knotless.repo:body.readers:items", kind: "items", name: None }
  • Non-breaking: AddedEdge { src: "dev.knotless.repo:body.readers:items", tgt: "dev.knotless.repo#reader", kind: "ref", name: None }
1 1
{
2 2
  "$type": "com.atproto.lexicon.schema",
3 3
  "defs": {
4 4
    "agent": {
5 5
      "description": "An account whose pulls are checked as they move, as code no one vouches for.",
6 6
      "properties": {
7 7
        "did": {
8 8
          "format": "did",
9 9
          "type": "string"
10 10
        }
11 11
      },
12 12
      "required": [
13 13
        "did"
14 14
      ],
15 15
      "type": "object"
16 16
    },
17 17
    "appview": {
18 18
      "description": "An appview the owner lets keep an index of a private repository.",
19 19
      "properties": {
20 20
        "did": {
21 21
          "description": "The appview's service DID, as did:web:knotless.dev.",
22 22
          "format": "did",
23 23
          "type": "string"
24 24
        }
25 25
      },
26 26
      "required": [
27 27
        "did"
28 28
      ],
29 29
      "type": "object"
30 30
    },
31 31
    "collaborator": {
32 32
      "description": "An account that may push to the repository.",
33 33
      "properties": {
34 34
        "did": {
35 35
          "format": "did",
36 36
          "type": "string"
37 37
        }
38 38
      },
39 39
      "required": [
40 40
        "did"
41 41
      ],
42 42
      "type": "object"
43 43
    },
44 44
    "label": {
45 45
      "description": "A label pulls and issues may carry.",
46 46
      "properties": {
47 47
        "color": {
48 48
          "description": "A hex color, as #d73a4a.",
49 49
          "maxLength": 7,
50 50
          "type": "string"
51 51
        },
52 52
        "description": {
53 53
          "description": "What the label means, for those who put it on.",
54 54
          "maxGraphemes": 200,
55 55
          "maxLength": 1000,
56 56
          "type": "string"
57 57
        },
58 58
        "exclusive": {
59 59
          "description": "At most one of its scope's exclusive labels stands at a time, as priority/high and priority/low: setting one takes the others off.",
60 60
          "type": "boolean"
61 61
        },
62 62
        "name": {
63 63
          "description": "Unique among the repository's labels. Up to its last `/`, if it has one, it names the label's scope, as kind/bug's is kind.",
64 64
          "maxGraphemes": 50,
65 65
          "maxLength": 100,
66 66
          "type": "string"
67 67
        }
68 68
      },
69 69
      "required": [
70 70
        "name"
71 71
      ],
72 72
      "type": "object"
73 73
    },
74 74
    "main": {
75 75
      "description": "Keyed by the repository's name, so a clone URL resolves with one getRecord. `key` prefixes the record keys of everything the repository holds; a rename writes a record under the new name with the same key, deletes the old one and leaves a dev.knotless.redirect under the old name.",
76 76
      "key": "any",
77 77
      "record": {
78 78
        "properties": {
79 79
          "agents": {
80 80
            "description": "Accounts, such as a coding agent, whose pulls the repository's runners check as they move, as they do a collaborator's, but as code no one vouches for: given no secrets, reading caches apart, and keeping nothing they write. An account named here counts as an agent even if it is a collaborator too.",
81 81
            "items": {
82 82
              "ref": "#agent",
83 83
              "type": "ref"
84 84
            },
85 85
            "maxLength": 32,
86 86
            "type": "array"
87 87
          },
88 88
          "appviews": {
89 89
            "description": "Deprecated, and no longer read: knotless.dev indexes every private repository its members read there, named here or not. Was, for a private repository, the appviews its owner let keep an index of it.",
90 90
            "items": {
91 91
              "ref": "#appview",
92 92
              "type": "ref"
93 93
            },
94 94
            "maxLength": 32,
95 95
            "type": "array"
96 96
          },
97 97
          "collaborators": {
98 98
            "description": "Accounts that may push. They push through a gateway the owner has delegated writes to, which checks this list.",
99 99
            "items": {
100 100
              "ref": "#collaborator",
101 101
              "type": "ref"
102 102
            },
103 103
            "maxLength": 1000,
104 104
            "type": "array"
105 105
          },
106 106
          "createdAt": {
107 107
            "format": "datetime",
108 108
            "type": "string"
109 109
          },
110 110
          "defaultBranch": {
111 111
            "description": "The branch HEAD points at, without refs/heads/.",
112 112
            "maxLength": 255,
113 113
            "type": "string"
114 114
          },
115 115
          "description": {
116 116
            "maxGraphemes": 300,
117 117
            "maxLength": 3000,
118 118
            "type": "string"
119 119
          },
120 120
          "forkOf": {
121 121
            "description": "The repository this one was forked from.",
122 122
            "ref": "dev.knotless.defs#repoRef",
123 123
            "type": "ref"
124 124
          },
125 125
          "gateway": {
126 126
            "description": "A gateway the owner has delegated writes to. Collaborators push and commit through it; it batches concurrent commits to a branch into one write.",
127 127
            "format": "did",
128 128
            "type": "string"
129 129
          },
130 130
          "key": {
131 131
            "description": "Minted when the repository is created; never reused. The `repo` of its dev.knotless.ref, dev.knotless.claim and dev.knotless.pack records.",
132 132
            "format": "tid",
133 133
            "type": "string"
134 134
          },
135 135
          "labels": {
136 136
            "description": "The labels its pulls and issues may carry. The owner and collaborators put them on with dev.knotless.label records; readers show none but these.",
137 137
            "items": {
138 138
              "ref": "#label",
139 139
              "type": "ref"
140 140
            },
141 141
            "maxLength": 200,
142 142
            "type": "array"
143 143
          },
144 144
          "links": {
145 145
            "description": "Links shown on the repository's pages, in display order: its website first.",
146 146
            "items": {
147 147
              "ref": "dev.knotless.defs#link",
148 148
              "type": "ref"
149 149
            },
150 150
            "maxLength": 5,
151 151
            "type": "array"
152 152
          },
153 153
          "name": {
154 154
            "description": "Equal to the record key.",
155 155
            "maxLength": 100,
156 156
            "type": "string"
157 157
          },
158 +
          "readers": {
159 +
            "description": "For a private repository, the accounts it is shared with to read but not to push: members of its space. An appview takes this as the owner's word that they may hear of what is said there.",
160 +
            "items": {
161 +
              "ref": "#reader",
162 +
              "type": "ref"
163 +
            },
164 +
            "maxLength": 1000,
165 +
            "type": "array"
166 +
          },
158 167
          "rules": {
159 168
            "description": "Protected branches. The gateway holds collaborators to them; the owner, who writes these records directly, is held only by their own client.",
160 169
            "items": {
161 170
              "ref": "#rule",
162 171
              "type": "ref"
163 172
            },
164 173
            "maxLength": 100,
165 174
            "type": "array"
166 175
          },
167 176
          "runners": {
168 177
            "description": "Accounts that run the repository's workflows. Readers show the dev.knotless.check records these accounts write about the repository, and no one else's.",
169 178
            "items": {
170 179
              "ref": "#runner",
171 180
              "type": "ref"
172 181
            },
173 182
            "maxLength": 32,
174 183
            "type": "array"
175 184
          },
176 185
          "transfer": {
177 186
            "description": "Where the owner has offered to move the repository: a record in another account, named before it exists. Once that account holds a dev.knotless.repo there whose `transferredFrom` names this one, the repository has moved, and readers follow.",
178 187
            "ref": "dev.knotless.defs#repoRef",
179 188
            "type": "ref"
180 189
          },
181 190
          "transferredFrom": {
182 191
            "description": "The repository this one was moved from. Readers count records naming that one as naming this one, if its owner agreed: its `transfer`, or the redirect left in its place, leads here.",
183 192
            "ref": "dev.knotless.defs#repoRef",
184 193
            "type": "ref"
185 194
          },
186 195
          "triagers": {
187 196
            "description": "Accounts, such as a triage bot, whose dev.knotless.label records readers honor for the scopes named, and below anyone's who labels as the owner or a collaborator.",
188 197
            "items": {
189 198
              "ref": "#triager",
190 199
              "type": "ref"
191 200
            },
192 201
            "maxLength": 32,
193 202
            "type": "array"
194 203
          }
195 204
        },
196 205
        "required": [
197 206
          "key",
198 207
          "name",
199 208
          "createdAt"
200 209
        ],
201 210
        "type": "object"
202 211
      },
203 212
      "type": "record"
204 213
    },
214 +
    "reader": {
215 +
      "description": "An account a private repository is shared with to read.",
216 +
      "properties": {
217 +
        "did": {
218 +
          "format": "did",
219 +
          "type": "string"
220 +
        }
221 +
      },
222 +
      "required": [
223 +
        "did"
224 +
      ],
225 +
      "type": "object"
226 +
    },
205 227
    "reviews": {
206 228
      "description": "The reviews a protected branch asks of a pull before it merges, counted from those who may write to the repository: its owner and collaborators. A review is a dev.knotless.comment with a verdict, and each reviewer's newest one stands. A standing request for changes from one of them blocks the merge. A reader that finds a field here it does not know merges into the branch only once it knows it, so a rule is never held more loosely than it was written.",
207 229
      "properties": {
208 230
        "approvals": {
209 231
          "description": "How many approvals the pull needs, from accounts other than its author. Absent is 0.",
210 232
          "maximum": 10,
211 233
          "minimum": 0,
212 234
          "type": "integer"
213 235
        },
214 236
        "codeOwners": {
215 237
          "description": "Each path the pull changes that the CODEOWNERS file on the target branch gives owners needs an approval from one of them. Absent is false.",
216 238
          "type": "boolean"
217 239
        },
218 240
        "dismissStale": {
219 241
          "description": "Only an approval of the pull's head as it is now counts: one of an earlier head no longer does. Absent is false, and any standing approval counts.",
220 242
          "type": "boolean"
221 243
        }
222 244
      },
223 245
      "type": "object"
224 246
    },
225 247
    "rule": {
226 248
      "description": "A protected branch: through a gateway it only moves forward and is never deleted, and, as its rule says, takes no merge commits, takes pulls only through the merge queue, or takes a pull only once it is reviewed.",
227 249
      "properties": {
228 250
        "branch": {
229 251
          "description": "The branch, without refs/heads/.",
230 252
          "maxLength": 255,
231 253
          "type": "string"
232 254
        },
233 255
        "history": {
234 256
          "description": "`linear`: the branch takes no merge commits, so pulls merge into it by squashing. `merges`: it takes them. Absent, or a value a reader does not know, is read as `linear`, so a rule is never held more loosely than it was written.",
235 257
          "knownValues": [
236 258
            "linear",
237 259
            "merges"
238 260
          ],
239 261
          "maxLength": 64,
240 262
          "type": "string"
241 263
        },
242 264
        "queue": {
243 265
          "description": "Pulls into this branch land only through the merge queue: a merge queues them instead, unless the owner forces it, and through a gateway the branch moves for no one but the owner and the runner that lands the queue. Absent is false.",
244 266
          "type": "boolean"
245 267
        },
246 268
        "reviews": {
247 269
          "description": "The reviews a pull needs before it merges into this branch. Absent, none.",
248 270
          "ref": "#reviews",
249 271
          "type": "ref"
250 272
        }
251 273
      },
252 274
      "required": [
253 275
        "branch"
254 276
      ],
255 277
      "type": "object"
256 278
    },
257 279
    "runner": {
258 280
      "description": "An account whose dev.knotless.check records about the repository readers trust.",
259 281
      "properties": {
260 282
        "did": {
261 283
          "format": "did",
262 284
          "type": "string"
263 285
        }
264 286
      },
265 287
      "required": [
266 288
        "did"
267 289
      ],
268 290
      "type": "object"
269 291
    },
270 292
    "scope": {
271 293
      "description": "A scope of labels a triager may put on.",
272 294
      "properties": {
273 295
        "name": {
274 296
          "description": "As kind is kind/bug's: a label's name up to its last `/`.",
275 297
          "maxLength": 100,
276 298
          "type": "string"
277 299
        }
278 300
      },
279 301
      "required": [
280 302
        "name"
281 303
      ],
282 304
      "type": "object"
283 305
    },
284 306
    "triager": {
285 307
      "description": "An account that puts labels of some scopes on pulls and issues. Its labels give way to the owner's and collaborators', whenever they were set; an account named here counts as a triager even if it is a collaborator too.",
286 308
      "properties": {
287 309
        "did": {
288 310
          "format": "did",
289 311
          "type": "string"
290 312
        },
291 313
        "scopes": {
292 314
          "description": "The scopes of the labels it may put on. None, when absent.",
293 315
          "items": {
294 316
            "ref": "#scope",
295 317
            "type": "ref"
296 318
          },
297 319
          "maxLength": 50,
298 320
          "type": "array"
299 321
        }
300 322
      },
301 323
      "required": [
302 324
        "did"
303 325
      ],
304 326
      "type": "object"
305 327
    }
306 328
  },
307 329
  "description": "A git repository hosted in this account: in its public repo, or, for a private repository, in a dev.knotless.space space keyed by the name.",
308 330
  "id": "dev.knotless.repo",
309 331
  "lexicon": 1
310 332
}

Compare Other Versions

Lexicon Garden

@