Claims
Attribution — every assessment of a case is an attributed, evidence-backed claim, and disagreement is preserved
Records, Observables, and Origins describe and classify an observation. Claims are how the standard records who said so. Every evaluative statement — "this showed instantaneous acceleration," "this is best explained by an unknown craft" — is a claim: an attributed assertion with a rationale and pointers to the specific evidence that backs it.
Claims aren't a separate package
The claim model ships inside @disclosureos/records (the @disclosureos/records/shared module) and is reused by Observables and Origins. It is the attribution layer that threads through the others — Part 4 of the standard, not a separate package.
Explore it visually
The Claims page in the Standard Explorer shows how attributed claims, evidence types, and evaluator disagreement fit together.
What every claim carries
Every claim, whatever it's about, shares the same structure from @disclosureos/records/shared: an attribution (who evaluated it, when, why) plus the in-record evidence references that justify it.
import { evidenceRef, type Claim } from '@disclosureos/records/shared';
// who / when / why + the evidence that backs the call
{
evaluatedBy: 'Scientific Coalition for UAP Studies',
evaluatedAt: '2026-03-01T00:00:00Z',
rationale: 'Radar tracked descent from ~80,000 ft to sea level in seconds.',
evidenceRefs: [evidenceRef('sensor', 'princeton-spy1-radar')],
}The point of this structure is auditability: a claim without evidenceRefs is an opinion; a claim with them can be traced back to the exact sensor reading, testimony, or document in the record that supports it.
Evidence references
An evidence reference is a typed string — <kind>:<id> — pointing at something that already lives in the record. There are four kinds:
| Kind | Points to |
|---|---|
media | A media attachment (photo, video, audio, document) |
sensor | A sensor reading in the record's sensor evidence |
physical | A physical evidence item (forensic extension) |
testimony | A testimony statement (forensic extension) |
evidenceRef('sensor', 'princeton-spy1-radar'); // → 'sensor:princeton-spy1-radar'The evidence must exist in the record first, with a stable id. The CLI and parseEnrichedObservation warn when a claim cites an evidence reference that doesn't resolve.
The two claim shapes
Two first-party shapes extend that shared structure, one per evaluative layer:
| Shape | Package | Adds on top of the shared structure |
|---|---|---|
| Observable Claim | @disclosureos/observables | an assessment level (how strong the evidence is) for one observable |
| Origin Claim | @disclosureos/origins | a primaryHypothesis from the OCS taxonomy, with alternativeHypotheses |
import { createObservableClaim } from '@disclosureos/observables';
import { createOriginClaim } from '@disclosureos/origins';
const observableClaim = createObservableClaim('measured', {
confidence: 0.7,
rationale: 'Doppler velocity profile shows acceleration inconsistent with known aircraft.',
evidenceRefs: [evidenceRef('sensor', 'princeton-spy1-radar')],
evaluatedBy: 'example-institution',
});
const originClaim = createOriginClaim('1.1.3', 0.4, {
rationale: 'Performance exceeds known aerospace capability.',
alternativeHypotheses: [{ nodeId: '1.1.1.2.1', confidence: 0.25, label: 'Classified program' }],
evidenceRefs: [evidenceRef('sensor', 'princeton-spy1-radar')],
});Where claims live: the two slots
The evaluative slots that Observables and Origins add to an Observation each hold a list of claims, never a single value:
| Slot | Holds | Owner |
|---|---|---|
observableAssessments | ObservableClaim[] per observable id | @disclosureos/observables |
origin | OriginClaim[] | @disclosureos/origins |
Holding lists is deliberate. It lets the record keep two distinct kinds of uncertainty straight.
Two axes of uncertainty
Inter-claim: evaluators disagree
When two institutions assess the same case differently, both claims sit in the slot side by side. Neither overwrites the other.
// instantaneous_acceleration, as assessed by two parties
[
createObservableClaim('measured', {
confidence: 0.85,
rationale: 'Radar tracked descent from ~80,000 ft to sea level in seconds.',
evaluatedBy: 'Navy aviator (firsthand)',
}),
createObservableClaim('not_indicated', {
confidence: 0.6,
rationale: 'Available sensor data judged insufficient to establish the maneuver.',
evaluatedBy: 'AARO (later review)',
}),
]The disagreement is the data. Scoring reads it and sets a contested flag when claims disagree in direction — it never averages the dispute away.
Intra-claim: one evaluator hedges
A single origin claim can carry a primary hypothesis alongside weighted alternatives — one evaluator expressing their own internal uncertainty:
createOriginClaim('1.1.3', 0.4, {
rationale: 'Best fit given the kinematics, but data is incomplete.',
alternativeHypotheses: [{ nodeId: '1.1.1.2.1', confidence: 0.25, label: 'Classified program' }],
});These two axes are kept distinct on purpose: a list of claims is disagreement between evaluators; primaryHypothesis + alternativeHypotheses is one evaluator's own hedging.
Opinion lives in claims and scoring — never in the bare record
The record holds facts. Every interpretation is a claim, attributed to whoever made it. Endorsement, weighting, and the contested flag belong to Scoring, not to the record itself.
Working with claims
- Claiming Observables — the discipline for picking the observable, level, and confidence, and citing evidence.
- Claiming Origins — choosing OCS nodes and expressing alternatives honestly.
- Compellingness — how claims and their evidence become a score, and how
contestedis derived.