ADR-0008 — Data Product and Storage Contracts¶
Status: Accepted
Date: 2026-05-01
Context¶
OrbitFabric is a model-first Mission Data Contract framework for small spacecraft.
The Payload / IOD Payload Contract Model introduced a first-class way to describe mission-specific payload behavior as a declarative contract.
That model can describe payload telemetry, commands, events, faults, lifecycle states, preconditions and expected effects.
However, a payload does not only expose telemetry or accept commands.
In many small spacecraft and IOD missions, a payload produces mission data objects that must be preserved, prioritized and eventually delivered to the ground.
Examples include:
image frames
radiation histograms
science sample batches
AIS capture windows
IoT receiver bursts
diagnostic dumps
compressed payload products
These objects are not the same as telemetry fields.
They are also not the same as packets.
OrbitFabric needs a contract-level way to describe them before runtime skeletons, downlink models or ground integration artifacts are generated.
Decision¶
OrbitFabric introduces Data Product and Storage Contracts as the next model-first slice after Payload Contracts.
A data product is a declared mission-data object produced by a payload or subsystem.
A data product contract may describe:
data product identity
producer reference
producer type
optional payload reference
product type
estimated size
priority
storage class
retention intent
overflow policy
downlink intent
Storage and downlink fields represent declared intent.
They do not represent real storage implementation, file-system behavior, compression, contact-window simulation or downlink runtime behavior.
The first implementation slice is intentionally narrow and is introduced as an optional model domain:
mission/data_products.yaml
Terminology¶
OrbitFabric must keep these concepts distinct.
Telemetry
A state, measurement or status value exposed by the Mission Model.
Packet
A declared grouping or transport-oriented representation of mission data.
Data Product
A mission or payload output object that may require storage, retention,
prioritization and eventual downlink.
This distinction is essential.
A payload may produce telemetry such as payload.acquisition.active while also producing a data product such as payload.radiation_histogram.
The telemetry describes operational state.
The data product describes a mission output object.
Minimal Shape¶
The first data product slice uses a shape similar to:
data_products:
- id: payload.radiation_histogram
producer: demo_iod_payload
producer_type: payload
type: histogram
estimated_size_bytes: 4096
priority: high
storage:
class: science
retention: 7d
overflow_policy: drop_oldest
downlink:
policy: next_available_contact
This is implemented in v0.3.0, but it is not a frozen v1.0 schema.
Initial Scope¶
The first vertical slice includes:
optional data_products.yaml loading
typed DataProductContract model
producer reference validation
optional payload reference validation
estimated size validation
priority validation
storage intent fields
downlink intent fields
semantic lint rules
generated data product documentation
invalid fixtures and tests
one synthetic demo data product
The slice proves this relationship:
Payload Contract
-> Data Product Contract
-> Storage Intent
-> Downlink Intent
Non-Goals¶
This decision must not introduce:
real onboard storage runtime
file-system abstraction
compression engine
payload data processing pipeline
contact window model
RF link model
downlink runtime
ground segment export
runtime skeleton generation
real payload data
private mission-specific data products
These are not missing pieces of the first data product slice.
They are intentionally outside the scope of this ADR.
Contact windows and downlink flow contracts belong to a later milestone.
Runtime skeletons and ground integration artifacts must remain deferred until the contract is mature.
Linting Direction¶
Data Product and Storage Contracts are lintable from the beginning.
Implemented lint direction includes:
ERROR: data product references an unknown producer.
ERROR: data product references an unknown payload contract.
WARNING: retained data product has no retention policy.
WARNING: retained data product has no overflow policy.
WARNING: high-priority data product has no downlink intent.
Structural validation covers duplicate IDs, positive estimated size and known literal values.
The principle is fixed:
If a data product can become operationally ambiguous, the ambiguity must be visible before runtime or ground artifacts are generated.
Documentation Direction¶
Generated documentation exposes data products from the validated Mission Model.
The generated file is:
generated/docs/data_products.md
The generated page makes clear that storage and downlink fields are contract intent, not executable runtime behavior.
Consequences¶
This decision extends OrbitFabric from payload behavior modeling toward mission data chain modeling.
It makes the first post-payload step explicit:
payload behavior
-> data product produced
-> storage intent declared
-> downlink intent declared
This strengthens future milestones.
Runtime skeletons will eventually be able to include data product identifiers and storage/downlink policy enumerations.
Ground artifacts will eventually be able to export not only telemetry and command dictionaries, but also data product dictionaries and downlink policy information.
Acceptance Criteria for This Decision¶
This ADR is satisfied when:
- the scope of Data Product and Storage Contracts is documented;
- data products are clearly distinguished from telemetry and packets;
- storage and downlink fields are described as intent, not implementation;
- non-goals are explicit;
- the public documentation exposes the contract scope;
- implementation is covered by model loading, lint rules, invalid fixtures, generated documentation and one synthetic demo data product.
Final Position¶
OrbitFabric should not jump from payload contracts directly to runtime generation.
The next correct step is to model the mission data objects produced by payloads and subsystems, together with their storage and downlink intent.
That is the first concrete layer of the Mission Data Chain.