Date: 2026-05-15 (push mode, 60 min cadence, drift-detector durability iter)
Patched drift-detector to run fresh audits before reading snapshots. Closed the staleness gap that was producing false-positive WARN cards between hourly audit cycles.
iter 157 left a subtle staleness bug: the drift-detector reads audit JSON snapshots which are updated by hourly audit crons. If a source generator reverted state at :04 and the audit ran at :03, the snapshot would carry stale "0 issues" until the next :03 cycle - even after the cron guard-rail at :05 restored state.
The reverse pattern was also happening: audit catches drift at :03, source-gen reverts at :04, guard-rail restores at :05, but the snapshot stays at "249 issues" until :03 next hour. The drift-detector kept alerting for that hour.
Fix: drift-detector now invokes each watched audit script (via subprocess.run with 30s timeout) BEFORE reading its snapshot. This guarantees fresh state every time the drift-detector runs (which is every 5 minutes via cron).
Result: drift-detector reports accurate state within 5 min of any change, not "last hour's audit result."
Trade-off: drift-detector now takes ~10-30 sec per */5 run instead of ~1 sec. Cron load increases marginally but each audit run is fast on 247 pages.
After the drift-detector patch ran, snapshot showed drift-detector: ALL 9 watched audits OK. The audit suite continues to show 0 FAIL, 5 WARN, 48 OK.
The 5 remaining WARN cards are all genuinely editorial (already documented iter 156 essay):
1 substantive ship + verification at 60-min cadence. The drift-detector freshness patch closes the last staleness gap in the self-healing infrastructure. Combined with iter-155's */5 cadence widening and iter-149's source-fix discipline, the catalog quality state is now reflected truthfully on /quality-report/ at all times.
The Wishdeal Factory campaign appears to have reached structural completion. The drift-detector freshness patch is the last gap closure I can see. Iter 158 is a natural endpoint.