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.
tid
Timestamp-based ID
Properties
claimText
string
Required
The atomic claim extracted from the subject, as the labeler interpreted it. The actual sentence on which the verdict was computed.
maxLength: 2000 bytesminLength: 1 bytesmaxGraphemes: 700 graphemesconfidence
integer
Optional
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.
minimum: 0maximum: 1000decontextualizedText
string
Optional
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.
maxLength: 2000 bytesmaxGraphemes: 700 graphemesemittedLabel
string
Optional
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.
evidence
array
of
ref
#evidenceItem
Required
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.
maxLength: 20 itemsminLength: 1 itemslabelUri
string
at-uri
Optional
Optional at-uri of the com.atproto.label record this verdict corresponds to, when the labeler also publishes a signed label.
rationale
string
Optional
Short human-readable explanation of how the verdict was reached. Optional but recommended.
maxLength: 1000 bytesmaxGraphemes: 350 graphemessubject
ref
com.atproto.repo.strongRef
Required
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.
supersedes
string
at-uri
Optional
Optional at-uri of an earlier claimVerdict by this labeler on the same subject. When set, signals 'this record replaces the older one'.
validAt
string
datetime
Optional
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.
verdict
string
Required
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.
supported, refuted, disputed, mixed, outdated, unknownverifiedAt
string
datetime
Required
When the verdict was computed.
voteBreakdown
ref
#voteBreakdown
Optional
How the underlying judgements split. Useful for downstream consumers to apply stricter thresholds than the labeler did.
View raw schema
{
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"subject",
"claimText",
"verdict",
"evidence",
"verifiedAt"
],
"properties": {
"subject": {
"ref": "com.atproto.repo.strongRef",
"type": "ref",
"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."
},
"validAt": {
"type": "string",
"format": "datetime",
"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."
},
"verdict": {
"type": "string",
"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.",
"knownValues": [
"supported",
"refuted",
"disputed",
"mixed",
"outdated",
"unknown"
]
},
"evidence": {
"type": "array",
"items": {
"ref": "#evidenceItem",
"type": "ref"
},
"maxLength": 20,
"minLength": 1,
"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."
},
"labelUri": {
"type": "string",
"format": "at-uri",
"description": "Optional at-uri of the com.atproto.label record this verdict corresponds to, when the labeler also publishes a signed label."
},
"claimText": {
"type": "string",
"maxLength": 2000,
"minLength": 1,
"description": "The atomic claim extracted from the subject, as the labeler interpreted it. The actual sentence on which the verdict was computed.",
"maxGraphemes": 700
},
"rationale": {
"type": "string",
"maxLength": 1000,
"description": "Short human-readable explanation of how the verdict was reached. Optional but recommended.",
"maxGraphemes": 350
},
"confidence": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"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."
},
"supersedes": {
"type": "string",
"format": "at-uri",
"description": "Optional at-uri of an earlier claimVerdict by this labeler on the same subject. When set, signals 'this record replaces the older one'."
},
"verifiedAt": {
"type": "string",
"format": "datetime",
"description": "When the verdict was computed."
},
"emittedLabel": {
"type": "string",
"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."
},
"voteBreakdown": {
"ref": "#voteBreakdown",
"type": "ref",
"description": "How the underlying judgements split. Useful for downstream consumers to apply stricter thresholds than the labeler did."
},
"decontextualizedText": {
"type": "string",
"maxLength": 2000,
"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.",
"maxGraphemes": 700
}
}
},
"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."
}