# repo22 G2 Full Manual Regression Report

Started: 2026-08-09 06:07 UTC

Completed: 2026-08-09 07:10 UTC

Baseline: `cd0e985b5ac54a4b7acb7042422329ad1729fb3e`

Branch: `manual-g2-20260809T060709Z`

Guest: FreeBSD 15.0-RELEASE-p8 amd64, QEMU TCG, isolated port 9223

Overlay: `/work/build/repo22-manual-g2-20260809T060709Z-freebsd15-overlay.qcow2`

## Scope and Result

The exact assigned set was executed manually from the numbered Markdown
procedures. No CI, runner, result wrapper, or unassigned TC was used.

| Test | Result | Primary evidence |
|---|---|---|
| TC002 | PASS | Real CRC32C ranges; valid mount; bad covered byte `ERR#97` |
| TC008 | PASS | Bad magic `ERR#22`; 1023-byte provider `ERR#6`; empty md `EINVAL` |
| TC010 | PASS | Qualified 16 TiB sparse provider; exact 64-bit `df` total |
| TC015 | PASS | Bad block size/root/feature returned 22/97/45 |
| TC016 | PASS | Checksum-field-only mutation returned `ERR#97` |
| TC017 | PASS | Raw union fields; short `ERR#6`; qualified sparse mount |
| TC018 | PASS | Exact read at physical offset 17592191561728 |
| TC112 | PASS | Bad magic field returned `ERR#22` before root load |
| TC113 | PASS | Resolved inode `openat` returned `ERR#45` |
| TC114 | PASS | OOB FLAT_PLAIN `read` returned `ERR#97` |
| TC115 | PASS | Future algorithm bit returned `ERR#45` |
| TC116 | PASS | FBT decompressor entry count 1; `read` returned `ERR#5` |
| TC119 | PASS | FLAT_PLAIN changed byte/hash returned without kernel error |

Count: 13 assigned, 13 PASS, 0 KERNEL-FAIL, 0 SHELVED, 0 ENV,
0 duplicate, 0 omitted, 0 extra.

## Build and Guest

Both configurations were built natively in the isolated guest with kernel
`-Werror`, `FREEBSD_SRC=/tmp/repo22-freebsd15-src`, and FreeBSD source
`15.0-RELEASE-p9`. The running guest was `15.0-RELEASE-p8`.

| Configuration | KLD SHA256 | Result |
|---|---|---|
| `WITH_ZSTDIO=0` | `482e9c072c949f0459c422aa1efd9b35a2d99cf90b25bb01e59e00b440b6d0fe` | PASS |
| `WITH_ZSTDIO=1` | `8349c97c7ced253fff32a9e706f29313f309cb63a270e4e39a4501426f2b95c6` | PASS |

The ZSTDIO KLD was loaded as ID 5 and was the only repo22 test KLD. It had the
expected FreeBSD `ZSTD_*` references and no unresolved `bcmp`. The disabled KLD
had neither `ZSTD_*` nor `bcmp` unresolved symbols.

## Fixture Qualification

`tests/prepare_error_fixtures.sh` ran twice in independent empty host
directories with erofs-utils 1.8.6. Both `SHA256SUMS` files were identical and
self-verified. Every field mutation records its exact field/path and old/new
value. Same-size corruption variants preserve provider length; short and empty
providers record their intentionally different lengths.

The helper independently proved the 4096-byte-block checksum forms:

```text
canonical: field 1028 cleared, CRC32C [1024,4096), initial 0xffffffff
kernel:    CRC32C [1032,4096), seed 0x5045b54a
valid control: stored=canonical=kernel=0xf7429681
```

Raw transcripts, build logs, KLDs, guest logs, fixture trees, and the overlay
remain untracked under `/work/build/repo22-manual-g2-20260809T060709Z*`.

## TC002

Result: **PASS**.

Commands: helper `inspect`; `sha256`; dynamic `mdconfig`; valid `mount`/`cmp`;
direct negative `mount`; independent `truss`.

Hashes: valid `eb97860671931c76a171d13caa70ddc2c9731c6cdef1e99b9a3deb580baf70ae`;
bad CRC `3f684e8cb03e3cb20a1920dccf23d9b7b19bc09d5745be04608e195c541ebf73`.
Both were 7622656 bytes. The corruption changed byte 1088 without recomputing
CRC; calculated checksum became `0x202160ab` while stored remained `0xf7429681`.
Valid data matched; bad direct mount rc was 1 and `nmount` returned errno 97.
Cleanup: mount absent and exact md detached.

## TC008

Result: **PASS**.

Commands: `wc -c`, `sha256`, dynamic `mdconfig`, direct `mount`, and `truss`
for each attachable provider.

Hashes: bad magic `d1bc3aec03c58dae1b74b54d895c0a72e5b3088f05907ab2f6a0cb8dc38a615f`;
1023-byte provider `5724796860baa23469b3118eff2567c96a0b64b7dadaf99eafb7ba3c65b9aa56`;
empty provider `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`.
Bad magic returned errno 22. The 1023-byte md attached and mount returned errno
6. The zero-byte provider was rejected by `mdconfig` with `EINVAL`. Cleanup:
zero mounts and md units after all three subcases.

## TC010

Result: **PASS**, not SHELVED.

Commands: copy qualified prefix, `truncate -s 17592193667072`, `stat`, dynamic
`mdconfig`, `diskinfo`, `mount`, `df -kT`, `df -iT`, and `cmp`.

Prefix hash: `d3ffadc6fc9e73f85a8a5973b4ac5ee2a2da57b4e8baeccd259fa4325a2146cf`.
Fields were `blocks_hi=1`, `blocks_lo=1861`, `rootnid_8b=36`, and
`total_blocks=4294969157`. The sparse file allocated 15232 UFS blocks while
GEOM reported all 17592193667072 bytes. `df -k` total and Used were exactly
17179876628; Avail was zero. Cleanup: unmounted, md detached, sparse provider
removed. The former environmental issue is now RESOLVED.

## TC015

Result: **PASS**.

Commands: evidence/hash/length checks; three dynamic md attachments; direct
mount status followed by independent `truss` errno capture.

Hashes: bad block size `b5c52c44ace6f693e39161102acde157efec2fce34eb4fef198681dfc7942b58`;
bad root `9cdd61eb99b2e7f45d2505b3b95d6427f8f636e117b5ffabed064a3f83997d55`;
unknown feature `95d19a490c38657a8c579a10f1f12088ab43c1819aa9b37ae86b841bb26a592a`.
All were 7622656 bytes with recomputed valid CRC. Direct mount rc was 1 for
each; `nmount` returned 22, 97, and 45 respectively. Cleanup: zero mounts/md.

## TC016

Result: **PASS**.

Commands: field evidence, `sha256`, `wc -c`, direct mount, and `truss`.

Hash: `04249f6b7d9b7322c171f1727408130d23cb0b83709aad7a4b77b39358a8dfe6`.
The 7622656-byte image changed only checksum `0xf7429681 -> 0xf7429680`.
Direct mount rc was 1 and `nmount` returned errno 97. Cleanup: no mount/md.

## TC017

Result: **PASS** with both negative guard and positive dynamic coverage.

Commands: raw `od` at offsets 1038/1060/1136; small-prefix mount; sparse
provider creation; `diskinfo`; positive mount; `cmp`; `df -kT`.

Hash: `d3ffadc6fc9e73f85a8a5973b4ac5ee2a2da57b4e8baeccd259fa4325a2146cf`.
Raw values were high 1, low 1861, root 36. The short prefix returned errno 6.
The qualified provider mounted and reported exactly 17179876628 one-KiB
blocks. Cleanup: unmounted, detached, sparse provider removed.

## TC018

Result: **PASS** with real I/O above 16 TiB.

Commands: sparse provider creation; high-offset `dd`; two raw `read_probe`
calls; low-decoy and high-source `cmp`/hash; dynamic md mount and mounted hash.

Prefix hash: `cfd86ed1e39528d958e32819282c7fd87191f80a25d9575078dad473f40563a8`.
The inode encoded `startblk_hi=1`, low 1347, combined block 4294968643, and
physical offset 17592191561728. The original low payload at 5517312 was zeroed:
its hash was `6a4875ddaceaa91fb3369f0f6d962f77442daf1b1d97733457d12bcabdf79441`.
Raw high and mounted hashes both matched source
`25eb31e024bc60745d68a5f7318753951804c7858b576cb698a4260af4a334a3`.
Cleanup: unmounted, detached, sparse provider and probe outputs removed.

## TC112

Result: **PASS**.

Commands: raw magic `od`, hash/length, direct mount, and `truss`.

Hash: `d1bc3aec03c58dae1b74b54d895c0a72e5b3088f05907ab2f6a0cb8dc38a615f`.
Magic was `0x21444142`; provider length remained 7622656. The canonical CRC was
invalid as required after changing magic, while the unchanged production
suffix checksum still matched `0xf7429681`. Direct rc was 1 and `nmount`
returned errno 22. Cleanup: no mount/md.

## TC113

Result: **PASS**.

Commands: structured path inspection; mount/control `cmp`; direct and trussed
`read_probe expect-error ... 45`; second control `cmp`.

Hash: `28d972c4065927326607fcd51dabff81cc88a28e2343f6056e55d04418172814`.
Resolved NID 52 at inode offset 1664 changed format `0x0001 -> 0x8001` with
valid CRC and equal provider length. `openat` returned errno 45; unaffected data
remained exact. Cleanup: clean unmount and md detach.

## TC114

Result: **PASS**.

Commands: path inspection; mount/control `cmp`; direct and trussed
`read_probe expect-error ... 97`; second control `cmp`.

Hash: `2afcb9dde4c8eaf30bb2541d00be36f726f5cf151d887e0d999803b3993285ed`.
NID 54 field offset 1744 changed start block `1349 -> 1861`, equal to declared
blocks, with valid CRC and equal media size. Target `read` returned errno 97;
control remained exact. Cleanup: clean unmount and md detach.

## TC115

Result: **PASS**.

Commands: raw field `od`, hash/length, direct mount, and `truss`.

Hash: `a8d7d9cf0abcf34a5cd2366059c0294e08fdd20d02ed3b5b21005ddf78c69029`.
`available_compr_algs` at byte 1106 changed `0x0000 -> 0x8000`; CRC was
recomputed and media remained 716800 bytes. Direct rc was 1 and `nmount`
returned errno 45. Cleanup: no mount/md.

## TC116

Result: **PASS** with direct decompressor-path proof.

Commands: parsed `dump.erofs -e` evidence; failed userspace extraction record;
mount/control `cmp`; FBT enumeration and count; direct/trussed `read_probe`.

Hash: `f442785ea7cdbdc3f64b2ff89ea04942460cbdc5bea5615cbed237029edda8d8`.
The equal-length 716800-byte image changed 64 bytes at 4128, wholly inside the
parsed first physical extent `[4096,69632)`. Mount succeeded, excluding the
media-size precheck. `fbt:erofs-zstdio:z_erofs_decompress:entry` counted one
call for the target command, and `read` returned errno 5. Control remained
exact. Cleanup: unmounted/detached; `dtraceall` and dependencies unloaded.

## TC119

Result: **PASS** with the revised real integrity semantics.

Commands: path/field evidence; image/source hashes; mount; complete mounted
hash; two one-byte `read_probe` calls; byte compare; control `cmp`.

Hash: `74b54f998481f9e55b30f2393ee780e3b46144157a54b4dc0fc0c044c160bb5a`.
The equal-length image flipped `/plain.bin` file offset 257 at provider byte
5525761 from `0x00` to `0x80`; the valid superblock CRC remained unchanged.
Source hash was `5647f05ec18958947d32874eeb788fa396a05d0bab7c1b71f112ceb7e9b31eee`;
mounted hash was `e98bb2acaecb24ab86112478bc8cc1e3668c127b449fe2e664dc4804f9477d81`.
Reads succeeded, the target byte differed, and control matched. Cleanup: clean
unmount and md detach.

## Harness Notes

Four incomplete attempts were discarded and are not PASS evidence:

1. TC002 repeated host Python inspection in a guest without Python and exited
   before md attachment.
2. TC002 initially trusted `truss` wrapper status; the qualified run separated
   direct mount rc from syscall tracing because FreeBSD `truss -o` returned 0
   around a failing mount.
3. TC008 had a stray patch marker after its second subcase; trap cleanup ran and
   the complete three-subcase command was repeated.
4. TC010 initially asserted the `df` Used column was free blocks; the qualified
   run used the correct `f_bfree=0` interpretation and repeated all steps.

## Final Cleanup

Per-TC cleanup ended with zero EROFS mounts and zero md providers. Global dmesg
changed from 102 to 104 lines; both new lines were the expected
`md0: truncating fractional last sector by 511 bytes` from TC008. New panic,
fatal trap, page fault, general-protection fault, and double-fault count was
zero. The exact test KLD unloaded successfully, leaving zero EROFS modules.
The guest shut down normally and QEMU PID 285696 exited after 12 seconds. Port
9223 no longer has a VM process.

## Issues

No kernel issue was found and no TC remains SHELVED. The former TC010 provider
issue is retained as a resolved record in
`issues/TC010-48bit-statfs-large-provider.md`.
