Gate overlap zones on node world - #291
Conversation
Bumps libs/retina-analytics to the branch commit that stops register_node and rebuild_zones_for building an overlap zone between two nodes in different worlds (offworldlabs/retina-analytics#25). This fleet is the reason: 50 synthetic nodes and 8 receivers share one footprint over Greenville, so the associator held a zone for all 400 sim/real pairs — 39 of them a live adjacency edge — and a pairing drawn from one of those grids can only ever match a simulated tracklet against a real echo. Real node ids showed up in 48 of 156 synthetic dark solver records over a 7-minute window. node_world is already the single authority for the question and is already injected as node_world_provider, so nothing new is wired here. /api/radar/association/status gains assoc_world_skipped_pairs next to overlap_zones: without it a fleet whose cross-world pairs are being refused reads exactly like a fleet whose pairs never overlapped. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Claude finished @jehanazad's task in 1m 47s —— View job Code ReviewTodo list
SummaryThis backend-side PR is exactly what it says it is: a submodule pin bump plus one status field. The diff is small (4 files, +50/-1) and low-risk. Note on scope: FindingsNothing blocking. A few observations:
Overall: clean, well-tested, well-scoped change. The real correctness question (does the gate actually skip the right pairs and drop existing zones correctly) lives in the library PR, which the description says already has 9 new tests and a full green suite. |
…r-observability docs/solverflow.md: keep this branch's symbol-named 'Defined in' column and add #292's SOLVER_ALT_MODE / SOLVER_FREE_ALT_STARTS rows and section in it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…/resolve-slot-claim-on-publish
…/resolve-slot-claim-on-publish
…ix/cluster-contamination test_analytics_routes.py: keep both new status tests (live counters from this branch, world-skipped pairs from #291). libs/retina-analytics: point at analytics main (#25 world gate + #26 cluster split + #27 epochs merged). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…urement-epochs state.py / routes/test.py / solver.py / test_solver_stats.py: adjacent additions from both sides kept (epoch-align flag + counters next to the free-altitude flags, resolve_skips_dark and altitude_mode stamps). libs/retina-analytics: analytics main. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ts-and-dr-budget .env.example: both new comment blocks, the shared commented knobs once. docs/solverflow.md: symbol-named constants table from the stack plus this branch's MN_DR_CAP_S / MN_DARK_EXPIRY_S rows; section 7 kept. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ck-following state.py / test_solver_stats.py: adjacent additions from both sides kept (DARK_FOLLOW_MODE beside the epoch-align and altitude-mode flags; follow counters beside the stale/epoch/skip counters). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…x/feed-dedup-multinode-split
…supersession-altitude-gate solver.py / state.py taken from deploy/dark-solver-stack b0a289f, which merged this exact PR set: the altitude-gated supersession block re-indented inside #299's restructured publish path, and mn_superseded_blocked_alt reset beside the other counters. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Pairs with offworldlabs/retina-analytics#25 — this PR is the pin bump plus the
status field. Merge the library PR first.
What
libs/retina-analyticspinned to4439c2c(branchfeat/world-gate-overlap-zones),which stops
register_node/rebuild_zones_forbuilding an overlap zonebetween two nodes in known, different worlds, and drops one that already
exists.
/api/radar/association/statusgainsassoc_world_skipped_pairsnext tooverlap_zones.Why
PR #267 gated ADS-B claiming and seeding on
node_world_provider, butbottom-up pairing was untouched. This fleet is where that bites: 50 synthetic
nodes and 8 receivers (
ret*,radar3*-retnode) share one footprint overGreenville, so the associator holds a zone for every sim/real pair, and any
pairing drawn from one of those grids can only ever match a simulated tracklet
against a real echo. A read-only audit found real node ids (
retf1144fcd,ret7dd2cb0d) in 48 of 156 synthetic dark solver records over a 7-minutewindow.
Nothing new is wired:
state.node_worldis already the single authority forthe question and is already injected as
node_world_provider.Numbers, measured live on retina-test (read-only
/api/radar/association/status)synth-*, 8 real)So the gate removes 24% of the zone table and 39 real neighbour edges, all of
them edges no true pairing can live on.
assoc_world_skipped_pairsis what makes that visible: it counts pairsconsidered and refused, so it climbs with re-registrations, and zero means the
fleet is single-world (or untagged) rather than the gate being off.
Verified
libs/retina-analyticssuite:420 passed(9 new intests/test_world_overlap_gate.py).tests/test_analytics_routes.py tests/test_adsb_seed_backend.py:54 passed— new: the status field reflects the counter; a
synth-*node and a hardwarenode registered on overlapping coverage get no zone and no adjacency; two
synthetic nodes on the same coverage still pair.
2777 passed, 2 skipped in 165.25s(-n 2 -m "not external").pre-commit run --all-filesclean in both the worktree and the library.🤖 Generated with Claude Code