app.kiesel.facts.claimVerdict
Schema Diff
+3 -3
Compatibility Analysis
Breaking Changes Detected
1 breaking change, 1 non-breaking change.
Breaking Changes (1)
- KindChanged KindChanged { vertex_id: "app.kiesel.facts.claimVerdict:body.confidence", old_kind: "object", new_kind: "integer" }
Non-Breaking Changes (1)
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "app.kiesel.facts.claimVerdict:body.confidence", sort: "maximum", old_value: "1", new_value: "1000" }
Migration Guidance
Constraint Changes
- ConstraintRelaxed ConstraintRelaxed { vertex_id: "app.kiesel.facts.claimVerdict:body.confidence", sort: "maximum", old_value: "1", new_value: "1000" }
Additional Notes
- Breaking: KindChanged { vertex_id: "app.kiesel.facts.claimVerdict:body.confidence", old_kind: "object", new_kind: "integer" }
1
1
{
2
2
"$type": "com.atproto.lexicon.schema",
3
3
"defs": {
4
4
"evidenceItem": {
5
5
"description": "A single fact-check cited as evidence. Provides EITHER a reference to an atproto claimReview record (preferred when the publisher operates on atproto) OR the publisher's own article URL and metadata. Both `claimReview` and `externalSource` may be set when an atproto record exists for an external publisher's web article.",
6
6
"properties": {
7
7
"attribution": {
8
8
"description": "Verbatim attribution string the labeler stores with this evidence. Lets downstream consumers see the publisher + intake provenance per evidence item without inferring it.",
9
9
"maxLength": 500,
10
10
"type": "string"
11
11
},
12
12
"claimReview": {
13
13
"description": "Reference to an atproto app.kiesel.facts.claimReview record. Set when the cited fact-check is hosted on atproto.",
14
14
"ref": "com.atproto.repo.strongRef",
15
15
"type": "ref"
16
16
},
17
17
"externalSource": {
18
18
"description": "Publisher's web article URL + metadata. Set when the cited fact-check is *not* on atproto (typical case today — Lead Stories, USA Today, dpa-Faktencheck etc. publish on the web only).",
19
19
"ref": "#externalSource",
20
20
"type": "ref"
21
21
},
22
22
"intakePath": {
23
23
"description": "How the labeler obtained this evidence. 'self-published' = an atproto claimReview record (claimReview field set). 'bulk-feed' = a ClaimReview JSON-LD compilation feed (e.g. Google Data Commons). 'factcheck-api' = a per-claim API lookup (e.g. Google Fact Check Tools).",
24
24
"knownValues": [
25
25
"self-published",
26
26
"bulk-feed",
27
27
"factcheck-api"
28
28
],
29
29
"type": "string"
30
30
},
31
31
"polarity": {
32
32
"description": "How this evidence relates to the claim being verdicted. 'entail' = supports. 'contradict' = refutes. 'neutral' = not directly relevant; included for transparency about what was retrieved but dropped.",
33
33
"knownValues": [
34
34
"entail",
35
35
"contradict",
36
36
"neutral"
37
37
],
38
38
"type": "string"
39
39
}
40
40
},
41
41
"type": "object"
42
42
},
43
43
"externalSource": {
44
44
"description": "Metadata for a fact-check hosted on the web (not on atproto). Includes enough fields to render without fetching the article: publisher name, source URL, rating text, language.",
45
45
"properties": {
46
46
"claimReviewed": {
47
47
"description": "The text of the claim as the publisher framed it (may differ slightly from the labeler's extracted claim).",
48
48
"maxLength": 2000,
49
49
"type": "string"
50
50
},
51
51
"lang": {
52
52
"description": "BCP-47 language tag of the publisher's article.",
53
53
"type": "string"
54
54
},
55
55
"publisherName": {
56
56
"description": "Display name of the publisher (e.g. 'Full Fact', 'USA Today').",
57
57
"maxLength": 200,
58
58
"minLength": 1,
59
59
"type": "string"
60
60
},
61
61
"publisherSite": {
62
62
"description": "Bare host of the publisher (e.g. 'fullfact.org', 'usatoday.com'). Lets consumers apply their own publisher allowlist.",
63
63
"type": "string"
64
64
},
65
65
"publisherUrl": {
66
66
"description": "Publisher's homepage URL.",
67
67
"format": "uri",
68
68
"type": "string"
69
69
},
70
70
"ratingNative": {
71
71
"description": "Publisher's verdict text, verbatim (e.g. 'False', 'Mostly False', 'Falsch', 'Pants on Fire').",
72
72
"type": "string"
73
73
},
74
74
"reviewDate": {
75
75
"description": "When the publisher published the fact-check.",
76
76
"format": "datetime",
77
77
"type": "string"
78
78
},
79
79
"sourceUrl": {
80
80
"description": "URL of the publisher's fact-check article.",
81
81
"format": "uri",
82
82
"type": "string"
83
83
}
84
84
},
85
85
"required": [
86
86
"publisherName",
87
87
"sourceUrl"
88
88
],
89
89
"type": "object"
90
90
},
91
91
"main": {
92
92
"description": "A labeler's aggregated verdict on one specific atproto record (typically a Bluesky post). Each verdict represents the labeler's call given the evidence available at `verifiedAt`. Re-running the pipeline later may produce a superseding record; the most recent record for a given (labeler, subject) pair is authoritative.",
93
93
"key": "tid",
94
94
"record": {
95
95
"properties": {
96
96
"claimText": {
97
97
"description": "The atomic claim extracted from the subject, as the labeler interpreted it. The actual sentence on which the verdict was computed.",
98
98
"maxGraphemes": 700,
99
99
"maxLength": 2000,
100
100
"minLength": 1,
101
101
"type": "string"
102
102
},
103
103
"confidence": {
104
-
"description": "Aggregated confidence in the verdict, in [0, 1]. Specific computation is labeler-internal; consumers should treat it as ordinal.",
105
-
"maximum": 1,
104
+
"description": "Aggregated confidence in the verdict, expressed as an integer in [0, 1000] (so 826 means 0.826). Stored as integer because the atproto data model intentionally excludes floats. Specific computation is labeler-internal; consumers should treat it as ordinal.",
105
+
"maximum": 1000,
106
106
"minimum": 0,
107
-
"type": "number"
107
+
"type": "integer"
108
108
},
109
109
"decontextualizedText": {
110
110
"description": "Standalone version of the claim — rewritten so the claim makes sense outside the original post's context. Used by the labeler internally to improve matching against ClaimReview entries that don't share the post's surrounding context.",
111
111
"maxGraphemes": 700,
112
112
"maxLength": 2000,
113
113
"type": "string"
114
114
},
115
115
"emittedLabel": {
116
116
"description": "Optional reference to a Bluesky label value this verdict caused the labeler to emit on subject (e.g. 'fact-supported', 'fact-refuted'). Reflects what consumers see on Bluesky's wire, complementing the structured verdict here.",
117
117
"type": "string"
118
118
},
119
119
"evidence": {
120
120
"description": "The fact-checks that informed the verdict. Each item either references an atproto claimReview record OR an external publisher URL (typical case today — most publishers don't yet write to atproto). At least one item is required: a verdict with no evidence is not a verdict.",
121
121
"items": {
122
122
"ref": "#evidenceItem",
123
123
"type": "ref"
124
124
},
125
125
"maxLength": 20,
126
126
"minLength": 1,
127
127
"type": "array"
128
128
},
129
129
"labelUri": {
130
130
"description": "Optional at-uri of the com.atproto.label record this verdict corresponds to, when the labeler also publishes a signed label.",
131
131
"format": "at-uri",
132
132
"type": "string"
133
133
},
134
134
"rationale": {
135
135
"description": "Short human-readable explanation of how the verdict was reached. Optional but recommended.",
136
136
"maxGraphemes": 350,
137
137
"maxLength": 1000,
138
138
"type": "string"
139
139
},
140
140
"subject": {
141
141
"description": "The atproto record the verdict is *about* (usually an app.bsky.feed.post). Constellation indexes this field, enabling 'which labelers have reviewed this post?' lookups.",
142
142
"ref": "com.atproto.repo.strongRef",
143
143
"type": "ref"
144
144
},
145
145
"supersedes": {
146
146
"description": "Optional at-uri of an earlier claimVerdict by this labeler on the same subject. When set, signals 'this record replaces the older one'.",
147
147
"format": "at-uri",
148
148
"type": "string"
149
149
},
150
150
"validAt": {
151
151
"description": "Optional 'as-of' date the verdict reflects — useful when citing a fact-check published earlier than verifiedAt. For example: a fact-check from 2020 cited today carries a validAt of 2020.",
152
152
"format": "datetime",
153
153
"type": "string"
154
154
},
155
155
"verdict": {
156
156
"description": "The aggregated verdict. 'supported' = fact-checkers confirm the claim. 'refuted' = fact-checkers refute it. 'disputed' = fact-checkers disagree among themselves. 'mixed' = the claim is partially true. 'outdated' = was true when reviewed but no longer current. 'unknown' = reviewed but unresolved by the publisher.",
157
157
"knownValues": [
158
158
"supported",
159
159
"refuted",
160
160
"disputed",
161
161
"mixed",
162
162
"outdated",
163
163
"unknown"
164
164
],
165
165
"type": "string"
166
166
},
167
167
"verifiedAt": {
168
168
"description": "When the verdict was computed.",
169
169
"format": "datetime",
170
170
"type": "string"
171
171
},
172
172
"voteBreakdown": {
173
173
"description": "How the underlying judgements split. Useful for downstream consumers to apply stricter thresholds than the labeler did.",
174
174
"ref": "#voteBreakdown",
175
175
"type": "ref"
176
176
}
177
177
},
178
178
"required": [
179
179
"subject",
180
180
"claimText",
181
181
"verdict",
182
182
"evidence",
183
183
"verifiedAt"
184
184
],
185
185
"type": "object"
186
186
},
187
187
"type": "record"
188
188
},
189
189
"voteBreakdown": {
190
190
"description": "Summary of the per-evidence judgements that fed the aggregated verdict.",
191
191
"properties": {
192
192
"contradict": {
193
193
"description": "Number of evidence items judged to contradict the claim.",
194
194
"minimum": 0,
195
195
"type": "integer"
196
196
},
197
197
"entail": {
198
198
"description": "Number of evidence items judged to entail the claim.",
199
199
"minimum": 0,
200
200
"type": "integer"
201
201
},
202
202
"neutral": {
203
203
"description": "Number of evidence items judged neutral (dropped from aggregation).",
204
204
"minimum": 0,
205
205
"type": "integer"
206
206
}
207
207
},
208
208
"required": [
209
209
"entail",
210
210
"contradict",
211
211
"neutral"
212
212
],
213
213
"type": "object"
214
214
}
215
215
},
216
216
"description": "An aggregated verdict on a single atproto record, produced by a labeler that cites one or more existing fact-checks. The actor writing this record is a *labeler* (an automated or human-curated routing service), not the original fact-checker. Each verdict points back at the atproto record it covers (subject) AND at the evidence it relied on (fact-checks).",
217
217
"id": "app.kiesel.facts.claimVerdict",
218
218
"lexicon": 1
219
219
}