- Remove TODO from simulation.cpp (interpolated burns now implemented)
- Update technical_reference.md: both trigger types now use sub-step
propagation to exact trigger time, not step boundary
- Update hohmann-rendezvous-quantization-fix.md: mark Option A as
resolved, remove outdated quantization fix suggestions
- Update propagation_refactor.md: resolve Issues 3 and 4, replace
interpolated time triggers TODO with code path unification TODO
- Remove make run target from Makefile (agents should not run graphical sim)
- Update AGENTS.md: clarify make test vs make test-build, add Simulation section
- Update technical_reference.md Build System: add tag/name/section filtering
- Add SCENARIO section docs with --section flag and fixture behavior notes
- Use ./build/orbit_test path, rename config_name to tag_name throughout
Planning doc updates:
- Replace estimate table with actual measured values from DT sweep test
- Add 0.5s and 2.0s data points (69m and 228m respectively)
- Mark DT sweep tests as COMPLETED section
- Add analysis note about linear scaling with DT
New tests in test_maneuver_planning.cpp:
1. DT sweep: Hohmann transfer separation vs time step
- Runs full Hohmann transfer at DT = {0.1, 0.5, 1.0, 2.0, 5.0, 10.0}
- Verifies final separation matches expected ranges
- Confirms ecc < 0.01 for DT <= 1.0
2. DT sweep: quantization error is bounded by DT
- Tests 9 trigger offsets per DT value at DT = {1, 5, 10, 30}
- Verifies quantization error is always in [0, DT)
- Verifies execution time matches ceil-to-step-boundary
3. DT sweep: Hohmann arrival burn timing error
- Measures exact timing error at each DT
- Reports position error estimate (timing_error × velocity)
- Confirms timing error < DT
All 157 tests pass (240,742 assertions).
Previous: 154 tests, 240,445 assertions.
Mark Issues 1, 2, 5, 6 as RESOLVED. Mark Issue 3 as PARTIALLY RESOLVED.
Mark Issue 4 as UNRESOLVED (time-triggered quantization).
Update call chain diagram to show current merged structure.
Update call sites summary to show final 4 call sites (3 contexts).
Add remaining work section for interpolated time triggers and
parabolic/hyperbolic orbit support.
In check_maneuver_trigger() (true-anomaly branch), eliminate the
propagate_orbital_elements() look-ahead probe that was called every
frame for pending maneuvers. Replace with direct analytical computation
of dt_needed from mean anomaly delta.
Benefits:
- Eliminates ~24k redundant Kepler solves per Hohmann transfer wait
period (DT=10s, 244k s wait time)
- More precise: no discretization error from single-step propagation
- Simpler logic: removed angle_between check, wraparound detection
- Removes dead angle_between() helper function
Elliptical orbits only — added TODO for parabolic/hyperbolic support.
All 154 tests pass (240,445 assertions).
Update planning doc to reflect:
- File renames (rendezvous_hohmann -> rendezvous)
- test_maneuver_timing.cpp merged into test_maneuver_planning.cpp
- Old CW rendezvous module removed (eliminated 3 pre-existing failures)
- Current test results: 154/154 all passing
- Completed work section with full file list
- Remaining work section with optional future tasks
- Add scheduled_dt field to Maneuver struct for precise timing
- Propagate spacecraft to exact trigger position before burn execution
- Handle 2π→0 wraparound in trigger crossing detection
- Add spacecraft tracking to prevent double-propagation in same frame
- Fix test configs and tolerances for new behavior
All 143 tests passing.
- Fix omega = π bug for near-zero inclination orbits (src/orbital_mechanics.cpp:277)
- Added inclination threshold (0.01 rad) before using atan2 path
- Prevents unstable omega calculation when h_vec.y is tiny
- Fix true anomaly trigger firing at wrong location (src/maneuver.cpp:172-213)
- Replaced binary search with O(1) analytical time calculation
- Uses mean motion: n = √(μ/a³) to compute exact time to target
- Added true_anomaly_to_eccentric_anomaly() function
See docs/planning/periapsis_burn_bug_analysis.md for technical details
See docs/periaapsis_burn_test_results.md for test results and next steps
Test status:
- Issue 1 (omega): ✅ FIXED and validated
- Issue 2 (triggers): ✅ IMPLEMENTED, 4 tests fail due to design (expected behavior)
- Full suite: 139 passed, 4 failed (all periapsis burn tests)
Next steps: Decide on test tolerance approach (see docs/periaapsis_burn_test_results.md)
Added planning document detailing two separate issues causing
periapsis burns to execute at incorrect locations:
Issue 1: Omega = π instead of 0 for near-zero inclination orbits
- Unstable atan2 calculation in cartesian_to_orbital_elements()
- Occurs when n_mag > 1e-10 due to tiny h_vec.y from i ≈ 0
- Fix: Add inclination threshold (0.01 rad) before using atan2 path
Issue 2: True anomaly trigger fires early at wrong location
- angle_between() detects upcoming crossing, fires immediately
- Executes burn at current position instead of waiting for target angle
- Proposed fixes: Defer execution, interpolate, or remove future check
Also cleaned up:
- Removed temporary debug files (debug_test_burn.cpp, debug_trace.cpp)
- Removed debug output from src/orbital_mechanics.cpp
- Kept tests/test_omega_debug.cpp as it validates Issue 1 fix
See docs/planning/periapsis_burn_bug_analysis.md for full details.
Added user experience improvements:
- Keyboard shortcuts: ESC to cancel, ENTER to confirm
- Enhanced error messages with detailed descriptions
- Hohmann tab input validation
- Error message display in Hohmann tab
- Edge case handling for all input scenarios
- Clear error messages when tab switches
Keyboard shortcuts work for all dialog tabs and delete confirmation.
Comprehensive design for modal maneuver management dialog including:
- Three-tab interface (Create, Hohmann, Edit)
- Real-time orbital preview using preview_burn_result()
- Hohmann transfer calculator
- Enhanced maneuver list with quick actions
- Complete UIState extension with ManeuverDialogState
- Detailed implementation plan with 6 phases
- Edge case handling and visual design guidelines