An official website of the Disclosure Foundation

Introduction

Overview

Modules

ObservationShared PrimitivesExtension SlotsCompanions

Guides

Composing an ObservationValidating at Boundaries

Extension Slots

Provenance, identifiers, testimony, physical evidence, and documents — the forensic surfaces

Five optional forensic and clerical surfaces ship inside @disclosureos/records. They're plain optional fields on Observation, with their schemas exposed subpath-only to keep the core barrel lean:

import { ProvenanceSchema } from '@disclosureos/records/extensions/provenance';
import { CrossReferencesSchema } from '@disclosureos/records/extensions/identifiers';
import { TestimonyStatementSchema } from '@disclosureos/records/extensions/testimony';
import { PhysicalEvidenceItemSchema } from '@disclosureos/records/extensions/physical';
import { DocumentMetadataSchema } from '@disclosureos/records/extensions/document';

These are records-owned slots — part of ObservationSchema, validated by validateObservation. (Cross-package slots like observableAssessments attach through module augmentation instead.)

provenance — chain of custody and digital integrity

Where evidence came from and whether it has been altered:

  • Chain of custody — ordered custody entries: who held the material, when, and what action they took
  • Digital provenance — file hashes (FileHash, with algorithm), capture metadata, third-party verification results

Use it when the integrity of media or documents is itself part of the case — FOIA productions, leaked footage, archival scans.

identifiers — cross-references

External identifiers tying the record to other catalogs: case numbers in legacy databases, archive accession numbers, FOIA request ids. This is how the same event is recognized across NICAP, Blue Book, NUFORC, and modern datasets without merging records prematurely.

testimony — witness statements

An array of TestimonyStatement items: the statement text, the witness (with category and credibility assessment), when and to whom it was given. Each statement has a statementId — which makes it citable evidence:

import { evidenceRef } from '@disclosureos/records/shared';

const ref = evidenceRef('testimony', statement.statementId); // "testimony:<id>"

physicalEvidence — material traces

An array of PhysicalEvidenceItem: trace material, ground effects, recovered objects — each with type, custody status, analysis results, and an evidence-quality assessment. Items carry an id, so claims can cite them with evidenceRef('physical', item.id).

documents — document metadata

Structured metadata for primary documents attached to a record: title, author, classification history, release authority, page count. Pairs with media attachments holding the files themselves.

When to reach for extensions

You're recordingUse
Basic facts of the sightingThe core domains — not extensions
Who has held a piece of footage since captureprovenance
"This is NICAP case #1961-04"identifiers
A pilot's signed statementtestimony
Soil samples, radiation readingsphysicalEvidence
A declassified memo's archival metadatadocuments

The extensions are deliberately off the hot path: most records won't have them, and tools can ignore them safely. But when an observable claim needs to cite a witness statement or a lab analysis, these slots make that evidence addressable.

Shared Primitives

Confidence, Attribution, Claim, evidence refs, and validation helpers — the primitives every part reuses

Companions

Constants, guards, factories, formatters, and labels for the record lexicon

On this page

provenance — chain of custody and digital integrity
identifiers — cross-references
testimony — witness statements
physicalEvidence — material traces
documents — document metadata
When to reach for extensions