<feed xmlns='http://www.w3.org/2005/Atom'>
<title>archsetup/docs, 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-10-06T19:58:40+00:00</updated>
<entry>
<title>feat(audio): ship the Framework 13 AMD internal-mic workaround</title>
<updated>2026-10-06T19:58:40+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-10-06T19:58:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=5189b7cdc7647f92382ddda3ca7d1a30fcffa4ce'/>
<id>urn:sha1:5189b7cdc7647f92382ddda3ca7d1a30fcffa4ce</id>
<content type='text'>
On the Framework 13 with AMD Ryzen AI 300 the kernel's ACP PDM digital-mic path returns a constant full-scale rail instead of audio. With UCM on, that broken DMIC is the only internal mic PipeWire offers, so the built-in microphone is dead in every app. The new step installs a WirePlumber drop-in that turns UCM off and disables the standalone PDM card so nothing can select it. Without UCM the ALC285 falls back to its analog-stereo profile, whose internal-mic pin carries real audio.

I gated it on DMI rather than on the acp-pdm-mach card or the hostname. The card exists on every AMD laptop with a PDM mic and stays present after the upstream fix lands, so its presence says nothing about whether the workaround belongs. The fix belongs to the board, not to one machine. The match needs all three of Framework, "Laptop 13" and "AMD Ryzen AI 300". That rules out the Framework Desktop ("AI Max 300") along with the Intel 13, the Ryzen 7040 13 and the 16. The rule inside the drop-in matches the PDM card by name pattern for the same reason: the gate covers the whole board family, so the rule can't pin the one PCI path velox enumerates.

The drop-in ships as a file under configs/, so a re-run refreshes it and deleting it plus a wireplumber restart reverts the machine. The installer doesn't restart wireplumber itself: there's no user session bus during install, so the drop-in applies when wireplumber next starts.

The audio failure taxonomy gains a row for the bug and a Cluster 5 note, so the audio doctor's use-ucm remedies treat the installed drop-in as the fix rather than as an offending config to remove.
</content>
</entry>
<entry>
<title>chore(security): record the history rewrite and remap its SHAs</title>
<updated>2026-10-06T12:24:37+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-10-06T12:24:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=4a2f811c73f7bceb1e10a565e46fb1b8536fed28'/>
<id>urn:sha1:4a2f811c73f7bceb1e10a565e46fb1b8536fed28</id>
<content type='text'>
The Signal pager number is rewritten out of every commit. 59 of 951 changed SHA, every descendant of the 08-17 post-rebuild-check commit, and tag v0.5 is untouched. The filter-repo map lands under assets/ so old citations can be translated. The cgit audit task carries the dated record and the release task notes that a full pre-release secrets scan is still owed. Sixteen citations of renamed SHAs across the task list, the task archive and the topgrade spec now point at the new ones.
</content>
</entry>
<entry>
<title>chore(security): take the Signal identity number out of the tracked tree</title>
<updated>2026-10-06T05:02:17+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-10-06T05:02:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=6c756ad3d02c5b201ee443f3b9fcb53323d2e19d'/>
<id>urn:sha1:6c756ad3d02c5b201ee443f3b9fcb53323d2e19d</id>
<content type='text'>
A quoted log line in the reinstall-gaps design note and a post-rebuild-check fixture both carried the real number in a repo that is anonymously cloneable. The note now names it in words and the fixture uses a 555 number, which the checker treats the same.
</content>
</entry>
<entry>
<title>docs(spec): review the guarded-upgrade spec and decompose its build</title>
<updated>2026-10-06T04:11:01+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-10-06T04:11:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=32008ac10409e1a6f8ddb8820c6e8ac30e575db4'/>
<id>urn:sha1:32008ac10409e1a6f8ddb8820c6e8ac30e575db4</id>
<content type='text'>
I ran three review rounds against the live code in archsetup and the dotfiles. They found 129 issues, and the blocking count fell from 13 to 4 to 0. Each one is dispositioned in the spec. The exact contract now lives only in Implementation phases, because the copies in Design, Decisions and Testing had drifted. The spec moves from DRAFT through READY to DOING, with nine non-blocking residuals left for the first build task.

The parent task now carries 22 build tasks in commit-group order, ending with the IMPLEMENTED flip. The manual tests are under Manual testing and validation, and a stale-kernel age metric is filed as [#D].
</content>
</entry>
<entry>
<title>chore(tasks): close the velox reinstall drill and the lock-clock bug</title>
<updated>2026-09-13T14:23:39+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-09-13T14:23:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=0e85fe37d4680492a6455672835cdd65901ad22c'/>
<id>urn:sha1:0e85fe37d4680492a6455672835cdd65901ad22c</id>
<content type='text'>
The reinstall drill finished on 2026-08-14 and every finding it surfaced already has its own task, so what remained was the record. I filed its working-dir artifacts into permanent homes. The runbook went to docs/ with an Outcome section, since the checklist was never ticked as it ran. The UEFI boot-entry reference went to docs/ too. The three reinstall-gap reports went to docs/design/. The rescued wttrin bundle moved into its own working dir under the task that owns it. Every inbound link is repointed and working/velox-reinstall/ is gone.

The lock-screen clock bug is closed because it no longer happens on velox. I couldn't identify the commit that fixed it from the dotfiles or archsetup logs, and the note says so. Its manual-testing check retires with it.
</content>
</entry>
<entry>
<title>chore: file the legacy inbox references and two unfiled captures</title>
<updated>2026-09-13T12:22:10+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-09-13T12:22:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=00c9eb4a4c7c79161dd04219dd6ad97f050f8bdf'/>
<id>urn:sha1:00c9eb4a4c7c79161dd04219dd6ad97f050f8bdf</id>
<content type='text'>
The inbox held 64 processed-but-kept handoffs from July and August. The inbox discipline no longer allows that state: a file is a task, reference content in a tracked home, or gone. I read each one. Fifty-six were acknowledgments, FYIs, lint pipeline files or requests whose work had already landed. Those are deleted.

Eight carried content worth keeping. The 2026-07-15 velox boot-failure diagnosis moves to docs/design, linked from the retrospective task. The three 2026-08-14 reinstall-gap reports move into the velox reinstall working dir, linked from the post-rebuild task. The two Maeda applets and their notes join the clock display references.

Two captures had never landed anywhere: the waybar module separator I captured on 2026-07-20 ([#B]) and the window-configuration research idea from 2026-07-24 ([#C]). Both are filed. The velox reinstall task records the two live steps (wsdd off, passim masked) applied over ssh once velox came back, and the health-check log now says velox is masked.
</content>
</entry>
<entry>
<title>docs(health-check): record the velox 2026-09-12 findings</title>
<updated>2026-09-13T12:02:39+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-09-13T12:02:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=28d576db056d35033061a2db41b7a7ac5ac6a64e'/>
<id>urn:sha1:28d576db056d35033061a2db41b7a7ac5ac6a64e</id>
<content type='text'>
These come from velox's 2026-09-12 health check. The Framework 04.02 BIOS update re-enabled Secure Boot, which rejects the unsigned ZFSBootMenu loader and reads as "no bootable device" while the boot entries are intact. I added a pre-firmware-update checklist to Phase 3 and a check-Secure-Boot-first section to the velox boot-entry reference.

Four Known Issues entries cover the Secure Boot flip, fwupdmgr activating passim, the topgrade containers step failing on local images and the harmless mkinitcpio firmware warnings. Phase 3 also notes why lsinitcpio needs sudo: the images are 0600, so an unprivileged run errors on stderr with an empty stdout, and a piped count reads 0.
</content>
</entry>
<entry>
<title>docs(spec): split the live upgrade and hold the kernel for a dedicated session</title>
<updated>2026-08-26T00:54:55+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-08-26T00:54:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=068306e7fd7963664942cf6511f46d9afe6b9308'/>
<id>urn:sha1:068306e7fd7963664942cf6511f46d9afe6b9308</id>
<content type='text'>
I rewrote the guarded-upgrade spec around a script the maintenance panel
calls: pacman -Syu --ignore on what the live-update guard would block plus
the kernel set, then the AUR remainder and topgrade with the system step
off. The boot oneshot now completes only the deferred GPU set. Kernels wait
for a session I choose, behind a gate on the DKMS build, the initramfs, and
a pre-pacman snapshot, because on velox a failed zfs-dkms rebuild after the
swap can't be aborted and leaves the new kernel unbootable. All seven
decisions are closed.

Also closes the ratio Emacs 31 task (upgraded, verified on Wayland) and
files gcalcli in the installer.
</content>
</entry>
<entry>
<title>docs: draft the guarded-upgrade spec and file the open velox items</title>
<updated>2026-08-25T18:58:26+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-08-25T18:58:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=a50fb3bf1e01aca8a540a4030e95af9af1e584cf'/>
<id>urn:sha1:a50fb3bf1e01aca8a540a4030e95af9af1e584cf</id>
<content type='text'>
The topgrade freshness warning never clears because the stamp is written only when topgrade exits 0, and the live-update guard plus any failing ecosystem step makes that exit almost unreachable. The spec (DRAFT) weighs four ways to close that. Its open decisions are state versus recency, an armed boot-time oneshot, an arch-only boot run and a persistent one-shot arm flag.

Four tasks filed:
- the spec's decisions, review and decomposition
- ratio pulling .emacs.d before its Emacs 31.1 upgrade
- the stale lock-screen clock after a real sleep
- the Signal tray icon waybar can't read. Electron 43 registers it under a well-known bus name and answers property reads only there. Downgrading is closed off by the database schema.

The Lua-port task got its date and the sleep task carries the two Aug 23 hibernate failures. Wrap hygiene moved 42 aged resolved subtrees into the task archive.
</content>
</entry>
<entry>
<title>fix(cmail): let Bridge setup finish without cmail-action</title>
<updated>2026-08-21T09:09:35+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-08-21T09:09:35+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=cfe9ab2c9a23757bf23d827c22d183e42f458541'/>
<id>urn:sha1:cfe9ab2c9a23757bf23d827c22d183e42f458541</id>
<content type='text'>
I moved the cmail-action install out of cmail-setup-finish.sh and left behind a guard that aborts when the tool is missing. The script mentions cmail-action five times and invokes it zero — every hit is a comment or that check. So a Bridge provisioning script hard-failed over a mail client it never touches, and a fresh machine got Bridge ready, the cert exportable, the service startable, and a script that refused to configure any of it.

It warns with the same remedy and carries on now. That also drops an ordering neither repo needs: Bridge setup no longer requires rulesets cloned and installed first.

The sequence around it hadn't caught up either. Both the checklist and the installer's completion message still opened with "clone claude-templates to ~/projects/claude-templates", the same dead path that broke the script, and neither mentioned rulesets at all. So the documented order was: clone a stale repo to a path that doesn't exist, log into Bridge, then run a script that aborts pointing at a directory nothing created. Both now run Bridge first and name rulesets as what it is — not a prerequisite for those steps, but the thing mbsync wants.

I also rephrased the header claim that the symlink "arrives on its own". True on a machine that runs agent sessions, since session start runs make install, and false on one that doesn't. It states the condition now instead of the consequence.
</content>
</entry>
</feed>
