Honest pins and paths: geocode precision, type-gated paths, impossible-speed stops (#236) #274
No Reviewers
Labels
Clear labels
area/ai-pipeline
area/auth
area/billing
area/correlation
area/discord
area/frontend
area/governance
area/growth
area/infra-deploy
area/legal
area/map
area/mqtt
area/node-ota
area/osint
area/recording-audio
area/sdr-radio
area/transcription
board
board:agenda
minutes:draft
minutes:final
role:ceo
role:cfo
role:cio
role:ciso
role:cmo
role:coo
role:cto
Scene/entity extraction, summarizer, AI providers, embeddings
AuthN/Z, roles, tenancy/org scoping, API keys, credentials
Plans, entitlements, AI spend accounting and caps
Incident correlation, linking, lifecycle, severity, corr_debug
Discord bot, radio bots, voice streams, bot tokens, webhooks
Web UI: Next.js app and the edge-node local dashboard
Board process, minutes, unattended runner, agent tooling
Go-to-market, outreach, cold email, discovery conversations
CI/CD, VM, registry, Firestore rules/indexes deploy, Terraform/Caddy
ToS, retention, licences/DAAs, CAN-SPAM, E&O, name suppression
Live map: pins, paths, tiles, legend, geocoding
Node-C2 MQTT, checkins, commands, node sweeper, dynsec
Node install, enrollment, OTA updater, image skew
External feeds: cameras, 511, ADS-B, AIS, outages, and their licences
Call capture, boundaries, PulseAudio, ring buffer, trimming, attribution
OP25 decode, SDR hardware/tuning, conventional, second SDR, mesh radio
STT, transcript correction, place verification, name accuracy
Board process: minutes and board-filed items
Needs board scoping at the next sitting; CEO removes the label once scoped
One exec pre-read, closed by CEO
CEO ruling; open until enacted
Filed by the CEO
Filed by the CFO
Filed by the CIO
Filed by the CISO
Filed by the CMO
Filed by the COO
Filed by the CTO
kind
behavior-bug
Wrong product behavior; the instrument reads it correctly
kind
measurement-bug
Corrupts the recording/instrument (debug data, evals, health checks), not behavior
priority
p0
Drop everything: prod broken, live exposure, or owner-ruled P0
priority
p1
Next up: blocks a gate, a customer, or core incident quality
priority
p2
Normal: real defect or planned work, schedule in turn
priority
p3
Low: minor, cosmetic, or someday
status
blocked
Waiting on an external party, spend, or another issue
status
in-progress
Branch or PR open against it
status
needs-decision
Waiting on an owner or board ruling before work
status
needs-info
Root cause or repro unknown; needs a reading first
type
bug
Something built is wrong: code, data, or a measurement
type
chore
Maintenance, refactor, tests, pinning, cleanup: no user-visible change
type
decision
A ruling to make or record: board minutes, owner calls, legal reviews
type
docs
Docs, runbooks, CLAUDE.md, skills, SOPs
type
feature
New capability or an extension of an existing one
type
security
Security, privacy, credential or tenant-isolation exposure
type
tracking
Tracker, checklist, initiative or punch-list spanning several changes
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: logan/server-26#274
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Make the map honest about how exact a pin or path is.
Backend (display-only)
intelligence._geocode_locationreturns{lat, lng, location_type}. The coords dict goes onto the call doc unchanged, and throughincident_correlator._resolve_location_pair(not edited) onto the incident pin.location_coordsindexes["lat"]/["lng"]directly, and the LLM prompt only sees the location string. Checked callers:place_verifier._geocode_in_anchor(truthiness only),upload.py,recorrelation_sweep,replay. No coords-dict equality comparisons exist inapp/.test_geocode_named_region.pyassertions updated. Newtest_geocode_location_type.pychecks that each accepted type is returned, that APPROXIMATE, empty and unknown types still return None, and that the type survives onto the incident pin.Frontend
types.ts:GeoPointadds an optionallocation_type.IncidentRecordaddslocation_coords_source.liveWall.ts, pure helpers shared by the map and the spine:isMovementIncidentis police/accident with a pursuit tag. The tag list mirrors_PURSUIT_TAGS.pathStopsproduces the stops. A stop is ghosted when reaching it means faster than 8 km/min, past 0.5 km; this mirrors the backend speed check. A bad first stop is detected when stops 1 and 2 agree with each other but not with it.mayBeMergedis set when the kept path is over 20 km.incidentPointsnow drops ghosted stops, so camera matching stops chasing a bad geocode.MapView.tsx:location_coords_sourceare ghosted with a dashed outline. The popup states the precision.?marker and a dotted spur. Paths over 20 km get a "may be merged · N km" badge.pulseIncidentIds?: Set<string>adds a pulsing ring to single and clustered pins. Nothing passes it yet; #238 wires it.WallPanels.tsx:stopOfcomes frompathStops, so the spine numbers exactly what the map numbers. Ghosted stops show a dashed?. The header shows the "may be merged" badge. The #233 spine changes are kept.Acceptance
movement=falseand no stop numbers, so no numbered path.Not done / caveats
location_type. They draw as before, and the popup says "Precision not recorded".Results
930 passed, 4 warningstsc --noEmit: exit 0Closes #236
🤖 Generated with Claude Code
Backend: _geocode_location now returns {lat, lng, location_type}, so the precision rides onto the call doc and, unchanged via _resolve_location_pair, onto the incident pin. Display-only: every correlator read indexes lat/lng. Frontend: pins styled by precision (rooftop / interpolated ring / GEOMETRIC_CENTER dashed uncertainty circle labelled with the spoken place / unverified pre-#23 pins ghosted). liveWall.pathStops() is shared by the map and the call spine: only police/accident incidents with a pursuit tag draw a numbered path; others get unnumbered call dots. Segments over >10 min gaps or talkgroup changes are dashed, stops implying >8 km/min are ghosted off the path, paths >20 km get a "may be merged" badge. New optional MapView prop pulseIncidentIds (wired by #238). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>