Task · TSO-0091

Dedup youngest-eviction-age gauge latches for the process lifetime with no reset path

Description

dedup.Set.YoungestEvictionAge (internal/dedup/dedup.go:162-172, set in evictLocked at :183-190) keeps an all-time low-water mark and never decays it — deliberately, so a short burst stays visible after it subsides. e3caac4 fixed the immediate live symptom by scoping the exported overlap horizon to the poll path, so the shipped ts2o-dedup-youngest-eviction rule now has no denominator on stream- and objectstore-fed collectors and cannot fire there. That does NOT fix the latch on a genuinely polling deployment: one max_window catch-up after a restart pins the gauge below the horizon and the alert then fires for the life of the process with no way to resolve. The catalog description at internal/appcatalog/catalog.go:523 already names the right current-pressure signal (“evictions approaching the set capacity WITHIN A SINGLE POLL INTERVAL”), and the sibling rule ts2o-dedup-set-saturated ships PAUSED for the mirror-image reason. Decide between a windowed/decaying variant of the gauge, an alert expression built on per-interval eviction pressure instead, or moving the latched value off alerting onto the status page and dashboard only.

Acceptance Criteria

Definition of Done

Implementation Plan

Lane F chooses the narrowest reset mechanism among the three task options, implements it with TDD, and records the choice; it owns internal/dedup, internal/app/dedupobs.go, and tabs/policy_access.py plus policy_dns.py.

Implementation Notes

Open question resolved by root: use the narrowest reversible windowed-reset mechanism. Keep the existing metric name, type, labels, panel, and alert; atomically consume the minimum capacity-eviction residency age since the previous self-observability interval, clear the gauge series during intervals with no eviction, and retain the lifetime accessor only as an internal compatibility diagnostic. This lets the existing noDataState Ok rule resolve without restart.

Final Summary

Changed youngest eviction age to a reporting-window low-water mark while retaining the lifetime diagnostic, so catch-up pressure clears and the existing alert and panel resolve without restart. Implementation SHA f35b6ab. Final integrated just check passed at 5b55617; exact-head CI run 33354208183 completed success.

View the source file on GitHub