Satellite operations engineer monitoring orbital data and satellite trajectories from a ground control workstation

TLE Catalog Numbers Have Run Out: Migrate Your Orbit-Data Pipeline

Wed, Sep 16, 2026

The failure mode is no longer theoretical. CelesTrak’s live GP-format notice records exhaustion of five-digit catalog numbers on July 11, 2026 and states that newly cataloged objects numbered 100000 and above do not have General Perturbations (GP) data available in CelesTrak’s TLE format. The alternative OMM-oriented formats are not a new 2026 product: CelesTrak introduced them in May 2020.

What changed in 2026 is the operational boundary your software can no longer postpone. The CelesTrak GP data format guidance, published May 27, 2020 and updated June 23, 2026, documents that provider history.

For satellite-operations teams, flight-dynamics engineers, ground-segment developers and data-pipeline owners, the decision is therefore not “TLE or OMM?” in the abstract. It is whether every interface from provider query to database join can preserve a catalog identity wider than five characters, retain the orbital-data semantics that SGP4 expects, and prove what data was actually used downstream.

This runbook treats TLE to OMM migration as a data-integrity change. It follows a record through acquisition, parsing, canonical identity, storage, propagation input, caching, freshness, observability and recovery. It deliberately stops before maneuver planning, conjunction triage or operational authority. A parser that accepts a six-digit satellite catalog ID is only the beginning; the migration is complete when the ground system can demonstrate lossless identity, source-aware semantics, controlled freshness and a reversible software cutover without deleting the objects the change was meant to support.

Define the failure caused by the five-digit boundary

The dated trigger is catalog-number exhaustion, not the invention of the Orbit Mean-Elements Message (OMM) or JSON. CelesTrak says its CATNR query accepts one to nine digits, but the legacy TLE format cannot represent objects above 99999; its live notice says objects at 100000 and above are now outside that TLE delivery path. CelesTrak also changed the default GP query output to CSV on May 9, 2026, so a client that omits FORMAT can experience a serialization change even before its parser encounters a wider identifier.

A missing row in a TLE response is not evidence that the spacecraft or debris object disappeared. It can be an interface limitation. That distinction belongs in ground-control operating responsibilities: the data-pipeline owner must distinguish provider coverage from physical status before an operations consumer acts on an absence.

Pipeline point

Five-digit assumption

Observable failure

Accountable owner

Query

FORMAT omitted; TLE assumed

CSV reaches a TLE parser, or high IDs are absent

Feed/integration owner

Parse

Catalog field fixed at five characters

Reject, truncation or mis-keyed record

Parser maintainer

Database

CHAR(5) or width-constrained integer/string

Insert failure or lossy cast

Data/schema owner

UI/export

%05d, five-cell column, legacy regex

Display truncation or invalid export

Application owner

Operational use

“download succeeded” treated as coverage

Consumer operates on incomplete catalog

Operations data authority

The cutover gate is simple: no downstream consumer should receive the new feed until absence, truncation and serialization mismatch are separately observable. A six-digit identifier that becomes five characters is a quarantine condition, not a warning.

Inventory every place that assumes a TLE identifier

Start with an interface inventory, not a parser rewrite. Five-digit assumptions often survive in places that never parse a TLE: ORM models, message buses, CSV exports, filenames, monitoring labels, database indexes, join keys, dashboards, test factories and integer format strings. Search for widths and semantics together: CHAR(5), VARCHAR(5), \d{5}, %05d, substring slices, zero-padding, “NORAD number” aliases and schemas that conflate catalog number with object name.

Keep three identities separate. NORAD_CAT_ID is the catalog identifier used by the GP/OMM data path. OBJECT_ID is the international designator. OBJECT_NAME is a human-readable name and can be missing. The CCSDS Orbit Data Messages standard, Issue 3 (April 2023), defines these as distinct OMM concepts, while CelesTrak notes that names and international designators can be unavailable for some objects.

Component

Current contract to find

Migration evidence

Owner/sign-off

Provider adapter

Five-digit request/response assumption

Query accepts and preserves wider ID

Integration owner

Domain model

Catalog ID stored as small numeric or five-char string

Round-trip test with six- and nine-digit strings

Data owner

Join layer

Name or international designator used as substitute

Join keyed by canonical catalog identity plus provider

Application owner

Export/API

Fixed-width schema or regex

Consumer contract updated and fixture accepted

Interface owner

Monitoring

Object ID embedded as high-cardinality label

Width violations counted without cardinality explosion

SRE/observability owner

This is also where satellite design and operations ownership matters: widening a data key is a software/data change, while deciding whether an orbit record is acceptable for a flight use remains an operations and flight-dynamics responsibility.

Prevent duplicate identities during transition. Do not create one row keyed by legacy text 01234 and another keyed by canonical 1234 unless the provider contract says those are distinct. Preserve the raw provider token for audit, but normalize a separate canonical key under an explicit rule. The inventory is complete only when every producer, store and consumer has an owner and a test artifact proving wider-ID behavior.

Choose a provider-specific format contract

Do not migrate to “OMM” as if it were one wire format. The CCSDS Orbit Data Messages standard defines OMM content and both Keyword Value Notation (KVN) and XML representations; the CCSDS XML Specification for Navigation Data Messages, CCSDS 505.0-B-3 (May 2023), defines the XML message structure. CelesTrak additionally offers JSON and CSV using OMM field names and definitions.

CelesTrak documents that null, blank or redundant fields may be omitted from those convenience formats. Those JSON/CSV responses are therefore not byte-for-byte full OMM KVN or XML messages.

Pin the contract at four levels: provider, endpoint/query, serialization, and parser/library revision. For CelesTrak GP ingestion, always set FORMAT explicitly because the omitted default became CSV on May 9, 2026. Record the expected content type and reject a payload whose structure does not match the selected format.

Contract choice

Identity width

Structural character

Recommended use in this migration

CelesTrak TLE/2LE/3LE

Legacy five-character field

Fixed-width lines

Compatibility path for representable legacy objects only

CelesTrak KVN

OMM catalog field

Full key-value message with mandatory fields

Strong explicit provider contract

CelesTrak XML

OMM catalog field

Structured XML message

Strong interoperability contract where XML tooling is acceptable

CelesTrak JSON

OMM-keyed fields

Provider convenience serialization; redundant/unavailable fields may be omitted

Efficient application ingestion with provider-specific defaults

CelesTrak CSV

OMM-keyed columns

Provider convenience serialization; redundant/unavailable fields may be omitted

Batch ingestion with explicit header/schema validation

There is a version detail worth making visible. Current CCSDS 502.0-B-3, published April 2023, defines OMM 3.0 as the Blue Book version while retaining OMM 2.0 as a previously supported version; its examples use CCSDS_OMM_VERS = 3.0. CelesTrak’s documentation still recommends XML OMM Version 2.0, and its live KVN example at the research cutoff reports version 2.0. Treat that as a provider/version contract difference, not something to “correct” in transit.

Legacy TLE and Alpha-5 compatibility boundaries

Alpha-5 is a compatibility mechanism in some parsers and data ecosystems, not a universal solution to provider coverage. The python-sgp4 maintainer documentation, accessed September 15, 2026, records Alpha-5 and OMM support in its December 16, 2020 changelog and shows an Alpha-5 parsing example. That proves a library capability for its supported range; it does not prove that CelesTrak will encode today’s 100000+ GP objects as Alpha-5 TLEs.

Operational rule: keep Alpha-5 behind an explicit provider-plus-parser contract. Never synthesize an Alpha-5 or numeric TLE solely to give a high-numbered OMM record a “legacy baseline.” That fabricates compatibility evidence the provider did not supply.

OMM-keyed JSON and CSV versus full messages

CelesTrak documents CENTER_NAME=EARTH, REF_FRAME=TEME, TIME_SYSTEM=UTC and MEAN_ELEMENT_THEORY=SGP4 as examples of redundant fields omitted from its JSON/CSV. A current CCSDS OMM 3.0 example uses MEAN_ELEMENT_THEORY = SGP/SGP4, illustrating why a local adapter should not apply a generic “OMM default” without naming its source contract.

For CelesTrak JSON/CSV, a controlled adapter may inject only documented provider defaults, and it should record which values were inferred rather than transmitted. Data from another provider must be validated against that provider’s own contract. “OMM-keyed” is not permission to assume identical omissions, versions or metadata.

Preserve catalog identity through storage and joins

A safe satellite identifier migration uses a canonical representation that is wider than today’s known boundary and does not depend on arithmetic. CelesTrak accepts CATNR values from one to nine digits, and CCSDS OMM defines NORAD_CAT_ID as an integer field used with SGP/SGP4 mean elements. Store the canonical identity as a decimal string large enough for the provider contract, while retaining the raw provider value separately. That avoids integer overflow surprises, preserves audit evidence and prevents display formatting from becoming identity logic.

A proposed local schema is below. Field sizes are engineering choices, not provider requirements.

Field

Proposed type

Purpose

Acceptance rule

catalog_provider

text

Namespace/provenance

Non-empty, controlled value

catalog_id_canonical

VARCHAR(16)

Join and lookup identity

Decimal digits, no truncation

catalog_id_raw

text

Exact provider token

Stored unchanged

international_designator

nullable text

Separate launch/object designator

Never substituted for catalog ID

object_name

nullable text

Display label

Never used as authoritative key

element_epoch_utc

timestamp/text pair

Element epoch plus original lexical value

Parseable under source contract

raw_blob_ref / sha256

text

Replay/audit linkage

Must resolve to immutable payload

The canonicalization rule should be boring and reversible. For a decimal provider catalog number, validate digits, remove only semantically insignificant leading zero padding for the canonical key, and preserve the raw token. Do not coerce an Alpha-5 token through this decimal rule. If a provider changes identifier syntax, that is a contract revision requiring a new parser path.

The schema migration needs dual-read or dual-write only where it helps verify compatibility. Do not leave two authorities indefinitely. Before production widening, prove these acceptance conditions:

  • A supported six-digit and a proposed nine-digit fixture survive API, parser, database, queue, export and UI round trips unchanged.

  • Legacy records join to the same domain objects before and after canonicalization.

  • No join falls back from catalog ID to OBJECT_NAME merely because the wider key is unfamiliar.

  • Database indexes, uniqueness constraints and foreign keys are rebuilt or widened consistently.

  • Backups and restore tooling preserve the wider schema and rows.

A principal-engineer cutover should fail closed if any downstream system truncates the key. It is safer to quarantine a record than to create a plausible-but-wrong identity that later joins orbital elements to the wrong operational object.

Validate epoch, units and propagation semantics

Changing serialization must not silently change orbital semantics. CelesTrak describes GP data as Brouwer mean elements fitted for propagation with Simplified General Perturbations 4 (SGP4). Skyfield’s Earth Satellites documentation, accessed September 15, 2026, explicitly warns that the familiar element names in a TLE are not simply generic Keplerian osculating elements. Treat OMM as a way to carry mean-element data and metadata, not as evidence of a higher-accuracy orbit or a reason to switch propagators.

CCSDS OMM defines mean motion in revolutions per day, angular elements in degrees, and BSTAR in inverse Earth radii for the SGP/SGP4 parameter set. It also carries the epoch and metadata such as reference frame, time system and mean-element theory. Validate these before constructing a propagation object.

Field/semantic

Provider-aware check

Failure action

EPOCH

Present; valid under declared/source time system

Quarantine

TIME_SYSTEM

Transmitted or supplied by documented provider contract

Quarantine if unresolved

REF_FRAME

Transmitted or documented provider value; expected by propagation path

Quarantine if unresolved

MEAN_ELEMENT_THEORY

Compatible with pinned SGP4 interface

Reject unsupported theory

Mean motion

Numeric, units interpreted as rev/day

Quarantine malformed value

Angles

Numeric, degrees under OMM contract

Quarantine malformed value

BSTAR and derivatives

Parse with correct OMM units/conventions

Quarantine malformed value

NORAD_CAT_ID

Exact canonical identity preserved

Quarantine any mismatch

Pin the propagation implementation as part of the test configuration. The current python-sgp4 package documentation says it propagates SGP4/SDP4 and returns TEME position in kilometers and velocity in kilometers per second; its OMM initializer uses WGS72 by default, while versions since 2.25 allow an explicit gravity-constant argument. The package version shown at the cutoff is 2.27, released July 3, 2026.

Do not infer arbitrary identifier-width support from OMM or Alpha-5 support. The python-sgp4 2.22 changelog says the library checks that satnum is never greater than 339999. A data layer can therefore preserve a provider’s wider identifier even when this particular propagation path cannot initialize it. In that case, retain the record, mark propagation as unsupported for that interface, and do not remap the identity to make the library accept it.

That does not mean WGS72 is universally the right mission setting; it means the differential test must hold the chosen setting constant. Record library version, gravity constants, time conversion path and error-code handling. If TLE and OMM paths produce different outputs, first ask whether the input values or configuration differ before calling the serialization “more accurate.”

Build a differential parser fixture corpus

A migration needs two kinds of evidence: differential fixtures for objects representable in both paths, and independent fixtures for identifiers that the legacy path cannot represent. Keep the fixture corpus under source control with provenance, generator version, expected parser status and expected semantic status. Archive public samples only where your use policy permits; use clearly marked synthetic data for boundary conditions.

Separate three verdicts. Parse validity asks whether the bytes conform to the expected serialization. Semantic validity asks whether identity, epoch, units and mean-element theory are understood. Operational suitability asks whether the accepted record meets a named consumer’s freshness and quality policy. Passing one does not imply the next.

Fixture class

Provenance label

Formats

Expected evidence

Archived provider sample

Provider URL, retrieval time, hash

One or more supported formats

Reproducible parse under pinned contract

Synthetic legacy-compatible

synthetic=true

Generated TLE plus OMM-keyed form

Differential identity/elements test

Synthetic wide-ID

synthetic=true

JSON/CSV/KVN/XML as applicable

Exact wider-ID preservation

Negative fixture

Synthetic mutation of known schema

Malformed/unsupported

Deterministic quarantine reason

Schema-drift fixture

Synthetic extra/unknown field

Supported serialization

Explicit ignore/store/reject policy

Objects representable in both the old and new formats

Define a synthetic fixture LEGACY-COMPAT-A with catalog ID 54321, an explicit epoch, mean elements and SGP4 parameters. Generate both its legacy TLE representation and its supported-format representation from the same canonical synthetic source. Do not copy a live object and relabel it synthetic. The expected propagation-result fields should remain “not run” until the test harness actually executes.

Compare in this order: canonical catalog identity; epoch after time parsing; each mean-element value after unit interpretation; SGP4 parameters; then propagated state using the same library and configuration. Fixed-width TLE rendering can quantize values, so tolerances must be derived from the source representation and reviewed by flight dynamics. Do not publish a universal position tolerance as if it were an SGP4 accuracy guarantee.

A useful acceptance record contains expected_identity=54321, per-field numeric tolerances, propagation epochs, pinned library/configuration, expected error code, and actual result fields. Until executed, those actual fields remain blank or explicitly NOT_RUN.

Six-digit objects with no legacy-format baseline

Define WIDE-ID-B with synthetic catalog ID 100123, explicitly noted as a test identifier not asserted to correspond to any live catalog object. Supply it only in a supported wider-ID format. Its primary acceptance test is exact identity preservation through parse, storage, serialization and joins.

Add negative variants: missing OBJECT_NAME where allowed, malformed EPOCH, nonnumeric catalog ID for a decimal-only contract, missing provenance, unknown fields, and a payload whose declared/observed format conflicts with the request. For CelesTrak JSON/CSV, test documented omitted metadata through the provider adapter; for a generic OMM source, do not reuse those CelesTrak defaults automatically. This fixture proves support for the new contract without inventing a TLE that never existed.

Reproduce the broken-cache migration scenario

Consider a fictional mission-support application called OrbitDesk. It has three defects: a database column catalog_id CHAR(5), a fixed-width TLE parser, and an HTTP cache keyed only by the downloaded filename. Every CelesTrak GP query ends in gp.php, so two distinct query URLs can map to the same basename. Skyfield’s documentation specifically warns that naïvely saving such URLs can overwrite one dataset with another and recommends choosing distinct local filenames.

The fixtures are synthetic. LEGACY-COMPAT-A uses ID 54321 and paired TLE/OMM representations. WIDE-ID-B uses ID 100123 and only a supported OMM-keyed representation. No live catalog position or customer incident is being claimed.

Step

Old OrbitDesk behavior

Evidence lost or mixed

Repaired behavior

Fetch legacy query

Saves response as gp.php

Query identity detached from bytes

Cache key includes provider + normalized query + explicit format

Fetch wide-ID JSON

Overwrites same gp.php

Prior batch no longer reproducible

Immutable raw payload stored by content hash

Parse 54321

Fixed-width TLE succeeds

No proof of alternate path

Differential fixture compares canonical fields

Parse 100123

Truncates/rejects into five chars

Identity corrupted or object omitted

Wider canonical string accepted exactly

Insert row

CHAR(5) cannot represent six digits

Failure may be hidden by coercion

Widened schema rejects any truncation

Downstream join

Joins on truncated value or filename

Wrong object/batch can be selected

Join uses canonical ID + provider and batch provenance

The first repair is not “change CHAR(5) to CHAR(6).” Six is merely today’s visible threshold. Choose a field width and contract that accommodates the provider’s documented one-to-nine-digit query space, then test nine digits even if the live operational set you consume is currently smaller.

The second repair is cache identity. A cache key should be derived from a normalized request identity, including provider, endpoint, query selector and explicit FORMAT; the stored batch should separately carry its content hash. Filename is presentation, not provenance.

The third repair is recovery. If WIDE-ID-B is truncated anywhere, quarantine that record and stop promotion of the batch to affected consumers. Continue serving the last known-good batch only if the consumer policy allows it, preserving its original element age and marking it stale when its age crosses the local threshold. Never “recover” by reverting the database to five digits and silently discarding the record.

Fetch responsibly and preserve the raw evidence

CelesTrak’s Usage Policy, published May 15, 2026 and updated May 22, 2026, says GP data is checked for updates every two hours and asks clients to download only the data they need, no more than once per update. For machine clients, non-200 responses are a stop-and-report condition rather than an invitation to retry rapidly. The policy specifically discusses 301, 403, 404 and server-error cases and the risk of repeated requests causing blocks.

Build the fetcher around evidence preservation. Set FORMAT explicitly. Select the smallest provider query that meets the consumer need. On HTTP 200, validate response structure before accepting it as the requested serialization. On any other status, stop that retrieval loop, retain the response evidence permitted by policy, and alert a human owner.

Batch evidence

Store with accepted payload

Why it matters

Provider and endpoint

Yes

Establishes contract namespace

Exact/normalized query parameters

Yes

Distinguishes group, catalog, name and format requests

Retrieval time in UTC

Yes

Supports cache and freshness reasoning

HTTP status and observed content type

Yes

Proves transport outcome

Response content hash, e.g. SHA-256

Yes

Detects replay/mutation and identifies immutable bytes

Parser/adapter version

Yes

Makes interpretation reproducible

Raw payload reference

Yes

Allows reparse after software changes

Defaults inferred by adapter

Yes

Separates transmitted data from local semantics

Use the content hash as a batch identity, not as a substitute for source metadata. Two identical payloads retrieved at different times can have the same hash but different retrieval evidence; conversely, semantically equivalent JSON and CSV naturally have different hashes.

The cache-identity checklist is short: no basename-only keys; no implicit response format; no overwrite of accepted raw evidence; no promotion before schema/semantic checks; no automatic retry storm on provider errors. For a CelesTrak cache, schedule around its documented update policy rather than polling each object independently.

Separate data freshness from successful download

HTTP success answers “did I receive bytes?” It does not answer “are these elements current enough for this consumer?” Skyfield’s satellite documentation makes the same operational distinction: downloading a TLE or OMM again can return data whose element epoch has not advanced, so software should inspect the element epoch rather than treating a fresh file as a fresh orbit.

Freshness therefore needs a consumer-owned threshold. Do not copy CelesTrak’s two-hour provider update cadence into a mission rule for maximum element age. Those are different quantities. The operations data authority and flight-dynamics owner should approve the allowable element age and any additional quality criteria for each downstream use.

State

Transport

Parse/semantics

Element-age gate

Consumer behavior

ACCEPTED

Successful

Valid

Within approved limit

Eligible for named consumer

STALE

Successful or last-known-good

Valid

Older than approved limit

Retain with explicit stale status; use only if policy allows

QUARANTINED

Any

Invalid/unresolved

Not evaluated as usable

Block from operational consumers

UNAVAILABLE

No acceptable payload

N/A

N/A

Notify owner; do not invent replacement

PROVIDER_ERROR

Non-200

Not promoted

N/A

Stop retrieval loop and escalate

Element epoch, retrieval time and pipeline completion

Store at least three timestamps with different meanings. element_epoch is part of the orbital record. retrieved_at records when the provider response was obtained. pipeline_completed_at records when your validated batch became available internally. A replay can have an old retrieval time and a new pipeline-completion time; that is expected and should be visible.

Never rewrite an old element epoch to the replay time or download time. That would convert a provenance event into false orbital freshness. If the system derives age_at_use, compute it from the actual element epoch under the agreed time-system interpretation, and keep the calculation rule versioned.

Blocked responses and quarantined records

CelesTrak’s Usage Policy instructs automated processes to stop when they encounter non-200 responses and report the problem to a human; repeated requests can worsen a block. Follow that boundary for CelesTrak rather than substituting a generic exponential-retry pattern.

Quarantine is for data problems: truncated identity, unresolved units/time/frame semantics, malformed required fields, missing provenance, or propagation-interface rejection. Retain the raw batch and reason code. Notify affected consumers that new data was not promoted. If last-known-good data remains available, preserve its original epoch and retrieval evidence and mark it stale according to the consumer rule. Recovery ends only when a newly validated batch passes the same gates; clearing an alert is not itself data acceptance.

Observe coverage and identity integrity after cutover

Cutover observability should answer three questions: did the provider response cover what we asked for, did we preserve every identity we received, and did downstream consumers join the same objects after the schema change? An increase in object count is not enough. It can coexist with duplicate keys, stale records or broken joins.

Keep object IDs out of unbounded metric labels. Emit counts and bounded dimensions such as provider, format, parser version and failure reason; put per-object detail in searchable logs or audit records. That gives operators enough evidence without creating a telemetry system that fails under catalog growth.

Signal

Meaning

Proposed trigger

Primary owner

Expected vs received coverage

Query-level completeness against a controlled expected set

Any unexplained deficit

Feed owner

Wider-ID count

Confirms new identity space is present

Sudden zero after previously nonzero

Data-pipeline owner

Truncation/width violations

Lossless-identity failure

Any occurrence

Schema/application owner

Parse/quarantine rate

Serialization or semantic problem

Deviation from reviewed baseline

Parser owner

Unknown/missing fields

Schema drift

Any newly required/unknown critical field

Contract owner

Element-age distribution

Freshness by consumer

Approved limit exceeded

Flight-dynamics/operations data owner

Join misses/duplicates

Downstream identity regression

Any unexplained change

Consumer owner

Cache-key collision

Provenance mixing

Any occurrence

Ground-software owner

These are proposed operational signals, not measured industry thresholds. Establish baselines during shadow ingestion, then make alert thresholds local and reviewable. For automation ideas, satellite-operations automation is adjacent context; the control point here remains deterministic data-integrity evidence, not an anomaly model deciding whether orbit data is trustworthy.

A useful post-cutover dashboard separates provider status, ingestion status and consumer status. “Provider 200 / 12,000 records” can be green while “34 join misses” is red. Likewise, a parser can be green while element-age policy is red. Assign those states to different owners so a ground-system alert is not silently reinterpreted as a flight-dynamics acceptance.

Rehearse a rollback that does not lose new objects

Rollback should restore application behavior, not restore the old data limitation. Once the system has accepted wider catalog identifiers, shrinking the schema or switching to a reader that omits those rows is data loss. The safe pattern is a forward-compatible storage layer, immutable raw supported-format archives, and reader/adaptor versions that can be selected without discarding records.

Rollback action

Allowed?

Gate

Disable a new UI path while keeping widened database

Yes

Wider IDs remain queryable and stored

Revert parser code to previous version

Only if it can read all accepted identities/formats

Replay fixture corpus before activation

Serve last-known-good validated batch

Conditionally

Preserve original age and show STALE when applicable

Shrink VARCHAR/column to five characters

No

Would make accepted identities unrepresentable

Drop high-numbered rows to regain compatibility

No

Silent catalog loss

Reparse immutable raw batches with fixed software

Yes

Keep old parse result and new result linked for audit

Before cutover, run a recovery exercise in a staging copy that already contains the synthetic 100123 record. Roll back the application release, restore from backup, rebuild indexes and replay raw batches. The pass condition is not merely “service starts.” The six-digit record must remain intact, visible to the appropriate new-capability consumer, and quarantined rather than truncated if the rolled-back reader cannot process it.

Irreversible schema operations need a stop gate. Dropping the old column can wait until dual-path evidence is complete; shrinking the new column should never be part of rollback. If a database migration tool cannot represent the coexistence period safely, redesign the migration rather than accepting an untestable recovery path.

The stale-data policy also belongs in the rollback plan. Define who can authorize temporary use of last-known-good elements, for which consumers, and how age is displayed. A software rollback is not authority to reset the freshness clock.

Set the boundary between ingestion and flight decisions

The migrated feed has an authorized-use boundary. A parser owner can certify that bytes became a semantically valid canonical record. A flight-dynamics owner can certify that the propagation interface produces expected results under a pinned configuration. An operations authority decides whether that data source and freshness state are approved for a specific operational use. Those are separate approvals.

This article intentionally does not reproduce TraCSS operations and conjunction workflows. Conjunction screening, Collision Data Message triage, operator ephemerides and maneuver decisions are adjacent operational processes with their own provenance and authority. Public GP ingestion plus the lab described here is not independently sufficient authority for a spacecraft maneuver.

Acceptance question

Evidence

Owner

Did we receive and preserve the provider identity?

Raw payload, hash, canonical/raw ID comparison

Data-pipeline owner

Are format and semantics resolved?

Contract/version record, validation matrix

Parser/contract owner

Is SGP4 interface behavior controlled?

Differential fixture results, pinned configuration

Flight-dynamics software owner

Is the record fresh enough for this consumer?

Element-age evaluation against approved rule

Operations data authority

Is this consumer authorized to use this source?

Controlled interface/operations procedure

Mission operations owner

Can we recover without losing wider IDs?

Restore/replay exercise

Ground-system owner

The stop condition is explicit: identity truncation, unresolved units/time/frame, malformed required fields or missing provenance blocks promotion. Propagation failure blocks the affected propagation consumer. A successful parse does not upgrade the authority of the source, and a successful SGP4 call does not approve a maneuver.

This separation also makes incident recovery cleaner. Data engineering can repair acquisition without rewriting flight rules; flight dynamics can reject a semantically suspect batch without diagnosing HTTP behavior; operations can choose a stale-data posture without pretending the record is fresh.

Build an orbit-data integrity portfolio

The most credible artifact from this migration is not a screenshot of a six-digit ID. Package the evidence an independent reviewer would need to reconstruct the change: schema diff, provider contract, fixture manifest, raw-payload provenance, differential comparison record, cache-key design, observability specification and rollback/replay exercise.

Portfolio artifact

Reviewer question

Identifier schema diff

Can any path still truncate or alias wider IDs?

Fixture corpus + provenance

Which records are provider-derived and which are synthetic?

Differential test matrix

Were fields compared before propagation?

Propagation configuration record

Are library, gravity constants, time path and error handling pinned?

Fetch/cache evidence

Can a batch be reproduced without filename ambiguity?

Freshness/quality policy

Who owns the age threshold and stale-data decision?

Recovery record

Did rollback preserve the six-digit fixture and raw evidence?

For readers building satellite mission-operations foundations, this is a useful portfolio because it demonstrates interface discipline, not just orbital vocabulary. Mark every synthetic fixture, every proposed threshold and every unexecuted result so the reviewer can distinguish design evidence from test evidence.

For structured study around the underlying disciplines, Refonte Learning’s Satellite Operations Specialist/Engineer Program lists orbit determination and control, ground-station operations, spacecraft health/data analysis, automation and operational simulations. It states three months at 10–12 hours per week, describes aerospace, electrical engineering or a related background as ideal, and requires working toward a bachelor’s or higher-level degree. The page does not verify this exact CelesTrak/OMM/SGP4 migration lab, so treat it as foundation-building rather than vendor-specific qualification.

Answer the remaining format-migration questions

Do all old TLEs stop working now that five-digit catalog numbers are exhausted?

No. CelesTrak states that legacy TLE/2LE/3LE delivery continues for objects whose catalog numbers fit the format. The operational failure is coverage of newly cataloged objects outside that representable range, plus software that assumes TLE is the only possible serialization. Keep legacy TLE fixtures for regression testing, but stop treating successful TLE parsing as proof that your feed covers the catalog you intend to consume.

Does Alpha-5 solve every provider case?

No. Alpha-5 is a parser/provider compatibility mechanism with its own representable range and syntax. The python-sgp4 library supports Alpha-5, but CelesTrak’s current notice says its 100000+ newly cataloged objects do not have GP data available in TLE format. A library feature cannot manufacture a provider response. Test Alpha-5 only where both the data source and the pinned parser explicitly support it.

Is CSV automatically more accurate than TLE?

No. Serialization and orbital accuracy are different concerns. CelesTrak’s JSON/CSV carry OMM-named GP fields and avoid the five-character catalog-number limit; GP data are still mean elements intended for SGP4-family propagation. A CSV migration can reduce identity and fixed-field limitations without changing the underlying orbit determination. Compare like-for-like source epochs and propagation configuration before attributing any numerical difference to format.

Does a fresh download mean the orbital elements are fresh?

No. Retrieval time and element epoch are separate. A provider can return HTTP 200 with an element set whose epoch is older than a consumer’s approved limit. Store element epoch, retrieval time and pipeline-completion time separately, then evaluate freshness from the element epoch. Skyfield’s documentation explicitly cautions that reloading does not guarantee a newer satellite epoch.

Why must rollback preserve wider IDs?

Because the identifier-width migration changes what your system can faithfully represent. Once a supported-format record with a six- or nine-digit catalog number has been accepted, reverting to a five-digit-only schema would turn rollback into silent data deletion or aliasing. Roll back code paths behind a forward-compatible data model, retain raw payloads, and quarantine unsupported reads instead of shrinking identity.

Use this final release checklist before calling the migration complete:

Assumption to challenge

Evidence required

Failure action

“The query still returns what we expect”

Explicit FORMAT, coverage metrics, raw batch

Stop promotion; inspect provider contract

“The database can hold the new ID”

End-to-end round-trip and join fixture

Quarantine; fix every truncating consumer

“Same elements means same propagation path”

Source-aware field comparison and pinned SGP4 test

Hold cutover; reconcile semantics/configuration

“Rollback is safe”

Restore/replay with wider-ID fixture intact

Do not cut over

The next failing assumption to test is whichever component still treats catalog identity, serialization, freshness or operational authority as the same thing. In a controlled GP data pipeline, they are separate contracts, with separate owners and separate evidence.