<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>GufWorks — The Augmented Workshop</title><description>Build logs from an augmented electronics workshop: shipping hardware with AI agents doing the engineering legwork.</description><link>https://pierregufler.com/</link><item><title>The week my ZFS pool ate itself</title><link>https://pierregufler.com/posts/the-week-my-zfs-pool-ate-itself/</link><guid isPermaLink="true">https://pierregufler.com/posts/the-week-my-zfs-pool-ate-itself/</guid><description>A memory overcommit, a corrupted mirror, four days of chasing ghosts through broken kernels — and the villain nobody suspected.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ZFS mirrors protect you from a dying disk. They do not protect you from yourself. This is the story of how I learned the difference over four increasingly unhinged days, and how the actual culprit turned out to be hiding in a BIOS menu the whole time.&lt;/p&gt;
&lt;h2&gt;Day zero: the confident years&lt;/h2&gt;
&lt;p&gt;My home server runs Proxmox with a ZFS pool — two mirrored pairs holding the family&apos;s data, the media library, backups, everything. Mirrors! Redundancy! I had, in the way of homelab people everywhere, allocated 46GB of RAM to VMs and containers on a host that physically contained 32GB. This worked fine, in the way that things work fine right up until the moment they very much don&apos;t.&lt;/p&gt;
&lt;p&gt;The moment arrived during a heavy download-and-unpack session. The host ran out of memory. ZFS&apos;s in-memory cache — the ARC — panicked. And here is the sentence that restructured my understanding of storage: &lt;strong&gt;the panic wrote identical corrupted metadata to both legs of the mirror.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Both legs. Simultaneously. Because a mirror faithfully replicates whatever it&apos;s told to write, and what it was told to write was garbage. The corruption in RAM happened &lt;em&gt;before&lt;/em&gt; the redundancy. The pool now contained an orphaned metadata object — forever after known in my house by its hex address, &lt;code&gt;0xda4&lt;/code&gt; — and any heavy I/O that touched it would kernel-panic the entire host.&lt;/p&gt;
&lt;h2&gt;Days one through three: the ghost hunt&lt;/h2&gt;
&lt;p&gt;What followed was a diagnostic death spiral that I can only describe as &lt;em&gt;educational&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The downloads kept crashing the host, so I blamed the download client — not entirely unfairly, since NZBGet is abandonware with genuine TLS socket hangs, and replacing it with SABnzbd was the one unambiguously correct decision of the week. The crashes continued.&lt;/p&gt;
&lt;p&gt;So I upgraded the Proxmox kernel. The new kernel, 6.14.11-6-pve, turned out to have its own bug — a NULL pointer dereference that crashed the machine during package unpacking, with all registers zeroed, which is the CPU&apos;s way of shrugging. So now I had two overlapping crash signatures: ZFS panics during pool I/O, and kernel crashes during &lt;em&gt;any&lt;/em&gt; heavy unpack, ZFS loaded or not.&lt;/p&gt;
&lt;p&gt;Standard procedure at this point is to isolate: boot a live USB, take your own software out of the equation. The live USB &lt;em&gt;also&lt;/em&gt; crashed during unpacking. A fresh, pristine Ubuntu image, crashing the same way. At this point every layer of the stack was a suspect and I was reading kernel oops dumps at 1 a.m. with the specific serenity of a man who has stopped believing in causality.&lt;/p&gt;
&lt;p&gt;I ran a full &lt;code&gt;e2fsck&lt;/code&gt; on the root filesystem, convinced four days of hard resets must have shredded it. Five passes. Zero errors. The filesystem, insultingly, was fine.&lt;/p&gt;
&lt;h2&gt;Day four: the villain&lt;/h2&gt;
&lt;p&gt;The clue was the live USB. If a known-good OS crashes on known-good storage, the problem is below the software. And I was running an Intel i5-13600KF — a 13th-generation chip, a family with a well-documented instability saga that Intel itself acknowledged.&lt;/p&gt;
&lt;p&gt;But the chip wasn&apos;t the root cause either. The root cause was my motherboard. ASUS, in its factory-default enthusiasm, had set the board&apos;s power limits to &lt;strong&gt;253W&lt;/strong&gt; — nearly double the processor&apos;s specification — plus the full buffet of auto-overclocking: Turbo boost tweaks, Adaptive Boost, the works. The CPU had been quietly running outside its design envelope the entire time, and heavy sustained loads (say, unpacking large archives, or a filesystem cache thrashing under memory pressure) pushed it into producing wrong answers. Silently. In RAM.&lt;/p&gt;
&lt;p&gt;Which reframes the whole week. The memory overcommit lit the fuse, but the CPU had likely been corrupting data in small, invisible ways for who knows how long — and ZFS, doing its job perfectly, faithfully mirrored one of those corruptions onto both disks.&lt;/p&gt;
&lt;p&gt;The fix was almost offensively simple: turn off every BIOS auto-boost feature, set power limits to Intel spec, and upgrade to 64GB of RAM so the overcommit could never recur. The machine has been boringly stable since.&lt;/p&gt;
&lt;h2&gt;The body count&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;One ZFS dataset rebuilt; &lt;code&gt;0xda4&lt;/code&gt; lives on as a cosmetic scar in &lt;code&gt;zpool status&lt;/code&gt;, structurally harmless, permanently humbling.&lt;/li&gt;
&lt;li&gt;One download client replaced (rest in peace, NZBGet, you were broken anyway).&lt;/li&gt;
&lt;li&gt;One kernel version on the do-not-fly list.&lt;/li&gt;
&lt;li&gt;Four days of my life, converted into the following lessons at an hourly rate I decline to calculate.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What I&apos;d tell past me&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Mirrors don&apos;t protect against in-memory corruption.&lt;/strong&gt; RAID and ZFS redundancy defend against disk failure. Corruption that happens in RAM gets replicated with perfect fidelity. If the data matters, the machine needs ECC or, at minimum, a CPU running inside its actual specification.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Never overcommit memory on a ZFS host.&lt;/strong&gt; The ARC assumes it can have what it needs. When it can&apos;t, it does not fail gracefully; it fails &lt;em&gt;creatively&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Motherboard defaults are marketing, not engineering.&lt;/strong&gt; Consumer boards ship with power limits and boost settings chosen to win benchmark charts. If a machine&apos;s job is to be correct rather than fast, the first thing to do on day one is set every power limit to the silicon vendor&apos;s spec.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When symptoms span unrelated subsystems, go down the stack, not across it.&lt;/strong&gt; I spent three days lateral-moving between download clients, kernels, and filesystems. The live-USB crash was the tell: when everything is broken, the thing they share is broken.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And run &lt;code&gt;fsck&lt;/code&gt; after hard resets anyway.&lt;/strong&gt; Mine was clean, but I only &lt;em&gt;knew&lt;/em&gt; that after checking, and &quot;unverified&quot; and &quot;fine&quot; feel identical right up until they don&apos;t.&lt;/p&gt;
&lt;p&gt;The server is called gufpalace. For four days it was more of a gufsiege. It stands, though — 64GB strong, boosts disabled, quietly serving Plex like nothing happened. Machines don&apos;t hold grudges. That&apos;s my job.&lt;/p&gt;
</content:encoded></item><item><title>Hello, GufWorks</title><link>https://pierregufler.com/posts/hello-gufworks/</link><guid isPermaLink="true">https://pierregufler.com/posts/hello-gufworks/</guid><description>A build log about shipping electronics with AI agents doing the engineering legwork. This is what&apos;s coming.</description><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is GufWorks, the augmented workshop. I design and ship electronics with
AI agents doing the engineering legwork: Claude Code editing KiCad schematics
directly, sourcing pipelines that refuse to hallucinate part numbers, a
homelab that occasionally tries to destroy itself and gets written up when it
does.&lt;/p&gt;
&lt;p&gt;The premise is simple. Big EDA vendors are selling agentic design suites at
enterprise prices. I do it with free tools and a chat window, and I publish
the working notes.&lt;/p&gt;
&lt;p&gt;Two kinds of posts are coming. Build logs: how a board actually gets
designed, reviewed, sourced, and manufactured when an AI holds the tools.
And &lt;strong&gt;Bodge Wire&lt;/strong&gt;, a series of post-mortems for the times hardware fails
spectacularly — because it does, and the failures teach more than the
successes.&lt;/p&gt;
&lt;p&gt;First proper posts land shortly. There&apos;s an &lt;a href=&quot;/rss.xml&quot;&gt;RSS feed&lt;/a&gt;. No
newsletter yet; &lt;a href=&quot;/subscribe/&quot;&gt;it&apos;s coming&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item></channel></rss>