admin: explain detection cooldowns and skipped scans (#12185)

* plugin: describe detection cooldowns and report skipped scans

* admin: expose cooldown eligibility and preserve skipped detection outcomes

* admin: show cooldown eligibility alongside maintenance lock waits

* plugin: retain cooldown activity for older admin servers

* admin: keep manual detection skips out of scheduler run state

* plugin: refresh descriptors on reconnect without downgrading saved schemas

* plugin: allow valid schema refreshes to repair corrupt descriptors

* admin: store eligible_after activity detail as RFC3339

* worker: report admin_script interval skips as skipped detection

* worker: report admin_script interval skips after the last completed job

* admin: show the selected job's cooldown while scheduling is disabled

* admin: report an unsigned interval skip instead of a completed scan

* worker: populate new DetectionComplete fields in Rust senders

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

---------

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Chris LuandDevin authored and GitHub committed 2026-10-28 22:55:36 -07:00
1 parent cb993ab83b
commit 4ed9595a58
24 files changed
+529 -112

No files matched your search

@@ -92,11 +92,14 @@ func TestAdminScriptDetectSkipsByRunInterval(t *testing.T) {
if sender.complete == nil || !sender.complete.Success {
t.Fatalf("expected successful completion message")
}
if sender.complete.SkippedReason == "" || sender.complete.EligibleAfter == nil {
t.Fatalf("expected skipped completion metadata, got %+v", sender.complete)
}
if len(sender.events) == 0 {
t.Fatalf("expected detector activity events")
}
if !strings.Contains(sender.events[0].Message, "run interval") {
t.Fatalf("unexpected skip message: %q", sender.events[0].Message)
if sender.events[0].Stage != "skipped_by_interval" {
t.Fatalf("unexpected skip stage: %q", sender.events[0].Stage)
}
}