Skip to content

Module Map

Use this map when deciding where shared GNSS meaning belongs. Start from the contract a downstream package needs to exchange, not from a source filename or the package that first requested it.

Choose A Contract Family

question owning family boundary
How is a constellation, satellite, signal, or component identified? Identity contracts identity only; catalog and signal behavior stay in signal
Which time scale or physical quantity does a value use? Time contracts and unit contracts shared representation and conversion, not runtime clock policy
Which coordinate frame or shared sanity law applies? Geometry helpers and scientific conventions reusable pure meaning, not estimator policy
What crosses acquisition, tracking, observation, or differencing boundaries? Observation contracts exchanged records, not stage implementation
How is measurement quality described across packages? Observation quality evidence records, not receiver lock policy
What does a navigation result say independent of its solver? Navigation solution contracts result, residual, lifecycle, and refusal records, not navigation algorithms
How is a record versioned and validated after serialization? Artifact contracts envelope and payload meaning, not repository placement
How do packages exchange failures and diagnostics? Diagnostic contracts and error taxonomy structured shared meaning, not command wording
How is shared configuration or support declared? Configuration contracts and support matrix cross-package schema and inventory, not local defaults

Placement Decision

flowchart TD
    type["proposed type or helper"]
    shared{"same meaning needed by<br/>multiple packages?"}
    pure{"independent of runtime,<br/>solver, storage, and CLI policy?"}
    family{"existing contract<br/>family owns it?"}
    core["extend that core family"]
    owner["keep with product owner"]
    review["justify a new durable family"]

    type --> shared
    shared -- no --> owner
    shared -- yes --> pure
    pure -- no --> owner
    pure -- yes --> family
    family -- yes --> core
    family -- no --> review

Do not create a new top-level family merely because a type feels "shared." A new family needs distinct semantics, multiple real consumers, and a boundary that will remain understandable after the requesting workflow changes.

Public Boundary

The curated core API is the only downstream import route. The crate architecture guide explains dependency and persistence boundaries, while the contract map carries the crate-local placement rules.

Use State and Serialization before changing a persisted record and Dependency Direction before adding any package relationship.