rockets-engine 0.10.0

Point-mass powered flight with ballistics-engine forces and guidance hooks
Documentation
# OpenRocket flight parity

`Apogee.java` flies OpenRocket's own test fixture — the Estes Alpha III from
`TestRockets.makeEstesAlphaIII()` — on its A8 test motor and prints the
apogee, the drag breakdown and the component masses. The printed apogee is
pinned as a constant in `src/command.rs`
(`openrocket_flight_parity_alpha_iii_a8`), which flies the same configuration
through the `rockets` CLI and requires agreement within 10 %.

## Reproduce

```sh
curl -LO https://github.com/openrocket/openrocket/releases/download/release-24.12/OpenRocket-24.12.jar
javac -cp OpenRocket-24.12.jar Apogee.java
java -cp OpenRocket-24.12.jar:. Apogee
```

CI runs exactly this on every push (the `openrocket-parity` job in
`.github/workflows/ci.yml`): it downloads the pinned jar, runs the driver,
sanity-checks the reference within 5 % of 409.63 m, then injects the live
apogee into the parity test via `ROCKETS_OPENROCKET_APOGEE_M`. Local test
runs use the pinned constant when the variable is unset.

Reference result (OpenRocket 24.12, 2026-10-24): **apogee 409.63 m**, max
velocity 143.1 m/s. rockets-engine flies the same flight to 442.76 m (+8 %).

## Configuration

The driver boots the OpenRocket core headless (Guice `CoreModule`, like the
unit tests), then modifies the fixture so both sides model the same rocket:

- **Rounded fin cross-section** — the fixture's default SQUARE section adds
  ~(t/MAC)·A_fins/A_ref ≈ 1.0 of pressure drag (OpenRocket's
  `FinSetCalc.calculatePressureCD`); our modeler assumes streamlined fins.
- **SMOOTH finish** — ≈20 µm paint in OpenRocket's finish table, matching
  our modeler's default roughness.
- **Launch lug removed** — our geometry modeler has no lug concept.
- **Zero wind, ISA atmosphere, vertical rod** — a clean ascent; the
  parachute ejection delay is set to 1000 s so it never fires.

The motor is the fixture's A8 (9 N·s triangle, 3.3 g propellant, 13.1 g
casing). The A8 keeps the flight below Mach 0.45; the fixture's D21 reaches
Mach 0.8, where OpenRocket's pre-transonic pressure rise — deliberately
absent from our Mach-1-clamped modeler — dominates the difference (with the
D21, OpenRocket flies to 655.83 m against our ~900 m).

Masses for the Rust side come from the printed flight mass: structure
24.74 g (nose 4.27 g, fins 13.06 g, everything else 7.41 g), casing 13.1 g.

## Known remaining differences

- Fin thickness pressure drag and fin-body interference (~0.15 of Cd in
  OpenRocket) are not in our modeler; our skin friction runs slightly
  higher than theirs. The two effects roughly cancel at these speeds.
- OpenRocket's launch-rod guidance vs our free start at 90° is negligible
  in zero wind.