correlator: remove is_dispatch and the tactical fit path entirely (#134)
Full removal, not a hardcoded flag: _is_dispatch_channel, _DISPATCH_TG_RE, the is_dispatch parameter, and _call_fits_incident's tactical branch are gone. One evaluation path for every channel. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Tbknwttzou4s46PAykmtix
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
0473e6a583
commit
b1884852d5
+12
-24
@@ -90,31 +90,19 @@ class Settings(BaseSettings):
|
||||
unit_continuity_max_idle_minutes: int = 20 # unit-continuity path: skip if incident idle > this
|
||||
recorrelation_scan_minutes: int = 60 # re-examine orphaned calls ended within this window
|
||||
tg_fast_path_idle_minutes: int = 90 # fast path: max minutes since incident last updated
|
||||
# Dispatch channels only: tier-2 thin calls attach to a lone candidate idle < this.
|
||||
# Was 10, which is long enough for the channel to have moved on to something else:
|
||||
# on 2026-08-16 a "72 at Holland Station" incident absorbed a Grand Central train
|
||||
# meet 9.6 min later, and a status check absorbed a records lookup at 9.7 min.
|
||||
# Across that dump every correct thin attach was <= 3.4 min idle and every wrong
|
||||
# one was >= 8.2, so 5 separates them with room on both sides. Genuine
|
||||
# back-and-forth is handled by the 30-second tier-1 path above this.
|
||||
# Second consumer (server-26#115): routers/upload.py's LLM-orphan-gate
|
||||
# escape hatch (_recent_incident_on_same_talkgroup) always uses this same
|
||||
# value now — no dispatch/tactical branch there since #133. Retuning this
|
||||
# for fast/thin reasons moves that gate's behavior too — check both call
|
||||
# sites before changing it. (tg_thin_idle_minutes below is now unused in
|
||||
# production — is_dispatch is hardcoded True at its only real call site,
|
||||
# incident_correlator.py's fast-path — see server-26#134.)
|
||||
# Tier-2 thin calls attach to a lone candidate idle < this, on every
|
||||
# channel (server-26#133/#134 removed the dispatch/tactical split — a
|
||||
# channel's name doesn't change how much scrutiny it gets). Was 10, which
|
||||
# is long enough for the channel to have moved on to something else: on
|
||||
# 2026-08-16 a "72 at Holland Station" incident absorbed a Grand Central
|
||||
# train meet 9.6 min later, and a status check absorbed a records lookup
|
||||
# at 9.7 min. Every correct thin attach in that dump was <= 3.4 min idle
|
||||
# and every wrong one was >= 8.2, so 5 separates them with room on both
|
||||
# sides. Genuine back-and-forth is handled by the 30-second tier-1 path
|
||||
# above this. Also the escape hatch in routers/upload.py's LLM-orphan gate
|
||||
# (_recent_incident_on_same_talkgroup, server-26#115) — check both call
|
||||
# sites before retuning this.
|
||||
tg_dispatch_thin_idle_minutes: int = 5
|
||||
# Every other channel: tier-2 thin calls attach to a lone candidate idle < this.
|
||||
# Non-dispatch talkgroups previously had NO tier-2 bound at all — they used the
|
||||
# whole 90-minute tg_fast_path_idle_minutes window with no single-candidate
|
||||
# requirement and no fit test, which is the widest version of the 2026-08-20
|
||||
# over-merge. A tactical channel really is dedicated to one scene, so it earns
|
||||
# a longer window than a dispatch backbone, but not an unbounded one: 15 sits
|
||||
# inside the 20-minute tactical-default window in _call_fits_incident, so the
|
||||
# no-evidence thin path is never more permissive than the fit-tested path on
|
||||
# the same channel.
|
||||
tg_thin_idle_minutes: int = 15
|
||||
|
||||
# ── Hard caps: an incident past either of these stops accepting calls ──────
|
||||
# Enforced on every correlation path (see _incident_at_capacity). Pairwise fit
|
||||
|
||||
Reference in New Issue
Block a user