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).

One-off runs
librarycases failedmost serious findingthis month’s launchesupstream
PyEphem
version 4.2.1
run 2026-09-27
corpus 0.4.0
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
version 7.1.0
run 2026-09-27
corpus 0.4.0
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
version 2.6
run 2026-09-27
corpus 0.4.0
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
version 0.2.1
run 2026-10-03
corpus 0.5.0
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
version 1.2.2 and master
run 2026-09-24
corpus 0.2.1
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
version 3.0
run 2026-09-27
corpus 0.4.0
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
version 5.0.3
run 2026-09-27
corpus 0.4.0
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
version 0.14.0
run 2026-09-27
corpus 0.4.0
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. PyEphem4.2.1 · corpus v0.4.0

    1. 1 epoch-year-19xx: fail
    2. 2 baseline-iss-five-formats: fail
    3. 3 six-digit-omm-saramago: pass
    4. 4 tle-omits-six-digit-objects: pass
    5. 5 analyst-objects: fail
    6. 6 nine-digit-supgp-launch-nominals: pass
    7. 7 supgp-celestrak-classification-c: fail
    8. 8 bstar-and-derivative-forms: fail
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: skip
    11. 11 mean-motion-derivative-convention: skip
    12. 12 tle-vs-omm-precision-loss: skip
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: skip
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 18 corrupt-input: fail
  2. satellite.js7.1.0 · corpus v0.4.0

    1. 1 epoch-year-19xx: fail
    2. 2 baseline-iss-five-formats: fail
    3. 3 six-digit-omm-saramago: fail
    4. 4 tle-omits-six-digit-objects: pass
    5. 5 analyst-objects: fail
    6. 6 nine-digit-supgp-launch-nominals: fail
    7. 7 supgp-celestrak-classification-c: fail
    8. 8 bstar-and-derivative-forms: within tolerance
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: pass
    11. 11 mean-motion-derivative-convention: skip
    12. 12 tle-vs-omm-precision-loss: skip
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: skip
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 18 corrupt-input: fail
  3. Gpredict2.6 · corpus v0.4.0

    1. 1 epoch-year-19xx: fail
    2. 2 baseline-iss-five-formats: fail
    3. 3 six-digit-omm-saramago: pass
    4. 4 tle-omits-six-digit-objects: pass
    5. 5 analyst-objects: fail
    6. 6 nine-digit-supgp-launch-nominals: pass
    7. 7 supgp-celestrak-classification-c: fail
    8. 8 bstar-and-derivative-forms: fail
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: skip
    11. 11 mean-motion-derivative-convention: skip
    12. 12 tle-vs-omm-precision-loss: skip
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: skip
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 18 corrupt-input: fail
  4. gods-eye-view0.2.1 · corpus v0.5.0

    1. 1 epoch-year-19xx: fail
    2. 2 baseline-iss-five-formats: fail
    3. 3 six-digit-omm-saramago: pass
    4. 4 tle-omits-six-digit-objects: pass
    5. 5 analyst-objects: fail
    6. 6 nine-digit-supgp-launch-nominals: pass
    7. 7 supgp-celestrak-classification-c: fail
    8. 8 bstar-and-derivative-forms: fail
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: skip
    11. 11 mean-motion-derivative-convention: skip
    12. 12 tle-vs-omm-precision-loss: skip
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: skip
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 18 corrupt-input: fail
  5. SatDump1.2.2 · corpus v0.2.1

    1. 1 epoch-year-19xx: fail
    2. 2 baseline-iss-five-formats: fail
    3. 3 six-digit-omm-saramago: skip
    4. 4 tle-omits-six-digit-objects: skip
    5. 5 analyst-objects: within tolerance
    6. 6 nine-digit-supgp-launch-nominals: skip
    7. 7 supgp-celestrak-classification-c: within tolerance
    8. 8 bstar-and-derivative-forms: within tolerance
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: skip
    11. 11 mean-motion-derivative-convention: skip
    12. 12 tle-vs-omm-precision-loss: skip
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: skip
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 18 corrupt-input: not a case of that version
  6. SatDumpmaster · corpus v0.2.1

    1. 1 epoch-year-19xx: fail
    2. 2 baseline-iss-five-formats: fail
    3. 3 six-digit-omm-saramago: pass
    4. 4 tle-omits-six-digit-objects: pass
    5. 5 analyst-objects: within tolerance
    6. 6 nine-digit-supgp-launch-nominals: fail
    7. 7 supgp-celestrak-classification-c: fail
    8. 8 bstar-and-derivative-forms: within tolerance
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: pass
    11. 11 mean-motion-derivative-convention: pass
    12. 12 tle-vs-omm-precision-loss: within tolerance
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: skip
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 18 corrupt-input: not a case of that version
  7. libsgp43.0 · corpus v0.4.0

    1. 1 epoch-year-19xx: pass
    2. 2 baseline-iss-five-formats: pass
    3. 3 six-digit-omm-saramago: pass
    4. 4 tle-omits-six-digit-objects: pass
    5. 5 analyst-objects: fail
    6. 6 nine-digit-supgp-launch-nominals: fail
    7. 7 supgp-celestrak-classification-c: fail
    8. 8 bstar-and-derivative-forms: fail
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: fail
    11. 11 mean-motion-derivative-convention: fail
    12. 12 tle-vs-omm-precision-loss: fail
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: fail
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 18 corrupt-input: pass
  8. tle.js5.0.3, raw fields · corpus v0.4.0

    1. 1 epoch-year-19xx: pass
    2. 2 baseline-iss-five-formats: pass
    3. 3 six-digit-omm-saramago: pass
    4. 4 tle-omits-six-digit-objects: pass
    5. 5 analyst-objects: pass
    6. 6 nine-digit-supgp-launch-nominals: pass
    7. 7 supgp-celestrak-classification-c: pass
    8. 8 bstar-and-derivative-forms: pass
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: skip
    11. 11 mean-motion-derivative-convention: skip
    12. 12 tle-vs-omm-precision-loss: skip
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: fail
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 18 corrupt-input: fail
  9. tle.js5.0.3, timestamp API · corpus v0.4.0

    1. 1 epoch-year-19xx: fail
    2. 2 baseline-iss-five-formats: fail
    3. 3 six-digit-omm-saramago: pass
    4. 4 tle-omits-six-digit-objects: pass
    5. 5 analyst-objects: fail
    6. 6 nine-digit-supgp-launch-nominals: pass
    7. 7 supgp-celestrak-classification-c: fail
    8. 8 bstar-and-derivative-forms: fail
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: skip
    11. 11 mean-motion-derivative-convention: skip
    12. 12 tle-vs-omm-precision-loss: skip
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: fail
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 18 corrupt-input: fail
  10. astroz0.14.0 · corpus v0.4.0

    1. 1 epoch-year-19xx: fail
    2. 2 baseline-iss-five-formats: fail
    3. 3 six-digit-omm-saramago: fail
    4. 4 tle-omits-six-digit-objects: pass
    5. 5 analyst-objects: fail
    6. 6 nine-digit-supgp-launch-nominals: fail
    7. 7 supgp-celestrak-classification-c: fail
    8. 8 bstar-and-derivative-forms: fail
    9. 9 satcat-70000-cutoff: not exercised
    10. 10 csv-json-omitted-mandatory-fields: pass
    11. 11 mean-motion-derivative-convention: skip
    12. 12 tle-vs-omm-precision-loss: skip
    13. 13 omm-xml-schema: skip
    14. 14 alpha5-encoding-vectors: fail
    15. 15 alpha5-tle-derived: fail
    16. 16 kvn-syntax-variants: skip
    17. 17 tle-writer-alpha5: skip
    18. 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 ·

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:

  1. case 1 epoch-year-19xx · fail
  2. case 2 baseline-iss-five-formats · fail
  3. case 3 six-digit-omm-saramago · fail
  4. case 5 analyst-objects · fail
  5. case 6 nine-digit-supgp-launch-nominals · fail
  6. case 7 supgp-celestrak-classification-c · fail
  7. case 8 bstar-and-derivative-forms · within tolerance
  8. case 15 alpha5-tle-derived · fail
  9. case 18 corrupt-input · fail

Back to the marks

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:

  1. case 1 epoch-year-19xx · fail
  2. case 2 baseline-iss-five-formats · fail
  3. case 5 analyst-objects · within tolerance
  4. case 7 supgp-celestrak-classification-c · within tolerance
  5. case 8 bstar-and-derivative-forms · within tolerance
  6. case 15 alpha5-tle-derived · fail

Back to the marks

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:

  1. case 1 epoch-year-19xx · fail
  2. case 2 baseline-iss-five-formats · fail
  3. case 5 analyst-objects · within tolerance
  4. case 6 nine-digit-supgp-launch-nominals · fail
  5. case 7 supgp-celestrak-classification-c · fail
  6. case 8 bstar-and-derivative-forms · within tolerance
  7. case 12 tle-vs-omm-precision-loss · within tolerance
  8. case 15 alpha5-tle-derived · fail

Back to the marks

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:

  1. case 5 analyst-objects · fail
  2. case 6 nine-digit-supgp-launch-nominals · fail
  3. case 7 supgp-celestrak-classification-c · fail
  4. case 8 bstar-and-derivative-forms · fail
  5. case 10 csv-json-omitted-mandatory-fields · fail
  6. case 11 mean-motion-derivative-convention · fail
  7. case 12 tle-vs-omm-precision-loss · fail
  8. case 14 alpha5-encoding-vectors · fail
  9. case 15 alpha5-tle-derived · fail

Back to the marks

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:

  1. case 1 epoch-year-19xx · fail
  2. case 2 baseline-iss-five-formats · fail
  3. case 3 six-digit-omm-saramago · fail
  4. case 5 analyst-objects · fail
  5. case 6 nine-digit-supgp-launch-nominals · fail
  6. case 7 supgp-celestrak-classification-c · fail
  7. case 8 bstar-and-derivative-forms · fail
  8. case 14 alpha5-encoding-vectors · fail
  9. case 15 alpha5-tle-derived · fail
  10. case 18 corrupt-input · fail

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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

Back to the marks

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

Back to the marks

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

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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

Back to the marks

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)

Back to the marks

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)

Back to the marks

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-16rel
  • tle-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

Back to the marks

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

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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)

Back to the marks

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.

Back to the marks

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)

Back to the marks

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)

Back to the marks

The eighteen cases

  1. epoch-year-19xx ISS first GP record (1998): two-digit epoch year 98, seven renderings of one record
  2. baseline-iss-five-formats ISS current GP record: the same object in TLE, 2LE, CSV, JSON, JSON-PRETTY, XML and KVN (live)
  3. six-digit-omm-saramago Catalog number 100000 (SARAMAGO): first 6-digit object, OMM formats only, TLE unavailable
  4. tle-omits-six-digit-objects A group with only 6-digit objects: OMM formats return 256 records, the TLE request returns HTTP 404
  5. analyst-objects Analyst objects: empty OBJECT_ID, OBJECT_NAME UNKNOWN, 8xxxx and 27xxxx ids, TLE keeps only the 5-digit ones
  6. nine-digit-supgp-launch-nominals Nine-digit catalog numbers: launch nominals of the 18th Space Defense Squadron (18 SDS), 7995016xx, in CelesTrak SupGP data
  7. supgp-celestrak-classification-c CelesTrak supplemental GP: classification C, element set 0, RMS/DATA_SOURCE columns, 72000-series ids
  8. bstar-and-derivative-forms Drag terms: negative BSTAR, negative first derivative, non-zero second derivative, implied-decimal exponent fields
  9. satcat-70000-cutoff SATCAT on both sides of 70000: CSV/JSON records for 25544, 69999 and 100000; legacy fixed-width file stops at 69999
  10. csv-json-omitted-mandatory-fields CelesTrak CSV and JSON omit the constant mandatory metadata keywords
  11. mean-motion-derivative-convention MEAN_MOTION_DOT / MEAN_MOTION_DDOT in the OMM equal the TLE fields as printed
  12. tle-vs-omm-precision-loss The TLE is a lossy rendering of the OMM record: eccentricity truncated, BSTAR/DDOT mantissa rounded, epoch quantised
  13. omm-xml-schema CelesTrak OMM XML against the SANA schemas: valid as NDM/XML 2.0, invalid as 3.0 on the version attribute
  14. 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
  15. alpha5-tle-derived Derived Alpha-5 TLE lines rendered from real CelesTrak OMM records (letters A and T)
  16. kvn-syntax-variants CCSDS-legal KVN renderings of one record that CelesTrak never emits
  17. tle-writer-alpha5 Writing TLEs across the five-digit boundary: Alpha-5 catalog field, valid lines, refusal of numbers the format cannot carry, round trip
  18. 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

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.

Behaviours
resultbehaviourlibrarydetailupstream
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

If you use python-sgp4 or Skyfield. Three rows in this table will bite you today: nine-digit placeholder numbers in the week after a Starlink launch make the library refuse the record; objects with no launch designation crash its XML reader; and the classification field is overwritten with “U” on the way in. Until the fixes land, read the CSV or JSON formats rather than XML, skip records whose number has nine digits, and do not rely on the classification field. Do this now: follow the test kit’s quick start (clone, fetch, run) with its built-in python-sgp4 adapter; it tells you which of the eighteen cases your installed version survives.

If you use python-sgp4 or Skyfield. Until a release carries PR #172 (merged 2026-09-24, in master, not in 2.27), sgp4.omm.parse_xml followed by initialize raises on an empty <OBJECT_ID/>: read CSV or JSON, where the same records load. Nine-digit SupGP ids raise ValueError in initialize and in EarthSatellite.from_omm (issue #169; PR #170 adds tests only): filter NORAD_CAT_ID >= 100000000 before loading, or leave the launch-week SupGP files aside. initialize resets classification to U, as does the pure-Python twoline2rv: keep the source value yourself if you need it. Do this now: git clone https://github.com/hneogy/gp-omm-conformance.git && cd gp-omm-conformance && python3 tools/fetch.py && python3 -m gpconf run --adapter tests.adapters.sgp4_adapter:Parser. On 2.27 it fails 8 of 18 cases; the count is the thing to watch as fixes land.

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_ID replaced by 799501621, or CLASSIFICATION_TYPE set 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 vendored vectors/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 twoline2rv resets 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.py in the site repository.

Run history

checkedpython-sgp4Skyfieldpassfail
2026-10-19 14:44 UTC2.27 (accelerated)1.5536
2026-10-12 18:53 UTC2.27 (accelerated)1.5536
2026-10-05 07:55 UTC2.27 (accelerated)1.5536
2026-09-28 07:51 UTC2.27 (accelerated)1.5536
2026-09-21 20:49 UTC2.27 (accelerated)1.5536
2026-09-21 05:52 UTC2.27 (accelerated)1.5536

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.