Model-first Mission Data Fabric for small spacecraft
Define telemetry, commands, events, faults, modes, packets, payload contracts, data products and operational scenarios once.
Validate them, document them, and execute deterministic mission scenarios from the same source of truth.
OrbitFabric is a model-first Mission Data Fabric for small spacecraft.
It lets teams define mission data contracts once, using a structured Mission Model, and then reuse that contract across validation, documentation, testing, simulation and future onboard/ground integration artifacts.
OrbitFabric is not a flight software framework, not a ground segment, and not a spacecraft dynamics simulator.
It is the contract layer between:
mission design
onboard software
simulation
testing
documentation
ground integration
Define once. Validate. Simulate. Test. Document. Integrate.
OrbitFabric is currently at v0.3.0 — Data Product and Storage Contracts.
The current repository includes:
- the
v0.2.1 — Payload Contract Modelvertical slice; - the
v0.2.3 — Mission Data Chain Roadmap Alignmentdirection; - the
v0.3.0 — Data Product and Storage Contractsvertical slice.
The current vertical slice is functional:
- Mission Model YAML loading;
- optional
payloads.yamlloading; - optional
data_products.yamlloading; - structural validation;
- semantic linting;
- engineering lint rules;
- payload contract lint rules;
- data product contract lint rules;
- JSON lint report generation;
- generated Markdown documentation;
- generated payload contract documentation;
- generated data product contract documentation;
- scenario YAML loading;
- scenario reference validation;
- deterministic scenario execution;
- minimal payload lifecycle simulation;
- simulation JSON report generation;
- simulation plain-text log generation;
- synthetic demo mission:
demo-3u.
Current verified baseline:
ruff check .
-> passing
pytest
-> passing
mkdocs build --strict
-> passing
OrbitFabric is a Mission Data Contract framework.
It models:
- telemetry;
- commands;
- events;
- faults;
- operational modes;
- packets;
- scenarios;
- persistence and downlink policies;
- optional Payload / IOD Payload Contracts;
- optional Data Product and Storage Contracts.
A payload contract describes mission-specific or IOD payload behavior as a declarative contract. It may reference:
- telemetry produced by the payload;
- commands accepted by the payload;
- events generated by payload activity;
- possible payload faults;
- lifecycle states;
- command preconditions;
- expected effects;
- generated payload documentation.
A data product contract describes a mission-data object produced by a payload or subsystem. It may define:
- producer reference;
- product type;
- estimated size;
- priority;
- storage intent;
- retention intent;
- overflow policy;
- downlink intent;
- generated data product documentation.
Payload and Data Product Contracts are part of the Mission Data Contract. They do not describe payload firmware, payload drivers, hardware buses, onboard services, physical payload simulation, real storage execution or real downlink runtime behavior.
From that model, OrbitFabric currently provides:
Mission Model YAML
-> structural validation
-> semantic lint
-> JSON lint report
-> generated Markdown docs
-> scenario validation
-> scenario loading
-> deterministic scenario execution
-> simulation JSON report
-> simulation log file
Optional Payload Contract Model
-> payload reference validation
-> payload lifecycle validation
-> payload documentation generation
-> payload-aware scenario behavior
Optional Data Product Contract Model
-> producer reference validation
-> storage intent validation
-> downlink intent validation
-> data product documentation generation
OrbitFabric is not:
- a flight-ready onboard runtime;
- a replacement for cFS or F Prime;
- a replacement for Yamcs or OpenC3;
- a spacecraft physics simulator;
- a Basilisk alternative;
- a CCSDS/PUS/CFDP implementation;
- a hardware abstraction layer;
- a CubeSat tutorial;
- a ground segment;
- a payload firmware framework;
- a payload driver framework;
- a payload physical simulator;
- a payload data processing pipeline;
- an onboard storage runtime;
- a downlink runtime.
Those may become future integration targets or generated artifacts, but they are not part of the current development preview.
The repository includes a synthetic clean-room demo mission:
examples/demo-3u/
├── mission/
│ ├── spacecraft.yaml
│ ├── subsystems.yaml
│ ├── modes.yaml
│ ├── telemetry.yaml
│ ├── commands.yaml
│ ├── events.yaml
│ ├── faults.yaml
│ ├── packets.yaml
│ ├── policies.yaml
│ ├── payloads.yaml
│ └── data_products.yaml
└── scenarios/
└── battery_low_during_payload.yaml
The demo includes a synthetic IOD payload contract:
demo_iod_payload
subsystem: payload
profile: iod
lifecycle: READY -> ACQUIRING -> READY
The demo also includes one synthetic payload data product:
payload.radiation_histogram
producer: demo_iod_payload
type: histogram
estimated size: 4096 bytes
storage: science, retention 7d, drop_oldest
downlink: next_available_contact
This demonstrates the relationship:
Payload Contract
-> Data Product Contract
-> Storage Intent
-> Downlink Intent
The demo contains:
- OBC mock;
- EPS mock;
- Payload mock;
- Radio mock;
- modes:
BOOT,NOMINAL,PAYLOAD_ACTIVE,DEGRADED,SAFE,MAINTENANCE; - one executable scenario:
battery_low_during_payload.
The scenario demonstrates:
payload.start_acquisition
→ payload.acquisition_started
→ NOMINAL → PAYLOAD_ACTIVE
→ battery voltage degradation
→ eps.battery_low
→ PAYLOAD_ACTIVE → DEGRADED
→ payload.stop_acquisition automatically dispatched
→ payload.acquisition_stopped
→ payload.acquisition.active = false
→ SCENARIO PASSED
Create and activate a Python virtual environment:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e ".[dev]"Verify the CLI:
orbitfabric --version
orbitfabric --helpExpected:
orbitfabric 0.3.0
Run semantic mission linting:
orbitfabric lint examples/demo-3u/mission/Generate a machine-readable lint report:
orbitfabric lint examples/demo-3u/mission/ \
--json generated/reports/lint_report.jsonExpected result:
Result: PASSED
Generated artifact:
generated/reports/lint_report.json
Generate Markdown documentation from the Mission Model:
orbitfabric gen docs examples/demo-3u/mission/Generated files:
generated/docs/
├── telemetry.md
├── commands.md
├── events.md
├── faults.md
├── modes.md
├── packets.md
├── payloads.md
└── data_products.md
These files are generated from the validated Mission Model. Do not edit them manually.
Run the demo scenario:
orbitfabric sim examples/demo-3u/scenarios/battery_low_during_payload.yamlGenerate both a JSON report and a plain-text timeline log:
orbitfabric sim examples/demo-3u/scenarios/battery_low_during_payload.yaml \
--json generated/reports/battery_low_during_payload_report.json \
--log generated/logs/battery_low_during_payload.logExpected result:
Result: PASSED
Example timeline excerpt:
[00:00] MODE=NOMINAL
[00:05] COMMAND payload.start_acquisition -> ACCEPTED
[00:05] EVENT payload.acquisition_started severity=INFO
[00:05] MODE TRANSITION NOMINAL -> PAYLOAD_ACTIVE reason=payload.acquisition_started
[00:30] INJECT eps.battery.voltage=6.7
[00:31] INJECT eps.battery.voltage=6.7
[00:32] INJECT eps.battery.voltage=6.7
[00:32] EVENT eps.battery_low severity=WARNING
[00:32] MODE TRANSITION PAYLOAD_ACTIVE -> DEGRADED reason=eps.battery_low_fault
[00:32] COMMAND payload.stop_acquisition -> AUTO_DISPATCHED
[00:32] EVENT payload.acquisition_stopped severity=INFO
[00:40] SCENARIO PASSED
Generated artifacts:
generated/reports/battery_low_during_payload_report.json
generated/logs/battery_low_during_payload.log
ruff check .
pytest
mkdocs build --strictCurrent expected baseline:
ruff check . -> All checks passed
pytest -> passing
mkdocs build --strict -> passing
The current vertical slice can produce:
generated/
├── docs/
│ ├── telemetry.md
│ ├── commands.md
│ ├── events.md
│ ├── faults.md
│ ├── modes.md
│ ├── packets.md
│ ├── payloads.md
│ └── data_products.md
├── reports/
│ ├── lint_report.json
│ └── battery_low_during_payload_report.json
└── logs/
└── battery_low_during_payload.log
Generated artifacts are reproducible outputs. They are not the source of truth.
The source of truth remains:
examples/demo-3u/mission/*.yaml
examples/demo-3u/mission/payloads.yaml
examples/demo-3u/mission/data_products.yaml
examples/demo-3u/scenarios/*.yaml
orbitfabric/
├── assets/
│ └── brand/
│ ├── orbitfabric-icon.png
│ ├── orbitfabric-logo-horizontal-light.png
│ ├── orbitfabric-logo-horizontal-dark.png
│ └── orbitfabric-social-preview.png
├── docs/
├── examples/
│ └── demo-3u/
├── src/
│ └── orbitfabric/
├── tests/
└── generated/
Published documentation is available at:
https://farotech.github.io/orbitfabric/
Project documentation lives under:
docs/
Useful entry points:
docs/PROJECT_CHARTER.mddocs/CLEAN_ROOM_POLICY.mddocs/ARCHITECTURE.mddocs/ROADMAP.mddocs/DEVELOPMENT.mddocs/reference/mission-model-v0.1.mddocs/reference/payload-contract-model.mddocs/reference/data-product-contract-model.mddocs/adr/
Build the documentation site locally:
mkdocs build --strictPreview locally:
mkdocs serveOrbitFabric is developed as a clean-room open-source project.
Do not add:
- proprietary mission data;
- private architectures;
- private protocols;
- real operational logs;
- non-public payload details;
- real bus maps;
- real pinouts;
- employer/customer-owned code;
- NDA-protected material.
All examples must be synthetic or based on public information.
See:
docs/CLEAN_ROOM_POLICY.md
Contributions should stay aligned with the Mission Data Contract architecture.
Before contributing, read:
CONTRIBUTING.md
Required local checks:
ruff check .
pytest
mkdocs build --strictAlso verify the demo vertical slice:
orbitfabric lint examples/demo-3u/mission/ \
--json generated/reports/lint_report.json
orbitfabric gen docs examples/demo-3u/mission/
orbitfabric sim examples/demo-3u/scenarios/battery_low_during_payload.yaml \
--json generated/reports/battery_low_during_payload_report.json \
--log generated/logs/battery_low_during_payload.logOrbitFabric is licensed under the Apache License 2.0.
See:
LICENSE
