Skip to content

feat(tracks): promote the IM test circuit on an imagery cross-check - #216

Merged
PurpleSentinel merged 1 commit into
mainfrom
feat/184-promote-test-circuit
Oct 17, 2026
Merged

PurpleSentinel merged 1 commit into
mainfrom
feat/184-promote-test-circuit

Conversation

@PurpleSentinel

Copy link
Copy Markdown
Contributor

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 (#214) to act on.

Promoted through the builder, not by editing a status

The gate profile now carries a validation record:

field value
geometry_status independently_validated
origins openstreetmap (vector ways 262071530/262071527), google-maps-imagery (satellite, visual check of each line against the carriageway)
agreement_m 5.0, against a 10.0 m limit
verified_utc 2026-10-17

build_track_pack.py checks 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:

OpenStreetMap ways 262071530/262071527; test-circuits manifest; validated: 2 origins agreeing to 5.0 m

The policy change, stated plainly

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 — 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_captured asserted this loop must stay provisional. It now asserts:

  • the fixture is timing-ready and independently_validated
  • its record carries two distinct origins inside MAXIMUM_SOURCE_DISAGREEMENT_M
  • removing the record puts the same geometry straight back to provisional

The 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=0
  • make test → 39 tests, OK
  • Pack builds: Built 1 definition(s), of which 1 are timing-ready

Refs #184.

🤖 Generated with Claude Code

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>
@PurpleSentinel
PurpleSentinel merged commit 22b9780 into main Oct 17, 2026
3 checks passed
@PurpleSentinel
PurpleSentinel deleted the feat/184-promote-test-circuit branch October 17, 2026 14:22
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.

1 participant