diff --git a/PLAN.md b/PLAN.md index e1bd64e..e58e496 100644 --- a/PLAN.md +++ b/PLAN.md @@ -296,8 +296,24 @@ something long in one, switch away and back, refresh — it's all still there. **Nothing is destroyed unseen.** Every schedule answers *what would it delete?* with the list, sizes and dates, before Run now touches anything; only names that parse as a stamp and a TTL are candidates, so a snapshot taken by hand is invisible to it; and a snapshot - deleted by hand needs its full name typed back. The scheduler is a 30 s tick in the daemon, - and `Run now` calls the same code, so the button and the timer cannot drift apart. + deleted by hand needs its full name typed back. + **A schedule is a real cron job** (2026-09-24, Mitchell's call after the first cut ran it + from a ticker inside the daemon). Ham Lab writes `/etc/cron.d/hamlab-zfs`, owns it, and + rewrites it whole on every change; each line calls `hamlab zfs-snapshot ` as the + account Ham Lab runs as, reaching zfs through sudo as the daemon does. Snapshots are + backup-shaped and must not stop because a console is down, upgrading, or uninstalled — and + a cron line is greppable by anyone looking at the machine the normal way. **A cron + expression is the single description of when a schedule fires**: the four common shapes + render to one, `custom` states one outright, and the next run is read back with the same + evaluator the Jobs tab uses on everyone else's lines, so the page, the file and the + prediction cannot disagree. A run's outcome is written to `zfs-runs/.json` beside the + config, never to `state.json`, because the cron job is a separate process and the daemon + would clobber it. An existing external job can be **adopted** — its schedule, retention + and dataset read out of the cron line into a new Ham Lab schedule. + **zfSnap is retired on `grid`** as of that day: Ham Lab now takes the nightly `tank` + snapshot, the package is purged and the old cron line is gone, with the 515 snapshots it + had taken left untouched and fully readable here — which is what adopting its naming + bought. See `hamlet/docs/hosts.md`. - **Skins** — 13 since 2026-09-19 (`themes.ts`: a palette is one `mk(…)` line): Dark, Light, Cyberpunk, Retro, **HUD** (hairlines of cyan on near-black, corner ticks, thin type), Nord, Gruvbox, Catppuccin + Latte, Dracula, Tokyo Night, Solarized Dark + Light;