RF-08 — Warning selection ignores live note staleness
State: fixed 2026-08-27
Repair shape: small policy decision and local patch
Severity: medium
Finding
Warn selection confirms that the current criterion still matches its baseline, but it does not compare the live note with the accepted note snapshot. A warning can therefore be queued after the note has changed enough to make the finding obsolete or misleading.
Evidence
- The former
scan_reviews()loaded the baseline and checked onlybaseline_criterion_hashagainst the live criterion. - The general freshness selector already has the note comparison needed to classify the pair.
Why it matters
The output is presented as actionable review text for the current note. Applying a stale finding can undo a repair, address text that no longer exists, or cause the fix agent to reinterpret the reviewer beyond its evidence.
Provisional repair direction
Decide whether note-stale warnings should be suppressed or returned in a separate explicitly stale advisory section. Do not silently present them as current.
Done when
- The selector's output distinguishes current-note findings from stale residue.
- A note-only edit has a specified, tested result.
- Criterion-stale and note-stale behavior use consistent terminology.
Resolution
Warn selection now compares both live input hashes with each WARN pair's
freshness baseline before admitting its findings to the fix queue. A mismatch
suppresses those findings and creates a pair-specific stale advisory carrying
the note, criterion, model partition, review-pair identity, and the canonical
note-changed and/or criterion-changed reasons. JSON exposes these advisories
under stale_pairs; grouped output labels them as skipped stale WARN pairs.
Direct fix-system consumers now treat that section as a re-review signal rather
than actionable fix work. Staleness is classified before the selector reads
mutable result prose, so a missing result artifact cannot suppress the advisory.
Tests cover live pairs, criterion-only staleness, note-only staleness and its
rendered output, missing result prose for a stale pair, and non-WARN pairs that
change.