Tracking issue for the smaller items that came out of reviewing the v0.0.3 release (#61). None of these were introduced by that PR; they are pre-existing and each one is a small, separate change. The pop-detection question is bigger and needs a decision, so it lives in its own issue.
An agent that never launches crashes at timeout
balloon_world.py leaves _rocket_flight as None until a launch action arrives, but the timeout branch calls post_process_simulation() and initialize_prints_plots() unconditionally:
if _timeout:
logger.info("Terminated: Reached max time")
self._rocket_flight.post_process_simulation() # AttributeError when never launched
A competitor whose agent decides not to launch gets an AttributeError instead of a normal episode end. Fix is a None guard plus a full-episode test that steps with launch=False.
The first interval after launch can never register a pop
step() reads previous_rocket_position from _rocket_states at the top of the step, but on the launch step that array is still all-NaN from reset(); it is only filled from y_sol after step_simulation() runs. Every distance comparison against NaN is false, so that first sweep is skipped. The practical effect is small, since the rocket is still on the pad for that 0.01 s, but the fix is cheap: populate _rocket_states from the initial solution when the flight is created.
Package version does not match the release
pyproject.toml still declares version = "0.0.1" while the release is v0.0.3, so wheel metadata and importlib.metadata.version() report the wrong number. @zuorenchen the version bump is yours to decide since it is the release name.
Actuator dynamics ship untested
gimbal_time_constant, roll_torque_time_constant and throttle_time_constant are null in both scenarios, so the golden masters only prove that the new actuator API preserves the old no-dynamics trajectories. A focused test with non-null time constants would cover the feature itself: initial lag, convergence under a repeated command, how the rate limit and time constant compose, and reset behavior.
Two test files can skip silently instead of failing
test_pop_detection.py and test_sensor_determinism.py wrap numpy and the internal package imports in one try / except ImportError, so a renamed symbol or a broken internal import turns them into skips rather than failures. test_scenario0_regression.py already does this properly by guarding only import rocketpy. These are my own tests, so I will fix them.
Python 3.10 is claimed but never tested
requires-python = ">=3.10" while CI pins 3.14 in both jobs. Since competitors run this locally on their own machines, the supported floor matters. Either add 3.10 to a matrix or narrow requires-python to what is actually tested.
Already handled
The stale uv.lock (recording ActiveRocketPy 1.12.0 against a 1.13.0 submodule) is #62.
I can take the code fixes above; the version bump and the Python floor are calls for @zuorenchen.
Tracking issue for the smaller items that came out of reviewing the v0.0.3 release (#61). None of these were introduced by that PR; they are pre-existing and each one is a small, separate change. The pop-detection question is bigger and needs a decision, so it lives in its own issue.
An agent that never launches crashes at timeout
balloon_world.pyleaves_rocket_flightasNoneuntil a launch action arrives, but the timeout branch callspost_process_simulation()andinitialize_prints_plots()unconditionally:A competitor whose agent decides not to launch gets an
AttributeErrorinstead of a normal episode end. Fix is aNoneguard plus a full-episode test that steps withlaunch=False.The first interval after launch can never register a pop
step()readsprevious_rocket_positionfrom_rocket_statesat the top of the step, but on the launch step that array is still all-NaN fromreset(); it is only filled fromy_solafterstep_simulation()runs. Every distance comparison against NaN is false, so that first sweep is skipped. The practical effect is small, since the rocket is still on the pad for that 0.01 s, but the fix is cheap: populate_rocket_statesfrom the initial solution when the flight is created.Package version does not match the release
pyproject.tomlstill declaresversion = "0.0.1"while the release is v0.0.3, so wheel metadata andimportlib.metadata.version()report the wrong number. @zuorenchen the version bump is yours to decide since it is the release name.Actuator dynamics ship untested
gimbal_time_constant,roll_torque_time_constantandthrottle_time_constantarenullin both scenarios, so the golden masters only prove that the new actuator API preserves the old no-dynamics trajectories. A focused test with non-null time constants would cover the feature itself: initial lag, convergence under a repeated command, how the rate limit and time constant compose, and reset behavior.Two test files can skip silently instead of failing
test_pop_detection.pyandtest_sensor_determinism.pywrap numpy and the internal package imports in onetry / except ImportError, so a renamed symbol or a broken internal import turns them into skips rather than failures.test_scenario0_regression.pyalready does this properly by guarding onlyimport rocketpy. These are my own tests, so I will fix them.Python 3.10 is claimed but never tested
requires-python = ">=3.10"while CI pins 3.14 in both jobs. Since competitors run this locally on their own machines, the supported floor matters. Either add 3.10 to a matrix or narrowrequires-pythonto what is actually tested.Already handled
The stale
uv.lock(recording ActiveRocketPy 1.12.0 against a 1.13.0 submodule) is #62.I can take the code fixes above; the version bump and the Python floor are calls for @zuorenchen.