Upstream record
What happened to each problem the test kit found in other people’s software: what was wrong, who fixed it, and whether a released version has the fix. Every line links to the public discussion, so nothing here has to be taken on trust.
One row per finding reported upstream. The wording of each row is kept by hand (site/content/upstream.json); every state, date, name and release tag is read from the GitHub REST API by a job (jobs/upstream_status.py), and the build refuses a row whose outcome the API does not bear out.
- 23 findings in 12 projects.
- 7 fixed by a pull request from this project that the maintainers merged.
- 7 fixed by someone else after this project's report: 5 by the maintainer, 2 by another contributor.
- 6 open, and 3 that ended another way.
- 6 of the 14 fixes are in a released version; the rest are merged and waiting for one.
How to read it
The outcome column keeps four things apart, because they are not the same kind of credit. “Pull request from this project, merged” means the fix was written here and the other project accepted it. “Fixed by the maintainer after this project’s report” means the problem was reported from here and they wrote the fix. “Open” means it is reported and not settled. “Other” covers the rest, with a line saying what happened. A report that led nowhere is listed like any other.
Outcomes: pull request from this project, merged (the fix thread is a merged pull request authored by the corpus’s maintainer); fixed by the maintainer or by another contributor after this project’s report (their merged pull request, or their release); open (the report is open); other (stated per row). “Released in” is the oldest release tag that contains the fix’s merge commit, by the API’s comparison; where none does, the row says so and names the latest release.
| project | what was wrong, and where it was said | outcome | released in |
|---|---|---|---|
| python-sgp4 | An OMM whose OBJECT_ID is empty, as CelesTrak writes analyst objects, raised a TypeError. | Pull request from this project, merged | merged, not yet released |
| python-sgp4 | A nine-digit NORAD_CAT_ID is refused by the OMM reader. | Other | — |
| python-sgp4 | The compiled Satrec writes the letters I and O in Alpha-5 fields, which the format skips. | Open | — |
| satellite.js | json2satrec dropped the digits of an OMM epoch beyond the millisecond. | Pull request from this project, merged | merged, not yet released |
| satellite.js | Nothing in the library decoded an Alpha-5 catalog field. | Pull request from this project, merged | merged, not yet released |
| satellite.js | twoline2satrec reads a TLE field up to a stray letter and sets no error. | Pull request from this project, merged | merged, not yet released |
| Gpredict | The mean motion lost its eighth decimal on every element set: ten characters read of an eleven-character field. | Pull request from this project, merged | merged, not yet released |
| Gpredict | A letter in a TLE's epoch field was accepted, and the epoch read up to it. | Fixed by Wahaj18 after this project's report | merged, not yet released |
| swift-sgp4 | Satellites numbered 100000 and up were refused: the bundled libsgp4 predated Alpha-5. | Fixed by the maintainer after this project's report | 4.1.0 |
| astroz | Alpha-5 catalog numbers were decoded without skipping I and O, so every id from J upward was wrong. | Fixed by the maintainer after this project's report | v0.13.0 |
| astroz | The TLE epoch came out as a Julian date hundreds of days off. | Fixed by the maintainer after this project's report | v0.13.0 |
| astroz | Seconds passed through a half-precision float, up to 15.5 ms off. | Fixed by the maintainer after this project's report | v0.14.0 |
| libsgp4 | Every Alpha-5 field was refused, and the pull request open to decode them mapped X, Y and Z wrongly. | Fixed by the maintainer after this project's report | v3.0 |
| libsgp4 | A TLE epoch is 8 microseconds off through DateTime(year, day), and FromCsv reads garbage microseconds from an epoch with no fraction. | Open | — |
| PyEphem | readtle() gives catalog number 0 for an Alpha-5 element set. | Open | — |
| PyEphem | readtle() accepts a letter in the epoch field and reads the epoch up to it. | Other | — |
| strf | number_to_alpha5 has no range check above 339999 (a hardening suggestion, not a bug report). | Open | — |
| tle.js | getCatalogNumber() returns NaN for Alpha-5 numbers, and two-digit years pivot at 50 instead of 57. | Pull request from this project, merged | v6.0.0 |
| tle.js | getEpochDay() reads the epoch up to a stray letter, and isValidTLE() calls the set valid. | Open | — |
| SatDump | The TLE registry drops Alpha-5 sets silently, and the Kepler CSV reader rejects CelesTrak SupGP files. | Other | — |
| gods-eye-view | Satellites with Alpha-5 catalog numbers collapse onto one NaN key, and all but the first are dropped. | Pull request from this project, merged | merged, not yet released |
| gods-eye-view | One TLE set missing a line drops every satellite after it in the group. | Fixed by xiehuanyi after this project's report | merged, not yet released |
| SatelliteKit | B* read from a TLE comes out as e-53 instead of e-05. | Open | — |
States, dates and release tags read from the GitHub API on 2026-10-23 02:43 UTC; the data is at /data/upstream/latest.json. A thread’s badge is its state on GitHub, not a judgement of it.
Who did the work on the other side
A report is the small part. These people read them, answered, and in most cases wrote or merged the fix. Each name links to what they wrote in public.
Maintainers and contributors who acted on these threads, each linked to their own public comment or pull request.
- SM-26 confirmed the gods-eye-view finding independently, on a later commit (gods-eye-view #751).
- SM-26 answered the audit ask on the corpus's own repository (gp-omm-conformance #1).
- Wahaj18 wrote the Gpredict fix for the letter in the epoch field (gpredict #430).
- Alexandru Csete (csete) reviewed and merged both Gpredict fixes (gpredict #428).
- Brandon Rhodes reviewed and merged the python-sgp4 fix, and explained PyEphem's position (python-sgp4 #172).
- 1valdis reviewed and merged the three satellite.js pull requests from this project, #186, #187 and #197 (satellite-js #185).
- ATTron fixed all three astroz findings within a day (astroz #99).
- dnwrnr added Alpha-5 support to libsgp4 and released it as v3.0 (sgp4 #46).
- csanfilippo updated the bundled libsgp4 and released swift-sgp4 4.1.0 (swift-sgp4 #4).
- Aang23 said what SatDump plans, and asked for shorter reports (SatDump #1221).
- David Calhoun and thkruz replied on tle.js and agreed to a pull request (tle.js #62).
- xiehuanyi wrote the gods-eye-view fix for the missing-line finding (gods-eye-view #936).
- kvnloo wrote a reference fix for the same finding and credited the report (gods-eye-view #906).
- VG31OP wrote an independent fix for the same finding (#1015), which the maintainer closed with thanks as a duplicate of the one merged (gods-eye-view #1015).
- Sameh Khamis (samehkhamis) merged the gods-eye-view Alpha-5 fix, with a follow-up making its decoder refuse malformed catalog fields (gods-eye-view #767).
- David Calhoun (davidcalhoun) merged the tle.js Alpha-5 and year-pivot fix and released it in v6.0.0 (tle.js #64).
What is not on this page
Findings that have not been reported to the project concerned are not listed until they are. The counts of failing cases per library are on Library status, and the live state of the python-sgp4 threads on Activity.