Classification
OriginClaim, hypothesis weights, and confidence distributions
Classification is how an evaluator's judgment about origin attaches to a record. The types model the two axes of disagreement separately: alternatives within one evaluator's claim, and competing claims between evaluators.
OriginClaim
One evaluator's verdict — the shared Claim envelope plus the hypothesis fields:
interface OriginClaim {
primaryHypothesis: string; // OCS node id, e.g. '1.1.3'
confidence: number; // [0, 1] — confidence in the primary
alternativeHypotheses?: HypothesisWeight[]; // also-entertained, weighted
rationale?: string;
evaluatedBy?: string;
evaluatedAt?: string;
evidenceRefs?: string[];
}
interface HypothesisWeight {
nodeId: string; // OCS node id
confidence: number; // [0, 1]
label?: string; // display convenience
}Build with the factory — it asserts every node id exists in the taxonomy and parses confidence ranges:
import { createOriginClaim } from '@disclosureos/origins';
const claim = createOriginClaim('1.1.3', 0.4, {
rationale: 'Performance exceeds known aerospace capability; cannot exclude advanced terrestrial program.',
alternativeHypotheses: [
{ nodeId: '1.1.1.2.1', confidence: 0.25, label: 'Classified U.S. program' },
{ nodeId: '2.2.1', confidence: 0.1, label: 'Misinterpretation' },
],
evidenceRefs: ['sensor:princeton-spy1-radar'],
evaluatedBy: 'example-institution',
});
createOriginClaim('9.9.9', 0.5); // throws: Unknown OCS node IDConfidences within a claim need not sum to 1 — the gap is honest unresolved uncertainty.
The origin slot
A flat array of claims. Push, never replace:
observation.origin = [claimFromInstitutionA, claimFromInstitutionB];Institution A says 1.1.3 at 0.4; Institution B says 2.1.5 (hoax) at 0.7. Both stand, attributed and evidence-linked. Compellingness scoring reads the spread and flags the case contested — which is exactly what a reader should know.
ConfidenceDistribution
For analyses that assign confidence across many hypotheses explicitly, with the remainder tracked:
import { createConfidenceDistribution } from '@disclosureos/origins';
const dist = createConfidenceDistribution([
{ nodeId: '1.1.1.1.2', confidence: 0.5, label: 'Celestial' },
{ nodeId: '1.1.1.2.4', confidence: 0.3, label: 'Private/commercial craft' },
]);
// dist.unresolved === 0.2 — computed, the distribution always accounts for 1.0CategoryConfidence
A simplified eight-bucket distribution for quick, coarse classification — useful for triage UIs and bulk imports before detailed analysis:
interface CategoryConfidence {
conventional: number; // OCS 1.1.1
cryptoterrestrial: number; // OCS 1.1.2
extraterrestrial: number; // OCS 1.1.3
extradimensional: number; // OCS 1.2
interdimensional: number; // OCS 1.3
psychosocial: number; // OCS 2
metaphysical: number; // OCS 3
insufficientData: number; // cannot classify
}insufficientData is a first-class answer. Most honest triage of historical records lands there.
Validation
import { validateOriginClassification, isOriginClaim } from '@disclosureos/origins';
const issues = validateOriginClassification(observation.origin); // ValidationIssue[]For the whole enriched record, use parseEnrichedObservation.