dev.roe.ama
Schema Diff
+1 -1
Compatibility Analysis
Breaking Changes Detected
3 breaking changes, 2 non-breaking changes.
Breaking Changes (3)
- RemovedVertex RemovedVertex { vertex_id: "dev.roe.defs#aspectRatio" }
- RemovedEdge RemovedEdge { src: "dev.roe.ama:body.imageDimensions", tgt: "dev.roe.defs#aspectRatio", kind: "ref", name: None }
- ConstraintTightened ConstraintTightened { vertex_id: "dev.roe.ama:body.imageDimensions", sort: "ref", old_value: "dev.roe.defs#aspectRatio", new_value: "community.lexicon.app.defs#aspectRatio" }
Non-Breaking Changes (2)
- AddedVertex AddedVertex { vertex_id: "community.lexicon.app.defs#aspectRatio" }
- AddedEdge AddedEdge { src: "dev.roe.ama:body.imageDimensions", tgt: "community.lexicon.app.defs#aspectRatio", kind: "ref", name: None }
Migration Guidance
Removed Elements
RemovedVertex { vertex_id: "dev.roe.defs#aspectRatio" }
Added Elements
AddedVertex { vertex_id: "community.lexicon.app.defs#aspectRatio" }
Constraint Changes
- ConstraintTightened ConstraintTightened { vertex_id: "dev.roe.ama:body.imageDimensions", sort: "ref", old_value: "dev.roe.defs#aspectRatio", new_value: "community.lexicon.app.defs#aspectRatio" }
Additional Notes
- Breaking: RemovedEdge { src: "dev.roe.ama:body.imageDimensions", tgt: "dev.roe.defs#aspectRatio", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "dev.roe.ama:body.imageDimensions", tgt: "community.lexicon.app.defs#aspectRatio", kind: "ref", name: None }
1
1
{
2
2
"id": "dev.roe.ama",
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
"status",
11
11
"createdAt"
12
12
],
13
13
"properties": {
14
14
"image": {
15
15
"type": "blob",
16
16
"accept": [
17
17
"image/*"
18
18
],
19
19
"maxSize": 5000000
20
20
},
21
21
"posts": {
22
22
"type": "array",
23
23
"items": {
24
24
"ref": "#post",
25
25
"type": "ref"
26
26
},
27
27
"maxLength": 16,
28
28
"description": "Thread of response posts. Each post is the body of one Bluesky-thread item (and one Mastodon status, one LinkedIn comment chain entry, etc)."
29
29
},
30
30
"status": {
31
31
"type": "string",
32
32
"knownValues": [
33
33
"unanswered",
34
34
"answered"
35
35
]
36
36
},
37
37
"question": {
38
38
"type": "string",
39
39
"maxLength": 500000,
40
40
"description": "Plaintext question. Present iff status=answered; the editor decrypts encryptedQuestion at publish time and writes it here so the record is self-contained going forward.",
41
41
"maxGraphemes": 50000
42
42
},
43
43
"createdAt": {
44
44
"type": "string",
45
45
"format": "datetime"
46
46
},
47
47
"platforms": {
48
48
"ref": "#platforms",
49
49
"type": "ref",
50
50
"description": "Which platforms the editor enabled when publishing."
51
51
},
52
52
"answeredAt": {
53
53
"type": "string",
54
54
"format": "datetime"
55
55
},
56
56
"publishedLinks": {
57
57
"ref": "#publishedLinks",
58
58
"type": "ref",
59
59
"description": "Resolved per-platform URLs after publish."
60
60
},
61
61
"backgroundStyle": {
62
62
"type": "string",
63
63
"maxLength": 128,
64
64
"description": "ID of the background style used to render the image, either a preset name or a serialised custom emoji-and-gradient id. The set of styles is internal to roe.dev."
65
65
},
66
66
"imageDimensions": {
67
-
"ref": "dev.roe.defs#aspectRatio",
67
+
"ref": "community.lexicon.app.defs#aspectRatio",
68
68
"type": "ref",
69
69
"description": "Pixel dimensions of `image`. Stored alongside because PDS blobs don't carry intrinsic dimensions and Bluesky's image embed needs `aspectRatio`."
70
70
},
71
71
"encryptedQuestion": {
72
72
"type": "string",
73
73
"maxLength": 500000,
74
74
"description": "AES-256-GCM envelope holding the raw question text. Present iff status=unanswered."
75
75
}
76
76
}
77
77
},
78
78
"description": "An anonymous question, optionally with a published answer. While unanswered the question text is encrypted server-side (private to roe.dev). Once published, the question is rewritten in plaintext alongside the answer and per-platform URLs."
79
79
},
80
80
"post": {
81
81
"type": "object",
82
82
"required": [
83
83
"text"
84
84
],
85
85
"properties": {
86
86
"text": {
87
87
"type": "string",
88
88
"maxLength": 500000,
89
89
"description": "Body text. Plain text with `@<entity-rkey>` placeholders for entity mentions (e.g. `Thanks @abc123def456 for the help`). The placeholder syntax is internal; the publisher swaps them for the right per-platform handle.",
90
90
"maxGraphemes": 50000
91
91
},
92
92
"mentions": {
93
93
"type": "array",
94
94
"items": {
95
95
"ref": "com.atproto.repo.strongRef",
96
96
"type": "ref"
97
97
},
98
98
"maxLength": 32,
99
99
"description": "Strong-refs to dev.roe.entity records. The rkey of each referenced record is the placeholder token used in `text`."
100
100
}
101
101
},
102
102
"description": "One post in the response thread. Mentions reference dev.roe.entity records by AT URI so the publisher can rewrite per-platform handles at publish time."
103
103
},
104
104
"platforms": {
105
105
"type": "object",
106
106
"properties": {
107
107
"bluesky": {
108
108
"type": "boolean",
109
109
"default": true
110
110
},
111
111
"linkedin": {
112
112
"type": "boolean",
113
113
"default": true
114
114
},
115
115
"mastodon": {
116
116
"type": "boolean",
117
117
"default": true
118
118
},
119
119
"youtubeShorts": {
120
120
"type": "boolean",
121
121
"default": false
122
122
}
123
123
}
124
124
},
125
125
"publishedLinks": {
126
126
"type": "object",
127
127
"properties": {
128
128
"bluesky": {
129
129
"type": "string",
130
130
"format": "uri"
131
131
},
132
132
"linkedin": {
133
133
"type": "string",
134
134
"format": "uri"
135
135
},
136
136
"mastodon": {
137
137
"type": "string",
138
138
"format": "uri"
139
139
},
140
140
"youtubeShorts": {
141
141
"type": "string",
142
142
"format": "uri"
143
143
}
144
144
}
145
145
}
146
146
},
147
147
"$type": "com.atproto.lexicon.schema",
148
148
"lexicon": 1
149
149
}