app.kiesel.facts.claimVerdict

facts.kiesel.app

Documentation

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.

main record

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.

Record Key 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 graphemes
confidence 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: 1000
decontextualizedText 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 graphemes
emittedLabel 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 items
labelUri 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 graphemes
subject 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.

Known values: supported, refuted, disputed, mixed, outdated, unknown
verifiedAt 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."
}
evidenceItem object

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.

Properties

attribution string Optional

Verbatim attribution string the labeler stores with this evidence. Lets downstream consumers see the publisher + intake provenance per evidence item without inferring it.

maxLength: 500 bytes
claimReview ref com.atproto.repo.strongRef Optional

Reference to an atproto app.kiesel.facts.claimReview record. Set when the cited fact-check is hosted on atproto.

externalSource ref #externalSource Optional

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).

intakePath string Optional

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).

Known values: self-published, bulk-feed, factcheck-api
polarity string Optional

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.

Known values: entail, contradict, neutral
View raw schema
{
  "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."
}
externalSource object

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.

Properties

claimReviewed string Optional

The text of the claim as the publisher framed it (may differ slightly from the labeler's extracted claim).

maxLength: 2000 bytes
lang string Optional

BCP-47 language tag of the publisher's article.

publisherName string Required

Display name of the publisher (e.g. 'Full Fact', 'USA Today').

maxLength: 200 bytesminLength: 1 bytes
publisherSite string Optional

Bare host of the publisher (e.g. 'fullfact.org', 'usatoday.com'). Lets consumers apply their own publisher allowlist.

publisherUrl string uri Optional

Publisher's homepage URL.

ratingNative string Optional

Publisher's verdict text, verbatim (e.g. 'False', 'Mostly False', 'Falsch', 'Pants on Fire').

reviewDate string datetime Optional

When the publisher published the fact-check.

sourceUrl string uri Required

URL of the publisher's fact-check article.

View raw schema
{
  "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."
}
voteBreakdown object

Summary of the per-evidence judgements that fed the aggregated verdict.

Properties

contradict integer Required

Number of evidence items judged to contradict the claim.

minimum: 0
entail integer Required

Number of evidence items judged to entail the claim.

minimum: 0
neutral integer Required

Number of evidence items judged neutral (dropped from aggregation).

minimum: 0
View raw schema
{
  "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."
}

Lexicon Garden

@