Each evidence case is found by a deterministic check over a function's per-release history — no LLM, identical every run. A code smell must have grown (over the published threshold for ≥ 2 releases), been fixed (the criterion below), and stayed fixed (survived to the latest observed release). Each family's “fixed” rule and the research behind it:
Complexity findings are ordered by three explicit axes (never collapsed into one opaque number, so a ranking is always explainable):
So: the most cognitively/cyclomatically complex code leads; among similarly complex functions, many callers + worsening over time rises (higher payoff, marked “touches N callers”), while never cleaned across releases sinks — likely essential or chronically deferred, not worth refactoring for its own sake unless you are already in that code.
How a fix is confirmed (deterministic, no LLM): The offending site count in the function falls from > 0 to 0 — the x in list leaves the loop, the nested input-scaling loop collapses, the query or allocation is hoisted or batched — while the function survives (a removal, not a deletion).
How a fix is confirmed (deterministic, no LLM): The bare/broad+silent handler is narrowed to a specific exception type, or stops being silent (logging or a re-raise is added) — either clears the offending-handler count.
How a fix is confirmed (deterministic, no LLM): Annotation coverage rises — unannotated parameters and a missing return type get annotated, a bare list/dict gains type args, or an Any/cast/type: ignore is removed — driving the “weak/missing” count to 0.
How a fix is confirmed (deterministic, no LLM): A function's clone group shrinks — the near-identical copies are consolidated into one shared implementation, so the count of other copies falls to 0.
How a fix is confirmed (deterministic, no LLM): A strongly-connected import cycle is no longer an SCC at a later release (an edge was removed — the cycle broke). The current-version report also classifies lazy/re-export cycles and package barrel back-references separately from import-time cycles. Hub and instability trend confirmation are still roadmap items.
How a fix is confirmed (deterministic, no LLM): The acquire/release balance stops being positive — a free/close/unlock is added, or the acquisition becomes context-managed (with) — while the function survives.
How a fix is confirmed (deterministic, no LLM): The flagged item simply disappears — the dead function/parameter is removed, the literal is named as a constant, the TODO is resolved, the docstring is added.