# Claims (/v1/docs/claims) 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. The claim model ships inside [`@disclosureos/records`](/docs/records) (the `@disclosureos/records/shared` module) and is reused by [Observables](/docs/observables) and [Origins](/docs/origins). It is the attribution layer that threads through the others — Part 4 of the standard, not a separate package. The [Claims page](/claims) in the Standard Explorer shows how attributed claims, evidence types, and evaluator disagreement fit together. What every claim carries [#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. ```ts 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 [#evidence-references] An evidence reference is a typed string — `:` — 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) | ```ts 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 [#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`](/docs/observables) | an assessment `level` (how strong the evidence is) for one observable | | **Origin Claim** | [`@disclosureos/origins`](/docs/origins) | a `primaryHypothesis` from the OCS taxonomy, with `alternativeHypotheses` | ```ts 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 [#where-claims-live-the-two-slots] The evaluative slots that [Observables](/docs/observables) and [Origins](/docs/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 [#two-axes-of-uncertainty] Inter-claim: evaluators disagree [#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. ```ts // 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](/docs/scoring/compellingness) reads it and sets a `contested` flag when claims disagree in direction — it never averages the dispute away. Intra-claim: one evaluator hedges [#intra-claim-one-evaluator-hedges] A single origin claim can carry a primary hypothesis alongside weighted alternatives — one evaluator expressing their own internal uncertainty: ```ts 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. The record holds facts. Every interpretation is a claim, attributed to whoever made it. Endorsement, weighting, and the `contested` flag belong to [Scoring](/docs/scoring), not to the record itself. Working with claims [#working-with-claims] * [Claiming Observables](/docs/observables/claiming-observables) — the discipline for picking the observable, level, and confidence, and citing evidence. * [Claiming Origins](/docs/origins/claiming-origins) — choosing OCS nodes and expressing alternatives honestly. * [Compellingness](/docs/scoring/compellingness) — how claims and their evidence become a score, and how `contested` is derived. # Overview (/v1/docs/cli) `@disclosureos/cli` is the developer tool for the ecosystem. It's not a library — it wraps the foundation packages so you can work with observations from a terminal: generate templates, validate files, and browse the registries without writing code. Run it [#run-it] No install required: ```bash title="Terminal" npx @disclosureos/cli --help ``` Or add it to a project: npm pnpm yarn bun ```bash npm install -D @disclosureos/cli ``` ```bash pnpm add -D @disclosureos/cli ``` ```bash yarn add --dev @disclosureos/cli ``` ```bash bun add --dev @disclosureos/cli ``` Once installed, the binary is `disclosureos`. Commands [#commands] | Command | Does | | -------------------------------- | -------------------------------------------------------------------------------------------------- | | [`scaffold`](/docs/cli/scaffold) | Generate typed templates — observations, assessment maps, classifications | | [`validate`](/docs/cli/validate) | Validate observation JSON files: core + slots + evidence-ref warnings | | `completeness` | Measure how fully observations populate the schema — percentage, required coverage, missing fields | | [`registry`](/docs/cli/registry) | Introspect the field, observable, and origin registries | | [`info`](/docs/cli/info) | Quick reference for types, observables, and OCS nodes | ```bash title="Terminal" disclosureos scaffold observation --full disclosureos validate ./data/ --recursive disclosureos completeness ./out/ --recursive disclosureos registry origins --id 1.1.3 disclosureos info observable TO-3 ``` Never drifts from the libraries [#never-drifts-from-the-libraries] The CLI doesn't re-implement any checks. `validate` delegates to [`parseEnrichedObservation`](/docs/schema/parsing) from `@disclosureos/schema` — the exact validation pipeline library consumers use — then layers on CLI-only niceties like dangling-evidence-reference warnings. `registry` and `info` read the same exported constants and taxonomies the packages ship. What the CLI tells you is what the code will do. A typical loop [#a-typical-loop] ```bash title="Terminal" # 1. Start from a template disclosureos scaffold observation --out sighting.json # 2. Fill it in (look things up as you go) disclosureos registry observables disclosureos info origin 1.1.1 # 3. Validate — repeat until clean disclosureos validate sighting.json --strict ``` For programmatic use, do the same things with the libraries — see the [golden path](/docs/platform#the-golden-path). Migrating a dataset [#migrating-a-dataset] When converting an existing catalog to observations, the CLI provides two key commands: ```bash title="Terminal" # Validate the output disclosureos validate ./out/ --recursive --json # Measure what's missing disclosureos completeness ./out/ --recursive --json ``` Both accept `--json` for structured output in CI and scripts. See the [onboarding workspace](/onboard) for the full guided workflow. # info (/v1/docs/cli/info) `disclosureos info` is the fast lookup: one type, one observable, or one origin node at a time, with the context you need to use it correctly. Usage [#usage] ```bash title="Terminal" disclosureos info [topic] [id] ``` Topics [#topics] Ecosystem overview [#ecosystem-overview] ```bash title="Terminal" disclosureos info ``` Prints the package map — records, observables, origins, scoring, cli — with live counts (schema fields, observables, OCS nodes) read from the packages themselves. info observation [#info-observation] The `Observation` type at a glance: required fields, the cross-package slots (`observableAssessments`, `origin`), the records-owned extension slots, and the total field-path count. info observable [#info-observable-code] Look up one observable by code or id: ```bash title="Terminal" disclosureos info observable TO-3 disclosureos info observable isotopic_provenance ``` ```text Observable: Hypersonic Velocities Without Signatures Code: TO-3 ID: hypersonic_no_signatures Category: technology Description: Object achieves hypersonic speeds (Mach 5+) without producing sonic boom, heat signature, or plasma sheath… ``` Run it without a code to list all twelve. info origin [#info-origin-nodeid] Look up one OCS node, including its ancestry path and children: ```bash title="Terminal" disclosureos info origin 1.1.2 ``` ```text Origin: Cryptoterrestrial ID: 1.1.2 Domain: physical Testable: Yes Aliases: CTH Path: Physical → Intradimensional → Cryptoterrestrial Children (4): • [1.1.2.1] Ancient / Proto-Human Survival • [1.1.2.2] Breakaway Civilization ... ``` The ancestry path is the quick sanity check when [choosing claim depth](/docs/origins/taxonomy#choosing-the-right-depth) — it shows exactly what you're asserting by claiming a node. info vs registry [#info-vs-registry] * `info` — one thing, in depth, fast. * [`registry`](/docs/cli/registry) — whole inventories: every field, every observable, the full tree. # registry (/v1/docs/cli/registry) `disclosureos registry` answers "what does the standard define?" without opening an editor — the field lexicon, the twelve observables, and the OCS taxonomy, straight from the packages' own exports. Usage [#usage] ```bash title="Terminal" disclosureos registry [options] ``` registry fields [#registry-fields] The observation field inventory, derived from the records JSON Schema (the same `deriveFieldPaths()` that powers [completeness scoring](/docs/scoring/completeness)): ```bash title="Terminal" disclosureos registry fields # every schema-derived field path, grouped by top-level domain disclosureos registry fields --category temporal # one group, as a path/required table ``` registry observables [#registry-observables] All twelve observables with codes, labels, and descriptions: ```bash title="Terminal" disclosureos registry observables disclosureos registry observables --technology # TO-1 … TO-6 only disclosureos registry observables --biologics # BO-1 … BO-6 only ``` ```text Technology Observables (AATIP-derived) TO-1 Anti-Gravity Lift Object appears to overcome gravitational force without conventional propulsion… TO-2 Instantaneous Acceleration … Assessment Levels: not_indicated → reported → documented → measured → confirmed ``` registry origins [#registry-origins] The OCS taxonomy: ```bash title="Terminal" disclosureos registry origins # the full tree: 3 domains, subdomains, and categories disclosureos registry origins --id 1.1.3 # one node in detail: label, domain, depth, testability, aliases, children disclosureos registry origins --testable # only hypotheses with scientificallyTestable: true ``` ```text ID: 1.1.3 Label: Extraterrestrial Domain: physical Testable: Yes Aliases: ETH Children (4): • [1.1.3.1] Solar System • [1.1.3.2] Interstellar • [1.1.3.3] Intergalactic • [1.1.3.4] Unknown Region of Space-Time ``` When to use it [#when-to-use-it] * Writing a data mapping and need the exact field paths → `registry fields` * Deciding which observable a signature falls under → `registry observables` * Choosing the right OCS node and depth for a claim → `registry origins --id` * Scoping which hypotheses your tool should surface as testable → `registry origins --testable` For single-item lookups with ancestry paths, [`info`](/docs/cli/info) is the quicker tool. # scaffold (/v1/docs/cli/scaffold) `disclosureos scaffold` generates ready-to-fill templates for the standard's data structures — as JSON for data files, or as TypeScript with typed factory calls. Usage [#usage] ```bash title="Terminal" disclosureos scaffold