84 of 100 incidents are titled "Ems — TGID 9048" because /upload never resolves the talkgroup name #34
Closed
opened 2026-08-23 03:20:35 -04:00 by logan
·
1 comment
No Branch/Tag Specified
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
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#34
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.
84 of 100 incidents in the 2026-08-23 correlation dump are named
"Ems — TGID 9048","Other — TGID 9600","Police — TGID 9563"— the fallback title, not a description of anything. Only 16 got a real name like"Medical Assistance at Noel Drive". The title is the primary label everywhere: incident list rows, map pins, Discord alerts._create_incident(internal/incident_correlator.py:1832-1849) builds it from two inputs:Both inputs are failing, but the second is the cheap fix:
talkgroup_namearrives as None on the correlation path, and nobody looks it up. It is a plain multipart form field on/upload(routers/upload.py:24), forwarded straight through_run_intelligence_pipelineinto the correlator. The edge node only sends it when OP25 supplied atgid_name(call_recorder.py:752—if talkgroup_name:), which is exactly the case that fails for talkgroups missing from the loaded tags file.The lookup that fixes it already exists — in the other path.
internal/mqtt_handler.py:222-231resolves it oncall_start:So the call document already holds the right name (written at call_start), and
/uploadfetches that very document a few lines earlier for the dedup check — then ignores itstalkgroup_namein favour of the empty form field. C2 owns the systems collection with all 125 talkgroup definitions; it should never be titling an incidentTGID 9048whileOssining - Police Dispatchsits in the system config.Fixing just this turns 84 titles from
"Ems — TGID 9048"into"Ems — Ossining Police Dispatch". Still not a description, but it names a place instead of an integer.The remaining half is extraction.
content_tagsis empty on those same 84, sointelligence.pyreturned no usable tag for the founding call. That is a prompt/extraction problem and deserves its own pass — worth measuring again once the talkgroup name is fixed, since some of these calls are genuinely content-free radio chatter that should arguably not be opening an incident at all (see server-26#5).Fix shape:
internal/talkgroups.pyhelper./upload, preferring the form value, then the call doc, then the system config.mqtt_handlertoo so there is one implementation.Fixed in
039a06d.internal/talkgroups.pyis now the single resolver — caller hint, then the call document, then the system config — and bothmqtt_handler(call_start) and_run_intelligence_pipeline(the funnel /upload and /calls/{id}/reprocess share) use it. The resolved name is written back to the call document when that was what was missing, so the archive and orphan panel stop showing bare TGIDs as well.12 unit tests pin the preference order in
tests/test_talkgroups.py; full c2-core suite is 183 green.The extraction half —
content_tagsempty on those same 84 incidents — is untouched and belongs with server-26#5. Worth re-measuring the fallback-title rate on the next AI window now that the label is real.