Skip to content

Maintenance clock

Every job on this estate that is not a CI pipeline — a cron, a systemd timer, a backup server’s own scheduler, a scheduler inside a container — is declared in one file with its host, its host-local start time and its measured duration. This panel renders that file. It is not a diagram of the intended schedule; it is the record the estate’s own clash reconciler reads, so the public clock and the internal one cannot drift apart.

Maintenance clock — 98 declared jobs across one day

Snapshot taken — build-time, not live
  • 98declared jobs
  • 4,123starts a day
  • 70watched by a dead-man
  • 09:00busiest hour
98 of 98
Overnight backup window 22:00–07:00, derived from 4 daily backup jobsQuiet hours 21:00–07:00 — nothing may page (ADR-0264)000306091215182100:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m01:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m02:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m03:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m04:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m05:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m06:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m07:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m08:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m09:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m10:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m11:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m12:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m13:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m14:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m15:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m16:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m17:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m18:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m19:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m20:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m21:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m22:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m23:17 · Reboot advance-notice detection · pve01, control01 · Hourly · 1m00:20 · Dawn triage metrics collection · control01 · Hourly · 1m01:20 · Dawn triage metrics collection · control01 · Hourly · 1m02:20 · Dawn triage metrics collection · control01 · Hourly · 1m03:20 · Dawn triage metrics collection · control01 · Hourly · 1m04:20 · Dawn triage metrics collection · control01 · Hourly · 1m05:20 · Dawn triage metrics collection · control01 · Hourly · 1m06:20 · Dawn triage metrics collection · control01 · Hourly · 1m07:20 · Dawn triage metrics collection · control01 · Hourly · 1m08:20 · Dawn triage metrics collection · control01 · Hourly · 1m09:20 · Dawn triage metrics collection · control01 · Hourly · 1m10:20 · Dawn triage metrics collection · control01 · Hourly · 1m11:20 · Dawn triage metrics collection · control01 · Hourly · 1m12:20 · Dawn triage metrics collection · control01 · Hourly · 1m13:20 · Dawn triage metrics collection · control01 · Hourly · 1m14:20 · Dawn triage metrics collection · control01 · Hourly · 1m15:20 · Dawn triage metrics collection · control01 · Hourly · 1m16:20 · Dawn triage metrics collection · control01 · Hourly · 1m17:20 · Dawn triage metrics collection · control01 · Hourly · 1m18:20 · Dawn triage metrics collection · control01 · Hourly · 1m19:20 · Dawn triage metrics collection · control01 · Hourly · 1m20:20 · Dawn triage metrics collection · control01 · Hourly · 1m21:20 · Dawn triage metrics collection · control01 · Hourly · 1m22:20 · Dawn triage metrics collection · control01 · Hourly · 1m23:20 · Dawn triage metrics collection · control01 · Hourly · 1m00:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m01:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m02:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m03:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m04:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m05:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m06:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m07:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m08:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m09:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m10:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m11:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m12:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m13:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m14:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m15:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m16:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m17:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m18:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m19:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m20:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m21:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m22:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m23:23 · cc-pool fork-resume regression test · control01 · Hourly · 2m01:30 · PVE backup all guests · pve01 · Daily · 50m02:00 · ADO PAT rotation gate · control01 · Sun · 5m02:00 · Docker image/build-cache prune · docker01 · daily · 10m02:00 · Media cleanup · pve01 · Daily · 15m02:30 · xt035 backup to xv035 · pve01 · Daily · 30m02:45 · pvesnap-prune · pve01 · Daily · 5m03:00 · rclone files→B2 · docker01 · Daily · 60m03:20 · Memory eviction sweep · control01 · Daily · 5m03:30 · Infisical Postgres backup · pve01 · Daily · 15m04:00 · Fleet patch+reboot cycle · control01 (orchestrates fleet ex-pve01) · Wed · 120m04:00 · Reboot coordinator (guests) · fleet (ex-pve01) · Daily · 8m04:10 · ADO pool-auth reconcile · control01 · Daily · 2m04:15 · Reboot coordinator (pve01) · pve01 · Daily · 5m04:30 · Infisical backup retention prune · pve01 · Daily · 5m05:00 · PBS local GC · xt035 · Sun · 155m06:00 · KB draft agent · control01 · Daily · 10m06:00 · PBS B2 sync · xt035 · Daily · 60m06:00 · bun3d restore check · control01 · Daily · 5m06:30 · PVE patching · pve01 · Sat · 30m06:50 · Dawn triage (autonomous actuator) · control01 · Daily · 25m07:00 · Morning health digest · control01 · Daily · 25m07:20 · Delivery snag review digest · control01 · Mon · 5m07:30 · Reboot deadline countdown · pve01, control01 · Daily · 1m07:45 · Schedule reconciler · control01 · Daily · 3m07:50 · GitHub scheduled-workflow freshness watch · control01 · Daily · 2m13:50 · GitHub scheduled-workflow freshness watch · control01 · Daily · 2m17:50 · GitHub scheduled-workflow freshness watch · control01 · Daily · 2m08:00 · vectormap embedding-map render · control01 · Mon · 3m08:05 · Hypercare window countdown · control01 · Daily · 1m08:10 · dated-review watch · control01 · Daily · 1m08:15 · Blog post daily count sync (Zabbix) · control01 · Daily · 1m08:15 · Monitoring-as-Code reconciler · control01 · Daily · 2m08:15 · Pi-hole tunnel-origin pin audit · control01 · Daily · 2m08:15 · Standards adherence gap analysis · control01 · Monthly · 2m08:20 · DT SBOM-freshness watchdog · control01 · Daily · 1m08:25 · Host/LXC synthetic test-plan gate · control01 · Daily · 2m14:25 · Host/LXC synthetic test-plan gate · control01 · Daily · 2m20:25 · Host/LXC synthetic test-plan gate · control01 · Daily · 2m08:30 · Disabled-trigger zombie reaper · control01 · Daily · 2m08:45 · Entra SSO client-secret expiry watchdog · control01 · Daily · 2m08:55 · Claude OAuth refresh-token expiry watchdog · control01 · Daily · 1m09:00 · HA integration inventory drift-check · control01 · Daily · 2m09:00 · Top-charts list rebuild · docker01 · Daily · 2m09:00 · vulnscan weekly DevSecOps loop · control01 · Mon · 120m09:10 · HA long-lived token dead-man · control01 · Daily · 1m09:12 · smtp STARTTLS cert renewal · docker01 · Daily · 1m09:15 · NetBox asset classification · control01 · Sun · 3m09:20 · Claude OAuth refresh-token regime verdict reminder · control01 · Daily · 1m09:30 · HA release-watcher · control01 · Wed · 4m09:30 · Year-planner term-date feed refresh · docker01 · Sun · 1m09:35 · HA entity-name conformance check · control01 · Thu · 1m09:40 · Year-planner RMIT next-year availability check · docker01 · Daily · 1m09:45 · External attack-surface scan · control01 · Monthly · 3m09:50 · Fleet auto-update conformance reconciler · control01 · Daily · 2m10:00 · Decom Phase 2 destroy · control01 · Daily · 5m10:00 · KB draft review digest · control01 · Mon · 5m10:00 · PBS B2 prune · xt035 · Sun · 30m10:00 · PBS verify · xt035 · Tue · 30m10:20 · *arr import-list drift check · control01 · Sun · 2m10:30 · PBS B2 offsite restore-test (monthly recoverability proof) · control01 · Thu · 15m10:30 · Restore drill (monthly recoverability proof) · control01 · Wed · 20m10:40 · Claude MCP config reconciler · control01 · Daily · 1m10:50 · Agent permission-set audit · control01 · Daily · 1m11:00 · PBS B2 GC · xt035 · Sun · 30m11:00 · Standards gap-analysis report (agent judgement layer) · control01 · Monthly · 15m11:00 · bun3d weekly backup · pve01 · Wednesday · 55m11:15 · HA proxy TLS leaf renewal · control01 · Daily · 1m11:15 · Weekly CI performance report · control01 · Mon · 5m11:25 · Upstream release watch (accepted-risk expiry) · control01 · Daily · 2m11:35 · Host→repo stack-source reconcile · control01 · Daily · 1m15:35 · Host→repo stack-source reconcile · control01 · Daily · 1m19:35 · Host→repo stack-source reconcile · control01 · Daily · 1m11:40 · *arr stalled-grab watchdog · control01 · Daily · 3m11:50 · Maintainerr retention rule evaluation · docker01 · Daily · 10m12:10 · CI shared-state PBS backup · pve01 · Daily · 2m12:30 · PBS backup-root config drift-export · control01 · Daily · 2m12:50 · Maintainerr retention deletion pass · docker01 · Daily · 20m13:00 · Sleep quiet-hours stuck-mute canary · control01 · Daily · 1m13:00 · Snapshot-tier appliance config export · control01 · Daily · 3m13:20 · arronpitman.com build-freshness watchdog · control01 · Daily · 1m13:40 · Vulnerability SLA conformance check · control01 · Daily · 5m14:10 · Open dependency-PR age check · control01 · Daily · 2m14:40 · Claude config docs reconciliation · control01 · Daily · 5m14:50 · Service catalog reconcile · control01 · Daily · 5m15:00 · servicemap dependency-graph render · control01 · Daily · 3m15:30 · Backlog grooming debt check · control01 · Monthly (15th) · 1m16:10 · waitfor synthetic + freshness dead-man · control01 · Daily · 2m16:40 · Stuck-alert watchdog · control01 · Daily · 2m17:20 · agent-access discovery sweep · control01 · Daily · 2m20:00 · Claude-pod podcast episode · control01 · Mon, Thu · 10m22:00 · PBS local prune · xt035 · Daily · 30mADO CI reconciler (trigger-gap detection + pipeline heartbeats) · every 20 min · control01ADO pipeline metrics collection · every 15 min · control01External dead-man snitch pinger · every 5 min · control01HA nginx-proxy add-on log shipper · every 5 min · control01HA ownership anomaly detector · every 1 min · control01HA press-without-action detector · every 15 min · control01cc-pool drain-request watch · every 1 min · control01cc-pool in-flight marker refresh · every 15 min · control01control01 shared repo checkout sync · every 15 min · control01docker01 config-as-code early warning · every 30 min · control01

cronin-container schedulernative schedulerothersystemd timer

Midnight at the top, clockwise, Australia/Melbourne (host-local AEST/AEDT). Each arc is one job at its declared start; jobs sharing a minute stack inward, so a crowded slot reads as depth. The ten sub-hourly jobs are the inner rings — they run all day and are stated as a rate rather than plotted 4,123 times.

The outer amber band is quiet hours, 21:00–07:00: a declared decision (ADR-0264) that nothing may page a human in it. The consequence is accepted deliberately — a real emergency born at 02:00 is not seen until morning — so anything that can fail overnight has to fail safe rather than fail loudly. The shaded sector is the overnight backup window, 22:00–07:00, which is not typed in anywhere: it is derived from the 4 daily backup jobs' own start times and measured durations.

TimeJobHostRunsWatched
*/20 minADO CI reconciler (trigger-gap detection + pipeline heartbeats)cron · 1mcontrol0172×/daydead-man
*/15ADO pipeline metrics collectioncron · 1mcontrol0196×/daydead-man
*/5 minExternal dead-man snitch pingercron · 1mcontrol01288×/daydead-man
*/5 minHA nginx-proxy add-on log shippercron · 1mcontrol01288×/daydead-man
:*HA ownership anomaly detectorsystemd timer · 1mcontrol011440×/daydead-man
*/15 minHA press-without-action detectorcron · 1mcontrol0196×/daydead-man
:*cc-pool drain-request watchsystemd timer · 1mcontrol011440×/daydead-man
:03, :18, :33, :48cc-pool in-flight marker refreshsystemd timer · 1mcontrol0196×/daydead-man
*/15 (offset :07)control01 shared repo checkout synccron · 1mcontrol0196×/daydead-man
:10, :40docker01 config-as-code early warningsystemd timer · 1mcontrol0148×/daynone
:17Reboot advance-notice detectionsystemd timer · 1mpve01, control01Hourlydead-man
:20Dawn triage metrics collectioncron · 1mcontrol01Hourlynone
:23cc-pool fork-resume regression testsystemd timer · 2mcontrol01Hourlydead-man
01:30PVE backup all guestsnative scheduler · 50mpve01Dailynone
02:00ADO PAT rotation gatecron · 5mcontrol01Sunnone
02:00Docker image/build-cache prunecron · 10mdocker01dailydead-man
02:00Media cleanupcron · 15mpve01Dailynone
02:30xt035 backup to xv035native scheduler · 30mpve01Dailynone
02:45pvesnap-prunecron · 5mpve01Dailynone
03:00rclone files→B2cron · 60mdocker01Dailydead-man
03:20Memory eviction sweepcron · 5mcontrol01Dailydead-man
03:30Infisical Postgres backupcron · 15mpve01Dailydead-man
04:00Fleet patch+reboot cyclesystemd timer · 120mcontrol01 (orchestrates fleet ex-pve01)Weddead-man
04:00Reboot coordinator (guests)systemd timer · 8mfleet (ex-pve01)Dailynone
04:10ADO pool-auth reconcilecron · 2mcontrol01Dailydead-man
04:15Reboot coordinator (pve01)systemd timer · 5mpve01Dailynone
04:30Infisical backup retention prunecron · 5mpve01Dailynone
05:00PBS local GCnative scheduler · 155mxt035Sunnone
06:00KB draft agentcron · 10mcontrol01Dailydead-man
06:00PBS B2 syncnative scheduler · 60mxt035Dailynone
06:00bun3d restore checkcron · 5mcontrol01Dailynone
06:30PVE patchingsystemd timer · 30mpve01Satnone
06:50Dawn triage (autonomous actuator)cron · 25mcontrol01Dailydead-man
07:00Morning health digestcron · 25mcontrol01Dailydead-man
07:20Delivery snag review digestcron · 5mcontrol01Mondead-man
07:30Reboot deadline countdownsystemd timer · 1mpve01, control01Dailydead-man
07:45Schedule reconcilercron · 3mcontrol01Dailydead-man
07:50, 13:50, 17:50GitHub scheduled-workflow freshness watchcron · 2mcontrol01Dailydead-man
08:00vectormap embedding-map rendersystemd timer · 3mcontrol01Monnone
08:05Hypercare window countdowncron · 1mcontrol01Dailydead-man
08:10dated-review watchcron · 1mcontrol01Dailydead-man
08:15Blog post daily count sync (Zabbix)cron · 1mcontrol01Dailydead-man
08:15Monitoring-as-Code reconcilercron · 2mcontrol01Dailydead-man
08:15Pi-hole tunnel-origin pin auditcron · 2mcontrol01Dailynone
08:15Standards adherence gap analysiscron · 2mcontrol01Monthlydead-man
08:20DT SBOM-freshness watchdogcron · 1mcontrol01Dailydead-man
08:25, 14:25, 20:25Host/LXC synthetic test-plan gatecron · 2mcontrol01Dailydead-man
08:30Disabled-trigger zombie reapercron · 2mcontrol01Dailydead-man
08:45Entra SSO client-secret expiry watchdogcron · 2mcontrol01Dailydead-man
08:55Claude OAuth refresh-token expiry watchdogcron · 1mcontrol01Dailydead-man
09:00HA integration inventory drift-checkcron · 2mcontrol01Dailydead-man
09:00Top-charts list rebuildin-container scheduler · 2mdocker01Dailydead-man
09:00vulnscan weekly DevSecOps loopcron · 120mcontrol01Mondead-man
09:10HA long-lived token dead-mancron · 1mcontrol01Dailydead-man
09:12smtp STARTTLS cert renewalcron · 1mdocker01Dailynone
09:15NetBox asset classificationcron · 3mcontrol01Sundead-man
09:20Claude OAuth refresh-token regime verdict remindercron · 1mcontrol01Dailynone
09:30HA release-watchercron · 4mcontrol01Weddead-man
09:30Year-planner term-date feed refreshin-container scheduler · 1mdocker01Sundead-man
09:35HA entity-name conformance checkcron · 1mcontrol01Thudead-man
09:40Year-planner RMIT next-year availability checkin-container scheduler · 1mdocker01Dailydead-man
09:45External attack-surface scancron · 3mcontrol01Monthlydead-man
09:50Fleet auto-update conformance reconcilersystemd timer · 2mcontrol01Dailydead-man
10:00Decom Phase 2 destroycron · 5mcontrol01Dailydead-man
10:00KB draft review digestcron · 5mcontrol01Mondead-man
10:00PBS B2 prunenative scheduler · 30mxt035Sunnone
10:00PBS verifynative scheduler · 30mxt035Tuenone
10:20*arr import-list drift checkcron · 2mcontrol01Sundead-man
10:30PBS B2 offsite restore-test (monthly recoverability proof)cron · 15mcontrol01Thudead-man
10:30Restore drill (monthly recoverability proof)cron · 20mcontrol01Weddead-man
10:40Claude MCP config reconcilersystemd timer · 1mcontrol01Dailynone
10:50Agent permission-set auditcron · 1mcontrol01Dailydead-man
11:00PBS B2 GCnative scheduler · 30mxt035Sunnone
11:00Standards gap-analysis report (agent judgement layer)cron · 15mcontrol01Monthlydead-man
11:00bun3d weekly backupnative scheduler · 55mpve01Wednesdaynone
11:15HA proxy TLS leaf renewalcron · 1mcontrol01Dailynone
11:15Weekly CI performance reportcron · 5mcontrol01Mondead-man
11:25Upstream release watch (accepted-risk expiry)cron · 2mcontrol01Dailydead-man
11:35, 15:35, 19:35Host→repo stack-source reconcilesystemd timer · 1mcontrol01Dailydead-man
11:40*arr stalled-grab watchdogcron · 3mcontrol01Dailydead-man
11:50Maintainerr retention rule evaluationin-container scheduler · 10mdocker01Dailydead-man
12:10CI shared-state PBS backupother · 2mpve01Dailydead-man
12:30PBS backup-root config drift-exportcron · 2mcontrol01Dailydead-man
12:50Maintainerr retention deletion passin-container scheduler · 20mdocker01Dailydead-man
13:00Sleep quiet-hours stuck-mute canarycron · 1mcontrol01Dailydead-man
13:00Snapshot-tier appliance config exportcron · 3mcontrol01Dailydead-man
13:20arronpitman.com build-freshness watchdogcron · 1mcontrol01Dailynone
13:40Vulnerability SLA conformance checkcron · 5mcontrol01Dailydead-man
14:10Open dependency-PR age checkcron · 2mcontrol01Dailydead-man
14:40Claude config docs reconciliationcron · 5mcontrol01Dailydead-man
14:50Service catalog reconcilecron · 5mcontrol01Dailynone
15:00servicemap dependency-graph rendersystemd timer · 3mcontrol01Dailydead-man
15:30Backlog grooming debt checkcron · 1mcontrol01Monthly (15th)dead-man
16:10waitfor synthetic + freshness dead-mancron · 2mcontrol01Dailydead-man
16:40Stuck-alert watchdogcron · 2mcontrol01Dailydead-man
17:20agent-access discovery sweepcron · 2mcontrol01Dailydead-man
20:00Claude-pod podcast episodecron · 10mcontrol01Mon, Thunone
22:00PBS local prunenative scheduler · 30mxt035Dailynone

Every job in the estate that is not a CI pipeline is declared in one file, and this panel renders that file — so the public clock and the record the estate's own clash reconciler reads cannot drift apart. 70 of 98 carry a dead-man watch, which is the check that matters for scheduled work: a job that stops running produces no error and no alert, only silence that looks exactly like success. The busiest hour is 09:00 with 26 distinct jobs — counted by job rather than by start, because an every-five-minute job would otherwise declare every hour the busiest and answer a question nobody asked.

Quiet hours are a declared decision. Between 21:00 and 07:00 nothing may page a human. That is not a measurement and it is not tuned — it is a recorded architecture decision, and the price is accepted knowingly: a real emergency born at 02:00 is not seen until morning. That price is only payable because the things which can fail overnight are built to fail safe — they halt, roll back, or refuse to promote, rather than degrading further while nobody is watching. The design obligation that follows is the useful part: anything new that could get worse unattended does not get a louder alarm, it gets an automated remediation or a safe stop.

The backup window is derived. It is not typed in anywhere. It is computed from the start times and measured durations of the jobs whose own declaration says they are backup work, taking daily work only — because one guest is deliberately backed up at 11:00 on a Wednesday precisely to keep it out of the nightly window, so it is exactly the job that must not define it. A schedule change moves the band with it, rather than leaving a hand-typed pair of times to go quietly stale.

The face stacks jobs inward when they share a minute, so a busy slot reads as depth. The morning peak is real and it is the interesting part of the picture: the overnight window is reserved for backup and patching, so everything else — reconcilers, digests, drift audits, conformance sweeps — is pushed into the hours after it. When no clean slot exists for a new job, that pressure is itself a finding worth surfacing, not a reason to cram the job into the least-bad gap.

Why the dead-man column matters more than it looks

Section titled “Why the dead-man column matters more than it looks”

A scheduled job that stops running produces no error, no exception and no alert. It produces silence, and silence is what success looks like too. That is why the record tracks a dead-man watch per job — a freshness check that fires when the job’s own evidence goes stale — and why the count of jobs without one is worth publishing rather than smoothing over.