burn-down night watches: R-872 05:00 run worked as designed but silently (Tester 2 34.8 h old) — early returns now log why, check re-dated 2026-10-07; R-887: 2 lost jobs, both re-run green; session report
gates / gates (push) Successful in 2m17s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-06 05:05:42 +02:00
parent c8774593f8
commit 307ecdf005
9 changed files with 144 additions and 3 deletions
+10
View File
@@ -346,11 +346,21 @@ const (
// expected_dbdump_missed and one expected_backup_missed, each only past its longer line, and never for a box that
// was bound or first reported less than downDumpMissedAfter ago (nothing has been expected yet).
func judgeDownCustomer(s *store.Store, id string, now time.Time, onEvent EventNotifyFunc, logger *log.Logger) (backupMissed, dbdumpMissed int) {
// Each early return says so in the log: the 2026-10-06 05:00 night watch saw only "1 skipped (down)" and could not
// tell "judged, nothing missed" from "too young to judge" (Tester 2, first report 34.8 h before). Pinned by
// TestR872_DownButTooYoungIsLogged.
if bound, err := s.HasEverBoundHost(id); err == nil && !bound {
logger.Printf("[INFO] Deadline check: %s is DOWN — not judged: no host was ever bound", id)
return 0, 0
}
first, ferr := s.GetFirstHostReportAt(id)
if ferr != nil || first.IsZero() || now.Sub(first) < downDumpMissedAfter {
age := "unknown"
if ferr == nil && !first.IsZero() {
age = now.Sub(first).Round(time.Minute).String()
}
logger.Printf("[INFO] Deadline check: %s is DOWN — not judged yet: first host report %s ago (under %s, nothing expected yet)",
id, age, downDumpMissedAfter)
return 0, 0
}
raise := func(typ, msg string) {