Fix explain_unresolved() not excluding toleranced bearings like solve_location() does

Latent inconsistency flagged during the ocr.py refactor: solve_location()
already excludes a compass-word bearing (bearing_tolerance_deg set) from
its own bearings list before triangulating, since a toleranced bearing
names a sector, not a precise ray, and shouldn't be treated as if it
were one. explain_unresolved()'s bearings list didn't have the same
exclusion, so a toleranced-only bearing plus a distance clue could get
described as inconsistent geometry ('the bearing from X never crosses
the Ykm circle...') when the real reason nothing resolved is just that
the bearing was never usable for that math in the first place. Locked
in with a new test.
This commit is contained in:
2026-08-09 18:28:48 +02:00
parent ddb7867a88
commit 21c6553784
2 changed files with 26 additions and 1 deletions
+9 -1
View File
@@ -294,7 +294,15 @@ def explain_unresolved(location: Location, board: Board) -> str | None:
return "waiting on " + ", ".join(unresolved_refs) + " to have a known position first"
resolved = [(clue, pt) for clue in location.clues if (pt := _entity_point(board, clue.reference)) is not None]
bearings = [(c, p) for c, p in resolved if c.bearing_deg is not None and c.distance_km is None]
# A toleranced bearing (compass word, not a precise degree reading)
# is never used to triangulate in solve_location() either (see its
# own comment above), excluded here too so this explanation doesn't
# claim a toleranced-only bearing could resolve something when it
# never actually could.
bearings = [
(c, p) for c, p in resolved
if c.bearing_deg is not None and c.distance_km is None and c.bearing_tolerance_deg is None
]
distances = [(c, p) for c, p in resolved if c.distance_km is not None and c.bearing_deg is None]
if bearings and distances: