app.kiesel.facts.claimVerdict

facts.kiesel.app

Schema Diff

+3 -3

From

CID
bafyreihrodym3hl...
Indexed At
2026-06-21 05:49 UTC
View this version

To

CID
bafyreihjiuvsiyw...
Indexed At
2026-06-21 05:58 UTC
View this version

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
}

Compare Other Versions

Lexicon Garden

@