<feed xmlns='http://www.w3.org/2005/Atom'>
<title>archsetup/scripts, branch main</title>
<subtitle>Builds a full dev workstation from a bare Arch Linux install.
</subtitle>
<id>https://git.cjennings.net/archsetup/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/archsetup/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/'/>
<updated>2026-06-11T17:57:49+00:00</updated>
<entry>
<title>fix(testing): lingering check could never pass — ls output broke the capture</title>
<updated>2026-06-11T17:57:49+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-11T17:57:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=5b519001a73d98ac7c1ab49256ac34781994f9e0'/>
<id>urn:sha1:5b519001a73d98ac7c1ab49256ac34781994f9e0</id>
<content type='text'>
The check captured 'ls path &amp;&amp; echo yes', so a present linger file produced 'path\nyes', which never string-equals yes — every run warned regardless of actual state. Forensics on a kept VM showed lingering correctly enabled all along (file present mid-install, loginctl Linger=yes, logind healthy): the original VM-artifact hypothesis was wrong, archsetup's enable-linger calls were always fine. test -e captures cleanly; verified returning 'yes' against the live VM.
</content>
</entry>
<entry>
<title>feat(scripts): package auditor + fix the four packages it caught</title>
<updated>2026-06-11T16:29:41+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-11T16:29:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=1f89523739a575f5dec19616ec44df4143df4866'/>
<id>urn:sha1:1f89523739a575f5dec19616ec44df4143df4866</id>
<content type='text'>
scripts/audit-packages.sh extracts every pacman_install/aur_install package (loop lists included) and verifies each against its declared source — sync dbs for official, one batched RPC query for AUR — flagging movers in both directions. Unit-tested against fixture installers with fake pacman/curl.

First real run over 420 packages found four that vanished from both sources, each now fixed: libva-mesa-driver folded into mesa (line dropped), nvidia-dkms replaced by nvidia-open-dkms (Turing+; legacy cards are the preflight task's problem), swww replaced by awww (its successor, already what both machines run), and libappindicator-gtk3 replaced by libayatana-appindicator. Fifteen AUR entries that graduated to official repos still install fine via yay and are left as-is.
</content>
</entry>
<entry>
<title>fix(testing): key the portal-query skip on the compositor, close warning tasks</title>
<updated>2026-06-11T00:08:54+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-11T00:08:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=19015c77c7d059d7bbc65270c6985f6cbc2330a3'/>
<id>urn:sha1:19015c77c7d059d7bbc65270c6985f6cbc2330a3</id>
<content type='text'>
The 19:06 verification run showed the portal skip not firing: a socket-activated xdg-desktop-portal process exists even headless, so the process check was the wrong precondition. The skip now keys on a running Hyprland, same as the socket check. That run confirmed the other three skips live (warnings 5 to 2); the remaining counted warnings are this portal case and the lingering question, which stays open.
</content>
</entry>
<entry>
<title>fix(testing): skip environment-impossible checks instead of warning</title>
<updated>2026-06-10T23:19:28+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-10T23:19:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=ced91c43c464d624b3396ae44894022fd33aecaf'/>
<id>urn:sha1:ced91c43c464d624b3396ae44894022fd33aecaf</id>
<content type='text'>
Four warnings fired on every headless VM run, training the reader to ignore the warning count: the Hyprland socket and portal queries (no graphical login), the mDNS ping (slirp passes no multicast), and docker-not-responding (enabled but deliberately not started pre-reboot). Each now detects its precondition and logs a skip that counts nowhere; the warn paths stay for the cases that are real (compositor running without a socket, portal running but unqueryable, mDNS failing on real networking, docker active but dead). The lingering warning stays — it needs its own investigation.
</content>
</entry>
<entry>
<title>fix(testing): expect minimal/ tree for the .zshrc symlink on DESKTOP_ENV=none</title>
<updated>2026-06-10T21:35:26+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-10T21:35:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=1754a945fa58fbdf71561596e5ddf06dea7428be'/>
<id>urn:sha1:1754a945fa58fbdf71561596e5ddf06dea7428be</id>
<content type='text'>
The dotfiles validation hardcoded .dotfiles/common/.zshrc, but a none install stows the standalone minimal/ tree, so the first none-run ever to reach validation failed on a correct symlink. The expected path now follows DESKTOP_ENV from the VM conf.
</content>
</entry>
<entry>
<title>refactor: fold pocketbook in-tree and drop its install steps</title>
<updated>2026-05-26T19:05:40+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-26T19:05:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=70e89e946cbdff307284d11a46558161f713607c'/>
<id>urn:sha1:70e89e946cbdff307284d11a46558161f713607c</id>
<content type='text'>
Pocketbook is nowhere near ready, so I pulled it back from publication: deleted the github mirror and the cjennings.net repo, removed the server mirror hook, and copied the package into pocketbook/ here until it's ready to spin back out.

Dropped the steps that provisioned it on a fresh install: the gtk4-layer-shell dep and the pip install in archsetup, and the clone in post-install.sh. That clone pointed at the now-deleted github repo, so it would have failed a fresh run regardless. Re-wiring the install is tracked in the pocketbook backlog.
</content>
</entry>
<entry>
<title>fix(testing): expect ~/.dotfiles symlink target in dotfiles validation</title>
<updated>2026-05-23T01:34:03+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-23T01:34:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=13c300f6fa8e52c498bf9843f6b8b6f61cab935b'/>
<id>urn:sha1:13c300f6fa8e52c498bf9843f6b8b6f61cab935b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor(testing): clone the dotfiles repo into the VM test</title>
<updated>2026-05-22T20:52:24+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-22T20:52:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=68172c8b4c33b4b2cc44d235a9c71685cd4ac3d5'/>
<id>urn:sha1:68172c8b4c33b4b2cc44d235a9c71685cd4ac3d5</id>
<content type='text'>
The dotfiles live in a separate repo now, so the VM test clones that source, bundles it, and clones from the bundle into /tmp/dotfiles-test on the VM. archsetup's in-VM clone of DOTFILES_REPO then resolves against the local path with no network. DOTFILES_SOURCE overrides the source for testing a local checkout instead of the published repo. The cleanup trap tracks the host-side bundle and clone, so a mid-run abort leaves nothing behind.
</content>
</entry>
<entry>
<title>feat(notify): add --silent flag, volume knob, and level sound files</title>
<updated>2026-05-22T00:16:34+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-22T00:16:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=f7079db3aa3e0073df6ce5409d4b6de0a431e26f'/>
<id>urn:sha1:f7079db3aa3e0073df6ce5409d4b6de0a431e26f</id>
<content type='text'>
The touchpad toggle's notification was too loud, and the eight notify sounds varied by ~13 dB in RMS loudness — bug and fail came out two to three times louder than info or security.

I added a --silent flag to notify (shows the popup, plays no sound) and a NOTIFY_VOLUME knob (paplay scale, default 65536) so the master level can drop without re-encoding. toggle-touchpad now passes --silent on both enable and disable. normalize-notify-sounds.sh measures each .ogg and shifts it to a uniform -31 dB mean. It writes through the file instead of mv-ing over it, so the stow symlinks survive when the script runs against the live sound dir. I re-encoded all eight sounds to the new level.

Tests: a new tests/notify suite (12 tests) covers --silent, the volume knob, flag composition, and the error paths.
</content>
</entry>
<entry>
<title>fix: correct a POSIX-sh bashism in init and document two SC2034 cases</title>
<updated>2026-05-20T17:02:47+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-20T17:02:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=618e6cce0b1662f50c6e766bba7e11b6d6952532'/>
<id>urn:sha1:618e6cce0b1662f50c6e766bba7e11b6d6952532</id>
<content type='text'>
init runs under #!/bin/sh but used $(&lt;file) to read /etc/hostname, a bashism that breaks on a strict POSIX sh. I switched it to $(cat) and quoted $interface_up in the same script.

The two VM_IP assignments in the test scripts are read by the sourced validation.sh, which shellcheck can't follow, so they now carry a documented disable=SC2034 instead of a bare suppression. The rest of the shellcheck findings across the scripts are intentional (word-splitting on $SSH_OPTS, integer tests in [ ]) or already accepted, so I left them alone.
</content>
</entry>
</feed>
