ci(fleet): assert the roster's four copies agree, and build what Flux builds #198

Merged
kblack0610 merged 1 commit from ci/fleet-roster-drift-check into master 2026-08-17 19:37:42 +00:00
Owner

The lazer-machine retirement (#196) updated three of the four places the fleet roster is written down and missed the fourth - FLEET_DISPLAY in the public dotfiles repo - so the status bar kept drawing a red dot for a machine that no longer existed, indistinguishable from one that was merely down. Nothing failed, because this repo had no PR CI at all.

scripts/check-fleet-roster.py

Asserts the invariant that actually holds: every rostered name must be declared in the gatus config. Not equality - declared-but-unrostered is deliberate (the sleeping Pi Zeros, the carry phone), and it is the retirement direction that breaks. Stdlib only, so there is no pip step to skip. CI runs the two-file half; --roster-env / --display cover all four locally.

Its first run found real pre-existing drift:

  • cachy-laptop is rostered on the bars but declared in no gatus endpoint - it can never report, which is why it has read NEVER REPORTED indefinitely.
  • windows is on the exporter's roster but not the bars' - so Grafana and the glyph have been describing different fleets.

Both are pre-existing and left alone here; they are a decision, not a cleanup.

kustomize gate

Over the Flux entry points (apps + clusters/*), deliberately not a per-directory loop: apps/cal is unwired and references a secret.yaml absent from the repo, so a loop would gate this repo on something production does not build. Verified both targets build clean.

Pairs with dotfiles fix/fleet-pulse-ghost-display, which fixes the fourth copy and makes the bar self-report a ghost token.

The lazer-machine retirement (#196) updated three of the **four** places the fleet roster is written down and missed the fourth - `FLEET_DISPLAY` in the public dotfiles repo - so the status bar kept drawing a red dot for a machine that no longer existed, indistinguishable from one that was merely down. **Nothing failed, because this repo had no PR CI at all.** ### `scripts/check-fleet-roster.py` Asserts the invariant that actually holds: every rostered name must be **declared** in the gatus config. Not equality - declared-but-unrostered is deliberate (the sleeping Pi Zeros, the carry phone), and it is the retirement direction that breaks. Stdlib only, so there is no pip step to skip. CI runs the two-file half; `--roster-env` / `--display` cover all four locally. **Its first run found real pre-existing drift:** - `cachy-laptop` is rostered on the bars but declared in no gatus endpoint - it can never report, which is why it has read `NEVER REPORTED` indefinitely. - `windows` is on the exporter's roster but not the bars' - so Grafana and the glyph have been describing different fleets. Both are pre-existing and left alone here; they are a decision, not a cleanup. ### kustomize gate Over the **Flux entry points** (`apps` + `clusters/*`), deliberately not a per-directory loop: `apps/cal` is unwired and references a `secret.yaml` absent from the repo, so a loop would gate this repo on something production does not build. Verified both targets build clean. Pairs with dotfiles `fix/fleet-pulse-ghost-display`, which fixes the fourth copy and makes the bar self-report a ghost token.
ci(fleet): assert the roster's four copies agree, and build what Flux builds
All checks were successful
checks / fleet-roster (pull_request) Successful in 31s
checks / kustomize-builds (pull_request) Successful in 33s
0fbba97cee
The lazer-machine retirement (#196) updated three of the FOUR places the fleet
roster is written down and missed the fourth - FLEET_DISPLAY in the public
dotfiles repo - so the status bar kept drawing a red dot for a machine that no
longer existed, indistinguishable from a machine that was merely down. Nothing
failed, because this repo had no PR CI at all.

scripts/check-fleet-roster.py asserts the invariant that actually holds: every
rostered name must be DECLARED in the gatus config. Not equality - declared-but-
unrostered is deliberate (the sleeping Pi Zeros and the carry phone), and it is
the retirement direction that breaks. Stdlib only, so there is no pip step to
skip. CI runs the two-file half; --roster-env/--display cover all four locally.

Its first run found real pre-existing drift, reported separately: cachy-laptop
is rostered on the bars but declared in no gatus endpoint (it can never report,
which is why it has read NEVER REPORTED), and `windows` is on the exporter's
roster but not the bars' - so Grafana and the glyph have been describing
different fleets.

Also adds a kustomize gate over the FLUX entry points (`apps` + `clusters/*`),
deliberately not a per-directory loop: apps/cal is unwired and references a
secret.yaml absent from the repo, so a loop would gate the repo on something
production does not build.

README gains the fourth place and both checks.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
kblack0610/home-config!198
No description provided.