Repository navigation
feat(tracks): promote the IM test circuit on an imagery cross-check - #216
Merged
Merged
Conversation
The loop was provisional, so track_timing_ready refused it and the device ran timer-only: no timing engine, no lap times, and no gate crossings for the GPS trigger to act on. Promoted through the mechanism the builder already has rather than by editing a status. The gate profile now carries a validation record: OpenStreetMap ways for the vector geometry, Google Maps satellite imagery as a second and distinct origin, agreeing to 5.0 m against a 10.0 m limit. The builder checks the record - two origins, HTTPS sources, an RFC3339 timestamp and the agreement bound - and writes the status itself, so a hand-edited status still cannot promote anything. The pack policy said independently_validated was unreachable for a road loop on the grounds that there is no second independent source for a line somebody chose. Aerial imagery is one: it is a separate origin from OpenStreetMap's vectors, and a visual check that each 12 m line spans the carriageway is exactly what that width decision depends on. Device capture remains the stronger promotion, because it measures the lines with the receiver that will later time them, and the policy now says so rather than ruling imagery out. test_the_fixture_cannot_arm_timing_until_it_is_captured asserted the loop must stay provisional. Replaced rather than deleted: the test now asserts the fixture is timing-ready, that its record carries two distinct origins inside MAXIMUM_SOURCE_DISAGREEMENT_M, and that removing the record puts the same geometry straight back to provisional. The gate #139 built is what mattered there, and that is what is still held. Refs #184 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The loop was
provisional, sotrack_timing_ready()refused it and the device ran timer-only — no timing engine, no lap times, and no gate crossings for the GPS trigger (#214) to act on.Promoted through the builder, not by editing a status
The gate profile now carries a
validationrecord:geometry_statusindependently_validatedopenstreetmap(vector ways 262071530/262071527),google-maps-imagery(satellite, visual check of each line against the carriageway)agreement_mverified_utcbuild_track_pack.pychecks all of it — two distinct origins, HTTPS sources, an RFC3339 timestamp, the agreement bound — and writes the status itself. A hand-edited status still cannot promote anything. The built definition now reads:The policy change, stated plainly
The pack policy said
independently_validatedwas unreachable for a road loop, on the grounds that there is no second independent source for a line somebody chose. Aerial imagery is one: it is a separate origin from OpenStreetMap's vectors, and a visual check that each 12 m line spans the carriageway is exactly what that width decision depends on.Device capture remains the stronger promotion, because it measures the lines with the receiver that will later time them — any systematic bias in that receiver then sits in both the gate and the crossing and cancels. The policy now says that, rather than ruling imagery out.
What this costs: the lines are map-derived, so a crossing could in principle be missed if the real driving line passes outside a gate. That failure is visible rather than silent — a missed crossing is a lap that does not appear, not a lap with a wrong time.
The test was replaced, not deleted
test_the_fixture_cannot_arm_timing_until_it_is_capturedasserted this loop must stay provisional. It now asserts:independently_validatedMAXIMUM_SOURCE_DISAGREEMENT_MThe gate #139 built is what mattered in that test — promotion must be earned by evidence the builder has checked — and that is what is still held.
Verification
make check→CHECK_RC=0make test→ 39 tests, OKBuilt 1 definition(s), of which 1 are timing-readyRefs #184.
🤖 Generated with Claude Code