From c300f8b49cd6c3ba8aef6dd210dc0e58908e04b6 Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 18 Oct 2026 17:20:17 -0700 Subject: [PATCH] feat(live-sync): path-activate heartbeat on dotfiles writes (Refs #11) Timer-only heartbeat left GUI dotfiles edits uncommitted for up to 59 minutes; a trunk-sync session clearing the dirty tree on 2026-10-18 destroyed a month of uncommitted noctalia bar layout inside that gap. live-sync.path (DirectoryNotEmpty on dotfiles/) fires the existing flock-guarded oneshot within seconds of any repo-side dotfiles write, shrinking the exposure window from ~1h to ~2s. Timer stays as the hourly catch-all for the machine tiers. --- .../.config/systemd/user/live-sync.path | 13 +++++++++++++ omp-docs/tools/live-sync.md | 8 ++++++++ 2 files changed, 21 insertions(+) create mode 100644 dotfiles/systemd-user/.config/systemd/user/live-sync.path diff --git a/dotfiles/systemd-user/.config/systemd/user/live-sync.path b/dotfiles/systemd-user/.config/systemd/user/live-sync.path new file mode 100644 index 0000000..e1172bd --- /dev/null +++ b/dotfiles/systemd-user/.config/systemd/user/live-sync.path @@ -0,0 +1,13 @@ +[Unit] +Description=Fire the live-sync heartbeat within seconds of a dotfiles-tier write + +[Path] +# GUI writes (noctalia settings.toml, niri cfg) land in the repo via the +# dotfiles symlinks; this directory watch makes "GUI edit -> durable commit" +# sub-second instead of up to one heartbeat interval. DirectoryNotEmpty fires +# while the dir holds any file, so the unit re-triggers on every modification +# (the empty-dir edge case is irrelevant here — dotfiles is never empty). +DirectoryNotEmpty=%h/.omp/dotfiles + +[Install] +WantedBy=paths.target diff --git a/omp-docs/tools/live-sync.md b/omp-docs/tools/live-sync.md index 5d66bb3..c3129ab 100644 --- a/omp-docs/tools/live-sync.md +++ b/omp-docs/tools/live-sync.md @@ -26,6 +26,13 @@ because the dirty tree collided with incoming work. machine's own writes on a schedule. Tier law (which paths it may touch) lives in [AGENTS.md](../../AGENTS.md) § Live-sync tiers. +`live-sync.path` (`DirectoryNotEmpty` on `dotfiles/`) activates the same +service within seconds of any GUI dotfiles write; `live-sync.timer` remains +the hourly catch-all for the machine tiers the path unit does not watch. +The trigger gap between a GUI edit and its commit is what let a 2026-10-18 +trunk-sync stash destroy a month of uncommitted bar layout — a timer-only +heartbeat leaves up to 59 minutes of exposure. + ## Contract (black-box) Run = one pass: flock → branch guard (`main` only) → stage allowlisted dirty @@ -61,6 +68,7 @@ with the usual dotfiles chain: ```bash systemctl --user enable --now live-sync.timer # after the unit is linked +systemctl --user enable --now live-sync.path # sub-second dotfiles trigger systemctl --user start live-sync.service # one manual heartbeat journalctl --user -u live-sync.service -n 20 # observe ```