Repo-wide audit of src/jorbit (16.4k lines), ranked biggest cut first.

delete: src/jorbit/mpchecker/ephem_generation/ — 990 lines, no __init__.py, imported by nothing, already excluded from ruff, but ships inside the wheel. Move to the existing top-level tools/. Then merge contribute_to_ephem.py + contribute_to_ephem_reverse.py (199+167, diff is 153 lines of forward-vs-reverse) into one function with a direction arg. [src/jorbit/mpchecker/ephem_generation/]

delete: whole module reparameterizations.py — square_to_unit_disk / unit_disk_to_square / unit_cube_to_orbital_elements / orbital_elements_to_unit_cube have zero callers in src, tests, docs, or paper; only a Sphinx automodule stub references it. Delete the module and docs/core/misc/reparameterizations.rst. [src/jorbit/utils/reparameterizations.py]

delete: _get_dynamic_intermediate_dts + get_all_dynamic_intermediate_dts (126 lines, zero callers — budgeted.discover_natural_step_times replaced them) plus the 48-line commented-out get_fixed_intermediate_dts below them. Nothing. [src/jorbit/accelerations/static_helpers.py:99-224, 283-330]

delete: ~110 lines of commented-out code: the create_dynamic_on_sky_helper/create_static_on_sky_helper tail, the Decimal variant inside _create_yoshida_coeffs, the acceleration block in _individual_state, and the dead blocks in doubledouble.py/constants.py. Git remembers. [create_acc_funcs.py:370-443, yoshida_leapfrog.py:228-248, ephemeris_processors.py:139-143]

delete: _create_yoshida_coeffs and its inputs Y4_Ws/Y6_Ws/Y8_Ws (never called — the C/D vectors are hardcoded), IASNN_DD_EPSILON (zero references, and it is the sole reason constants.py does a buried mid-file from jorbit.utils.doubledouble import DoubleDouble at line 454), HUGE_ASTEROID_EPHEMERIS_URL (docstring says "Currently never used"; drop it and its 4 mentions in cache.py). [constants.py:456,464-486, yoshida_leapfrog.py:215, utils/cache.py]

shrink: Ephemeris.__init__'s two ssos branches duplicate the planets group dict and the first four lines of postprocessing_func. Build the planets group + base postprocessor once, append the asteroid group and the two extra lines only for "default solar system". ~-35 lines. [src/jorbit/ephemeris/ephemeris.py:100-152]

yagni: particle/ias15_forced.py — a whole module for one 8-line function with one caller. Fold _ephem_forced_budgeted into particle/ias15_dense.py, which already imports the same pieces. [src/jorbit/particle/ias15_forced.py]

yagni: _ephem reimplements _on_sky_scan inline — same scan_func, same jax.lax.scan, defined 40 lines apart in the same file. Call _on_sky_scan. ~-20 lines. [src/jorbit/particle/ephem.py:56-96]

stdlib: horizons_query_context is a @conStringIO and closes it on exit.io.StringIO already is a context manager. Use with io.StringIO(query) as q: at the two call sites; drop the
function and the contextlib import. [src150-157]

yagni: HorizonsQueryConfig(NamedTuple) d never instantiated — it is a namespaceholding nine module constants. Make them module-level constants; drop the typing.NamedTuple import.
[src/jorbit/utils/horizons.py:25-66]

shrink: three copies of the same packed-oth arms callpacked_to_unpacked_designation and only idtype differs. idtype = "designation" if len(target) == 7 else
"smallbody"; target = packed_to_unpacked lines. [horizons.py:99-105, 268-274,358-364]

delete: accelerations/__init__.py lists "precompute_perturber_positions" in __all__ with no mat— from jorbit.accelerations import * raiport it from static_helpers. Drop thestring. [src/jorbit/accelerations/__init__.py:36]
delete: ipykernel and pyarrow in [project.dependencies] — neither is imported anywhere in src; polars.read_ipc reads the .arrow file nathe dev group, drop pyarrow (confirmpolars' IPC path first). [pyproject.toml:28,32]
yagni: Ephemeris always wraps in EphemerisPostProcessor even for the single-group case, with the if len(self.ephs) == 1 shortcut sitting com. Restore it or delete the dead comment — right now it reads as an unfinished decision. [src/jorbit/ephemeris/ephemeris.py:190-194]

net: -850 lines, -2 deps possible.
Out of scope but worth one line: requests is imported in utils/horizons.py but not declared in [project.dependencies] — it currently ar astroquery.
