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
"id": "app.kiesel.facts.claimVerdict",
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
"subject",
11
11
"claimText",
12
12
"verdict",
13
13
"evidence",
14
14
"verifiedAt"
15
15
],
16
16
"properties": {
17
17
"subject": {
18
18
"ref": "com.atproto.repo.strongRef",
19
19
"type": "ref",
20
20
"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."
21
21
},
22
22
"validAt": {
23
23
"type": "string",
24
24
"format": "datetime",
25
25
"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."
26
26
},
27
27
"verdict": {
28
28
"type": "string",
29
29
"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.",
30
30
"knownValues": [
31
31
"supported",
32
32
"refuted",
33
33
"disputed",
34
34
"mixed",
35
35
"outdated",
36
36
"unknown"
37
37
]
38
38
},
39
39
"evidence": {
40
40
"type": "array",
41
41
"items": {
42
42
"ref": "#evidenceItem",
43
43
"type": "ref"
44
44
},
45
45
"maxLength": 20,
46
46
"minLength": 1,
47
47
"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."
48
48
},
49
49
"labelUri": {
50
50
"type": "string",
51
51
"format": "at-uri",
52
52
"description": "Optional at-uri of the com.atproto.label record this verdict corresponds to, when the labeler also publishes a signed label."
53
53
},
54
54
"claimText": {
55
55
"type": "string",
56
56
"maxLength": 2000,
57
57
"minLength": 1,
58
58
"description": "The atomic claim extracted from the subject, as the labeler interpreted it. The actual sentence on which the verdict was computed.",
59
59
"maxGraphemes": 700
60
60
},
61
61
"rationale": {
62
62
"type": "string",
63
63
"maxLength": 1000,
64
64
"description": "Short human-readable explanation of how the verdict was reached. Optional but recommended.",
65
65
"maxGraphemes": 350
66
66
},
67
67
"confidence": {
68
-
"type": "number",
69
-
"maximum": 1,
68
+
"type": "integer",
69
+
"maximum": 1000,
70
70
"minimum": 0,
71
-
"description": "Aggregated confidence in the verdict, in [0, 1]. Specific computation is labeler-internal; consumers should treat it as ordinal."
71
+
"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."
72
72
},
73
73
"supersedes": {
74
74
"type": "string",
75
75
"format": "at-uri",
76
76
"description": "Optional at-uri of an earlier claimVerdict by this labeler on the same subject. When set, signals 'this record replaces the older one'."
77
77
},
78
78
"verifiedAt": {
79
79
"type": "string",
80
80
"format": "datetime",
81
81
"description": "When the verdict was computed."
82
82
},
83
83
"emittedLabel": {
84
84
"type": "string",
85
85
"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."
86
86
},
87
87
"voteBreakdown": {
88
88
"ref": "#voteBreakdown",
89
89
"type": "ref",
90
90
"description": "How the underlying judgements split. Useful for downstream consumers to apply stricter thresholds than the labeler did."
91
91
},
92
92
"decontextualizedText": {
93
93
"type": "string",
94
94
"maxLength": 2000,
95
95
"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.",
96
96
"maxGraphemes": 700
97
97
}
98
98
}
99
99
},
100
100
"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."
101
101
},
102
102
"evidenceItem": {
103
103
"type": "object",
104
104
"properties": {
105
105
"polarity": {
106
106
"type": "string",
107
107
"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.",
108
108
"knownValues": [
109
109
"entail",
110
110
"contradict",
111
111
"neutral"
112
112
]
113
113
},
114
114
"intakePath": {
115
115
"type": "string",
116
116
"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).",
117
117
"knownValues": [
118
118
"self-published",
119
119
"bulk-feed",
120
120
"factcheck-api"
121
121
]
122
122
},
123
123
"attribution": {
124
124
"type": "string",
125
125
"maxLength": 500,
126
126
"description": "Verbatim attribution string the labeler stores with this evidence. Lets downstream consumers see the publisher + intake provenance per evidence item without inferring it."
127
127
},
128
128
"claimReview": {
129
129
"ref": "com.atproto.repo.strongRef",
130
130
"type": "ref",
131
131
"description": "Reference to an atproto app.kiesel.facts.claimReview record. Set when the cited fact-check is hosted on atproto."
132
132
},
133
133
"externalSource": {
134
134
"ref": "#externalSource",
135
135
"type": "ref",
136
136
"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)."
137
137
}
138
138
},
139
139
"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."
140
140
},
141
141
"voteBreakdown": {
142
142
"type": "object",
143
143
"required": [
144
144
"entail",
145
145
"contradict",
146
146
"neutral"
147
147
],
148
148
"properties": {
149
149
"entail": {
150
150
"type": "integer",
151
151
"minimum": 0,
152
152
"description": "Number of evidence items judged to entail the claim."
153
153
},
154
154
"neutral": {
155
155
"type": "integer",
156
156
"minimum": 0,
157
157
"description": "Number of evidence items judged neutral (dropped from aggregation)."
158
158
},
159
159
"contradict": {
160
160
"type": "integer",
161
161
"minimum": 0,
162
162
"description": "Number of evidence items judged to contradict the claim."
163
163
}
164
164
},
165
165
"description": "Summary of the per-evidence judgements that fed the aggregated verdict."
166
166
},
167
167
"externalSource": {
168
168
"type": "object",
169
169
"required": [
170
170
"publisherName",
171
171
"sourceUrl"
172
172
],
173
173
"properties": {
174
174
"lang": {
175
175
"type": "string",
176
176
"description": "BCP-47 language tag of the publisher's article."
177
177
},
178
178
"sourceUrl": {
179
179
"type": "string",
180
180
"format": "uri",
181
181
"description": "URL of the publisher's fact-check article."
182
182
},
183
183
"reviewDate": {
184
184
"type": "string",
185
185
"format": "datetime",
186
186
"description": "When the publisher published the fact-check."
187
187
},
188
188
"publisherUrl": {
189
189
"type": "string",
190
190
"format": "uri",
191
191
"description": "Publisher's homepage URL."
192
192
},
193
193
"ratingNative": {
194
194
"type": "string",
195
195
"description": "Publisher's verdict text, verbatim (e.g. 'False', 'Mostly False', 'Falsch', 'Pants on Fire')."
196
196
},
197
197
"claimReviewed": {
198
198
"type": "string",
199
199
"maxLength": 2000,
200
200
"description": "The text of the claim as the publisher framed it (may differ slightly from the labeler's extracted claim)."
201
201
},
202
202
"publisherName": {
203
203
"type": "string",
204
204
"maxLength": 200,
205
205
"minLength": 1,
206
206
"description": "Display name of the publisher (e.g. 'Full Fact', 'USA Today')."
207
207
},
208
208
"publisherSite": {
209
209
"type": "string",
210
210
"description": "Bare host of the publisher (e.g. 'fullfact.org', 'usatoday.com'). Lets consumers apply their own publisher allowlist."
211
211
}
212
212
},
213
213
"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."
214
214
}
215
215
},
216
216
"$type": "com.atproto.lexicon.schema",
217
217
"lexicon": 1,
218
218
"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)."
219
219
}