# app.kiesel.facts.claimVerdict

> Published by [facts.kiesel.app](https://lexicon.garden/identity/did:plc:7elfhdwxzvsqib4wmfn3zra7)

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

## Links

- [View on Lexicon Garden](https://lexicon.garden/lexicon/did:plc:7elfhdwxzvsqib4wmfn3zra7/app.kiesel.facts.claimVerdict)
- [Documentation](https://lexicon.garden/lexicon/did:plc:7elfhdwxzvsqib4wmfn3zra7/app.kiesel.facts.claimVerdict/docs)
- [Examples](https://lexicon.garden/lexicon/did:plc:7elfhdwxzvsqib4wmfn3zra7/app.kiesel.facts.claimVerdict/examples)

## Definitions

### `app.kiesel.facts.claimVerdict`

**Type**: `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.

**Key**: `tid`

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `subject` | `ref` → `com.atproto.repo.strongRef` | Yes | 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` | `string` (datetime) | No | 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` | Yes | 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. |
| `evidence` | `array` | Yes | 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` | `string` (at-uri) | No | Optional at-uri of the com.atproto.label record this verdict corresponds to, when the labeler also publishes a signed label. |
| `claimText` | `string` | Yes | The atomic claim extracted from the subject, as the labeler interpreted it. The actual sentence on which the verdict was computed. |
| `rationale` | `string` | No | Short human-readable explanation of how the verdict was reached. Optional but recommended. |
| `confidence` | `integer` | No | 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` | `string` (at-uri) | No | Optional at-uri of an earlier claimVerdict by this labeler on the same subject. When set, signals 'this record replaces the older one'. |
| `verifiedAt` | `string` (datetime) | Yes | When the verdict was computed. |
| `emittedLabel` | `string` | No | 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` | No | How the underlying judgements split. Useful for downstream consumers to apply stricter thresholds than the labeler did. |
| `decontextualizedText` | `string` | No | 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. |

### `app.kiesel.facts.claimVerdict#evidenceItem`

**Type**: `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.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `polarity` | `string` | No | 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. |
| `intakePath` | `string` | No | 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). |
| `attribution` | `string` | No | 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` | No | Reference to an atproto app.kiesel.facts.claimReview record. Set when the cited fact-check is hosted on atproto. |
| `externalSource` | `ref` → `#externalSource` | No | 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). |

### `app.kiesel.facts.claimVerdict#voteBreakdown`

**Type**: `object`

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

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `entail` | `integer` | Yes | Number of evidence items judged to entail the claim. |
| `neutral` | `integer` | Yes | Number of evidence items judged neutral (dropped from aggregation). |
| `contradict` | `integer` | Yes | Number of evidence items judged to contradict the claim. |

### `app.kiesel.facts.claimVerdict#externalSource`

**Type**: `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.

| Property | Type | Required | Description |
|----------|------|----------|-------------|
| `lang` | `string` | No | BCP-47 language tag of the publisher's article. |
| `sourceUrl` | `string` (uri) | Yes | URL of the publisher's fact-check article. |
| `reviewDate` | `string` (datetime) | No | When the publisher published the fact-check. |
| `publisherUrl` | `string` (uri) | No | Publisher's homepage URL. |
| `ratingNative` | `string` | No | Publisher's verdict text, verbatim (e.g. 'False', 'Mostly False', 'Falsch', 'Pants on Fire'). |
| `claimReviewed` | `string` | No | The text of the claim as the publisher framed it (may differ slightly from the labeler's extracted claim). |
| `publisherName` | `string` | Yes | Display name of the publisher (e.g. 'Full Fact', 'USA Today'). |
| `publisherSite` | `string` | No | Bare host of the publisher (e.g. 'fullfact.org', 'usatoday.com'). Lets consumers apply their own publisher allowlist. |

## Raw Schema

```json
{
  "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)."
}
```
