Operations
Dotfiles Maintenance Runbook
This runbook captures recovery and release maintenance operations for this repository.
Updates and scheduled maintenance
dot update (short for dot system update) is the one update path. It updates the dotfiles, the mise tools and, after asking, the system packages (Homebrew, apt, dnf, pacman or zypper) and the app stores (mas, Flatpak, Snap). --globals adds npm, cargo and pipx globals, and --yes answers every question. The AI CLIs stay at their [ai_tools] pins: dot update lists the newer releases it finds on each pin's major version (from dot ai update --check, which changes nothing; a new major is a migration to choose, not a bump), and dot ai update moves them past the pins. Topgrade, the ~/.local/bin/update script and the update/upd functions are gone; chezmoi apply deletes the script and the topgrade config. The update and upd forwarders were removed in 0.2.538: run dot update.
The maintenance job clears the shell startup caches, prunes the dot logs ($XDG_STATE_HOME/dot/<domain>/log.jsonl) to the last DOT_LOG_RETENTION_DAYS (30) days and rotates the installer log. Nothing is scheduled until you ask:
On macOS set writes and loads ~/Library/LaunchAgents/com.sebastienrousseau.dot-maintenance.plist, which runs Sundays (or daily) at 10:00; a run missed while the Mac slept happens at the next wake. On Linux it writes dot-maintenance.service and .timer under ~/.config/systemd/user and enables the timer with OnCalendar=weekly (Mondays at 00:00) or OnCalendar=daily (00:00), a random delay of up to an hour (RandomizedDelaySec=1h), and Persistent=true. Each run records its time and exit code in $XDG_STATE_HOME/dot/system/last-run, and its output in last-run.log beside it. The old dotfiles-maintenance units, deployed but never enabled, are deleted by chezmoi apply.
Signed History Recovery (February 19, 2026)
Purpose: Recover from strict signature enforcement failures caused by legacy/non-compliant commit history.
When to use:
- Pushes are blocked by signature policy on historical commits.
- Merge ancestry contains commits that can't be validated by the current principal/key policy.
Procedure:
- Create a backup ref for current
main. - Build a rewritten signed baseline commit from the current tree.
- Push the rewritten branch to remote.
- Temporarily allow force-push on
mainprotections/rulesets. - Force-update
mainto the rewritten signed baseline. - Disable force-push again immediately.
- Re-run CI and verify required checks are green.
- Repoint the release tag/target as needed.
Verification commands:
Release Closeout Checklist
For every release update:
mainbranch is clean and synced.- CI is green on the release commit.
- Annotated release tag points to the intended commit.
- GitHub release target is correct (
mainor explicit commit). - Branch protections/rulesets are restored to strict state.
- Local apply has completed:
CHEZMOI_SOURCE_DIR="/.dotfiles"
Security Scan Guardrails
We prevent gitleaks historical-scan regressions with:
- Shallow checkout (
fetch-depth: 1,fetch-tags: false) in gitleaks jobs. - A workflow-dispatch guard script:
tools/ci/guard-gitleaks-checkout.sh.
Manual verification: