{
"id": "app.kiesel.facts.claimVerdict",
"defs": {
"main": {
"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."
},
"evidenceItem": {
"type": "object",
"properties": {
"polarity": {
"type": "string",
"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.",
"knownValues": [
"entail",
"contradict",
"neutral"
]
},
"intakePath": {
"type": "string",
"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).",
"knownValues": [
"self-published",
"bulk-feed",
"factcheck-api"
]
},
"attribution": {
"type": "string",
"maxLength": 500,
"description": "Verbatim attribution string the labeler stores with this evidence. Lets downstream consumers see the publisher + intake provenance per evidence item without inferring it."
},
"claimReview": {
"ref": "com.atproto.repo.strongRef",
"type": "ref",
"description": "Reference to an atproto app.kiesel.facts.claimReview record. Set when the cited fact-check is hosted on atproto."
},
"externalSource": {
"ref": "#externalSource",
"type": "ref",
"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)."
}
},
"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."
},
"voteBreakdown": {
"type": "object",
"required": [
"entail",
"contradict",
"neutral"
],
"properties": {
"entail": {
"type": "integer",
"minimum": 0,
"description": "Number of evidence items judged to entail the claim."
},
"neutral": {
"type": "integer",
"minimum": 0,
"description": "Number of evidence items judged neutral (dropped from aggregation)."
},
"contradict": {
"type": "integer",
"minimum": 0,
"description": "Number of evidence items judged to contradict the claim."
}
},
"description": "Summary of the per-evidence judgements that fed the aggregated verdict."
},
"externalSource": {
"type": "object",
"required": [
"publisherName",
"sourceUrl"
],
"properties": {
"lang": {
"type": "string",
"description": "BCP-47 language tag of the publisher's article."
},
"sourceUrl": {
"type": "string",
"format": "uri",
"description": "URL of the publisher's fact-check article."
},
"reviewDate": {
"type": "string",
"format": "datetime",
"description": "When the publisher published the fact-check."
},
"publisherUrl": {
"type": "string",
"format": "uri",
"description": "Publisher's homepage URL."
},
"ratingNative": {
"type": "string",
"description": "Publisher's verdict text, verbatim (e.g. 'False', 'Mostly False', 'Falsch', 'Pants on Fire')."
},
"claimReviewed": {
"type": "string",
"maxLength": 2000,
"description": "The text of the claim as the publisher framed it (may differ slightly from the labeler's extracted claim)."
},
"publisherName": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Display name of the publisher (e.g. 'Full Fact', 'USA Today')."
},
"publisherSite": {
"type": "string",
"description": "Bare host of the publisher (e.g. 'fullfact.org', 'usatoday.com'). Lets consumers apply their own publisher allowlist."
}
},
"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."
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1,
"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)."
}