Non-primary scenes inherit the primary scene's severity from the call doc, so bdb57ae closed one of three leaks and the other two now carry the weight alone #95

Closed
opened 2026-09-01 02:43:34 -04:00 by logan · 1 comment
Owner

Found by the standing P0 correlation static pass, unattended run 2026-09-01, at b722223. Not a regression caused by bdb57ae — it is a pre-existing sibling defect that bdb57ae made load-bearing.

What bdb57ae actually fixed, and what it left

bdb57ae (#87) stopped _build_context falling back to the call doc's location_coords when a scene passes none (incident_correlator.py:792-799). Verified: each scene now geocodes its own location (intelligence.py:309-323), only genuinely locationless scenes lose coords, and recorrelation_sweep.py:96-97 passes both explicitly so the sweep path is unchanged. No regression in the coords path. #87's stated defect is fixed and #87 is closed.

But the primary-scene leak had three channels into _build_context, not one. Coords was the one that got fixed:

Channel Source Status
location_coords call doc fallback fixed by bdb57ae
embedding incident_correlator.py:780, written from processed[0] at intelligence.py:368 tracked as #80, open
severity incident_correlator.py:784, written from processed[0] at intelligence.py:356 this issue — not tracked anywhere

intelligence.py unions tags, units and vehicles across scenes but writes severity and embedding from processed[0] only. So a non-primary scene is still judged on scene 1's content.

Why the severity half bites in both directions

  • Over-split. An inherited major severity makes a content-free scene non-thin at incident_correlator.py:644, which lets it clear the creation gate at :1293 and open its own "other" incident. That is server-26#5's failure mode, arriving through a field the scene never claimed.
  • Over-merge. The embedding half (#80) drives the slow path at :1214-1219 and the content-divergence veto at :1644,1657, so scene 2 is matched on scene 1's meaning.

Together these are precisely the #87-class leak. Removing the coords crutch without removing the siblings means the two remaining channels now carry the full weight of the primary scene's identity.

Fix shape

severity and embedding should be per-scene in the extraction output rather than call-level, and _build_context should read the scene's own values with no call-doc fallback — the same shape bdb57ae used for coords. Do #80 and this in one pass; splitting them repeats exactly the partial-fix pattern this issue documents.

Test gap

No test covers _build_context's embedding or severity sourcing. drb-c2-core is at 290 pass / 0 fail at HEAD (bdb57ae added one), but all three findings from this pass sit outside the tested gate and dedup paths. A fix here must arrive with a multi-scene fixture where scene 1 is major and scene 2 is content-free.

Not verified

Whether the severity leak fires in practice — that needs a real multi-scene call where scene 1 is major and no recent talkgroup incident exists. AI is off during the week for cost, so this is static reading only. Worth confirming in the next evening window.

Related: #87 (closed), #80, #91, #5. Recorded in DEFERRED.md alongside the #87 row so neither is the sole record.

Found by the standing P0 correlation static pass, unattended run 2026-09-01, at `b722223`. Not a regression *caused* by `bdb57ae` — it is a pre-existing sibling defect that `bdb57ae` made load-bearing. ## What `bdb57ae` actually fixed, and what it left `bdb57ae` (#87) stopped `_build_context` falling back to the call doc's `location_coords` when a scene passes none (`incident_correlator.py:792-799`). Verified: each scene now geocodes its own location (`intelligence.py:309-323`), only genuinely locationless scenes lose coords, and `recorrelation_sweep.py:96-97` passes both explicitly so the sweep path is unchanged. **No regression in the coords path. #87's stated defect is fixed and #87 is closed.** But the primary-scene leak had **three** channels into `_build_context`, not one. Coords was the one that got fixed: | Channel | Source | Status | |---|---|---| | `location_coords` | call doc fallback | **fixed** by `bdb57ae` | | `embedding` | `incident_correlator.py:780`, written from `processed[0]` at `intelligence.py:368` | tracked as **#80**, open | | `severity` | `incident_correlator.py:784`, written from `processed[0]` at `intelligence.py:356` | **this issue — not tracked anywhere** | `intelligence.py` unions `tags`, `units` and `vehicles` across scenes but writes `severity` and `embedding` from `processed[0]` **only**. So a non-primary scene is still judged on scene 1's content. ## Why the severity half bites in both directions - **Over-split.** An inherited `major` severity makes a content-free scene non-thin at `incident_correlator.py:644`, which lets it clear the creation gate at `:1293` and open its own `"other"` incident. That is server-26#5's failure mode, arriving through a field the scene never claimed. - **Over-merge.** The embedding half (#80) drives the slow path at `:1214-1219` and the content-divergence veto at `:1644,1657`, so scene 2 is matched on scene 1's meaning. Together these are precisely the #87-class leak. Removing the coords crutch without removing the siblings means the two remaining channels now carry the full weight of the primary scene's identity. ## Fix shape `severity` and `embedding` should be **per-scene** in the extraction output rather than call-level, and `_build_context` should read the scene's own values with no call-doc fallback — the same shape `bdb57ae` used for coords. Do #80 and this in one pass; splitting them repeats exactly the partial-fix pattern this issue documents. ## Test gap No test covers `_build_context`'s embedding or severity sourcing. `drb-c2-core` is at 290 pass / 0 fail at HEAD (`bdb57ae` added one), but all three findings from this pass sit outside the tested gate and dedup paths. A fix here must arrive with a multi-scene fixture where scene 1 is `major` and scene 2 is content-free. ## Not verified Whether the severity leak fires in practice — that needs a real multi-scene call where scene 1 is `major` and no recent talkgroup incident exists. AI is off during the week for cost, so this is static reading only. Worth confirming in the next evening window. Related: #87 (closed), #80, #91, #5. Recorded in `DEFERRED.md` alongside the #87 row so neither is the sole record.
Author
Owner

Fixed in a9d1d24 (branch fix/scene-context-leak-80-95, not yet merged/deployed).

_build_context no longer reads embedding / severity off the call doc — each scene threads its own value through preview_correlation / correlate_call, exactly like the #87 coords fix. recorrelation_sweep passes the call doc value explicitly (whole-call re-link, link-only). +2 regression tests in test_incident_identity.py; full c2-core suite green (295 passed).

Remaining leg of this defect class split to #102 (llm_correlator._call_block still reads the whole-call transcript per scene). Review-flagged side effects: #103 (divergence veto on None embedding), #104 (reprocess stale severity).

Fixed in `a9d1d24` (branch `fix/scene-context-leak-80-95`, not yet merged/deployed). `_build_context` no longer reads `embedding` / `severity` off the call doc — each scene threads its own value through `preview_correlation` / `correlate_call`, exactly like the #87 coords fix. `recorrelation_sweep` passes the call doc value explicitly (whole-call re-link, link-only). +2 regression tests in `test_incident_identity.py`; full c2-core suite green (295 passed). Remaining leg of this defect class split to #102 (`llm_correlator._call_block` still reads the whole-call transcript per scene). Review-flagged side effects: #103 (divergence veto on None embedding), #104 (reprocess stale severity).
logan closed this issue 2026-09-06 15:11:33 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: logan/server-26#95