Skip to content

chore: bump retina-tracker for the frame dt and gating fix (86cb9bq7p) - #271

Merged
Babissimo merged 1 commit into
mainfrom
chore/bump-retina-tracker
Aug 27, 2026
Merged

Babissimo merged 1 commit into
mainfrom
chore/bump-retina-tracker

Conversation

@Babissimo

Copy link
Copy Markdown
Contributor

Ticket: 86cb9bq7p
Parent: 86cb9bp4q, pipeline accuracy audit of 2026-08-24
Tracker side: offworldlabs/retina-tracker#24 (merged as 79db48c)

Moves libs/retina-tracker from 04ec70b (v0.2.1) to 79db48c.

Why it matters here

An out-of-order frame made dt negative, which made F P Fᵀ + Q non-positive-definite. The gate tested only that S was invertible, so such a track kept gating, its Mahalanobis distances came out negative, and a negative cost wins a minimisation outright. The corrupted track took detections from every healthy track it could reach, with no exception, no log and no counter, and ended up ACTIVE, positive definite and indistinguishable from healthy, reporting the wrong aircraft under the original track ID.

This repo is what feeds it. Audit §3 found blah2_bridge's duplicate guard was ts_ms != last_ts, which skips exact repeats but injects an older frame, and §2 found FRAME_WORKERS draining a single queue with no per-node keying. Backwards timestamps therefore reach a node's tracker in ordinary operation, not as an edge case.

What else the bump carries

Six intervening commits besides the fix. Checked rather than assumed:

commits what reaches this repo?
#19, #20, #21, #22 ruff config, vulture dead-code gate, both moved into pre-commit no, tooling only
d9f473d events.jsonl rotation no, this repo supplies its own InMemoryEventWriter
#24 the tracker fix yes

The fix is the only behavioural change that lands. Across the whole range track.py sees import reordering plus one if/return pair collapsed to return expr, and config.py gains an additive output section with no existing default altered.

Expected effect

Association counts shift slightly. Detections that previously received a garbage negative distance are now excluded rather than preferred. That is the intent, not a regression.

Still open on the tracker side

  • Surfacing n_dt_clamped / n_frames_rejected / n_clock_resyncs to an operator (86cb9t7pw). Until then the counters are reachable only by attribute access on the Tracker instance, and they are the only signal that §2's per-node serialisation defect is still live.
  • Ageing tracks by elapsed time rather than missed-frame count (86cb9bqj3).

🤖 Generated with Claude Code

@claude

claude Bot commented Aug 27, 2026

Copy link
Copy Markdown

Claude finished @Babissimo's task in 1m 31s —— View job


Code Review

Todo list

  • Gather context (PR body, diff, CLAUDE.md)
  • Understand the request (custom instruction: run /code-review on this PR)
  • Run code review
  • Post findings

Summary

This PR is a single-line submodule pointer bump: libs/retina-tracker moves from 04ec70b (v0.2.1) to 79db48c. No source in this repo changes.

Findings

  • Diff matches description. git diff origin/main...HEAD shows exactly the SHA change described (04ec70b8dd0fd5ee24f62cdace0690ad10f5471279db48c8fbd07f74b73c86b7c6d68ff8c40bbf8f), consistent with the PR body's claim that this lands offworldlabs/retina-tracker#24.
  • No stale references to the old pin. Grepped the repo for retina-tracker: the only places it's referenced are .gitmodules, Dockerfile (which COPYs the submodule directory and uv pip installs it — no separate version/hash pin), justfile, docs, and code that imports the package by name, not by version. Nothing else needs to move in lockstep with this bump.
  • CI will actually exercise the new pin. .github/workflows/ci.yml checks out with submodules: recursive for both the test and Docker-build jobs, and the deploy steps run git submodule update --init --recursive before restarting, so this bump takes effect in CI and on deploy, not just locally.
  • Not independently re-verified: the tracker-side fix itself. This sandbox has no network access to offworldlabs/retina-tracker, so I could not fetch/diff 04ec70b..79db48c directly to independently confirm the described gating fix, the "six intervening commits" table, or that track.py/config.py changes are as narrow as claimed. That audit is unusually thorough for a PR description (correctly identifies the non-positive-definite S / negative-Mahalanobis-wins-minimization failure mode, and reconciles it with blah2_bridge's ts_ms != last_ts guard from the linked accuracy audit), and lines up with what's visible here (no other pins need updating, contract/OpenAPI unaffected since no /v1/nodes routes touched). I'd flag this only so a human reviewer with tracker-repo access double-checks the commit range before merging, not because anything here looks wrong.
  • No CLAUDE.md gates triggered. No /v1/nodes route/model changes (no OpenAPI regen needed), no new config keys added to this repo's backend/.env/.env.example, and no host/credential references introduced.

Recommendation

Safe to merge from this repo's side. The only outstanding verification is confirming the 04ec70b..79db48c tracker commit range matches the table in the PR description — best done by someone with a checked-out retina-tracker clone, or by trusting the linked tracker PR (#24, merged as 79db48c).

An out-of-order frame made dt negative, which made F P Fᵀ + Q
non-positive-definite. The association gate tested only that S was
invertible, so such a track kept gating and its Mahalanobis distances came
out negative, which wins a minimisation outright: the corrupted track took
detections from every healthy track it could reach, with no exception, no
log and no counter, and ended up reporting the wrong aircraft under the
original track ID.

This repo is where that bites. blah2_bridge's duplicate guard admitted an
older frame, and FRAME_WORKERS drain a single queue with no per-node
keying, so backwards timestamps reach a node's tracker under ordinary
operation rather than as an edge case.

The bump carries six intervening commits besides the fix. Five are tooling
and formatting (ruff configuration, the vulture dead-code gate, running
both through pre-commit) and one adds events.jsonl rotation, which this
repo never reaches since it supplies its own InMemoryEventWriter. The fix
is the only behavioural change that lands: across the range track.py sees
import reordering plus one `if/return` pair collapsed to `return expr`,
and config.py gains an additive `output` section with no existing default
altered.

offworldlabs/retina-tracker#24

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@Babissimo
Babissimo force-pushed the chore/bump-retina-tracker branch from 3f40a43 to ddf9d09 Compare August 27, 2026 12:11
@claude

claude Bot commented Aug 27, 2026

Copy link
Copy Markdown

Claude finished @Babissimo's task in 42s —— View job


Code Review

Todo list

  • Gather context (PR body, diff, CLAUDE.md)
  • Understand the request (custom instruction: run /code-review on this PR)
  • Run code review
  • Post findings

Summary

This PR is a single-line submodule pointer bump: libs/retina-tracker moves from 04ec70b (v0.2.1) to 79db48c. No source in this repo changes. This re-run confirms the PR is still exactly one commit (ddf9d09) with the same diff as the prior review — nothing new to evaluate since the last pass.

Findings

  • Diff matches description. git diff origin/main...HEAD shows only the submodule pointer change: 04ec70b8dd0fd5ee24f62cdace0690ad10f5471279db48cdce11e9cb82ee222285b7a62a3f3321c5, consistent with the PR body's claim that this lands offworldlabs/retina-tracker#24.
  • No stale references to the old pin. .gitmodules only records the repo URL/path (no SHA pin there). Dockerfile:73,78 and justfile:32 reference libs/retina-tracker by path, not by version. Nothing else in this repo needs to move in lockstep.
  • CI will actually exercise the new pin. .github/workflows/ci.yml checks out with submodules: recursive (lines 65, 220) for the test and Docker-build jobs, and deploy steps run git submodule update --init --recursive (lines 582, 878) before restarting — so the bump takes effect in CI and on deploy, not just locally.
  • Not independently re-verifiable here: the tracker-side fix itself. This sandbox has no network access to offworldlabs/retina-tracker, so I still can't fetch/diff 04ec70b..79db48c directly to independently confirm the described gating fix or the "six intervening commits" table. The described failure mode (non-positive-definite S letting a negative Mahalanobis distance win a minimization) is internally consistent and lines up with what's visible from this side (no other pins need updating, no /v1/nodes contract touched). Flagging only so a reviewer with retina-tracker access double-checks the commit range before merging.
  • No CLAUDE.md gates triggered. No /v1/nodes route/model changes (no OpenAPI regen needed), no new config keys added to backend/.env/.env.example, no host/credential references introduced.

Recommendation

Safe to merge from this repo's side. The only outstanding verification is confirming the 04ec70b..79db48c tracker commit range matches the table in the PR description — best done by someone with a checked-out retina-tracker clone, or by trusting the linked tracker PR (#24, merged as 79db48c).

@Babissimo
Babissimo merged commit e324f54 into main Aug 27, 2026
15 checks passed
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