Receiver Stage Handoffs¶
The receiver does not pass one opaque success value from stage to stage.
Acquisition hypotheses control tracking admission, tracking histories determine
observation construction, and optional navigation requires time and ephemeris
context. Typed run artifacts, runtime traces, runtime metrics, and local
StepReport values carry different evidence and must not be described as one
report.
Actual Pipeline¶
flowchart LR
source["signal source"]
frame["conditioned<br/>acquisition frame"]
acquisition["ranked acquisition<br/>results and explanations"]
eligible{"accepted or ambiguous,<br/>tracking-supported?"}
tracking["bounded tracking<br/>channels and histories"]
observations["epochs, decisions,<br/>residuals, quality"]
navgate{"navigation feature,<br/>GPS time, synthetic<br/>GPS ephemerides?"}
navigation["navigation epochs"]
artifacts["RunArtifacts"]
source --> frame --> acquisition --> eligible
eligible -- yes --> tracking --> observations --> navgate
eligible -- no --> observations
navgate -- yes --> navigation --> artifacts
navgate -- no --> artifacts
acquisition --> artifacts
tracking --> artifacts
observations --> artifacts
The top-level engine is the composition authority. The public receiver API defines what a caller receives. Stage-local APIs can expose more detail than the top-level run preserves.
Entry Contract¶
Receiver::run derives acquisition requests from configuration and source
metadata. Explicit-request and explicit-satellite entrypoints converge on the
same internal pipeline after constellation-policy filtering.
The first source read asks for the acquisition frame:
- end of source before a frame is a successful empty run returning default artifacts
- a source error becomes
ReceiverError::Inputand triggers diagnostic dumping - an available frame is front-end conditioned before acquisition
- the same acquisition frame also seeds tracking, preserving sample continuity
- subsequent tracking reads continue until source exhaustion
An empty successful run is therefore not evidence that acquisition executed. Callers must inspect processed counts and stage artifacts rather than process status alone.
Acquisition to Tracking¶
Acquisition searches up to four ranked results for each request. The top-level
run keeps the first result from each non-empty request result set in
RunArtifacts.acquisitions, regardless of whether its hypothesis is accepted,
ambiguous, rejected, or deferred. Explanations are retained separately.
Tracking admission is narrower:
stateDiagram-v2
[*] --> Reported: first ranked result
Reported --> Trackable: accepted + supported signal/channel
Reported --> DegradedSeed: ambiguous + supported signal/channel
Reported --> ArtifactOnly: rejected or deferred
Reported --> ArtifactOnly: unsupported tracking combination
Trackable --> ChannelSelection
DegradedSeed --> ChannelSelection
ChannelSelection --> TrackingSession: preview ranking within channel limit
| Handoff concern | Contract |
|---|---|
| identity | satellite, signal band/code, and GLONASS channel where applicable stay attached |
| seed state | accepted acquisition enters as accepted; ambiguous acquisition records a degraded acquisition-to-track state |
| timing | source and front-end group delays are applied to acquisition alignment evidence before tracking |
| eligibility | rejected, deferred, and unsupported combinations remain acquisition evidence but do not create tracking channels |
| capacity | eligible candidates are previewed and ranked, then bounded by configured channel capacity |
| explainability | ranked rationale remains in acquisition explain artifacts, not in the tracking result |
The trace field currently named accepted_candidates records the number of
first-ranked acquisition results, not the number whose hypothesis is accepted.
Use acquisition statistics or hypotheses for acceptance counts; do not infer
them from that trace label.
See the acquisition implementation and acquisition explainability proof when changing this boundary.
Tracking to Observations¶
A tracking result carries the acquisition seed, final carrier and code estimates, epoch history, and transitions for one admitted channel. Parallel channel-state reports preserve stable channel identity, final state, reasons, and emitted lifecycle events such as acquired, pull-in, locked, degraded, lost, reacquired, or refused.
The observation stage receives all tracking results, not only channels whose final state is locked. It constructs:
- observation epochs with accepted or rejected decisions
- decision artifacts derived from those epochs
- residual reports
- per-signal measurement-quality reports
This separation matters. An observation epoch may exist and be rejected, while its decision and quality evidence explain why it cannot support navigation. Cardinality across the four vectors is not a general one-to-one contract; assert relationships only where the changed constructor guarantees them.
The tracking artifact types, channel lifecycle types, and observation artifact type define the detailed handoff. The channel-state integration proof checks the exported tracking/report relationship for receiver runs.
Observation to Navigation¶
Automatic navigation in the top-level run is more constrained than the availability of public navigation helpers suggests. It executes only when:
- the receiver is built with navigation support
- capture-start GPS time is configured
- the signal source is the receiver’s synthetic source type
- that synthetic source exposes at least one GPS ephemeris
Otherwise the run returns an empty navigation vector and records a trace status
such as disabled, missing capture time, or missing navigation data. Those
conditions are not ReceiverError failures. Even when execution starts, a
solver may produce no navigation epochs and report completed-empty.
Public receiver methods can solve supplied observation epochs against explicit GPS ephemerides or broadcast navigation data. Those methods are separate from the automatic source-to-navigation bridge and must not be used to imply that a generic file or memory source automatically carries ephemerides.
Use the navigation bridge and multisatellite readiness proof when changing this handoff.
Evidence Channels¶
| Channel | Preserved evidence | Important limit |
|---|---|---|
RunArtifacts |
processed counts; acquisition results and explanations; tracking transitions, state reports, and histories; observation decisions, epochs, residuals, and quality; support matrix; navigation epochs | no stage duration, acquisition statistics, trace status, or aggregate StepReport |
| runtime trace sink | stage start/completion, status, selected counts, and diagnostic context | only available through the configured sink; field names are not substitutes for typed hypotheses |
| runtime metric sink | stage durations, acquisition counters, tracking counts, observation counts, and navigation counts | not returned in RunArtifacts |
| metrics summary | aggregate acquisition, tracking, observation, and navigation measures | written only when a run directory is configured |
StepReport<T> |
stage-local output, diagnostic events, and optional processing time | observation helpers return it, but the top-level engine currently retains only its output and discards its events and stats |
StepStats currently contains only optional processing milliseconds. It is a
public stage-helper contract, not a top-level pipeline accounting record. The
crate-local pipeline guide
should be read with this distinction; its “step reporting” row does not mean
that RunArtifacts contains step reports.
Degraded, Empty, and Error Outcomes¶
| Condition | Run behavior | Evidence to inspect |
|---|---|---|
| source ends before acquisition frame | successful default artifacts | zero processed counts and empty vectors |
| no accepted or ambiguous supported acquisition | observations still execute over an empty tracking set | acquisition hypotheses, explanations, zero tracking channels |
| tracking loses or refuses a channel | run continues | transitions, state report reasons, epoch lock evidence |
| observation is inconsistent or lacks accepted observables | epoch may be retained as rejected | decision artifact, residual, and quality report |
| navigation prerequisite absent | run continues with empty navigation | navigation trace status |
| source read fails | run returns input error | diagnostic dump and error context |
| configured metrics-summary write fails | write helper currently suppresses many failures by returning early | sink/output inspection; successful run alone is insufficient |
The final row is an implementation limitation: metrics-summary persistence is best-effort and not represented in the receiver result type.
Reviewing a Handoff Change¶
- Name the producer type, consumer type, eligibility rule, ordering, units, and identity fields.
- Prove accepted, ambiguous/degraded, rejected/refused, empty, and source-error paths that can occur at that boundary.
- Check which evidence channel retains the decision and which details are dropped.
- Follow the changed artifact into command reporting and infrastructure persistence before claiming compatibility.
- Keep reusable signal math in the signal package, navigation science in the navigation package, persisted run interpretation in the infrastructure package, and operator syntax in the command package.
A stage contract is complete when success, refusal, degradation, emptiness, error, and evidence loss are all visible to the next reader.