// Replays hub cmd/hub/main.go scheduleDaily's arithmetic (felhom.eu 5c48731, lines 1057-1062) over
// 2026-10-23..27 with a simulated clock, for each hub daily job. Prints every fire time.
package main

import (
	"fmt"
	"time"
)

func main() {
	bud, _ := time.LoadLocation("Europe/Budapest")
	jobs := []struct{ name string; h, m int }{{"db-snapshot", 2, 0}, {"prune", 4, 30}, {"deadline-check", 5, 0}, {"offsite-key-audit", 7, 10}}
	for _, j := range jobs {
		now := time.Date(2026, 10, 23, 12, 0, 0, 0, bud)
		end := time.Date(2026, 10, 27, 12, 0, 0, 0, bud)
		fmt.Printf("%s (%02d:%02d):\n", j.name, j.h, j.m)
		for now.Before(end) {
			n := now.In(bud)
			next := time.Date(n.Year(), n.Month(), n.Day(), j.h, j.m, 0, 0, bud)
			if !next.After(n) {
				next = next.Add(24 * time.Hour)
			}
			fmt.Printf("   fires %s  (%s)\n", next.In(bud).Format("2006-01-02 15:04 MST"), next.UTC().Format("15:04Z"))
			now = next // fn() runs instantly; loop re-reads the clock at the fire instant
		}
	}
}

--- go run, go version go1.26.0 linux/amd64
db-snapshot (02:00):
   fires 2026-10-24 02:00 CEST  (00:00Z)
   fires 2026-10-25 02:00 CEST  (00:00Z)
   fires 2026-10-25 02:00 CET  (01:00Z)
   fires 2026-10-26 02:00 CET  (01:00Z)
   fires 2026-10-27 02:00 CET  (01:00Z)
   fires 2026-10-28 02:00 CET  (01:00Z)
prune (04:30):
   fires 2026-10-24 04:30 CEST  (02:30Z)
   fires 2026-10-25 03:30 CET  (02:30Z)
   fires 2026-10-25 04:30 CET  (03:30Z)
   fires 2026-10-26 04:30 CET  (03:30Z)
   fires 2026-10-27 04:30 CET  (03:30Z)
   fires 2026-10-28 04:30 CET  (03:30Z)
deadline-check (05:00):
   fires 2026-10-24 05:00 CEST  (03:00Z)
   fires 2026-10-25 04:00 CET  (03:00Z)
   fires 2026-10-25 05:00 CET  (04:00Z)
   fires 2026-10-26 05:00 CET  (04:00Z)
   fires 2026-10-27 05:00 CET  (04:00Z)
   fires 2026-10-28 05:00 CET  (04:00Z)
offsite-key-audit (07:10):
   fires 2026-10-24 07:10 CEST  (05:10Z)
   fires 2026-10-25 06:10 CET  (05:10Z)
   fires 2026-10-25 07:10 CET  (06:10Z)
   fires 2026-10-26 07:10 CET  (06:10Z)
   fires 2026-10-27 07:10 CET  (06:10Z)
   fires 2026-10-28 07:10 CET  (06:10Z)
