Repository navigation
Tracking: remaining work-plan backlog (items 2, 5–17) #9
Copy link
Copy link
Open
Description
Tracking issue for the work-plan items not yet on a branch. Shipped so far: #5 (item 1), #6 (item 9), #7 (item 4), and #8 (item 3, filed separately as a real bug).
Ground rules still apply: one PR per item, fix/ feat/ chore/ branches, squash-merge, every bug fix ships a regression test that fails on main first, and the published baseline (838 km / 3344 kg·m⁻³, mass 8.2430310159e21 kg, 2026-08-12 chained event) must not move unless the PR is explicitly labelled results-changing.
Needs a maintainer decision before code
- 2 — Dead candidate loop in
perigee_state_for_position. Two ascending-node candidates are computed, thenif best_state is Nonemeans the second is never evaluated; there is no scoring and the loop is dead. Choose (a) score both candidates and keep the prograde / lower two-body-error one, or (b) delete the loop and document why candidate Repo hygiene: CI triggers, coverage, Dependabot, templates, changelog #1 is the intended geometry. (a) is preferred but may reseedrefine_design_shooting— results-changing, needs a before/afterdesign_mode_event.jsondiff. - 5 —
config/baseline.yamldeclares knobs the code ignores. The wholegeometry:section, severaloptimization.*keys, andstability.years/samples/integrator/include_earth_j2/optional_long_yearsare never read. Each key must be wired through or deleted; add a strict validator that rejects unknown keys. Silent no-op config is a reproducibility hazard. Wiring is only a no-op if the wired values equal today's hardcoded ones (120 s tracks, 20/60 s brackets, 500 samples) — assert that in tests. - 7 —
_best_common_locationis a 9-point line search. Replace the coarse scan withscipy.optimize.minimize_scalaron the geodesic fraction, same scoring function. Results-changing: shifts reported best-site coordinates;definition_a/definition_bneed re-verifying on the 2026-08-12 event. Explicit approval required. - 11 — Cut the
v0.1.0release.CITATION.cffclaimsdate-released: 2026-07-13, the README linksreleases/latest, andCHANGELOG.mdcompare links point atv0.1.0— none of which exist. Needs a maintainer to pick the tag target and upload the run bundle/movies the README promises.
Ready to implement
- 6 — Three duplicate numeric implementations. Kepler solvers (
orbital_dynamics.solve_keplervsstability._solve_kepler), element→state (elements_to_statevsorbital_elements_to_icrf_state), and geodesics (hand-rolled Vincenty invalidation.wgs84_geodesic_distance_kmvspyproj.Geod). Add cross-check tests first (<1e-12 on a (e, M) grid; <1 mm and <1 µm/s on an elements grid; <1 mm vsGeod.inv), then pick one canonical implementation. Unblocked for the geodesic half now that fix: declare pyproj as a direct dependency #5 makes pyproj a declared dependency. - 8 — Single-source the version. Derive
__version__fromimportlib.metadata.version("chained-eclipse")with aPackageNotFoundErrorfallback of"0+unknown"; keepMODEL_VERSIONdeliberately separate and documented as a model version; addtests/test_versions.pyassertingCITATION.cff'sversion:matches the installed package version. - 10 — Enforce formatting. One mechanical
ruff format .commit with no logic changes, then add.venv/bin/ruff format --check .to the CI Lint step. - 12 — Entry-point cleanup. Delete
run_search.py(duplicates thechained-eclipseconsole script) and update the README quick-start touv run chained-eclipse --mode full. Dropchained-eclipse-eclipse4-atlantaandchained-eclipse-total-tracks-2027from[project.scripts]— one-off analyses should not land on every user's PATH — keep them runnable viapython -m chained_eclipse.…and say so in the README. - 13 — Ephemeris kernel integrity verification.
ephemeris.load_ephemeris()auto-downloadsde440s.bspwith no checksum. Add a known-good SHA-256, verify on load, raise clearly on mismatch with an--allow-unverified-ephemerisescape hatch, and recordverified: true/falsein theevents.jsonephemeris block. The SHA-256 plumbing already exists (cli.run_fullhashes the kernel after the fact for the manifest). Recommended first feature — the whole validation chain rests on kernel identity. - 14 — Hybrid (annular-total) eclipse classification. Classification happens at the greatest-eclipse point only, so a hybrid gets mislabelled total or annular and
type_matchesfails spuriously. Sample the signed core radius along the track (iter_real_trackalready yields it) and classifyhybridon a sign change; add a NASA hybrid reference (e.g. 2031-11-14) and extend the type-match logic. Labels only — timings and coordinates unchanged, but flag any catalog rows whose label moves. - 15 —
--versionflag + structured logging.argparse --versionprinting package version,MODEL_VERSION, and kernel name; replace bareprint(..., flush=True)progress lines incli.pywithlogging(INFOdefault,--quiet/--verbose), keepingterminal_summary.txtbyte-identical. - 16 — Stage checkpointing for
run_full. A failure at stage 5 currently discards hours of stages 1–4. Add--resume: reuse a stage's output JSON when its recordedmodel_versionand config hash match. Stages already writereal_moon_eclipses.json,validation_report.json,design_mode_event.json, andstability.json, so this is mostly plumbing plus a config-hash field. Must refuse to resume across a differingMODEL_VERSIONor kernel SHA — depends on item 13. - 17 — Broaden the validation set. All four references sit within 2 years of epoch. Add a pre-epoch historical eclipse (2017-08-21 or 2024-04-08), a deep partial with no central line (requires extending
_validate_oneto compare penumbral geometry), and a hybrid (after item 14). Turns validation from a near-epoch smoke test into a real accuracy envelope.
Suggested order
- 12 — trivial, zero-risk
- 8, 10 — small and independent
- 6 — numeric care needed, tests first
- 13, 15 — small features, high value
- 5, 14, 16, 17 — larger; results-affecting bits need sign-off
- 2, 7, 11 — gated on maintainer decisions
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
wiyth00 commentedon Jul 25, 2026
Progress update — three more items are now on PRs:
run_search.py, prunes the two one-off console scripts, README now usesuv run chained-eclipse)__version__fromimportlib.metadata,tests/test_versions.pypinsCITATION.cffto the package version;MODEL_VERSIONdeliberately untouched)KERNEL_SHA256_PINStable; NAIF publishes no checksums, so the known-good pin must come from a maintainer's localsha256sum data/ephemeris/de440s.bsp— one-line follow-up)Follow-ups that moved here from #12's scope:
--allow-unverified-ephemeristhroughcli.pyand recordkernel_sha256/verifiedin theevents.jsonephemeris block + run manifest (do together with item 15, which touches the same argparse setup)KERNEL_SHA256_PINSfrom a trusted local copyStill open, unchanged: 2, 5, 7, 11 (maintainer decisions), 6, 10, 14, 15, 16, 17 (implementable). Note for 10: the mechanical
ruff format .commit has to be run locally — formatting by hand without running ruff would guarantee drift from whatruff format --checkexpects in CI.wiyth00 commentedon Jul 25, 2026
Status update — remaining agent-executable work-plan items are now all in open PRs:
--version, logging with--quiet/--verbose--resumeper-stage artifact reuse (refuses across model-version/kernel changes)Follow-ups from my earlier comment that are now resolved by PR #14:
--allow-unverified-ephemerisescape hatch is wired through all five run modes.events.jsonnow records the kernel'sverifiedstatus from the load-time integrity check (no re-hash).Merge-order notes:
NASA_GSFC_REFERENCES; Expand validation references: 2024 pre-epoch total + 2025 timing-only partial (item 17) #16 inserts at the beginning; both keep the tuple chronological (and Expand validation references: 2024 pre-epoch total + 2025 timing-only partial (item 17) #16 adds a test enforcing that), so they merge cleanly in either order. Expand validation references: 2024 pre-epoch total + 2025 timing-only partial (item 17) #16's singlecli.pyhunk is disjoint from CLI: --version, logging with --quiet/--verbose, ephemeris verification wiring, and --resume (items 15 + 16) #14's logging changes.eclipse_typecolumn after merge.Still maintainer-gated (no action from me): items 2, 5, 7, 11 per the ground rules; item 10 needs a local ruff pass decision.