Skip to content

ADR-0009 — Contact Windows and Downlink Flow Contracts

Status: Accepted
Date: 2026-05-04


Context

OrbitFabric is a model-first Mission Data Contract framework for small spacecraft.

The Data Product and Storage Contract Model introduced a contract-level way to describe mission data objects, their producers, estimated size, priority, storage intent, retention intent, overflow policy and downlink intent.

That slice intentionally stopped before contact windows and downlink flow modeling.

However, a data product with downlink intent is still incomplete unless the mission contract can also express the assumptions used to reason about delivery to the ground.

OrbitFabric therefore needs a narrow contract-level model for:

Data Product Contract
        -> Storage Intent
        -> Downlink Intent
        -> Contact Window Assumptions
        -> Downlink Flow Contract

This is a Mission Data Contract concern.

It is not a ground segment concern, not an orbit propagation concern, not an RF simulation concern and not a downlink runtime concern.


Decision

OrbitFabric will introduce Contact Windows and Downlink Flow Contracts as the next Mission Data Chain slice.

The model will describe declared assumptions about contacts, links and downlink flows so that OrbitFabric can reason about consistency before runtime skeletons, ground integration artifacts or end-to-end mission data flow evidence are introduced.

The first implementation slice should be optional and narrow.

The preferred model entry point is:

mission/contacts.yaml

The model may contain:

contact profiles
link profiles
contact windows
downlink flow contracts
declared downlink capacity assumptions
data product downlink eligibility

These concepts are declarative.

They do not execute contacts, schedule passes, propagate orbits, model RF behavior, transmit data or integrate with live ground systems.


Terminology

OrbitFabric must keep these concepts distinct.

Contact Profile
    A declared abstract target or class of contact used by the mission contract.

Link Profile
    A declared abstract link assumption used for downlink reasoning.

Contact Window
    A declared availability window or assumed opportunity for contact.

Downlink Flow Contract
    A declared policy describing how eligible data products are intended to be downlinked.

Declared Capacity
    A contract-level capacity assumption used for linting and documentation.

A contact window is not an orbit pass computed by OrbitFabric.

A link profile is not an RF link budget.

A downlink flow contract is not a runtime queue implementation.


Minimal Shape

The first slice should use a shape similar to:

contacts:
  contact_profiles:
    - id: primary_ground_contact
      target: synthetic_ground_station
      description: Synthetic primary ground contact used by the demo mission.

  link_profiles:
    - id: uhf_downlink_nominal
      direction: downlink
      assumed_rate_bps: 9600
      description: Abstract nominal downlink assumption.

  contact_windows:
    - id: demo_contact_001
      contact_profile: primary_ground_contact
      link_profile: uhf_downlink_nominal
      start: "2026-01-01T00:00:00Z"
      duration_seconds: 600
      assumed_capacity_bytes: 512000

  downlink_flows:
    - id: science_next_available_contact
      contact_profile: primary_ground_contact
      link_profile: uhf_downlink_nominal
      queue_policy: priority_then_age
      eligible_data_products:
        - payload.radiation_histogram

This shape is a proposed v0.4.0 contract shape.

It is not a frozen v1.0 schema.


Initial Scope

The first vertical slice should include:

optional contacts.yaml loading
typed contact/downlink model objects
contact profile identity validation
link profile identity validation
contact window identity validation
downlink flow identity validation
reference validation between contact windows, profiles and link profiles
reference validation from downlink flows to data products
declared capacity linting direction
generated contact/downlink documentation
one synthetic demo contact/downlink slice

The slice should prove this relationship:

Data Product Contract
        -> Downlink Intent
        -> Contact Assumption
        -> Downlink Flow Contract

Non-Goals

This decision must not introduce:

orbit propagation
TLE parsing
ground track computation
antenna pointing
RF link budget simulation
modulation or coding simulation
live ground links
real contact scheduling
real downlink execution
onboard downlink queues
file transfer protocols
CCSDS implementation
PUS implementation
CFDP implementation
Yamcs runtime integration
OpenC3 runtime integration
ground station operations
operator consoles
runtime skeleton generation
ground export generation
private mission-specific contact data

These are not missing pieces of v0.4.0.

They are intentionally outside the scope of this ADR.


Linting Direction

Contact Windows and Downlink Flow Contracts must be lintable from the beginning.

Initial linting direction should include:

ERROR: contact window references an unknown contact profile.
ERROR: contact window references an unknown link profile.
ERROR: downlink flow references an unknown contact profile.
ERROR: downlink flow references an unknown link profile.
ERROR: downlink flow references an unknown data product.
WARNING: high-priority data product has downlink intent but no eligible downlink flow.
WARNING: estimated data volume may exceed declared contact capacity.

The principle is fixed:

If a downlink assumption can become operationally ambiguous, the ambiguity must be visible before runtime or ground artifacts are generated.


Documentation Direction

Generated documentation should expose contact and downlink assumptions from the validated Mission Model.

The expected generated file is:

generated/docs/contacts.md

The generated page should make clear that contacts, link profiles, capacity and downlink flows are contract assumptions only.


Consequences

This decision extends OrbitFabric from data product and storage intent modeling toward declared onboard-to-ground flow reasoning.

It makes the next Mission Data Chain step explicit:

payload or subsystem produces data product
        -> data product declares storage intent
        -> data product declares downlink intent
        -> contact/downlink assumptions define expected delivery path

This strengthens later milestones.

End-to-End Mission Data Flow Evidence will be able to reason about produced, retained, queued, eligible and downlinked data products at contract level.

Runtime skeletons and ground integration artifacts will eventually be derived from a stronger model.


Acceptance Criteria for This Decision

This ADR is satisfied when:

  • the scope of Contact Windows and Downlink Flow Contracts is documented;
  • contact profiles, link profiles, contact windows and downlink flows are defined as contract assumptions;
  • non-goals are explicit;
  • the model remains optional;
  • contact/downlink concepts are connected to Data Product Contracts;
  • initial linting direction is documented;
  • generated documentation direction is documented;
  • implementation remains narrow, synthetic and clean-room.

Final Position

OrbitFabric must not jump from data product downlink intent directly to runtime or ground integration.

The next correct step is to model the contact and downlink assumptions used to reason about the mission data chain.

That model must stay declarative.