Source types & reliability rubric
source_type classifies an actor and sets two things: its default credibility band and how fast its claims lose weight over time. The set is closed — eleven values, matched case-insensitively ("expert" and "Expert" are the same). See Modeling a source that isn't in the list if none of these fit.
This table is also Arbiter's source-reliability rubric: every anchor band carries a stated rationale, so a base_reliability derived from it traces to a published, versioned rule rather than a judgement call.
Rubric version 1.0 — 2026-08-05. Changes to bands, rationale, or decay multipliers bump this version.
The eleven values
source_type | Pick it for | Reliability anchor | Rationale | Decay multiplier |
|---|---|---|---|---|
Regulator | Supervisory bodies, financial regulators, courts, auditors with attestation liability — anyone with legal authority and access to non-public data | 0.85–0.95 | Legal liability for misstatement; supervisory access to non-public records | 2.5× |
Institutional | A bank, an audited company, an agency speaking with organizational backing — see the conflict-of-interest note below | 0.85–0.95 as a credible institution; 0.01–0.40 when it's the entity under investigation | Organizational process and reputation at stake; dual-natured when the institution is a party | 2.0× |
Researcher | A research institute or academic researcher publishing methodologically accountable findings | 0.70–0.90 | Peer review and methodological accountability; no supervisory access. Pre-registered work sits at the top of the band, unreviewed work at the bottom | 2.0× |
Expert | A named domain specialist giving an individual, deeply informed opinion | 0.65–0.85 | Deep knowledge without institutional review; individual perspective | 1.5× |
Journalist | Sourced reporting with editorial oversight — the document's author is typically this | 0.65–0.85 | Editorial verification; timeliness over depth | 1.0× |
Analyst | Industry or financial analysts — rigorous but scoped to their coverage area | 0.40–0.65 | Rigour under commercial coverage pressures; scoped mandate | 1.2× |
Insider | A named insider with privileged access, whose information may be stale by the time it's disclosed | 0.40–0.65 | Access without verification; disclosure lag | 1.0× |
Vendor | An organization making claims about its own products, services, or performance | 0.20–0.45 | Direct commercial interest in the claim's acceptance; selection and methodology typically undisclosed | 0.8× |
Anonymous | An unnamed source, tip, or leak with no institutional backing — also the engine's fallback for unrecognised values (see below) | 0.15–0.40 | No accountability, no track record | 0.8× |
SocialMedia | An unverified social-media account | 0.15–0.40 | No verification; virality-selected content | 0.7× |
Troll | A known fabricator or an account with a documented history of falsity | 0.01–0.15 | Documented falsity; the omitted-reliability default (0.08) sits below the 0.15 credibility floor, so an unquantified Troll contributes nothing | 0.5× |
The reliability anchors are the extraction prompt's bands for base_reliability (0.01–0.99) — a starting point, not a hard limit. An exceptionally well-established Expert can reasonably sit above 0.85; set base_reliability explicitly rather than relying on the class default whenever your prior differs from the anchor.
When base_reliability is omitted, the class anchor's midpoint applies: Regulator/Institutional 0.90, Researcher 0.80, Expert/Journalist 0.75, Analyst/Insider 0.55, Vendor 0.35, Anonymous/SocialMedia 0.30, Troll 0.08. The class genuinely drives the default — an unquantified Regulator and an unquantified Troll do not score alike.
Institutional is dual-natured, deliberately. The same class covers an institution acting as a credible outside source and an institution that is itself the subject of the investigation. When it's the latter, reduce reliability for the predicates in dispute — the conflict of interest is the whole point of tracking it. Use the lower band, down to 0.01 for a party with a documented pattern of misrepresentation on the topic at hand. For the specific case of an organization promoting its own products or performance, use Vendor instead: it carries the interested-party band by default, with no manual override needed.
The decay multiplier scales how long a claim's evidence weight holds up: effective_half_life = domain_half_life × claim_type_multiplier × source_authority_multiplier × epistemic_status_multiplier. A Regulator finding decays 2.5× slower than the domain default; a Troll claim decays at half the domain default. See How it works for the full formula and the domain/claim-type tables.
Mapping sources that suggest other labels
These are the natural guesses that are not in the set, and where each belongs:
| You're thinking | Use | Why |
|---|---|---|
Academic | Researcher | Same mechanics: methodological accountability |
Court, Auditor | Regulator | Same mechanics: legal authority, attestation liability |
Government agency | Regulator (supervisory/statistical bodies) or Institutional (a ministry with a position) | Government spans both bands; pick by role in the dispute |
NGO, TradeBody | Institutional, with base_reliability from the lower band when the claim serves its declared mission | Advocacy interest is a reliability question, not a separate access class |
Wire service | Journalist | Editorial oversight is the mechanic |
Blog, Forum | SocialMedia — or Expert when the author is a named specialist | Classify the voice, not the medium |
Whistleblower | Insider | Privileged access, disclosure lag |
Litigant, a party to the dispute | Its access class (Institutional, Expert, Insider…) with base_reliability set low on the disputed predicates | Interest is per-topic; use per-predicate competence to scope it |
Preprint | Researcher for the actor; the preprint status belongs on the claim as epistemic_status: "hypothesis" | Review status is a claim property, not an actor class |
What happens on an invalid value
It depends on which surface you're writing through:
- Session endpoints —
POST /api/v1/sessions(create),PATCH /api/v1/sessions/{id}(update), andPOST /api/v1/sessions/{id}/actors(add/replace an actor) all validatesource_typebefore anything is stored. An unrecognised value returns HTTP 400 with an error naming the full legal set, so you can fix it before the session is ever written. - One-shot analysis —
POST /api/v1/investigations/analyzeand thesubmit_investigationMCP tool do not run that check. There, an unrecognised value degrades toAnonymousand a warning is added to the result. This is not a legacy-data special case on this path — it is the only source-of-truth guard for a one-shot call, because there is no stored payload to validate ahead of time.
Either way, the fallback lands on Anonymous and never anything higher: Anonymous is the lowest-trust variant, so a typo can only ever cost a source credibility, never grant it. A misspelled source_type degrades a claim's standing; it can never inflate a verdict.
Modeling a source that isn't in the list
The honest answer: you cannot add a twelfth source_type. The enum is closed — extending it means a new rubric row with a defensible reliability band, a rationale, and a decay multiplier, which is a code change and a rubric version bump, not a payload change. The workaround uses the fields the engine already gives you to express a prior that doesn't match any of the eleven defaults:
- Pick the closest of the eleven variants. Don't force-fit to whichever sounds most flattering — pick on the mechanics (does this source have institutional backing? individual expertise? privileged access? an interest in the outcome?), not the label. The mapping table above covers the common near-misses.
- Override
base_reliability(0.01–0.99) directly. This is your specific prior on this source, and it overrides the class default — the anchor table above is a starting point the class implies, not a ceiling or floor you're bound to. - Use per-predicate
competencewhen the source is strong on some topics and weak on others. Acompetencemap ofpredicate -> 0.0–1.0multiplies against reliability per predicate, so one actor can be a 0.9 onvaluationand a 0.3 onregulatory-risk.
Worked example. A source described as "Research Institute" is Researcher:
{
"id": "research-institute",
"name": "Fraunhofer-style Research Institute",
"source_type": "Researcher",
"base_reliability": 0.8,
"competence": { "materials-science": 0.9, "market-forecasting": 0.4 }
}
Researcher fits the methodological-accountability shape; base_reliability: 0.8 states your actual prior (here it happens to match the class default); competence says the institute is strong on its actual research domain and weaker outside it. Expert is the other reasonable fit if the claim is really one named researcher's individual assessment rather than the institute speaking with its organizational weight.
See also
- Extract claims from any text — the full actor/claim extraction workflow, including how
source_typeandbase_reliabilityinteract with the rest of a payload. - How it works — the temporal decay formula and a worked investigation.
- Connect your tool — REST and MCP reference, including the full OpenAPI spec.