generated from coulomb/repo-seed
session-memory: recurring-error signal + clustering (WP-0006 T02)
detect/signals.py sig_recurring_error emits one signal per distinct error fingerprint per session (magnitude = in-session occurrences), so the same error recurring across sessions/repos/flavors clusters into a candidate root-cause problem pattern via the existing clusterer — cross-flavor flagged automatically. 3 new tests; suite 98/98 green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -156,10 +156,28 @@ def sig_tool_thrash(digest, ctx) -> list[Signal]:
|
||||
return []
|
||||
|
||||
|
||||
def sig_recurring_error(digest, ctx) -> list[Signal]:
|
||||
"""Problem: a normalized error fingerprint (WP-0006) — one signal per distinct
|
||||
error in the session, so the same error across sessions/repos/flavors clusters
|
||||
into a candidate root-cause pattern (locus = fingerprint, magnitude = in-session
|
||||
occurrences). This is the content-level 'why', not just a coarse error count.
|
||||
"""
|
||||
out: list[Signal] = []
|
||||
for snip in digest.get("error_snippets", []) or []:
|
||||
fp = snip.get("fingerprint")
|
||||
if not fp:
|
||||
continue
|
||||
out.append(_base(digest, "recurring_error", PROBLEM, fp, float(snip.get("count", 1)),
|
||||
sample=snip.get("sample", ""), tool=snip.get("tool"),
|
||||
occurrences=snip.get("count", 1)))
|
||||
return out
|
||||
|
||||
|
||||
EXTRACTORS: list[Callable] = [
|
||||
sig_retry_storm, sig_repeated_errors, sig_budget_overrun, sig_abandoned,
|
||||
sig_clean_pass, sig_error_then_recovery,
|
||||
sig_infra_overhead, sig_schema_thrash, sig_tool_thrash,
|
||||
sig_recurring_error,
|
||||
]
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user