<feed xmlns='http://www.w3.org/2005/Atom'>
<title>archsetup/scripts/testing/lib/validation.sh, branch claude/hungry-franklin-09fffc</title>
<subtitle>Builds a full dev workstation from a bare Arch Linux install.
</subtitle>
<id>https://git.cjennings.net/archsetup/atom?h=claude%2Fhungry-franklin-09fffc</id>
<link rel='self' href='https://git.cjennings.net/archsetup/atom?h=claude%2Fhungry-franklin-09fffc'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/'/>
<updated>2026-06-26T03:24:13+00:00</updated>
<entry>
<title>refactor(testing): delete the dead validation.sh shell sweep</title>
<updated>2026-06-26T03:24:13+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-26T03:24:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=2e396dd92fa5e4af0da0b9802fc9d4cb7c5fdbf9'/>
<id>urn:sha1:2e396dd92fa5e4af0da0b9802fc9d4cb7c5fdbf9</id>
<content type='text'>
Both runners now validate through run_testinfra_validation, so the shell sweep validation.sh ran is dead. Delete run_all_validations, validate_all_services, run_full_validation, the ~35 validate_* checks, and validation_pass/fail/warn/skip (called only by those checks). Keep the live helpers the runners and testinfra.sh still use: ssh_cmd, attribute_issue, capture_pre/post_install_state, analyze_log_diff, categorize_errors, generate_issue_report, and the VALIDATION_* counters plus issue arrays. The file drops from 1156 lines to 314.

Closes the P5 follow-up from the Testinfra cutover.
</content>
</entry>
<entry>
<title>fix(testing): authorize a root key so make test survives sshd hardening</title>
<updated>2026-06-25T05:24:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-25T05:24:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=b6d20c99971a44e5de67c962ab53987493578d6d'/>
<id>urn:sha1:b6d20c99971a44e5de67c962ab53987493578d6d</id>
<content type='text'>
The VM test SSHes into the guest as root with a password for the whole run. archsetup hardens sshd to PermitRootLogin prohibit-password and reloads it partway through the install, so every SSH after that step failed with "Permission denied" and the run aborted before any validation — make test had been silently broken since the hardening landed.

inject_root_key authorizes a throwaway root key right after the first SSH (before archsetup runs) and the ssh/scp helpers now add -i &lt;key&gt; via SSH_KEY_OPT. prohibit-password still allows root key auth, so the harness survives the very hardening it validates. Password stays as the fallback, so the change is additive.
</content>
</entry>
<entry>
<title>chore: open-source release-prep (udev flag, SPDX headers, boolean style)</title>
<updated>2026-06-24T23:44:29+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-24T23:44:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=b44992e498c4f3f290cef30070e50e1487752d65'/>
<id>urn:sha1:b44992e498c4f3f290cef30070e50e1487752d65</id>
<content type='text'>
Three release cleanups, all behavior-preserving for my machines:

- Gated the Logitech BRIO udev rule behind INSTALL_DEVICE_UDEV_RULES (default yes, opt-out), so the device-specific rule is off for anyone without that hardware. Added the config read, validation, and a conf.example entry.
- Added a GPL-3.0-or-later SPDX-License-Identifier header after the shebang of all 24 shell scripts in the repo.
- Standardized boolean conditionals on the explicit [ "$var" = "true" ] form, replacing the bare `if $var` idiom. The STEPS function-dispatch is left alone, since it runs a function name rather than testing a boolean.
</content>
</entry>
<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=d3c93c43edd91390820652bf452037cbf5320c49'/>
<id>urn:sha1:d3c93c43edd91390820652bf452037cbf5320c49</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>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=44502c000bf9c0e772e5299d3ef01dbc96f31f65'/>
<id>urn:sha1:44502c000bf9c0e772e5299d3ef01dbc96f31f65</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=dac0db0d7dc34dd5ecf026d5c2620ca5821e4e50'/>
<id>urn:sha1:dac0db0d7dc34dd5ecf026d5c2620ca5821e4e50</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=3c19cb0538148c0caa751e637765fa2d43fff66d'/>
<id>urn:sha1:3c19cb0538148c0caa751e637765fa2d43fff66d</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>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=755e8c2a47be32da14e24d243315061478d54eba'/>
<id>urn:sha1:755e8c2a47be32da14e24d243315061478d54eba</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(testing): drop stale plugin checks, count failed validations</title>
<updated>2026-05-11T22:19:56+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-11T22:19:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=6b89a3fec7c3c4401208017df102b7afe4c76de8'/>
<id>urn:sha1:6b89a3fec7c3c4401208017df102b7afe4c76de8</id>
<content type='text'>
validate_hyprland_plugins and validate_hyprpm_hook checked for the hyprland-plugins-setup script and the hyprpm pacman hook, both removed in c6ba9f7 (Hyprland 0.54 brings the layouts into core). I deleted the two functions and their calls in validate_window_manager.

I also disabled errexit in run-test.sh from the validation phase onward, so one failed check is counted in VALIDATION_FAILED instead of aborting the run before the report or VM cleanup. About 16 validations across the file do a bare `return 1` after `validation_fail`; any of them firing under the previous behavior would have killed the harness mid-run.
</content>
</entry>
<entry>
<title>feat(archsetup): add rustup, log-cleanup cron, update configs</title>
<updated>2026-02-27T16:51:03+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-27T16:51:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=fc9291e883a49da0e8e97221223576fa640fe42c'/>
<id>urn:sha1:fc9291e883a49da0e8e97221223576fa640fe42c</id>
<content type='text'>
Add rustup toolchain manager to developer_workstation (before AUR
packages that need rust to compile). Add log-cleanup cron job with
test validation. Update ISO glob for archangel naming. Add dunst
icon theme, hyprlock animations, waybar log filtering.
</content>
</entry>
</feed>
