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 recording | Use |
|---|---|
| Basic facts of the sighting | The core domains — not extensions |
| Who has held a piece of footage since capture | provenance |
| "This is NICAP case #1961-04" | identifiers |
| A pilot's signed statement | testimony |
| Soil samples, radiation readings | physicalEvidence |
| A declassified memo's archival metadata | documents |
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.