fix(validate): the homelab-* timers are the estate's, not every host's (#263) - #323
Merged
Merged
Conversation
#263) `make validate` on `alexander` failed the moment the lab stack came up: FAIL the stack runs here but no homelab-* units are installed — run 'make install-timers' (#215) Both halves of that are wrong on that host. #263 widened the deployment-host test from "is the observability stack running" to stack_running(), which asks whether ANY stack is — correct for the question it was given, and the wrong question. The timers are the estate's maintenance: converge runs `make up`, which is STACK=observability; snmp-verify polls devices the lab does not have; backup-firewall ships to a host 30 -> 99 cannot reach; dashboards-drift exports the estate's seven dashboards. None of them are work the lab guest should do. And the advice cannot be followed. Every unit's ExecStart hardcodes /home/robo/code/Gerrrt/HomeLab, and install-timers.sh refuses to install anywhere but that checkout — so the fix the failure names is refused by the next command. A dead end pointing at work that should never happen there. The gate is the path the units already carry. install-timers.sh asserts every ExecStart and WorkingDirectory agrees with its DEPLOY_ROOT, so that path IS the definition of "the host these timers belong to" and can be read out of systemd/*.service rather than restated here as a third literal that would drift from the other two. On the monitoring host's deploy checkout the check is unchanged and still fails when the stack runs with no units installed, which is what #215 asked for. On the lab guest, and in a worktree, it now skips and says whose jobs those are. Found by following the build runbook on the real guest. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Sep 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Found by running
make validateonalexanderonce the lab stack was up:Both halves are wrong on that host, and this is a regression from #263.
Why it fired
#263 widened the deployment-host test from "is the observability stack running" to
stack_running(), which asks whether any stack is. Correct for the question it was given, and the wrong question — thehomelab-*timers are the estate's maintenance:convergemake up— which isSTACK=observability, the estate stacksnmp-verifybackup-firewall30 → 99cannot reachdashboards-driftNone of that is work
alexandershould be doing.And the advice cannot be followed
Every unit's
ExecStarthardcodes/home/robo/code/Gerrrt/HomeLab, andinstall-timers.shalready refuses to install anywhere but that checkout (line 331). So the fix the failure names is refused by the very next command — a dead end, pointing at work that should never happen on that host.Worth saying plainly: nothing broke. The existing refusal held, so this cost confusion rather than six failing timers on the lab guest.
The fix
The gate is the path the units already carry.
install-timers.shasserts everyExecStartandWorkingDirectoryagrees with itsDEPLOY_ROOT, so that path is the definition of "the host these timers belong to" — read out ofsystemd/*.servicerather than restated here as a third literal that would drift from the other two.Verification
make lintpasses;make validatein a worktree now produces the skip above in place of the failure. The positive path is preserved becauseunit_deploy_root()resolves to exactly the main checkout's path.🤖 Generated with Claude Code