Historical: the roadmap written at M1 for M2 (2026-09-27), kept as it was then, with a few lines corrected where they could mislead (marked “2026-10-09”). It was not updated after M2.
- Where things stand now: MILESTONES.md (M1 to M5 done; M6 next; the open work no milestone owns) and the “Now” section of WORKLOG.md.
- Done or overtaken since: the open questions below were answered on 2026-09-28, the tag
m1and the backups were done, and them1-frozensnapshot was taken.- Still yours: the ruleset (question 7), host details (question 13) and a current VM snapshot. These are kept in the worklog’s “Still waiting for you”.
The roadmap from here to the end of M2, and what comes after. Written 2026-09-27, while the M2 plan is being drafted. WORKLOG.md stays the one source of truth for what is happening right now.
c720f22, ec15ece).scd watcher). No M2 code
until you approve it./etc, /boot or
store, and any destructive VM action (reboot, enabling a unit,
apt upgrade)./etc
stay on the VM and are readable by root only.docs/ quotes paths, counts, modes and hashes only,
never file contents from /etc (it can hold password hashes and keys).Save the research outputs outside /tmp. Done 2026-09-27: copied
to ~/smartconfig-work/ (mode 0700), because /tmp is wiped at every
boot. Repeated when each running process finishes.
database is locked failures under many
concurrent writers on both versions, and more often after ec15ece
(2 to 7 times), because the restore now holds the write lock across the
rename and its fsync. The restore then aborts cleanly instead of leaving
an unrecorded change, but the review has to settle whether the busy
handling needs work. Either way, M2 must keep write transactions short,
because scd will be a second writer next to sc.m1 on the last M1 code commit
(ec15ece, unless the review adds a fix) and push it./var/backups/smartconfig (mode 0700, root only):
sc-m1: the static binary built from tag m1. The rescue steps in
PROJECT_LOG point here from now on. The repo’s bin/sc will be half-built
during M2.store-m1.tar: a copy of /var/lib/smartconfig (4 rows; 2c6901 is the
original fstab).etc-boot-m1.tar.zst and manifest-m1.txt: /etc and /boot/grub, plus
a sorted list of mode, owner, size and sha256 for each file. After each
risky session, Claude rebuilds the manifest and diffs it, so WORKLOG can
say “/etc left as found” or list exactly what changed.m1-frozen once WORKLOG
says the freeze is done (see “What only you can do”).kill -9 of scd mid-transaction leaves a store the next writable open
rolls back cleanly (PRAGMA integrity_check ok, no committed row lost).sc-m1 can still log, cat, diff and restore file rows, and for
every new row kind an sc-m1 restore either fails cleanly leaving the
file untouched, or does the right thing, proven by a test.sc restore never fails with
database is locked while scd works./etc or boot state refuse to run unless
systemd-detect-virt reports a VM, or SC_ALLOW_REAL_HOST=1 is set.
The repo is public.sudo findmnt --verify.ec15ece.docs/ line.docs/M2_PLAN.md with:
WORKLOG “Now” says “M2 step 1”, and the commit is pushed. This comes first because everything in /tmp, including the drafts and their evidence, is deleted at the next boot.
gofmt -l ., go vet ./... and go test ./... as the user;sudo -E go test when root-only tests are touched;make race if approved;Claude does not ask between steps. It stops and asks when:
golang.org/x/sys);/etc, /boot or store;The step numbers of the approved plan win. The chunks only group them.
| Chunk | What | Review | You see (FYI) |
|---|---|---|---|
| A | store housekeeping and schema migration | light | - |
| B | row kinds (file, link, deleted, digest) through the CLI | normal | a sample sc log |
| C | glob matcher and default scope | light | a table of what gets watched on this VM, per tier, and what is excluded |
| D | the inotify watcher engine | full: concurrency, events, security | - |
| E | sc watch, systemd unit, acceptance script, docs |
normal | - |
go test -count=5 ./internal/watch/... must pass before each
watcher commit.sc-m1 still
reads the migrated store.make race if approved).
file bin/sc says statically linked.sudo ./scripts/accept-m2.sh and sudo ./scripts/smoke.sh pass./etc/ssh/sshd_config with nano and never type sc: sc log
shows the change and the old version;chmod -x /etc/grub.d/41_custom shows as a mode-only row (then put it
back). Not 10_linux: if update-grub ran before the bit came back, the
boot menu would lose its Linux entries. 41_custom changes nothing here
(BIOS VM, no /boot/grub/custom.cfg);systemctl mask of a harmless unit shows as a link row (then unmask);scd.service enabled for real, the VM
rebooted. systemd-analyze critical-chain and blame show nothing
waiting on scd, and scd is running.kill -9 scd during an apt burst and during its
startup rescan. The unit restarts it, the missed change is recorded
exactly once, and PRAGMA integrity_check reports ok. A static check
shows no unit is ordered After= or Requires= scd.apt-daily-upgrade run, plus a
deliberate apt upgrade of the 13 pending updates while scd watches
(apparmor alone owns 248 files under /etc). Pass means no crash, no
flood, no unexplained rows, and bounded memory and CPU. The /etc
manifest diff lists only expected changes.m2.m2-accepted and sign off.Rough size: 2.5 to 3 working days of session time plus the 24-hour soak, so 3 to 4 calendar days. This is an estimate from code size, not a measurement.
m2-accepted snapshot, turn on nested VT-x if your host
allows it. It is not required: QEMU is already installed and runs
throwaway boot tests without /dev/kvm (TCG), just more slowly.ro fstab=no systemd.unit=rescue.target SYSTEMD_SULOGIN_FORCE=1;sc reads the store;-snapshot inside the dev VM, and a VirtualBox linked clone for final
acceptance.findmnt --verify as the
reference in its tests. SmartConfig adds severity and a warning at save
time.m1-frozen snapshot:
m1-frozen.VBoxManage list vms to get the exact name, then
VBoxManage snapshot "<VM name>" take m1-frozen --description "M1 done, before M2" --live,
then check it with VBoxManage snapshot "<VM name>" list.VBoxManage snapshot "<VM name>" restore m1-frozen, then start it. A
restore also rolls back Claude’s memory and anything not yet pushed.gh auth refresh -h github.com -s workflow
on the VM, or better, use a fine-grained token limited to SmartConfig
with Contents and Workflows read/write, and no Administration.main against mistakes made from this VM.apt upgrade. They come from
noble-updates, which unattended-upgrades does not install here.m2-pre-accept, and say yes or
no to enabling scd, a reboot, the soak and the apt upgrade.m2-accepted;Answered 2026-09-28: yes to every recommendation below. Question 7 (the ruleset) and question 13 (host details) still need you.
CGO_ENABLED=1, tests only? Yes, as make race.
The shipped binary stays static.docs/ is public on
Pages within a minute. The hooks block a private denylist (such as the
VM password) and the patterns of password hashes ($6$..., $y$...),
-----BEGIN ... PRIVATE KEY----- and psk=.docs/ in Layout, “read WORKLOG first”,
“push after every step”, the race exception)? Yes.sc a
root daemon. govulncheck would be a new tool, so this is your call.m2-accepted
power-off./var/backups/smartconfig, root only.
Not the home directory, never the repo.bin/sc is half-built during M2. Use sc-m1 for rescue. (Since
M5 the rescue binary is the package’s /usr/sbin/sc; sc-m1 restores
file rows only. Corrected 2026-10-09; see PROJECT_LOG’s recovery guide.)sc a root daemon. (Fixed: go.mod
requires Go 1.26.8 since 2026-09-28. Corrected 2026-10-09.)A critic checked this roadmap against the VM, the repo and GitHub. Its
corrections are applied above: the hot-journal and sc-m1 restore checks,
the failure-path tests, the safe 41_custom scenario, the VirtualBox 7.2
steps, the token without admin rights, the secret-pattern hooks, the Go
vulnerability count, and nested virtualization as a speed-up rather than a
requirement.
/usr/lib/tmpfiles.d/tmp.conf: D /tmp 1777 root root 30d.
systemd-tmpfiles-setup runs with --remove --boot.pages-build-deployment. The gh token scopes are gist, read:org and
repo.apt list --upgradable: 13 packages, all from noble-updates, 0 security.
50unattended-upgrades allows only the release and -security origins.dpkg-query shows 248 apparmor conffiles under /etc. The next
apt-daily-upgrade run is Mon 2026-09-28 06:32 UTC.uptime: load 18 to 22 on 9 CPUs, about 1.7 to 2 GiB available./dev/kvm, and 0 vmx/svm flags. qemu-system-x86 is installed and runs
without KVM (TCG).dmidecode -t 11) report VirtualBox 7.2.2.log, cat
and diff. A WAL store fails with “unable to open database file (14)”.passwd -S root shows L, and the recovery menu’s root option runs
plain /sbin/sulogin.