Every sample carries two times — when it was measured and when the ground received it — and every decision of the MCS uses one of them on purpose. This page explains which time is used where, so that checks, verifications, derived measures and reports behave as expected, including after a loss of signal or a dump of on-board telemetry.
One time scale#
The whole chain works in a single time scale, set by the global configuration:
time:
scale: utc # utc (default), tai or gpsEvery timestamp of the MCS — in samples, events, logs, passes and reports — is expressed in that
scale, as RFC 3339 text with nanosecond resolution (2026-10-02T10:15:03.912Z). Drivers deliver
on-board time already converted into it: the conversion from the on-board clock (counter,
epoch, leap seconds) is part of the ICD of the target and belongs in the driver.
Two times per sample#
| Time | Field | Source | Used for |
|---|---|---|---|
| Sample time | time | On-board time when the driver provides it (onboard_time), else ground reception time | Ordering of the current value table, temporal derived functions, archives and reports |
| Ground time | ground_time | Ground reception time, stamped by the gateway (Stellar-Ground-Time) | Freshness (max_age), within windows, "received after SENT" |
On-board time dates what happened on the spacecraft; it is never the reference of a wait. Ground time is when the MCS learned about it; it is the reference of freshness and of every timeout, because it is the only clock the ground controls.
For a derived measure, time is that of its most recent input and ground_time that of its
oldest input: a derived measure is never fresher than its oldest source.
Freshness#
A measure may declare how old its current value may be to be trusted:
measures:
responding: {type: bool, max_age: 30s}checkandrequiresread the current value and refuse one that is absent, or whose age — measured from itsground_time— exceedsmax_age. A failedrequiresrejects the telecommand before encoding (REJECTED).- A value without
max_ageis always accepted bycheckandrequires, however old. - A temporal derived measure whose window holds no sample (for instance during a loss of signal)
is unknown: published once with
value: null, and refused bycheckandrequireslike a stale value.
During a loss of signal, current values simply age: nothing is invented, and checks that need fresh data fail rather than trusting old values.
Waits and windows#
Every wait of the MCS has a bound, measured on ground time.
| Construct | Starts at | Accepts |
|---|---|---|
verify with within (ACK 3) | SENT | Samples received after SENT; must hold within the window |
verify without within | SENT | The first samples received after SENT, within executor.ack_timeout |
expect <condition> within <d> | The last SENT of the step, or the start of the step without send | Samples received after that point, including those that arrived while the send was waiting for its verification |
wait until <condition> within <d> | Now | The current values, then new samples |
wait <d> | Now | Nothing: a fixed pause |
check <condition> | Now | Current values within their max_age |
The requirement of a sample received after SENT avoids false successes on a value that was
already true before the telecommand. The executor reads such samples from the PARAMS stream
starting at SENT, so a measure produced once — the reply to a ping, for instance — still
satisfies the expect that follows the send, even if it arrived during the verification of the
telecommand.
Durations are literals with a unit (10 s, 3 min, 500 ms), so the maximum duration of a
procedure is known before launch. See
Safety Rules and Maximum Duration.
Durations in configuration files#
In the global configuration and in YAML files, a duration is a number followed by d, h,
min, s, ms, us or ns, with or without a space: 5s, 3 min, 30d.
Real-time and deferred telemetry#
Each sample is marked with its delivery:
realtime: received live, during a pass or on a bench;deferred: recorded on board and downloaded later — frames replayed by the spacecraft and markedStellar-Delivery: deferredby the gateway, or samples decoded from a long-term telemetry file (LTTM) by the driver, one message per on-board instant.
Deferred samples are archived and used for analysis, but they never drive live decisions:
| Real-time | Deferred | |
|---|---|---|
Archived in PARAMS and by connectors | yes | yes |
| Pure derived measures | yes | yes, from its own values completed by the latest known ones, at the instant of its values |
Temporal derived measures (stable, avg, rate…) | yes | ignored |
| Alarms | yes | ignored (analysed afterwards) |
| Current value table | yes | only if not older than the current value |
A dump of yesterday's telemetry therefore never overwrites today's current value, never raises a
stale alarm, and never disturbs a stable(…) condition.
Temporal derived functions#
Windows and durations of temporal functions (avg(x, 10 s), stable(cond, 30 s), since,
rate…) are computed on sample time (time): on-board time when the driver provides it. The
compute stage evaluates them at processing time over the real-time samples it keeps, and
re-evaluates them at their next deadline (end of a stable duration, a sample leaving a window,
every second for age and since) without waiting for a new sample. Windows are bounded by
derived.max_window (1 h by default). Same samples, same result: a temporal derived measure can
be recomputed from the history. See Derived Measures.
Times in other places#
| Where | Time |
|---|---|
Telecommand events (at) | Time of the transition, by the component that publishes it |
Deadline of a telecommand (Stellar-Deadline) | executor.ack_timeout after PENDING; a driver or gateway receiving it later refuses it |
Run log (at of each event) | Time of the event, by the executor |
Passes (aos, los) | As given by the feeders, in the time scale of the chain |
Schedules (start: aos + 30 s) | Relative to the AOS of the pass |
Messages (Stellar-Emitted-At) | Emission time, on every message of the MCS |
Ground stations and benches#
Gateways stamp the ground reception time of each frame, so their clocks matter most: synchronize
them by NTP, or by PTP where the timing of within windows is tight. A gateway on a bench, without
a notion of visibility, reports its link as always available; a ground station gateway reports it
only during passes, and current values age between passes as they would in orbit.