at.atjam.round
Schema Diff
+21 -0
Compatibility Analysis
Breaking Changes Detected
4 breaking changes, 4 non-breaking changes.
Breaking Changes (4)
- ConstraintAdded ConstraintAdded { vertex_id: "at.atjam.round:body.networkGate", sort: "maxLength", value: "640" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.atjam.round:body.networkGate", sort: "maxGraphemes", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.atjam.round:body.joinMode", sort: "maxGraphemes", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.atjam.round:body.joinMode", sort: "maxLength", value: "640" }
Non-Breaking Changes (4)
- AddedVertex AddedVertex { vertex_id: "at.atjam.round:body.joinMode" }
- AddedVertex AddedVertex { vertex_id: "at.atjam.round:body.networkGate" }
- AddedEdge AddedEdge { src: "at.atjam.round:body", tgt: "at.atjam.round:body.joinMode", kind: "prop", name: Some("joinMode") }
- AddedEdge AddedEdge { src: "at.atjam.round:body", tgt: "at.atjam.round:body.networkGate", kind: "prop", name: Some("networkGate") }
Migration Guidance
Added Elements
AddedVertex { vertex_id: "at.atjam.round:body.joinMode" }AddedVertex { vertex_id: "at.atjam.round:body.networkGate" }
Constraint Changes
- ConstraintAdded ConstraintAdded { vertex_id: "at.atjam.round:body.joinMode", sort: "maxGraphemes", value: "64" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.atjam.round:body.joinMode", sort: "maxLength", value: "640" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.atjam.round:body.networkGate", sort: "maxLength", value: "640" }
- ConstraintAdded ConstraintAdded { vertex_id: "at.atjam.round:body.networkGate", sort: "maxGraphemes", value: "64" }
Additional Notes
- Non-breaking: AddedEdge { src: "at.atjam.round:body", tgt: "at.atjam.round:body.joinMode", kind: "prop", name: Some("joinMode") }
- Non-breaking: AddedEdge { src: "at.atjam.round:body", tgt: "at.atjam.round:body.networkGate", kind: "prop", name: Some("networkGate") }
1
1
{
2
2
"id": "at.atjam.round",
3
3
"defs": {
4
4
"main": {
5
5
"key": "tid",
6
6
"type": "record",
7
7
"record": {
8
8
"type": "object",
9
9
"required": [
10
10
"jam",
11
11
"assignment",
12
12
"acceptedSubmissionTypes",
13
13
"milestones",
14
14
"createdAt"
15
15
],
16
16
"properties": {
17
17
"jam": {
18
18
"ref": "com.atproto.repo.strongRef",
19
19
"type": "ref",
20
20
"description": "Strong-ref to the parent at.atjam.jam record."
21
21
},
22
22
"name": {
23
23
"type": "string",
24
24
"maxLength": 640,
25
25
"description": "Human label for this round (e.g. 'Round 26', 'December 2025'). Optional.",
26
26
"maxGraphemes": 64
27
27
},
28
28
"subject": {
29
29
"type": "unknown",
30
30
"description": "Optional structured subject for the round. Records embedded here must include a $type discriminator. Example: a site.eptss.song record for an EPTSS round."
31
31
},
32
+
"joinMode": {
33
+
"type": "string",
34
+
"maxLength": 640,
35
+
"description": "How the round handles signups. Three named patterns: 'open' (default): anyone can sign up; no invitation required. 'hosted': only invitees can sign up, and only the jam organizer can invite — like a guest list. 'network': only invitees can sign up; the organizer can invite, and so can current participants (with the threshold set by networkGate) — like a friend-of-a-friend network. For 'hosted' and 'network', a signup is only valid for readers when its 'invitation' field strong-refs an at.atjam.invitation written by a valid inviter. Unknown values resolve to 'open' for forward compatibility.",
36
+
"knownValues": [
37
+
"open",
38
+
"hosted",
39
+
"network"
40
+
],
41
+
"maxGraphemes": 64
42
+
},
32
43
"createdAt": {
33
44
"type": "string",
34
45
"format": "datetime"
35
46
},
36
47
"assignment": {
37
48
"type": "string",
38
49
"maxLength": 30000,
39
50
"description": "The prompt or brief participants are working against.",
40
51
"maxGraphemes": 3000
41
52
},
42
53
"milestones": {
43
54
"type": "array",
44
55
"items": {
45
56
"ref": "#milestone",
46
57
"type": "ref"
47
58
},
48
59
"maxLength": 16,
49
60
"minLength": 1,
50
61
"description": "Dated milestones for this round. At minimum should include a submission deadline. State is derived by comparing now() to these dates."
51
62
},
63
+
"networkGate": {
64
+
"type": "string",
65
+
"maxLength": 640,
66
+
"description": "Only meaningful when joinMode is 'network'. Defines the threshold a participant must cross before they're allowed to extend invitations. 'signup' (default): any DID with a valid signup can invite. 'contributed': only DIDs whose valid signup is accompanied by at least one at.atjam.submission to this round can invite. Ignored when joinMode is 'open' or 'hosted'. Unknown values resolve to 'signup' for forward compatibility.",
67
+
"knownValues": [
68
+
"signup",
69
+
"contributed"
70
+
],
71
+
"maxGraphemes": 64
72
+
},
52
73
"closingEvent": {
53
74
"type": "unknown",
54
75
"description": "Optional structured closing event (e.g. a listening party, demo day). Records embedded here must include a $type discriminator."
55
76
},
56
77
"acceptedSubmissionTypes": {
57
78
"type": "array",
58
79
"items": {
59
80
"type": "string",
60
81
"format": "nsid"
61
82
},
62
83
"maxLength": 32,
63
84
"minLength": 1,
64
85
"description": "NSIDs of record types that can be submitted to this round (e.g. ['fm.plyr.track'])."
65
86
}
66
87
}
67
88
},
68
89
"description": "Declares a round under a parent jam."
69
90
},
70
91
"milestone": {
71
92
"type": "object",
72
93
"required": [
73
94
"label",
74
95
"date"
75
96
],
76
97
"properties": {
77
98
"date": {
78
99
"type": "string",
79
100
"format": "datetime"
80
101
},
81
102
"label": {
82
103
"type": "string",
83
104
"maxLength": 640,
84
105
"description": "Short label. Known values get special UI treatment but unknown labels are accepted.",
85
106
"knownValues": [
86
107
"signup-deadline",
87
108
"submission-deadline",
88
109
"closing-event",
89
110
"results"
90
111
],
91
112
"maxGraphemes": 64
92
113
}
93
114
}
94
115
}
95
116
},
96
117
"$type": "com.atproto.lexicon.schema",
97
118
"lexicon": 1,
98
119
"description": "A single instance of a jam: an assignment with a deadline that participants sign up for and submit to. State (open / in-progress / closed) is derived from milestones, not stored as an enum."
99
120
}