Date: 2026-10-03. One reviewer (an AI agent, as the plan’s question 6
says), on a23d050..a1be8e1: internal/check (findings, rules, runner,
file graph, the fstab checker, the baseline diff) and the exported scope
glob. The reviewer worked in a scratch copy and ran the real findmnt
2.39.3 as a user. Claude reproduced each finding before fixing it, with
findmnt as root where the finding needed it; the outputs are now golden
files in internal/check/testdata/findmnt.
Held up: the runner’s fixed tool directories, argument list, environment and timeout; the graph parser; the scratch copy’s modes and cleanup; severities from systemd-fstab-generator.
| Area | Finding | Severity | Fixed in |
|---|---|---|---|
| diff | Added compared rule, severity and text, and every fstab-fields finding has the same text: with one bad line already in the file, a newly broken root line was not reported, or the old line was blamed. The same for two different findmnt errors on one mount point. |
high | a2e325f (a finding has a key) |
| fstab | A UUID or LABEL in the wrong letter case was accepted. libblkid and udev’s links are case-sensitive: findmnt reports the upper-cased UUID of this VM’s root as unreachable. The boot would have stopped. | high | a2e325f |
| fstab | findmnt’s “unreachable on boot required source” was always dropped as “sc’s own rule”, also for sources sc could not look up (LABEL=My\\040Disk): no finding for a line that stops the boot. |
high | a2e325f |
| fstab | findmnt’s on-disk type warning is a string compare; sc made a blocker of working lines: ext4,xfs, ntfs-3g on ntfs, ext3 on ext4. Confirmed as root for the list and ext3. |
medium | a2e325f (compatible types, ext family a warning) |
| fstab | Real options near a common one were called misspellings at blocker level: btrfs nossd, ext4 resuid, xfs wsync, nfs nocto, _rnetdev. |
medium | a2e325f (one slip only; 746 known options in mountopts.txt) |
| fstab | A findmnt heading sc could not match (a mount point with an escape other than \040) gave line 0 at blocker; two lines for one mount point were both filed under the first. | medium | a2e325f |
| runner | stdout and stderr shared a pipe. findmnt buffers stdout and not stderr, so on long output its summary landed inside a line and broke the parse. | medium | a2e325f (two streams) |
| checks | A validator that was killed, rejected its arguments or had its output cut was read as a clean run, with no note. | medium | a2e325f |
| fstab | As a user findmnt cannot read the disks and the type check is skipped: nothing said so. | low | a2e325f (a note) |
| runner | Leftover processes were killed after the tool was reaped, when its process group id could in theory already name another group. | low | a2e325f (killed while the tool is a zombie) |
DefaultGraph panics on a broken built-in graph, as scope.Default
does; TestDefaultGraph parses it in every test run.default and fsync. default would have hidden the most
likely misspelling of defaults. Both are removed, and
TestKnownOptsNearCommon fails for any listed word one letter from a
common option that is not checked by hand.Each finding has a test that fails without its fix: TestFstabAddedFields,
TestFstabVerifyKeys (a mutation that ignores the key fails three tests),
lines 20-22 of TestFstabRules, 15 cases of TestFstabFindmnt,
TestFstabFindmntBroken, TestRunExact (streams apart),
TestRunStraggler.