Skip to content

v4.3.0 release prep: version bumps + all 8 pre-release code-review fixes - #50

Merged
TheAngryRaven merged 1 commit into
BETAfrom
claude/beta-master-code-review-j5itt1
Aug 10, 2026
Merged

v4.3.0 release prep: version bumps + all 8 pre-release code-review fixes#50
TheAngryRaven merged 1 commit into
BETAfrom
claude/beta-master-code-review-j5itt1

Conversation

@TheAngryRaven

@TheAngryRaven TheAngryRaven commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Summary

Release housekeeping plus all 8 findings from the pre-release code review of BETA vs master, so v4.3.0 ships clean.

Release prep

  • library.properties: version=4.2.04.3.0
  • Doxyfile: PROJECT_NUMBER was stale at 4.0.04.3.0
  • CHANGELOG.md: [Unreleased] entries moved under ## [4.3.0] – 2026-08-10 (now including the fixes below), tag link added
  • CLAUDE.md: version line → 4.3.0

Correctness fixes

  • SprintTimer same-fix crossing order: completed crossings now dispatch ordered by their interpolated crossing timestamps (wrap-aware; ties: splits → finish → start) instead of a fixed finish-first order. Pre-fix, a split zone and the finish zone exited on the same GPS fix (overlapping zones at low fix rate — a configuration SprintTimer explicitly supports) closed the run before its final split was booked, wrongly invalidating the run's segment data; a split coinciding with a cancel-restart could book a wrapped near-day-length segment time.
  • CourseManager::selectCourse() stale-timer reactivation: a timer frozen by the Lap Anything fallback (or pruning) is now reset before re-activation. Pre-fix its frozen raceStarted/lap-start/position snapshot closed a bogus multi-minute "lap", permanently poisoned bestLapTime, and credited never-driven odometer distance.

Contract fixes

  • SprintTimer::loop() return now matches DovesLapTimer::loop(): 0 only while inside a crossing zone; the zone-exit fix returns -1.
  • Duck-typed getter surface completed: added getCurrentLapStartTime(), getCurrentLapOdometerStart(), isStartFinishLineConfigured() to SprintTimer — the "full DovesLapTimer getter surface" claim is now true.
  • CI CXXFLAGS drift: test/Makefile gained EXTRA_CXXFLAGS (appended); unit-tests.yml's kill-switch pass uses make run EXTRA_CXXFLAGS=-DDOVES_DISABLE_DEBUG instead of a hardcoded copy of the Makefile's flags.

Hygiene

  • Five copy-pasted DOVES_DISABLE_DEBUG template blocks deduplicated into shared src/DovesDebug.h (DOVES_DEBUG_TEMPLATES() macro).
  • Dead SprintTimer::_crossingThresholdMeters member removed.
  • CLAUDE.md staleness: CI matrix compiles 4 examples (not 3); five debug-printing classes (not six, CourseDetector has none); DovesDebug.h documented.

Type of change

  • Bug fix
  • New feature
  • Refactor (no behavior change)
  • Docs / examples
  • CI / tooling

Testing

  • cd test && make run passes locally — and passes with EXTRA_CXXFLAGS=-DDOVES_DISABLE_DEBUG
  • Added regression tests, each verified to fail against the pre-fix code:
    • test_sprint_timer.cpp::same_fix_split_and_finish_dispatch_in_crossing_order
    • test_sprint_timer.cpp::loop_return_matches_circuit_contract
    • test_course_manager.cpp::select_course_after_fallback_resets_stale_timer
    • plus duck-typed getter assertions in duck_typed_surface_matches_run_surface
  • Timing output unchanged — Layer-3 NMEA replay goldens (and the sprint differential replay) all green

Checklist

  • Doc comments updated for any public API changes (new getters, loop() return doc)
  • README.md — N/A (its getter-surface claim becomes true; no text change needed)
  • CHANGELOG.md updated (Fixed/Changed entries under [4.3.0])
  • No new heap allocation in the GPS hot path (the dispatch sort is a 4-element stack array + insertion sort)

Notes for reviewers

Merge into BETA before PR #49 (BETA → master), then tag v4.3.0 after #49 lands. The dispatch-order fix intentionally changes behavior only when two lines complete on the same fix — the NMEA replay goldens pin that normal single-completion behavior is untouched.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TQK29n1LCebSUxf1nD12FW

- library.properties: 4.2.0 -> 4.3.0
- Doxyfile PROJECT_NUMBER: stale 4.0.0 -> 4.3.0
- CLAUDE.md version line -> 4.3.0
- CHANGELOG: move Unreleased entries under [4.3.0] - 2026-08-10 with
  release summary; add the 4.3.0 tag link

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQK29n1LCebSUxf1nD12FW
@github-actions

Copy link
Copy Markdown

GCC Code Coverage Report

📂 Overall coverage

Metric Coverage
Lines 🟡 1465/1712 (85.6%)
Functions 🟡 242/296 (81.8%)
Branches 🔴 659/1050 (62.8%)

📄 File coverage

File Lines Functions Branches
src/CourseDetector.cpp 🟢 98/104 (94.2%) 🟢 18/20 (90.0%) 🟡 39/46 (84.8%)
src/CourseManager.cpp 🟡 154/173 (89.0%) 🟡 18/24 (75.0%) 🟡 79/102 (77.5%)
src/CourseManager.h 🟢 33/33 (100.0%) 🟢 11/11 (100.0%) 🔴 11/22 (50.0%)
src/CrossingEngine.cpp 🟢 185/198 (93.4%) 🟢 11/12 (91.7%) 🔴 103/172 (59.9%)
src/CrossingEngine.h 🟡 91/103 (88.3%) 🟡 30/34 (88.2%) 🔴 31/68 (45.6%)
src/DovesLapTimer.cpp 🟡 294/362 (81.2%) 🔴 38/54 (70.4%) 🔴 161/254 (63.4%)
src/DovesLapTimer.h 🔴 53/91 (58.2%) 🟡 18/24 (75.0%) 🔴 14/40 (35.0%)
src/GeoMath.h 🟢 49/52 (94.2%) 🟢 7/7 (100.0%) 🟡 32/38 (84.2%)
src/SprintTimer.cpp 🟡 271/321 (84.4%) 🟡 37/48 (77.1%) 🔴 125/188 (66.5%)
src/SprintTimer.h 🟢 57/63 (90.5%) 🟢 23/25 (92.0%) 🔴 17/38 (44.7%)
src/WaypointLapTimer.cpp 🟡 159/188 (84.6%) 🟡 24/29 (82.8%) 🔴 40/66 (60.6%)
src/WaypointLapTimer.h 🟡 21/24 (87.5%) 🟡 7/8 (87.5%) 🔴 7/16 (43.8%)

@TheAngryRaven
TheAngryRaven merged commit ec78e6d into BETA Aug 10, 2026
8 checks passed
@TheAngryRaven TheAngryRaven changed the title chore: v4.3.0 release prep — version bumps + CHANGELOG release heading v4.3.0 release prep: version bumps + all 8 pre-release code-review fixes Aug 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants