Housecarl
Operational Open the console →
Docs

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_typePick it forReliability anchorRationaleDecay multiplier
RegulatorSupervisory bodies, financial regulators, courts, auditors with attestation liability — anyone with legal authority and access to non-public data0.85–0.95Legal liability for misstatement; supervisory access to non-public records2.5×
InstitutionalA bank, an audited company, an agency speaking with organizational backing — see the conflict-of-interest note below0.85–0.95 as a credible institution; 0.01–0.40 when it's the entity under investigationOrganizational process and reputation at stake; dual-natured when the institution is a party2.0×
ResearcherA research institute or academic researcher publishing methodologically accountable findings0.70–0.90Peer review and methodological accountability; no supervisory access. Pre-registered work sits at the top of the band, unreviewed work at the bottom2.0×
ExpertA named domain specialist giving an individual, deeply informed opinion0.65–0.85Deep knowledge without institutional review; individual perspective1.5×
JournalistSourced reporting with editorial oversight — the document's author is typically this0.65–0.85Editorial verification; timeliness over depth1.0×
AnalystIndustry or financial analysts — rigorous but scoped to their coverage area0.40–0.65Rigour under commercial coverage pressures; scoped mandate1.2×
InsiderA named insider with privileged access, whose information may be stale by the time it's disclosed0.40–0.65Access without verification; disclosure lag1.0×
VendorAn organization making claims about its own products, services, or performance0.20–0.45Direct commercial interest in the claim's acceptance; selection and methodology typically undisclosed0.8×
AnonymousAn unnamed source, tip, or leak with no institutional backing — also the engine's fallback for unrecognised values (see below)0.15–0.40No accountability, no track record0.8×
SocialMediaAn unverified social-media account0.15–0.40No verification; virality-selected content0.7×
TrollA known fabricator or an account with a documented history of falsity0.01–0.15Documented falsity; the omitted-reliability default (0.08) sits below the 0.15 credibility floor, so an unquantified Troll contributes nothing0.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 thinkingUseWhy
AcademicResearcherSame mechanics: methodological accountability
Court, AuditorRegulatorSame mechanics: legal authority, attestation liability
Government agencyRegulator (supervisory/statistical bodies) or Institutional (a ministry with a position)Government spans both bands; pick by role in the dispute
NGO, TradeBodyInstitutional, with base_reliability from the lower band when the claim serves its declared missionAdvocacy interest is a reliability question, not a separate access class
Wire serviceJournalistEditorial oversight is the mechanic
Blog, ForumSocialMedia — or Expert when the author is a named specialistClassify the voice, not the medium
WhistleblowerInsiderPrivileged access, disclosure lag
Litigant, a party to the disputeIts access class (Institutional, Expert, Insider…) with base_reliability set low on the disputed predicatesInterest is per-topic; use per-predicate competence to scope it
PreprintResearcher 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 endpointsPOST /api/v1/sessions (create), PATCH /api/v1/sessions/{id} (update), and POST /api/v1/sessions/{id}/actors (add/replace an actor) all validate source_type before 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 analysisPOST /api/v1/investigations/analyze and the submit_investigation MCP tool do not run that check. There, an unrecognised value degrades to Anonymous and 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:

  1. 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.
  2. 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.
  3. Use per-predicate competence when the source is strong on some topics and weak on others. A competence map of predicate -> 0.0–1.0 multiplies against reliability per predicate, so one actor can be a 0.9 on valuation and a 0.3 on regulatory-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_type and base_reliability interact 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.