Stop the deploy tier from reverting live theme state
Three findings from verifying the #41 merge against the live box with `deploy.sh --check`. One commit because they share the deploy tier, its documentation, and the first test file that tier ever had. **1. Generated palette output was tracked, and sync would have restored it over a live theme.** `dotfiles/zz-blankpad/niri/.config/niri/noctalia.kdl` (`b3d3df4`, 2026-10-18) sat byte-identical to the live file — harmless while the palette held, and `--check` was already proposing `ADOPT … noctalia.kdl`. The moment the theme changed, the next sync would have quarantined the live file and reinstated 2026-10-18's colours. `deploy.sh` now refuses the class outright (`SKIP … (generated theme output)`), `.gitignore` carries the matching patterns so it cannot be re-added, and the file is untracked. **2. A `zz` override older than the file it overrides.** `dotfiles/zz-blankpad/niri/…/ layout.kdl` held focus ring `width 2` / `#e01b24` (`7b7dbf5`, 2026-10-17) while base absorbed `b3d3df4` (2026-10-18): `width 4`, `#ff8c00`. Stow order makes `zz-*` win, and a cross-package owner change relinks *silently* — no quarantine, no warning. Live was linked to base, the newer intent, so `--check` printed `RELINK … layout.kdl` every run and one unattended `deploy.sh` would have reverted the amber focus ring. The duplicate is deleted; base owns the file. **3. Two topologies I had asserted and not measured.** The media law and the `.gitignore` comment both said `~/.local/share/noctalia/wallpapers` symlinks into the repo, so deleting the tracked copies would blank the desktop. Measured: it is a real directory of real files that Noctalia owns; the repo held a duplicate, and the #41 merge deleted that duplicate without the desktop flickering. The correct general law replaces the false one — untracking a path deletes the file in every other checkout, `git rm --cached` on the branch notwithstanding — and the restore procedure now points at the app's directory, which `deploy.sh` does not manage. The guard is `tests/deploy.bats`, black-box over exit status, stdout, the symlink shape under `$HOME`, and the quarantine directory. Before the change: test 1 and test 2 fail, test 2 because the live palette really is quarantined and reverted. After: 4/4, including the control that an ordinary identical config is still adopted — an exclusion nobody can turn off is just a broken tool. Verification: `bats tests/` 66/66, `kb-lint.sh omp-docs` 0 violations, `kb-coverage.py` 0 issues, and live `deploy.sh --check` on blankpad reports `SKIP … (generated theme output)` with `actions=0` instead of `ADOPT … noctalia.kdl`. The real `deploy.sh` run that clears the remaining `RELINK` lines is deliberately left until this is in main — running it from a worktree would repoint live symlinks into a checkout the heartbeat reaps. Refs #42
This commit is contained in:
1 parent
689ada428f
commit
3022277167
7 files changed
+145
-76
No files matched your search
@@ -42,14 +42,18 @@ Wallpapers live at `dotfiles/noctalia/.local/share/noctalia/wallpapers/` and are
|
||||
gitignored. They were tracked until 2026-10-20 — 23 files, 80 MiB — which meant every
|
||||
clone of a *configuration* repo carried a media library no diff can review, and the
|
||||
payload only ever grows because deleting a tracked blob from the tree does not delete it
|
||||
from history. [Noctalia](noctalia-shell.md) reads
|
||||
`~/.local/share/noctalia/wallpapers/`, which is a set of symlinks into that directory, so
|
||||
the files stay on disk and untracking them broke nothing on this box.
|
||||
from history. The topology is not what one would guess: [Noctalia](noctalia-shell.md)
|
||||
keeps its own library at `~/.local/share/noctalia/wallpapers/` as a **real directory of
|
||||
real files**, so the tracked tree was a duplicate of it and never its source — measured
|
||||
2026-10-20, when the merge of #41 deleted the repo copies and the desktop did not
|
||||
flicker. Two consequences to know before untracking media: the copy that survives belongs
|
||||
to the application, not to the repo; and untracking deletes the file in every other
|
||||
checkout, `git rm --cached` on the branch notwithstanding.
|
||||
|
||||
Restore on a fresh box: every filename is `wallhaven_<id>.<ext>` and the ID is the whole
|
||||
address — `curl -L -o <name> "https://wallhaven.cc/w/<id>"` puts the library back, then
|
||||
`deploy.sh` relinks it. Losing the set is an acceptable outcome; 80 MB per clone forever
|
||||
is not.
|
||||
Restore on a fresh box: the library lives in `~/.local/share/noctalia/wallpapers/`, a path
|
||||
`deploy.sh` does not manage. Every filename is `wallhaven_<id>.<ext>` and the ID is the
|
||||
whole address — `curl -L -o <name> "https://wallhaven.cc/w/<id>"` into that directory puts
|
||||
the set back. Losing it is an acceptable outcome; 80 MB per clone forever is not.
|
||||
|
||||
## Law: never `systemctl --user enable` a unit from a worktree
|
||||
|
||||
@@ -90,3 +94,34 @@ tracked in `dotfiles/zz-blankpad/`; the pointer is not, because which desk the b
|
||||
is not a fact about the repo. A fresh box therefore starts with no output configuration —
|
||||
`config.kdl` includes `display.kdl` with `optional=true`, so niri comes up usable but with
|
||||
default monitors until `desk.sh` is run once.
|
||||
|
||||
## Law: generated theme output is never deployed
|
||||
|
||||
noctalia rewrites palette output in place — `noctalia.*`, `themes/noctalia*`,
|
||||
`colors/noctalia*`, `noctalia-*` (the classes the [census](/inventory/home-config-census.md)
|
||||
proves by same-millisecond mtime). A tracked copy of one is a stale snapshot of a colour
|
||||
scheme, and the failure is quiet: `dotfiles/zz-blankpad/niri/.config/niri/noctalia.kdl`
|
||||
(commit `b3d3df4`, 2026-10-18) sat byte-identical to the live file for two days, harmless,
|
||||
while `--check` cheerfully proposed `ADOPT … noctalia.kdl`. The moment the palette changed,
|
||||
the next sync would have quarantined the live file and restored 2026-10-18's colours —
|
||||
a tool silently reverting a user-visible theme choice.
|
||||
|
||||
`deploy.sh` now refuses the class (`SKIP … (generated theme output)`), `.gitignore` carries
|
||||
the matching patterns so it cannot be re-added, and `tests/deploy.bats` pins both
|
||||
directions: generated output is never adopted, and an ordinary identical config still is.
|
||||
Untracked in #43, Refs #42.
|
||||
|
||||
## Law: a `zz` override older than the file it overrides is a time bomb
|
||||
|
||||
Stow order means `zz-$HOST` wins, and when both packages carry the same path, sync relinks
|
||||
it *silently* — the script's own comment: "managed file changing owners between packages:
|
||||
silent relink, nothing to quarantine". `dotfiles/zz-blankpad/niri/.config/niri/cfg/layout.kdl`
|
||||
held focus ring `width 2` / `active-color "#e01b24"` from `7b7dbf5` (2026-10-17) while the
|
||||
base package absorbed `b3d3df4` (2026-10-18): `width 4`, `"#ff8c00"`. Live was linked to
|
||||
base, the newer intent, so `--check` printed `RELINK .config/niri/cfg/layout.kdl` on every
|
||||
run and one unattended `deploy.sh` would have reverted the amber focus ring with no
|
||||
quarantine and no warning. The duplicate is deleted in #43.
|
||||
|
||||
Rule: a `zz` file exists only to differ. When base absorbs the change, delete the `zz` copy
|
||||
in the same commit — and never read `RELINK` lines from `--check` as cosmetic noise; they
|
||||
are the sound of a stale override waiting for someone to run the tool for real.
|
||||
Reference in new issue
Block a user