Library status
Results of the test kit on real satellite software: eight programs in one-off runs, each at a pinned version, and two popular free libraries checked every week.
The corpus run against third-party parsers: eight in one-off runs at pinned versions, and a weekly job over the latest python-sgp4 and Skyfield.
Run once against the corpus
Eight pieces of satellite software had one-off runs in September 2026, each at one pinned version, against the seventeen cases of the time, and PyEphem, satellite.js, Gpredict, gods-eye-view, libsgp4, tle.js and astroz since against the eighteen of the current version; every finding was reproduced by running that software’s own code before it was reported.
One-off runs (site/content/library-runs.json): each row names the corpus version it ran against, with that version’s runner: v0.2.1 for the first round, of 2026-09-24, v0.4.0 for the second round’s PyEphem, satellite.js, Gpredict, libsgp4, tle.js and astroz rows, of 2026-09-27, and v0.5.0 for gods-eye-view’s row, a run of its release v0.2.1 on 2026-10-03; one run per library on the date shown, through a harness or adapter of the corpus’s own over the library’s unmodified parser; recorded in the corpus decision log (D-128 and D-132 to D-141; the second round’s PyEphem, satellite.js, Gpredict, libsgp4, tle.js and astroz, D-174, D-176, D-178, D-182, D-184 and D-185; gods-eye-view’s release v0.2.1, D-221), the specifics in the linked reports.
These counts were measured with files saved in the days just after one launch, which the test kit’s download does not ask for, so a run made today from a fresh download cannot reproduce the failures that rest on them and shows fewer for most rows.
The rows were measured on the maintainer’s copy of the corpus, with launch-window files that a new user’s fetch cannot obtain, and a run from a fresh fetch cannot reproduce the failures that rest on them, so it shows fewer failing cases for most rows (corpus D-229).
| library | cases failed | most serious finding | this month’s launches | upstream |
|---|---|---|---|---|
| PyEphem | 7 of 18 | Alpha-5 fields decode to catalog number 0, silently, the elements unaffected (#296); a letter in a numeric field is read up to the letter, with no error (#297). | nothing to load from this feed | issue #296 (open 2026-09-25; Alpha-5 catalog numbers read as 0), issue #297 (closed 2026-10-01; a letter in a numeric field; no validation added, by the maintainer's choice for a legacy library, reopenable) |
PyEphem: ephem 4.2.1 from PyPI (2026-02-28), bundling XEphem's libastro; Python 3.14; the corpus's pyephem preset, which reports the library's refusals; reads TLE, 2LE (readtle) |
3 pass, 7 fail, 7 skip, 1 not exercised; three cases that skipped at the first round pass, since the corpus now hands a parser the provider's recorded empty answers (corpus D-143); the corrupt-input case fails on the letter O in the epoch field, read up to the letter with no error (#297) |
nothing to load from this feed: CelesTrak's TLE feed omits these objects (the group's TLE request answers HTTP 404), so a TLE-only parser on that feed has nothing to load; as Space-Track serves them (Alpha-5): 256 misidentified, every catalog number read as 0; CSV (as CelesTrak serves them): not read [snapshot 2026-09-21, 256 objects, ids 100404-100789, Alpha-5 fields beginning with A: a decoder wrong from J upward is not caught by this snapshot] | ||
| satellite.js | 8 of 18 | OMM JSON epochs are truncated to milliseconds, and the TLE catalog field is returned as a string and never decoded (#185); a letter in a numeric TLE field is read up to the letter, with no error (#190). | nothing to load from this feed | issue #185 (open 2026-09-24; OMM epoch digits and the Alpha-5 field), PR #186 (merged 2026-09-26; fixed in develop, awaiting a release), PR #187 (merged 2026-09-28; Alpha-5 decoder in develop, awaiting a release), issue #190 (open 2026-09-28; a letter in a numeric field), PR #197 (open 2026-10-02; the eleven field conversions moved to Number, from #190) |
satellite.js: npm 7.1.0, tag 7.1.0 of 2026-07-23; Node 26.5.0; the corpus's satellite.js preset, which reports no refusal because the library raises on none of the corpus's inputs; reads TLE, 2LE, OMM JSON |
2 pass, 1 within tolerance, 8 fail, 6 skip, 1 not exercised; one case that skipped at the first round passes, since the corpus now hands a parser the provider's recorded empty answers (corpus D-143); the corrupt-input case is the eighth failing case: the letter O in the epoch field is read up to the letter with no error (#190); a line one character short and a line 1 with no line 2 after it are read with no error too, which follows from the reader checking neither a line's length nor its checksum, the design of the reference C++ it descends from, recorded at the first round and not filed as a defect |
nothing to load from this feed: CelesTrak's TLE feed omits these objects (the group's TLE request answers HTTP 404), so a TLE-only parser on that feed has nothing to load; as Space-Track serves them (Alpha-5): 256 misidentified, every catalog number returned as the raw string; CSV (as CelesTrak serves them): not read; OMM JSON: not in the snapshot [snapshot 2026-09-21, 256 objects, ids 100404-100789, Alpha-5 fields beginning with A: a decoder wrong from J upward is not caught by this snapshot] | ||
| Gpredict | 7 of 18 | Alpha-5 fields become catalog number 0; the mean motion loses its last digit on every record (#426); a letter in the epoch field passes the set's checks and is read up to the letter (#427). | nothing to load from this feed | issue #426 (closed 2026-10-08; mean motion, fixed by PR #428), PR #428 (merged 2026-10-08; the mean motion read at its full eleven characters, from #426), ecosystem entry below (Alpha-5), issue #427 (open 2026-09-28; a letter in the epoch field) |
Gpredict: the SGP4 module src/sgpsdp/ of release 2.6, compiled on its own; the GTK application was not built; the recipe's harness reports the module's refusals; reads TLE, 2LE |
3 pass, 7 fail, 7 skip, 1 not exercised; three cases that skipped at the first round pass, since the corpus now hands a parser the provider's recorded empty answers (corpus D-143); the corrupt-input case fails on the letter O in the epoch field, which passes Good_Elements() and is read up to the letter (#427) |
nothing to load from this feed: CelesTrak's TLE feed omits these objects (the group's TLE request answers HTTP 404), so a TLE-only parser on that feed has nothing to load; as Space-Track serves them (Alpha-5): 256 misidentified, every catalog number read as 0; CSV (as CelesTrak serves them): not read [snapshot 2026-09-21, 256 objects, ids 100404-100789, Alpha-5 fields beginning with A: a decoder wrong from J upward is not caught by this snapshot] | ||
| gods-eye-view | 7 of 18 | Every Alpha-5 satellite collapses onto one catalog entry keyed NaN and the rest are dropped as duplicates (#751); one set with a missing line drops every set after it in its group, with nothing said (#906). | nothing to load from this feed | issue #751 (open 2026-09-24; Alpha-5 satellites collapse onto one catalog entry), PR #767 (open 2026-09-25; decoder in review, rebased onto v0.2.1 on 2026-10-03), issue #906 (open 2026-10-03; one set with a missing line drops the rest of its group) |
gods-eye-view: release v0.2.1 (aa16b7c) of 2026-10-03, the satellites ingestion layer over satellite.js 6.0.2, Cesium stood in; reads TLE |
3 pass, 7 fail, 7 skip, 1 not exercised; three cases that skipped at the first round pass, since the corpus now hands a parser the provider's recorded empty answers (corpus D-143); five of the seven fail on the mean motion, which satellite.js 6.0.2, the application's dependency, replaces with the model's own value and does not keep as printed: a property of that version of the library, not a fault of the application; three of the five fail on nothing else, and two also on a name-less 2LE file, a form the application does not read; the Alpha-5 case fails on the collapse (#751); the corrupt-input case fails on the set with no line 2 and on the valid set after it (#906), and on a line one character short and the letter O in the epoch field, both read by satellite.js with no error |
nothing to load from this feed: CelesTrak's TLE feed omits these objects (the group's TLE request answers HTTP 404), so a TLE-only parser on that feed has nothing to load; as Space-Track serves them (Alpha-5): 1 misidentified (kept under the key NaN), 255 dropped as duplicates of it; CSV (as CelesTrak serves them): not read [snapshot 2026-09-21, 256 objects, ids 100404-100789, Alpha-5 fields beginning with A: a decoder wrong from J upward is not caught by this snapshot] | ||
| SatDump | 3 of 17 (1.2.2), 5 of 17 (master) | The TLE registry silently drops every Alpha-5 set; master's CSV reader rejects CelesTrak SupGP files whole. | 1.2.2: nothing to load from this feed; master: only via CSV | issue #1221 (closed 2026-09-27; Alpha-5 sets and the SupGP CSV; a collaborator confirmed both and said fixes are planned, neither changed yet; closed by the reporter) |
SatDump: release 1.2.2 and master f3d82ad, tle.cpp and the bundled predict fork compiled on their own; reads TLE; master also CelesTrak CSV |
1.2.2: 0 pass, 3 within tolerance, 3 fail, 10 skip, 1 not exercised; master: 4 pass, 3 within tolerance, 5 fail, 4 skip, 1 not exercised |
1.2.2: nothing to load from this feed: CelesTrak's TLE feed omits these objects (the group's TLE request answers HTTP 404), so a TLE-only parser on that feed has nothing to load; as Space-Track serves them (Alpha-5): 256 dropped by the TLE registry; CSV (as CelesTrak serves them): not read. master: only via CSV: CSV (as CelesTrak serves them): 256 loaded; TLE (Alpha-5, as Space-Track serves them; rendered by the corpus from the CelesTrak CSV capture): 256 dropped [snapshot 2026-09-21, 256 objects, ids 100404-100789, Alpha-5 fields beginning with A: a decoder wrong from J upward is not caught by this snapshot] | ||
| libsgp4 | 9 of 18 | Alpha-5 decoding correct in v3.0; CelesTrak's SupGP CSV is still refused whole, and some TLE epochs still come back 8 µs off (#45). | reads them | comment on issue #44 (released 2026-09-26; v3.0 decodes every Alpha-5 vector in the corpus), comment on PR #42 (released 2026-09-26; Alpha-5 decoding in v3.0 through #46, this PR still open), issue #45 (open 2026-09-24; epoch and SupGP CSV, both unresolved in v3.0) |
libsgp4: release v3.0 (c6ebb90) of 2026-09-26, also master's head, the library's sources compiled with clang; the harness reports the library's refusals; reads TLE, 2LE, CelesTrak CSV |
5 pass, 9 fail, 3 skip, 1 not exercised; three of the nine fail only since the corpus's fail-closed rule (corpus D-144) fails a file the parser returns no record from, which CelesTrak's SupGP CSV is for this library: it refuses every row (#45); two of those three rest on a supplemental pair that the public copy of the corpus withholds, so they were never reproducible from the public corpus, and the count is the one measured on the maintainer's copy (corpus D-233); the corrupt-input case passes |
reads this month's launches in every format it reads here: TLE (Alpha-5, as Space-Track serves them; rendered by the corpus from the CelesTrak CSV capture): 256 loaded, CSV (as CelesTrak serves them): 256 loaded [snapshot 2026-09-21, 256 objects, ids 100404-100789, Alpha-5 fields beginning with A: a decoder wrong from J upward is not caught by this snapshot] | ||
| tle.js | 3 of 18 | Alpha-5 fields give NaN with no error, and two-digit epoch years pivot at 50 instead of 57 (#62); a letter in the epoch field is read up to the letter, and isValidTLE() calls the set valid (#63). | nothing to load from this feed | issue #62 (released 2026-10-19; Alpha-5 fields and the year pivot, fixed in v6.0.0 by PR #64), PR #64 (merged 2026-10-19; the Alpha-5 decoder and the pivot at 57, from #62), issue #63 (open 2026-09-28; a letter in the epoch field) |
tle.js: npm 5.0.3 of 2026-07-21 over satellite.js 6.0.2; Node 26.5.0; the corpus's tle.js and tle.js-api presets, which report no refusal because the getters raise on none of the corpus's inputs; reads TLE, 2LE |
8 pass, 3 fail, 6 skip, 1 not exercised with the epoch read from the raw fields; 8 fail when taken from the millisecond timestamp API; three cases that skipped at the first round pass, since the corpus now hands a parser the provider's recorded empty answers (corpus D-143); the corrupt-input case is the one more failing case: the letter O in the epoch field is read up to the letter and isValidTLE() calls the set valid (#63); a line one character short and a line 1 with no line 2 after it are read by the getters, which validate nothing unless asked, by design; isValidTLE() returns false for both, so neither is filed as a defect |
nothing to load from this feed: CelesTrak's TLE feed omits these objects (the group's TLE request answers HTTP 404), so a TLE-only parser on that feed has nothing to load; as Space-Track serves them (Alpha-5): 256 misidentified, every catalog number NaN; CSV (as CelesTrak serves them): not read [snapshot 2026-09-21, 256 objects, ids 100404-100789, Alpha-5 fields beginning with A: a decoder wrong from J upward is not caught by this snapshot] | ||
| astroz | 10 of 18 | Alpha-5 decoding and the epoch field fixed (#97, #98); the parser keeps no object name, so every values item from a named source fails on it. | reads them | issue #97 (released 2026-09-26; Alpha-5, fixed in v0.13.0 by #99), issue #98 (released 2026-09-26; dates, fixed in v0.13.0 by #99) |
astroz: release v0.14.0 (tag 67ca74c) of 2026-09-27, Zig 0.16.0; the harness reads the second derivative this release added and reports the library's refusals; reads TLE, 2LE, OMM JSON |
2 pass, 10 fail, 5 skip, 1 not exercised; every values item from a source that names its objects fails on the object name, which the parser does not carry; the corrupt-input case fails on the two inputs its file iterator passes over without an error, a line 2 cut short and a missing line 2 |
reads this month's launches in every format it reads here: TLE (Alpha-5, as Space-Track serves them; rendered by the corpus from the CelesTrak CSV capture): 256 loaded; CSV (as CelesTrak serves them): not read [snapshot 2026-09-21, 256 objects, ids 100404-100789, Alpha-5 fields beginning with A: a decoder wrong from J upward is not caught by this snapshot] | ||
A count is a result against that version on that date, not a verdict on the project, and it does not say how much a user is affected: some data feeds never carry the input that triggers the failure. The counts do not rank the libraries: one that reads fewer formats has fewer cases it can fail, and the skips are in the technical breakdown.
The column “this month’s launches” asks one practical question: can the software load this month’s launches, the 256 objects CelesTrak listed on 21 September 2026, every one numbered above 99,999? Six of the eight read only the TLE format, and CelesTrak leaves every such object out of its TLE feed, so their users are not affected today: the new satellites are simply absent, not misnumbered. Those parsers would misnumber or drop them only if a lettered line reached them from Space-Track or a hand-kept file. Two load them through CelesTrak’s CSV format, and two read the lettered lines correctly.
A row is a result for the version named at that date; skip means the library has no reader for the case’s format, not exercised is the runner’s data check. Every finding was reproduced on the library’s own code before it was reported. Rows are added as reports are filed, never before. Where a fix is proposed, its pull request sits beside the report with its state and date, as in the weekly table, and a report carries its own state in the same shape once a release has come: open means in review, merged means in the library’s source but in no release yet, released means a published release carries the fix, and in every case the finding stands as run against the version named until a run of the release is published. The gate column is the corpus’s gate over this month’s launches (D-142), read from the record counts each run recorded: per format the parser reads, records are loaded (returned with the expected integer id), misidentified (returned as 0, NaN, a string or a wrong number) or dropped (no record came back); CelesTrak’s TLE request for the group answers HTTP 404, so a TLE-only parser on that feed has nothing to load, and the Alpha-5 rendering stands for what Space-Track’s TLE output carries. Six of the eight read TLE only; the wording names the behaviour and never grades the project. Refused and dropped are not distinguished for the first-round runs: they were recorded before the runner’s refusal channel (corpus D-144), so a “dropped” count there may include records the library refused with an error; the second-round runs of PyEphem, Gpredict, libsgp4 and astroz were made with the channel and report the two apart, and satellite.js and tle.js raise on none of the corpus’s inputs, so their second-round rows have no refusal to report; gods-eye-view’s harness reports none at either round, the application skipping what it does not take and saying nothing.
The same runs, case by case
Each row is one of the runs in the table above, and each numbered mark is one of the test kit’s eighteen tests. Point at a mark, move to it with the arrow keys, or tap it, to see what the test expected, what the software read, and why: a report to that project, a design choice of the software, or something the software does not do at all. The rows are in the table’s order and are not ranked.
Per-case outcomes of the runs in the table above, each read from that run’s recorded report (curated, site/content/library-matrix.json); no row is of a newer run than its row above. A case that did not pass exactly lists the checks that did not, by their names in the corpus’s manifest, with the runner’s own line and what its cause is: a report the row links, the row’s own sentences, a design choice of the library, or an operation the library does not have, which the runner of that version counted as a failure and today’s skips. A check whose cause has not been reported to its project carries no line. The rows are in the table’s order, are never sorted, and carry no total.
-
- 1 epoch-year-19xx: fail
- 2 baseline-iss-five-formats: fail
- 3 six-digit-omm-saramago: pass
- 4 tle-omits-six-digit-objects: pass
- 5 analyst-objects: fail
- 6 nine-digit-supgp-launch-nominals: pass
- 7 supgp-celestrak-classification-c: fail
- 8 bstar-and-derivative-forms: fail
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: skip
- 11 mean-motion-derivative-convention: skip
- 12 tle-vs-omm-precision-loss: skip
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: skip
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: fail
-
- 1 epoch-year-19xx: fail
- 2 baseline-iss-five-formats: fail
- 3 six-digit-omm-saramago: fail
- 4 tle-omits-six-digit-objects: pass
- 5 analyst-objects: fail
- 6 nine-digit-supgp-launch-nominals: fail
- 7 supgp-celestrak-classification-c: fail
- 8 bstar-and-derivative-forms: within tolerance
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: pass
- 11 mean-motion-derivative-convention: skip
- 12 tle-vs-omm-precision-loss: skip
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: skip
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: fail
-
- 1 epoch-year-19xx: fail
- 2 baseline-iss-five-formats: fail
- 3 six-digit-omm-saramago: pass
- 4 tle-omits-six-digit-objects: pass
- 5 analyst-objects: fail
- 6 nine-digit-supgp-launch-nominals: pass
- 7 supgp-celestrak-classification-c: fail
- 8 bstar-and-derivative-forms: fail
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: skip
- 11 mean-motion-derivative-convention: skip
- 12 tle-vs-omm-precision-loss: skip
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: skip
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: fail
-
- 1 epoch-year-19xx: fail
- 2 baseline-iss-five-formats: fail
- 3 six-digit-omm-saramago: pass
- 4 tle-omits-six-digit-objects: pass
- 5 analyst-objects: fail
- 6 nine-digit-supgp-launch-nominals: pass
- 7 supgp-celestrak-classification-c: fail
- 8 bstar-and-derivative-forms: fail
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: skip
- 11 mean-motion-derivative-convention: skip
- 12 tle-vs-omm-precision-loss: skip
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: skip
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: fail
-
- 1 epoch-year-19xx: fail
- 2 baseline-iss-five-formats: fail
- 3 six-digit-omm-saramago: skip
- 4 tle-omits-six-digit-objects: skip
- 5 analyst-objects: within tolerance
- 6 nine-digit-supgp-launch-nominals: skip
- 7 supgp-celestrak-classification-c: within tolerance
- 8 bstar-and-derivative-forms: within tolerance
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: skip
- 11 mean-motion-derivative-convention: skip
- 12 tle-vs-omm-precision-loss: skip
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: skip
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: not a case of that version
-
- 1 epoch-year-19xx: fail
- 2 baseline-iss-five-formats: fail
- 3 six-digit-omm-saramago: pass
- 4 tle-omits-six-digit-objects: pass
- 5 analyst-objects: within tolerance
- 6 nine-digit-supgp-launch-nominals: fail
- 7 supgp-celestrak-classification-c: fail
- 8 bstar-and-derivative-forms: within tolerance
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: pass
- 11 mean-motion-derivative-convention: pass
- 12 tle-vs-omm-precision-loss: within tolerance
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: skip
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: not a case of that version
-
- 1 epoch-year-19xx: pass
- 2 baseline-iss-five-formats: pass
- 3 six-digit-omm-saramago: pass
- 4 tle-omits-six-digit-objects: pass
- 5 analyst-objects: fail
- 6 nine-digit-supgp-launch-nominals: fail
- 7 supgp-celestrak-classification-c: fail
- 8 bstar-and-derivative-forms: fail
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: fail
- 11 mean-motion-derivative-convention: fail
- 12 tle-vs-omm-precision-loss: fail
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: fail
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: pass
-
- 1 epoch-year-19xx: pass
- 2 baseline-iss-five-formats: pass
- 3 six-digit-omm-saramago: pass
- 4 tle-omits-six-digit-objects: pass
- 5 analyst-objects: pass
- 6 nine-digit-supgp-launch-nominals: pass
- 7 supgp-celestrak-classification-c: pass
- 8 bstar-and-derivative-forms: pass
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: skip
- 11 mean-motion-derivative-convention: skip
- 12 tle-vs-omm-precision-loss: skip
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: fail
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: fail
-
- 1 epoch-year-19xx: fail
- 2 baseline-iss-five-formats: fail
- 3 six-digit-omm-saramago: pass
- 4 tle-omits-six-digit-objects: pass
- 5 analyst-objects: fail
- 6 nine-digit-supgp-launch-nominals: pass
- 7 supgp-celestrak-classification-c: fail
- 8 bstar-and-derivative-forms: fail
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: skip
- 11 mean-motion-derivative-convention: skip
- 12 tle-vs-omm-precision-loss: skip
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: fail
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: fail
-
- 1 epoch-year-19xx: fail
- 2 baseline-iss-five-formats: fail
- 3 six-digit-omm-saramago: fail
- 4 tle-omits-six-digit-objects: pass
- 5 analyst-objects: fail
- 6 nine-digit-supgp-launch-nominals: fail
- 7 supgp-celestrak-classification-c: fail
- 8 bstar-and-derivative-forms: fail
- 9 satcat-70000-cutoff: not exercised
- 10 csv-json-omitted-mandatory-fields: pass
- 11 mean-motion-derivative-convention: skip
- 12 tle-vs-omm-precision-loss: skip
- 13 omm-xml-schema: skip
- 14 alpha5-encoding-vectors: fail
- 15 alpha5-tle-derived: fail
- 16 kvn-syntax-variants: skip
- 17 tle-writer-alpha5: skip
- 18 corrupt-input: fail
- pass: every item of the case matched exactly
- within tolerance: matched within the corpus’s stated tolerances
- fail: at least one check of the case did not pass
- skip: the library has no reader for the case’s format
- not exercised: the runner’s own data check, which involves no parser
Point at a mark, or move to one with the Tab key and then the arrow keys, to read it here.
· case ·
PyEphem 4.2.1
Corpus v0.4.0. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
satellite.js 7.1.0
Corpus v0.4.0. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
- case 1
epoch-year-19xx· fail - case 2
baseline-iss-five-formats· fail - case 3
six-digit-omm-saramago· fail - case 5
analyst-objects· fail - case 6
nine-digit-supgp-launch-nominals· fail - case 7
supgp-celestrak-classification-c· fail - case 8
bstar-and-derivative-forms· within tolerance - case 15
alpha5-tle-derived· fail - case 18
corrupt-input· fail
Gpredict 2.6
Corpus v0.4.0. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
gods-eye-view 0.2.1
Corpus v0.5.0. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
SatDump 1.2.2
Corpus v0.2.1. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
SatDump master
Corpus v0.2.1. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
- case 1
epoch-year-19xx· fail - case 2
baseline-iss-five-formats· fail - case 5
analyst-objects· within tolerance - case 6
nine-digit-supgp-launch-nominals· fail - case 7
supgp-celestrak-classification-c· fail - case 8
bstar-and-derivative-forms· within tolerance - case 12
tle-vs-omm-precision-loss· within tolerance - case 15
alpha5-tle-derived· fail
libsgp4 3.0
Corpus v0.4.0. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
- case 5
analyst-objects· fail - case 6
nine-digit-supgp-launch-nominals· fail - case 7
supgp-celestrak-classification-c· fail - case 8
bstar-and-derivative-forms· fail - case 10
csv-json-omitted-mandatory-fields· fail - case 11
mean-motion-derivative-convention· fail - case 12
tle-vs-omm-precision-loss· fail - case 14
alpha5-encoding-vectors· fail - case 15
alpha5-tle-derived· fail
tle.js 5.0.3, raw fields
Corpus v0.4.0. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
tle.js 5.0.3, timestamp API
Corpus v0.4.0. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
astroz 0.14.0
Corpus v0.4.0. Its row in the table above has the version, the date and the reports. The cases that did not pass exactly:
- case 1
epoch-year-19xx· fail - case 2
baseline-iss-five-formats· fail - case 3
six-digit-omm-saramago· fail - case 5
analyst-objects· fail - case 6
nine-digit-supgp-launch-nominals· fail - case 7
supgp-celestrak-classification-c· fail - case 8
bstar-and-derivative-forms· fail - case 14
alpha5-encoding-vectors· fail - case 15
alpha5-tle-derived· fail - case 18
corrupt-input· fail
PyEphem 4.2.1 › case 1 › fail
epoch-year-19xx: ISS first GP record (1998): two-digit epoch year 98, seven renderings of one record. Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · eccentricityread0.012536199763417244expected0.0125362(a design choice of the library, recorded in corpus D-128)negative-bstar-and-ndot· 2 itemsExpected BSTAR and the first derivative can be negative; parsers must keep the sign.Read id 25544 · mean_motion_dotread-0.00003656999979284592expected-0.00003657(a design choice of the library, recorded in corpus D-128)
PyEphem 4.2.1 › case 2 › fail
baseline-iss-five-formats: ISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live). Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · eccentricityread0.0004825000069104135expected0.0004825(a design choice of the library, recorded in corpus D-128)
PyEphem 4.2.1 › case 5 › fail
analyst-objects: Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 81011 · eccentricityread0.013431699946522713expected0.0134317(a design choice of the library, recorded in corpus D-128)
PyEphem 4.2.1 › case 7 › fail
supgp-celestrak-classification-c: CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids. Corpus v0.4.0.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 72000 · eccentricityread0.0010264000156894326expected0.0010264(a design choice of the library, recorded in corpus D-128)
PyEphem 4.2.1 › case 8 › fail
bstar-and-derivative-forms: Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 20453 · eccentricityread0.0022511999122798443expected0.0022512(a design choice of the library, recorded in corpus D-128)bstar-implied-decimal-exponent· 3 itemsExpected TLE BSTAR and second-derivative fields are +/-NNNNN+/-E with an implied leading decimal point: ' 15975-3' is 0.15975e-3; zero is written ' 00000+0'.Read id 20453 · bstarread0.0007598900119774044expected0.00075989(a design choice of the library, recorded in corpus D-128)negative-bstar-and-ndot· 3 itemsExpected BSTAR and the first derivative can be negative; parsers must keep the sign.Read id 57422 · bstarread-0.0000027414000669523375expected-0.0000027414(a design choice of the library, recorded in corpus D-128)
PyEphem 4.2.1 › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.4.0.
values· 4 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 expected record(s) not returned, e.g. [100000]; 1 unexpected record id(s), e.g. [0] (reported in #296)tle-catalog-field-decodes· 4 itemsExpected Columns 3-7 of TLE lines 1 and 2 decode to the same integer (five digits, or Alpha-5 letter + four digits).Read 1 catalog field(s) not decoded to the right integer, e.g. [100000] (reported in #296)
PyEphem 4.2.1 › case 18 › fail
corrupt-input: Corrupt input between valid records: a wrong checksum digit, a line one character short, a letter in a numeric field, a set missing its second line, a file cut mid-record. Corpus v0.4.0.
corrupt-tle-letter-in-number· 1 itemExpected A TLE set with the letter O in place of a 0 in line 1's epoch field is refused with a reason, not read as a record with a wrong epoch and not dropped silently.Read epochread'2026-07-08T16:48:00.000000'unedited'2026-07-08T17:02:16.167840'(reported in #297)
satellite.js 7.1.0 › case 1 › fail
epoch-year-19xx: ISS first GP record (1998): two-digit epoch year 98, seven renderings of one record. Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · epochread'1998-11-20T06:49:59.999000'expected'1998-11-20T06:49:59.999808'(reported in #185)tle-values-match-omm-within-tle-precision· 1 itemExpected The TLE rendering equals the OMM values except: eccentricity truncated to 7 digits, BSTAR and second derivative rounded (half up) to a 5-digit mantissa, epoch at 1e-8 day resolution.Read id 25544 · epochTLE1998-11-20T06:49:59.999808OMM1998-11-20T06:49:59.999000(reported in #185)
satellite.js 7.1.0 › case 2 › fail
baseline-iss-five-formats: ISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live). Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · epochread'2026-09-20T12:42:37.141000'expected'2026-09-20T12:42:37.141056'(reported in #185)
satellite.js 7.1.0 › case 3 › fail
six-digit-omm-saramago: Catalog number 100000 (SARAMAGO): first 6-digit object, OMM formats only, TLE unavailable. Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 100000 · epochread'2026-07-14T21:45:20.933000'expected'2026-07-14T21:45:20.933856'(reported in #185)
satellite.js 7.1.0 › case 5 › fail
analyst-objects: Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 81011 · epochread'2026-09-19T01:05:16.147000'expected'2026-09-19T01:05:16.147392'(reported in #185)
satellite.js 7.1.0 › case 6 › fail
nine-digit-supgp-launch-nominals: Nine-digit catalog numbers: launch nominals of the 18th Space Defense Squadron (18 SDS), 7995016xx, in CelesTrak SupGP data. Corpus v0.4.0.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 799501621 · epochread'2026-09-20T20:39:42.000000'expected'2026-09-20T20:39:42.000019'(reported in #185)
satellite.js 7.1.0 › case 7 › fail
supgp-celestrak-classification-c: CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids. Corpus v0.4.0.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 72000 · epochread'2026-09-20T02:49:15.220000'expected'2026-09-20T02:49:15.220042'(reported in #185)
satellite.js 7.1.0 › case 8 › within tolerance
bstar-and-derivative-forms: Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read within tolerance: mean_motion n=18 mean=+2.29e-20rel max=1.26e-16rel; arg_of_pericenter n=9 mean=+4.18e-17rel max=2.48e-16rel
satellite.js 7.1.0 › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.4.0.
values· 4 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 record(s) whose norad_cat_id is not an integer, e.g. 'A0000' (str); 1 expected record(s) not returned, e.g. [100000] (reported in #185)tle-catalog-field-decodes· 4 itemsExpected Columns 3-7 of TLE lines 1 and 2 decode to the same integer (five digits, or Alpha-5 letter + four digits).Read 1 catalog field(s) not decoded to the right integer, e.g. [100000] (reported in #185)
satellite.js 7.1.0 › case 18 › fail
corrupt-input: Corrupt input between valid records: a wrong checksum digit, a line one character short, a letter in a numeric field, a set missing its second line, a file cut mid-record. Corpus v0.4.0.
corrupt-tle-line-short· 1 itemExpected A TLE set whose line 2 has lost one character mid-line (a digit of the eccentricity), so that it is 68 characters and every column after the cut has moved one to the left, is refused with a reason.Read mean_motionread1.623733631unedited11.62373363(the cause is in this library’s row)corrupt-tle-letter-in-number· 1 itemExpected A TLE set with the letter O in place of a 0 in line 1's epoch field is refused with a reason, not read as a record with a wrong epoch and not dropped silently.Read epochread'2026-07-08T16:48:00.000000'unedited'2026-07-08T17:02:16.167840'(reported in #190)corrupt-tle-missing-line-2· 1 itemExpected A TLE set whose line 1 is followed directly by the next set's name line: the orphan line 1 is refused with a reason.Read mean_motionreadNoneunedited11.62373363(the cause is in this library’s row)
Gpredict 2.6 › case 1 › fail
epoch-year-19xx: ISS first GP record (1998): two-digit epoch year 98, seven renderings of one record. Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · mean_motionread16.0506483expected16.05064833(reported in #426)
Gpredict 2.6 › case 2 › fail
baseline-iss-five-formats: ISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live). Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · mean_motionread15.4919679expected15.49196792(reported in #426)
Gpredict 2.6 › case 5 › fail
analyst-objects: Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 81011 · mean_motionread14.086477expected14.08647708(reported in #426)
Gpredict 2.6 › case 7 › fail
supgp-celestrak-classification-c: CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids. Corpus v0.4.0.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 72000 · mean_motionread16.0591224expected16.05912245(reported in #426)
Gpredict 2.6 › case 8 › fail
bstar-and-derivative-forms: Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 20453 · mean_motionread15.9678869expected15.96788691(reported in #426)
Gpredict 2.6 › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.4.0.
values· 4 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 expected record(s) not returned, e.g. [100000]; 1 unexpected record id(s), e.g. [0] (the cause is in this library’s row)tle-catalog-field-decodes· 4 itemsExpected Columns 3-7 of TLE lines 1 and 2 decode to the same integer (five digits, or Alpha-5 letter + four digits).Read 1 catalog field(s) not decoded to the right integer, e.g. [100000] (the cause is in this library’s row)
Gpredict 2.6 › case 18 › fail
corrupt-input: Corrupt input between valid records: a wrong checksum digit, a line one character short, a letter in a numeric field, a set missing its second line, a file cut mid-record. Corpus v0.4.0.
corrupt-tle-letter-in-number· 1 itemExpected A TLE set with the letter O in place of a 0 in line 1's epoch field is refused with a reason, not read as a record with a wrong epoch and not dropped silently.Read epochread'2026-07-08T16:48:00.000000'unedited'2026-07-08T17:02:16.167840'(reported in #427)
gods-eye-view 0.2.1 › case 1 › fail
epoch-year-19xx: ISS first GP record (1998): two-digit epoch year 98, seven renderings of one record. Corpus v0.5.0.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · mean_motionread16.048747893633813expected16.05064833(the cause is in this library’s row)records-returned· 1 itemExpected A file the corpus's own reader reads records from yields records; a parser that returns none for it fails the file, and no other check on it runs.Read parser returned 0 of 1 record(s): 1 dropped (refusals not reported by this adapter) (the cause is in this library’s row)
gods-eye-view 0.2.1 › case 2 › fail
baseline-iss-five-formats: ISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live). Corpus v0.5.0.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · mean_motionread15.490241252712966expected15.49196792(the cause is in this library’s row)records-returned· 1 itemExpected A file the corpus's own reader reads records from yields records; a parser that returns none for it fails the file, and no other check on it runs.Read parser returned 0 of 1 record(s): 1 dropped (refusals not reported by this adapter) (the cause is in this library’s row)
gods-eye-view 0.2.1 › case 5 › fail
analyst-objects: Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones. Corpus v0.5.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 81011 · mean_motionread14.094648204110708expected14.08647708(the cause is in this library’s row)
gods-eye-view 0.2.1 › case 7 › fail
supgp-celestrak-classification-c: CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids. Corpus v0.5.0.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 72000 · mean_motionread16.066944276364875expected16.05912245(the cause is in this library’s row)
gods-eye-view 0.2.1 › case 8 › fail
bstar-and-derivative-forms: Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields. Corpus v0.5.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 20453 · mean_motionread15.956197256374303expected15.96788691(the cause is in this library’s row)
gods-eye-view 0.2.1 › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.5.0.
values· 4 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 record(s) without norad_cat_id; 1 expected record(s) not returned, e.g. [100000] (reported in #751)tle-catalog-field-decodes· 4 itemsExpected Columns 3-7 of TLE lines 1 and 2 decode to the same integer (five digits, or Alpha-5 letter + four digits).Read 1 catalog field(s) not decoded to the right integer, e.g. [100000] (reported in #751)
gods-eye-view 0.2.1 › case 18 › fail
corrupt-input: Corrupt input between valid records: a wrong checksum digit, a line one character short, a letter in a numeric field, a set missing its second line, a file cut mid-record. Corpus v0.5.0.
corrupt-tle-line-short· 1 itemExpected A TLE set whose line 2 has lost one character mid-line (a digit of the eccentricity), so that it is 68 characters and every column after the cut has moved one to the left, is refused with a reason.Read mean_motionread1.6236713535852212unedited11.617581822814529(the cause is in this library’s row)corrupt-tle-letter-in-number· 1 itemExpected A TLE set with the letter O in place of a 0 in line 1's epoch field is refused with a reason, not read as a record with a wrong epoch and not dropped silently.Read epochread'2026-07-08T16:48:00.000000'unedited'2026-07-08T17:02:16.167840'(the cause is in this library’s row)corrupt-tle-missing-line-2· 1 itemExpected A TLE set whose line 1 is followed directly by the next set's name line: the orphan line 1 is refused with a reason.Read the corrupt record dropped (refusals not reported by this adapter) (reported in #906)corrupt-input-neighbours-load· 1 itemExpected The valid records around each corrupt input load exactly as the same parser reads them from the unedited file: the corrupt input changes nothing about them, so the parser picks up again after it.Read 1 of 2 valid set(s) around the corrupt one loaded as the parser reads them from the unedited file unedited-sets.tle; 20453 dropped (reported in #906)
SatDump 1.2.2 › case 1 › fail
epoch-year-19xx: ISS first GP record (1998): two-digit epoch year 98, seven renderings of one record. Corpus v0.2.1.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 expected record(s) not returned, e.g. [25544] (a design choice of the library)two-digit-year-pivot· 1 itemExpected TLE epoch years 57-99 map to 1957-1999 and 00-56 to 2000-2056; the resulting ISO epoch equals the OMM EPOCH string.Read epoch mismatch for ids [25544] (a design choice of the library)
SatDump 1.2.2 › case 2 › fail
baseline-iss-five-formats: ISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live). Corpus v0.2.1.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 expected record(s) not returned, e.g. [25544] (a design choice of the library)two-digit-year-pivot· 1 itemExpected TLE epoch years 57-99 map to 1957-1999 and 00-56 to 2000-2056; the resulting ISO epoch equals the OMM EPOCH string.Read epoch mismatch for ids [25544] (a design choice of the library)
SatDump 1.2.2 › case 5 › within tolerance
analyst-objects: Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones. Corpus v0.2.1.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read within tolerance: bstar n=110 mean=+1.35e-16rel max=2.7e-16rel; eccentricity n=58 mean=-1.02e-16rel max=2.11e-16rel
SatDump 1.2.2 › case 7 › within tolerance
supgp-celestrak-classification-c: CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids. Corpus v0.2.1.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read within tolerance: eccentricity n=1 mean=-1.94e-16rel max=1.94e-16rel; bstar n=1 mean=+1.78e-16rel max=1.78e-16rel
SatDump 1.2.2 › case 8 › within tolerance
bstar-and-derivative-forms: Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields. Corpus v0.2.1.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read within tolerance: mean_motion_ddot n=39 mean=+1.4e-16rel max=2.75e-16rel; bstar n=42 mean=+1.47e-16rel max=2.38e-16rel
SatDump 1.2.2 › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.2.1.
values· 4 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 expected record(s) not returned, e.g. [100000] (reported in #1221)tle-catalog-field-decodes· 4 itemsExpected Columns 3-7 of TLE lines 1 and 2 decode to the same integer (five digits, or Alpha-5 letter + four digits).Read 1 catalog field(s) not decoded to the right integer, e.g. [100000] (reported in #1221)
SatDump master › case 1 › fail
epoch-year-19xx: ISS first GP record (1998): two-digit epoch year 98, seven renderings of one record. Corpus v0.2.1.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 expected record(s) not returned, e.g. [25544] (a design choice of the library)two-digit-year-pivot· 1 itemExpected TLE epoch years 57-99 map to 1957-1999 and 00-56 to 2000-2056; the resulting ISO epoch equals the OMM EPOCH string.Read epoch mismatch for ids [25544] (a design choice of the library)
SatDump master › case 2 › fail
baseline-iss-five-formats: ISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live). Corpus v0.2.1.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 expected record(s) not returned, e.g. [25544] (a design choice of the library)two-digit-year-pivot· 1 itemExpected TLE epoch years 57-99 map to 1957-1999 and 00-56 to 2000-2056; the resulting ISO epoch equals the OMM EPOCH string.Read epoch mismatch for ids [25544] (a design choice of the library)
SatDump master › case 5 › within tolerance
analyst-objects: Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones. Corpus v0.2.1.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read within tolerance: bstar n=110 mean=+1.35e-16rel max=2.7e-16rel; eccentricity n=58 mean=-1.02e-16rel max=2.11e-16rel
SatDump master › case 6 › fail
nine-digit-supgp-launch-nominals: Nine-digit catalog numbers: launch nominals of the 18th Space Defense Squadron (18 SDS), 7995016xx, in CelesTrak SupGP data. Corpus v0.2.1.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 expected record(s) not returned, e.g. [799501621] (reported in #1221)
SatDump master › case 7 › fail
supgp-celestrak-classification-c: CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids. Corpus v0.2.1.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 2 expected record(s) not returned, e.g. [72000, 72001] (reported in #1221)
SatDump master › case 8 › within tolerance
bstar-and-derivative-forms: Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields. Corpus v0.2.1.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read within tolerance: mean_motion_ddot n=39 mean=+1.4e-16rel max=2.75e-16rel; bstar n=42 mean=+1.47e-16rel max=2.38e-16reltle-values-match-omm-within-tle-precision· 2 itemsExpected The TLE rendering equals the OMM values except: eccentricity truncated to 7 digits, BSTAR and second derivative rounded (half up) to a 5-digit mantissa, epoch at 1e-8 day resolution.Read within tolerance: bstar n=42 mean=+1.47e-16rel max=2.38e-16rel; mean_motion_ddot n=39 mean=+1.4e-16rel max=2.75e-16rel
SatDump master › case 12 › within tolerance
tle-vs-omm-precision-loss: The TLE is a lossy rendering of the OMM record: eccentricity truncated, BSTAR/DDOT mantissa rounded, epoch quantised. Corpus v0.2.1.
tle-values-match-omm-within-tle-precision· 5 itemsExpected The TLE rendering equals the OMM values except: eccentricity truncated to 7 digits, BSTAR and second derivative rounded (half up) to a 5-digit mantissa, epoch at 1e-8 day resolution.Read within tolerance: eccentricity n=1 mean=-7.98e-17rel max=7.98e-17rel; mean_motion_ddot n=1 mean=+8.65e-17rel max=8.65e-17rel
SatDump master › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.2.1.
values· 4 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 expected record(s) not returned, e.g. [100000] (reported in #1221)tle-catalog-field-decodes· 4 itemsExpected Columns 3-7 of TLE lines 1 and 2 decode to the same integer (five digits, or Alpha-5 letter + four digits).Read 1 catalog field(s) not decoded to the right integer, e.g. [100000] (reported in #1221)
libsgp4 3.0 › case 5 › fail
analyst-objects: Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones. Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 81011 · epochread'2026-09-19T01:05:16.147400'expected'2026-09-19T01:05:16.147392'(reported in #45)
libsgp4 3.0 › case 6 › fail
nine-digit-supgp-launch-nominals: Nine-digit catalog numbers: launch nominals of the 18th Space Defense Squadron (18 SDS), 7995016xx, in CelesTrak SupGP data. Corpus v0.4.0.
records-returned· 2 itemsExpected A file the corpus's own reader reads records from yields records; a parser that returns none for it fails the file, and no other check on it runs.Read parser returned 0 of 1 record(s): 1 refused with a reason (TleException: Invalid CSV field count) (reported in #45)
libsgp4 3.0 › case 7 › fail
supgp-celestrak-classification-c: CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids. Corpus v0.4.0.
records-returned· 1 itemExpected A file the corpus's own reader reads records from yields records; a parser that returns none for it fails the file, and no other check on it runs.Read parser returned 0 of 2 record(s): 2 refused with a reason (TleException: Invalid CSV field count) (reported in #45)values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 72000 · epochread'2026-09-20T02:49:15.220120'expected'2026-09-20T02:49:15.220128'(reported in #45)
libsgp4 3.0 › case 8 › fail
bstar-and-derivative-forms: Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields. Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 45062 · epochread'2026-09-20T10:50:08.361896'expected'2026-09-20T10:50:08.361888'(reported in #45)
libsgp4 3.0 › case 10 › fail
csv-json-omitted-mandatory-fields: CelesTrak CSV and JSON omit the constant mandatory metadata keywords. Corpus v0.4.0.
records-returned· 1 itemExpected A file the corpus's own reader reads records from yields records; a parser that returns none for it fails the file, and no other check on it runs.Read parser returned 0 of 1 record(s): 1 refused with a reason (TleException: Invalid CSV field count) (reported in #45)
libsgp4 3.0 › case 11 › fail
mean-motion-derivative-convention: MEAN_MOTION_DOT / MEAN_MOTION_DDOT in the OMM equal the TLE fields as printed. Corpus v0.4.0.
records-returned· 1 itemExpected A file the corpus's own reader reads records from yields records; a parser that returns none for it fails the file, and no other check on it runs.Read parser returned 0 of 2 record(s): 2 refused with a reason (TleException: Invalid CSV field count) (reported in #45)
libsgp4 3.0 › case 12 › fail
tle-vs-omm-precision-loss: The TLE is a lossy rendering of the OMM record: eccentricity truncated, BSTAR/DDOT mantissa rounded, epoch quantised. Corpus v0.4.0.
records-returned· 1 itemExpected A file the corpus's own reader reads records from yields records; a parser that returns none for it fails the file, and no other check on it runs.Read parser returned 0 of 2 record(s): 2 refused with a reason (TleException: Invalid CSV field count) (reported in #45)
libsgp4 3.0 › case 14 › fail
alpha5-encoding-vectors: Specification vectors: the Alpha-5 table with boundaries and invalid inputs, catalog-id text forms, the two-digit-year pivot and CCSDS epoch strings. Corpus v0.4.0.
alpha5-encode· 1 itemExpected Integers 100000-339999 encode to the Alpha-5 table; below 100000 encode as five digits with leading zeros; above 339999 cannot be encoded.Read input 100000read'raised ValueError'expected'A0000'(the library has no such operation)ccsds-epoch-strings· 1 itemExpected parse_epoch accepts every CCSDS 502.0-B-3 7.5.10 epoch form in vectors/ccsds-epoch-strings.json (calendar and day-of-year, with or without a fraction and a Z, second 60) and returns the instant each denotes (within 2 us; a leap second may read as 23:59:59 or as the next midnight), and rejects the five invalid forms.catalog-number-is-integer· 1 itemExpected NORAD_CAT_ID parses as an integer in every OMM format, including values of six and nine digits, and a ten-digit value is rejected (CCSDS allows up to nine digits); leading zeros and an explicit '+' are legal in KVN.Read '1000000000' accepted as 1000000000 (should be rejected: ten digits exceed 'up to nine digits'; schema xsd:integer would accept it, the standard's text does not) (reported in #45)
libsgp4 3.0 › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 100407 · epochread'2026-09-20T15:02:50.762696'expected'2026-09-20T15:02:50.762688'(reported in #45)
tle.js 5.0.3, raw fields › case 14 › fail
alpha5-encoding-vectors: Specification vectors: the Alpha-5 table with boundaries and invalid inputs, catalog-id text forms, the two-digit-year pivot and CCSDS epoch strings. Corpus v0.4.0.
alpha5-decode· 1 itemExpected An Alpha-5 catalog field decodes as (letter value)*10000 + digits with A=10 ... Z=33 and I, O unused; 'I', 'O' and lowercase are invalid.Read input A0000readNaNexpected100000(reported in #62)alpha5-encode· 1 itemExpected Integers 100000-339999 encode to the Alpha-5 table; below 100000 encode as five digits with leading zeros; above 339999 cannot be encoded.Read input 100000read'raised ValueError'expected'A0000'(the library has no such operation)two-digit-year-pivot· 1 itemExpected TLE epoch years 57-99 map to 1957-1999 and 00-56 to 2000-2056; the resulting ISO epoch equals the OMM EPOCH string.Read 56 -> 1956 (reported in #62)ccsds-epoch-strings· 1 itemExpected parse_epoch accepts every CCSDS 502.0-B-3 7.5.10 epoch form in vectors/ccsds-epoch-strings.json (calendar and day-of-year, with or without a fraction and a Z, second 60) and returns the instant each denotes (within 2 us; a leap second may read as 23:59:59 or as the next midnight), and rejects the five invalid forms.Read valid '2020-064T10:34:41.4264' rejected (ValueError) (the library has no such operation)catalog-number-is-integer· 1 itemExpected NORAD_CAT_ID parses as an integer in every OMM format, including values of six and nine digits, and a ten-digit value is rejected (CCSDS allows up to nine digits); leading zeros and an explicit '+' are legal in KVN.Read input '25544'read'raised ValueError'expectedint 25544(the library has no such operation)
tle.js 5.0.3, raw fields › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.4.0.
values· 4 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 record(s) whose norad_cat_id is not an integer, e.g. 'NaN' (str); 1 expected record(s) not returned, e.g. [100000] (reported in #62)tle-catalog-field-decodes· 4 itemsExpected Columns 3-7 of TLE lines 1 and 2 decode to the same integer (five digits, or Alpha-5 letter + four digits).Read 1 catalog field(s) not decoded to the right integer, e.g. [100000] (reported in #62)
tle.js 5.0.3, raw fields › case 18 › fail
corrupt-input: Corrupt input between valid records: a wrong checksum digit, a line one character short, a letter in a numeric field, a set missing its second line, a file cut mid-record. Corpus v0.4.0.
corrupt-tle-line-short· 1 itemExpected A TLE set whose line 2 has lost one character mid-line (a digit of the eccentricity), so that it is 68 characters and every column after the cut has moved one to the left, is refused with a reason.Read mean_motionread1.623733631unedited11.62373363(the cause is in this library’s row)corrupt-tle-letter-in-number· 1 itemExpected A TLE set with the letter O in place of a 0 in line 1's epoch field is refused with a reason, not read as a record with a wrong epoch and not dropped silently.Read epochread'2026-07-08T16:48:00.000000'unedited'2026-07-08T17:02:16.167840'(reported in #63)corrupt-tle-missing-line-2· 1 itemExpected A TLE set whose line 1 is followed directly by the next set's name line: the orphan line 1 is refused with a reason.Read mean_motionreadNoneunedited11.62373363(the cause is in this library’s row)
tle.js 5.0.3, timestamp API › case 1 › fail
epoch-year-19xx: ISS first GP record (1998): two-digit epoch year 98, seven renderings of one record. Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · epochread'1998-11-20T06:49:59.999000'expected'1998-11-20T06:49:59.999808'(the cause is in this library’s row)two-digit-year-pivot· 2 itemsExpected TLE epoch years 57-99 map to 1957-1999 and 00-56 to 2000-2056; the resulting ISO epoch equals the OMM EPOCH string.Read epoch mismatch for ids [25544] (the cause is in this library’s row)
tle.js 5.0.3, timestamp API › case 2 › fail
baseline-iss-five-formats: ISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live). Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · epochread'2026-09-20T12:42:37.141000'expected'2026-09-20T12:42:37.141056'(the cause is in this library’s row)two-digit-year-pivot· 2 itemsExpected TLE epoch years 57-99 map to 1957-1999 and 00-56 to 2000-2056; the resulting ISO epoch equals the OMM EPOCH string.Read epoch mismatch for ids [25544] (the cause is in this library’s row)
tle.js 5.0.3, timestamp API › case 5 › fail
analyst-objects: Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 81011 · epochread'2026-09-19T01:05:16.147000'expected'2026-09-19T01:05:16.147392'(the cause is in this library’s row)
tle.js 5.0.3, timestamp API › case 7 › fail
supgp-celestrak-classification-c: CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids. Corpus v0.4.0.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 72000 · epochread'2026-09-20T02:49:15.220000'expected'2026-09-20T02:49:15.220128'(the cause is in this library’s row)
tle.js 5.0.3, timestamp API › case 8 › fail
bstar-and-derivative-forms: Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 20453 · epochread'2026-09-20T13:39:33.839000'expected'2026-09-20T13:39:33.839424'(the cause is in this library’s row)
tle.js 5.0.3, timestamp API › case 14 › fail
alpha5-encoding-vectors: Specification vectors: the Alpha-5 table with boundaries and invalid inputs, catalog-id text forms, the two-digit-year pivot and CCSDS epoch strings. Corpus v0.4.0.
alpha5-decode· 1 itemExpected An Alpha-5 catalog field decodes as (letter value)*10000 + digits with A=10 ... Z=33 and I, O unused; 'I', 'O' and lowercase are invalid.Read input A0000readNaNexpected100000(reported in #62)alpha5-encode· 1 itemExpected Integers 100000-339999 encode to the Alpha-5 table; below 100000 encode as five digits with leading zeros; above 339999 cannot be encoded.Read input 100000read'raised ValueError'expected'A0000'(the library has no such operation)two-digit-year-pivot· 1 itemExpected TLE epoch years 57-99 map to 1957-1999 and 00-56 to 2000-2056; the resulting ISO epoch equals the OMM EPOCH string.Read 56 -> 1956 (reported in #62)ccsds-epoch-strings· 1 itemExpected parse_epoch accepts every CCSDS 502.0-B-3 7.5.10 epoch form in vectors/ccsds-epoch-strings.json (calendar and day-of-year, with or without a fraction and a Z, second 60) and returns the instant each denotes (within 2 us; a leap second may read as 23:59:59 or as the next midnight), and rejects the five invalid forms.Read valid '2020-064T10:34:41.4264' rejected (ValueError) (the library has no such operation)catalog-number-is-integer· 1 itemExpected NORAD_CAT_ID parses as an integer in every OMM format, including values of six and nine digits, and a ten-digit value is rejected (CCSDS allows up to nine digits); leading zeros and an explicit '+' are legal in KVN.Read input '25544'read'raised ValueError'expectedint 25544(the library has no such operation)
tle.js 5.0.3, timestamp API › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.4.0.
values· 4 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read 1 record(s) whose norad_cat_id is not an integer, e.g. 'NaN' (str); 1 expected record(s) not returned, e.g. [100000] (reported in #62)tle-catalog-field-decodes· 4 itemsExpected Columns 3-7 of TLE lines 1 and 2 decode to the same integer (five digits, or Alpha-5 letter + four digits).Read 1 catalog field(s) not decoded to the right integer, e.g. [100000] (reported in #62)
tle.js 5.0.3, timestamp API › case 18 › fail
corrupt-input: Corrupt input between valid records: a wrong checksum digit, a line one character short, a letter in a numeric field, a set missing its second line, a file cut mid-record. Corpus v0.4.0.
corrupt-tle-line-short· 1 itemExpected A TLE set whose line 2 has lost one character mid-line (a digit of the eccentricity), so that it is 68 characters and every column after the cut has moved one to the left, is refused with a reason.Read mean_motionread1.623733631unedited11.62373363(the cause is in this library’s row)corrupt-tle-letter-in-number· 1 itemExpected A TLE set with the letter O in place of a 0 in line 1's epoch field is refused with a reason, not read as a record with a wrong epoch and not dropped silently.Read epochread'2026-07-08T16:48:00.000000'unedited'2026-07-08T17:02:16.167000'(reported in #63)corrupt-tle-missing-line-2· 1 itemExpected A TLE set whose line 1 is followed directly by the next set's name line: the orphan line 1 is refused with a reason.Read mean_motionreadNoneunedited11.62373363(the cause is in this library’s row)
astroz 0.14.0 › case 1 › fail
epoch-year-19xx: ISS first GP record (1998): two-digit epoch year 98, seven renderings of one record. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · object_namereadNoneexpected'ISS (ZARYA)'(the cause is in this library’s row)
astroz 0.14.0 › case 2 › fail
baseline-iss-five-formats: ISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live). Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 25544 · object_namereadNoneexpected'ISS (ZARYA)'(the cause is in this library’s row)
astroz 0.14.0 › case 3 › fail
six-digit-omm-saramago: Catalog number 100000 (SARAMAGO): first 6-digit object, OMM formats only, TLE unavailable. Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 100000 · object_namereadNoneexpected'SARAMAGO'(the cause is in this library’s row)
astroz 0.14.0 › case 5 › fail
analyst-objects: Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones. Corpus v0.4.0.
values· 6 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 81011 · object_namereadNoneexpected'UNKNOWN'(the cause is in this library’s row)object-name-unknown-literal· 6 itemsExpected OBJECT_NAME may be the literal UNKNOWN (CCSDS-recommended) rather than empty.Read UNKNOWN not preserved for [81011, 81015, 81021] (the cause is in this library’s row)
astroz 0.14.0 › case 6 › fail
nine-digit-supgp-launch-nominals: Nine-digit catalog numbers: launch nominals of the 18th Space Defense Squadron (18 SDS), 7995016xx, in CelesTrak SupGP data. Corpus v0.4.0.
values· 1 itemExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 799501621 · object_namereadNoneexpected'STARLINK-38381'(the cause is in this library’s row)
astroz 0.14.0 › case 7 › fail
supgp-celestrak-classification-c: CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids. Corpus v0.4.0.
values· 2 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 72000 · object_namereadNoneexpected'STARLINK-G15-27 STACK'(the cause is in this library’s row)
astroz 0.14.0 › case 8 › fail
bstar-and-derivative-forms: Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields. Corpus v0.4.0.
values· 3 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 20453 · object_namereadNoneexpected'DELTA 2 R/B(1)'(the cause is in this library’s row)
astroz 0.14.0 › case 14 › fail
alpha5-encoding-vectors: Specification vectors: the Alpha-5 table with boundaries and invalid inputs, catalog-id text forms, the two-digit-year pivot and CCSDS epoch strings. Corpus v0.4.0.
alpha5-encode· 1 itemExpected Integers 100000-339999 encode to the Alpha-5 table; below 100000 encode as five digits with leading zeros; above 339999 cannot be encoded.Read input 100000read'raised ValueError'expected'A0000'(the library has no such operation)ccsds-epoch-strings· 1 itemExpected parse_epoch accepts every CCSDS 502.0-B-3 7.5.10 epoch form in vectors/ccsds-epoch-strings.json (calendar and day-of-year, with or without a fraction and a Z, second 60) and returns the instant each denotes (within 2 us; a leap second may read as 23:59:59 or as the next midnight), and rejects the five invalid forms.catalog-number-is-integer· 1 itemExpected NORAD_CAT_ID parses as an integer in every OMM format, including values of six and nine digits, and a ten-digit value is rejected (CCSDS allows up to nine digits); leading zeros and an explicit '+' are legal in KVN.
astroz 0.14.0 › case 15 › fail
alpha5-tle-derived: Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T). Corpus v0.4.0.
values· 4 itemsExpected Every record the file holds comes back, under the right catalog number, with each field equal to the corpus's frozen expected value.Read id 100000 · object_namereadNoneexpected'SARAMAGO'(the cause is in this library’s row)
astroz 0.14.0 › case 18 › fail
corrupt-input: Corrupt input between valid records: a wrong checksum digit, a line one character short, a letter in a numeric field, a set missing its second line, a file cut mid-record. Corpus v0.4.0.
corrupt-tle-line-short· 1 itemExpected A TLE set whose line 2 has lost one character mid-line (a digit of the eccentricity), so that it is 68 characters and every column after the cut has moved one to the left, is refused with a reason.Read the corrupt record dropped silently (the cause is in this library’s row)corrupt-tle-missing-line-2· 1 itemExpected A TLE set whose line 1 is followed directly by the next set's name line: the orphan line 1 is refused with a reason.Read the corrupt record dropped silently (the cause is in this library’s row)
The eighteen cases
epoch-year-19xxISS first GP record (1998): two-digit epoch year 98, seven renderings of one recordbaseline-iss-five-formatsISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live)six-digit-omm-saramagoCatalog number 100000 (SARAMAGO): first 6-digit object, OMM formats only, TLE unavailabletle-omits-six-digit-objectsA group with only 6-digit objects: OMM formats return 256 records, the TLE request returns HTTP 404analyst-objectsAnalyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit onesnine-digit-supgp-launch-nominalsNine-digit catalog numbers: launch nominals of the 18th Space Defense Squadron (18 SDS), 7995016xx, in CelesTrak SupGP datasupgp-celestrak-classification-cCelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series idsbstar-and-derivative-formsDrag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fieldssatcat-70000-cutoffSATCAT on both sides of 70000: CSV/JSON records for 25544, 69999 and 100000; legacy fixed-width file stops at 69999csv-json-omitted-mandatory-fieldsCelesTrak CSV and JSON omit the constant mandatory metadata keywordsmean-motion-derivative-conventionMEAN_MOTION_DOT / MEAN_MOTION_DDOT in the OMM equal the TLE fields as printedtle-vs-omm-precision-lossThe TLE is a lossy rendering of the OMM record: eccentricity truncated, BSTAR/DDOT mantissa rounded, epoch quantisedomm-xml-schemaCelesTrak OMM XML against the SANA schemas: valid as NDM/XML 2.0, invalid as 3.0 on the version attributealpha5-encoding-vectorsSpecification vectors: the Alpha-5 table with boundaries and invalid inputs, catalog-id text forms, the two-digit-year pivot and CCSDS epoch stringsalpha5-tle-derivedDerived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T)kvn-syntax-variantsCCSDS-legal KVN renderings of one record that CelesTrak never emitstle-writer-alpha5Writing TLEs across the five-digit boundary: Alpha-5 catalog field, valid lines, refusal of numbers the format cannot carry, round tripcorrupt-inputCorrupt input between valid records: a wrong checksum digit, a line one character short, a letter in a numeric field, a set missing its second line, a file cut mid-record
A case’s title, its expected values and every check’s full text are in the corpus (fixtures, manifest.json). SatDump’s two rows are its first-round run, against corpus v0.2.1, which had seventeen cases.
Checked every week
Two popular free libraries do most of the orbit maths in open-source satellite software. Every week we install their newest versions and check, without touching the network, whether the problems the test kit found are fixed yet.
A weekly job installs the latest PyPI sgp4 and skyfield, runs the corpus’s no-network reproducers (nine-digit id, empty OBJECT_ID, classification) built on the CCSDS 502.0-B-3 annex G example values, and runs the Alpha-5 vectors from corpus v0.7.0. Pass means the behaviour the corpus expects; fail means the finding still stands.
Last check 2026-10-19 14:44 UTC: python-sgp4 2.27 (accelerated C++ build), Skyfield 1.55, Python 3.13.16. 3 pass, 6 fail.
| result | behaviour | library | detail | upstream |
|---|---|---|---|---|
| fail | Nine-digit NORAD_CAT_ID loads through sgp4.omm.initialize expected: a record with NORAD_CAT_ID 799501621 loads and satnum equals it |
python-sgp4 | ValueError: satellite number cannot exceed 339999, whose Alpha 5 encoding is 'Z9999' |
issue #169, PR #170, corpus test report on PR #170 |
| fail | Empty <OBJECT_ID/> in OMM XML loads through parse_xml and initialize expected: no exception; an empty OBJECT_ID is a legitimate CelesTrak value for analyst objects |
python-sgp4 | TypeError: 'NoneType' object is not subscriptable |
issue #171 (closed 2026-09-24), PR #172 (merged 2026-09-24; fixed in master, awaiting a release) |
| fail | CLASSIFICATION_TYPE C survives sgp4.omm.initialize expected: sat.classification == 'C' |
python-sgp4 | classification after initialize: 'U' |
corpus note |
| pass | Classification C survives Satrec.twoline2rv expected: sat.classification == 'C' (the corpus found the pure-Python build resets it and the accelerated build keeps it) |
python-sgp4 | classification after twoline2rv: 'C' (accelerated=True) |
corpus note |
| pass | to_alpha5 matches every valid vector expected: all valid vectors encode as the Space-Track table says |
python-sgp4 | 64/64 encode vectors |
corpus case alpha5-encoding-vectors |
| pass | from_alpha5 matches every valid vector expected: all valid vectors decode to their integer |
python-sgp4 | 64/64 decode vectors |
corpus case alpha5-encoding-vectors |
| fail | from_alpha5 rejects I, O, lowercase and malformed fields expected: every invalid vector raises (Space-Track never uses I or O and defines capital letters only) |
python-sgp4 | 2/6 invalid fields rejected; accepted: ['I0000', 'O1234', 'a0000', 'A000'] |
corpus case alpha5-encoding-vectors |
| fail | to_alpha5 rejects numbers outside 0-339999 expected: every unrepresentable number raises |
python-sgp4 | 2/3 unrepresentable numbers rejected; accepted: [-1] |
corpus case alpha5-encoding-vectors |
| fail | Nine-digit NORAD_CAT_ID loads through EarthSatellite.from_omm expected: a record with NORAD_CAT_ID 799501621 loads (Skyfield delegates to python-sgp4) |
Skyfield | ValueError: satellite number cannot exceed 339999, whose Alpha 5 encoding is 'Z9999' |
python-sgp4 issue #169 |
What the rows mean
- Nine-digit id: can the library load a record whose catalog number has nine digits, as CelesTrak publishes for new Starlink launches? Today it refuses.
- Empty OBJECT_ID: can it read an XML record for an object with no launch designation? Today’s release, 2.27, crashes (our report #171; our fix, PR #172, was merged on 24 September 2026 and reaches users with the next release).
- Classification C: does it keep the “C” marker on operator-supplied records? Today it changes it to “U” in some paths.
- Alpha-5 vectors: does it turn numbers into lettered fields and back exactly as the rules say, and refuse the forbidden letters? It encodes and decodes correctly but accepts letters it should refuse.
Method
- Inputs: the annex G example (GOES 9) with
NORAD_CAT_IDreplaced by 799501621, orCLASSIFICATION_TYPEset to C, or rendered as a TLE with C; the same values in CelesTrak’s<ndm>-wrapped XML shape with an empty<OBJECT_ID>; the vendoredvectors/alpha5.json(SHA-256 recorded in the repository). - No provider data, no network: Skyfield’s timescale is loaded from its bundled data. Recorded per behaviour: pass/fail, exception type and message (never element values), the expected behaviour and upstream links; per run: package versions, whether the C++ extension is active, Python version.
- The classification result on the TLE path depends on the build: the corpus found the pure-Python
twoline2rvresets C to U while the accelerated build keeps it; the row above says which build ran. - Data:
latest.json,history.json. Job source:jobs/library_status.pyin the site repository.
Run history
| checked | python-sgp4 | Skyfield | pass | fail |
|---|---|---|---|---|
| 2026-10-19 14:44 UTC | 2.27 (accelerated) | 1.55 | 3 | 6 |
| 2026-10-12 18:53 UTC | 2.27 (accelerated) | 1.55 | 3 | 6 |
| 2026-10-05 07:55 UTC | 2.27 (accelerated) | 1.55 | 3 | 6 |
| 2026-09-28 07:51 UTC | 2.27 (accelerated) | 1.55 | 3 | 6 |
| 2026-09-21 20:49 UTC | 2.27 (accelerated) | 1.55 | 3 | 6 |
| 2026-09-21 05:52 UTC | 2.27 (accelerated) | 1.55 | 3 | 6 |
Elsewhere in the ecosystem
Curated (site/content/ecosystem.json); each entry links to a public statement by the project. Statements, not results: nothing in this list has been run against the corpus.
Some software is not a library on PyPI, so the weekly check cannot reach it. Here is what its makers have said in public, with a link and a date.
- SatNOGS in progress — The open ground-station network. As of 22 September 2026 none of its parts handle satellite numbers above 99,999. Its makers say support for both the lettered numbers and the new OMM format is in progress, and will arrive in stages, one part of the network at a time. — No SatNOGS component supports NORAD ids above 99999 as of 2026-09-22. Support for Alpha-5 and OMM JSON is said to be in progress, with the level of support differing by sub-project. Not tested by the corpus. Fredy, SatNOGS maintainer, on the Libre Space forum, 2026-09-22
- Gpredict not supported — The free satellite tracker most amateur-radio stations use. The practical position in September 2026: a stock Gpredict fetches CelesTrak's TLE feeds, and that format carries nothing above 69,999 except the analyst objects in 80000–89999, so satellites numbered above 99,999 are missing from Gpredict rather than misnumbered. If a TLE line with a lettered number does reach it from another source, version 2.6 reads the number as 0 and files the satellite under that number. The maintainer is adding support for CelesTrak's CSV format, which carries the full numbers; that is how these objects would arrive. A July 2026 patch for the lettered numbers was withdrawn by its author, not declined; the maintainer wrote that, as far as he could tell, CelesTrak would not serve the lettered format. — Three facts and a position. (1) If an Alpha-5 line reaches Gpredict 2.6, the catalog field decodes to 0: the parser converts it with atoi (src/sgpsdp/sgp_in.c:117) and the updater with g_ascii_strtod (src/tle-update.c:1001), and both the .sat files and the update hash are keyed by that number. (2) CelesTrak's TLE output carries nothing above 69999 except the 80000–89999 analyst objects, so the default feeds in src/sat-cfg.c (gp.php FORMAT=tle) never carry such a line; a stock installation is missing those objects, not corrupting them. (3) The maintainer is adding support for the CelesTrak CSV format (issue #250, open since 2021), which carries the full NORAD_CAT_ID; that is the path by which objects above 99999 would reach Gpredict. Source: PR #412 (2026-07-18) added an Alpha-5 decoder at both sites and was closed the same day by its author as not meant for upstream yet, withdrawn rather than declined; the maintainer's comment of 2026-07-19 says CelesTrak would not, as far as he could tell, support Alpha-5, and that CSV support is in progress. Alexandru Csete, Gpredict's maintainer, on pull request #412, 2026-07-19