# repo22 G5 compression full manual regression report

## Scope and result

- Exact scope: TC003, TC004, TC084-TC092, TC102-TC110, TC143-TC146.
- Count check: 24 requested, 24 executed, 0 duplicate, 0 omitted.
- Result: **PASS 23, PARTIAL 1, FAIL 0, NOT RUN 0**.
- SHELVED subscenario: TC146 explicit mapped extent only.
- TC146 overall: **PARTIAL**; HEAD2 PASS, interlaced PASS, explicit extent
  SHELVED.
- Kernel baseline: `f383bbbbff301a6bde18894f03ab88a8c0cc885a`.
- Initial and pre-push `xdm/main` baseline: the same commit.
- No repo22 kernel source was changed. No kernel failure issue was opened.

## Isolated environment

- Worktree: `/work/build/repo22-manual-g5-20260809T085450Z`.
- Branch: `manual-g5-20260809T085450Z`.
- Artifact root: `/work/build/repo22-g5-20260809T085450Z`.
- Dedicated qcow2 overlay backed by the FreeBSD development base.
- Dedicated SSH forward: `127.0.0.1:9225`.
- Guest: FreeBSD `15.0-RELEASE-p8`, amd64,
  `releng/15.0-n281036-53054229dcb3`.
- Guest toolchain: FreeBSD clang/LLD 19.1.7.
- Host tools: mkfs/dump/fsck erofs-utils 1.8.6.
- No CI, runner, or wrapper was used. Each Markdown test was issued manually.

## Reproducible fixture

`tests/g5_fixtures.py` generated source content, invoked mkfs with fixed UUID,
timestamp, owner, sort order, and one worker, transformed structured records,
reopened every image, and wrote a field manifest. Two final fresh output
directories produced byte-identical source and image checksum inventories.

```text
SHA256SUMS SHA256        = 8535696f187f818df8b3b30ee35cd8837aceadef9de7a85be1475732dcdf0596
SOURCE-SHA256SUMS SHA256 = 145bd663d7552025b486ec15c0b4c1c0ce99affa7728dc4d762134bdc92420c3
fixture manifest SHA256  = 63ecdb46f8cc3c04e348e24e0f1306ad5e4606bf1fa108919f946515d7b41d63
image count              = 25
source count             = 19
guest hash verification  = 25 images, 19 sources
```

### Image hashes

| Image | SHA256 |
|---|---|
| `deflate-level1.erofs` | `58dc78da2ec5a751688f53c4eee34f94b7f828d68b7225aea006d08374187bfe` |
| `deflate-level6.erofs` | `4a3b5d2ce6b8d1bad23aa2c4d4ce38f83bc0e6642523e9165e58afe03e030c28` |
| `deflate-level9.erofs` | `c4bf219a5130d475c26452a1a5346c63ed1f434afd4315972ee30ebc66f9c751` |
| `deflate-partial-ref.erofs` | `fccb2f4038dca8b7277984e255a304bb6eee5de51fedd7b7261ef4f879362c81` |
| `deflate-partial-ref-corrupt.erofs` | `063e1bc07d2c3a3bf3b17c0cce0237eca7000eb16abdf8a1b4428d8cc7880811` |
| `extent-attempt.erofs` | `ee7472c23ccffd5eef6f4a3171ea53ae2e840f8a1ea417b2630065175ecf3225` |
| `head2.erofs` | `4948335059e605ff70da4f6e516c4ba24d58313d10e836cc6fe9c9c468775a23` |
| `head2-corrupt.erofs` | `7c25e9c8c767d2717c06b1efc854f0bb3b1f370cf3e2a8e2d53e767918bfe50f` |
| `interlaced.erofs` | `7b77055dfae301a0acc3202cf0d7cf7062eb82c6101d16b68c91f70615e1638b` |
| `lz4-compact-4k.erofs` | `0701a37430372f1240ad6485c83f0048d97bb49ae1ca85e1423dd05101bf5578` |
| `lz4-compact-64k.erofs` | `967cc1b625546f9f9f881472e71cc3d849c65feb4e98e67fbfdc9b90a4be6dda` |
| `lz4-compact-256k.erofs` | `6fbded24756b557c7ce19a5936dcde01fb75d4b1c91b0236fca46ee0c6331db0` |
| `lz4-full-4k.erofs` | `3bc6eb538752673e2b9f905a0382887bccf417574a0d04901932cfeaac258bc7` |
| `lz4-large.erofs` | `0340026fe5fea5fd7c6c4c03f288815bc86c7517c2c2a9a2ca21c61dfb96a973` |
| `lz4-ztail.erofs` | `18cd045d7f2b8e542a0dda6fb0063c266919928e6e485f498ed93c8992d9ae3a` |
| `lzma-level6.erofs` | `32107a084b27362a093768b88746c37c2e99a74b9f1301a9d4046988479defe9` |
| `lzma-large.erofs` | `6534870a686c3c5ba58fc665ea4995c07427a15c9d5ac7747690114138adf47d` |
| `lzma-partial-ref.erofs` | `fbbcbcb8a178370a8f7665c3e0cff8df5bb6f81c3ba38a0e44c137e8ed165402` |
| `lzma-partial-ref-corrupt.erofs` | `23981af2f4e36f88e382fff975f3c4fb00cb4b02c0f40f10948602ab4ce39f23` |
| `microlzma-edge.erofs` | `27a19758141d64430d7536774fadf34ba7f8befa0bc36442b789e494b4b37d4c` |
| `zstd-level1.erofs` | `34f51d5b1273cc3fc9efa458c200cf134dc7dca2c583e577a8d06ad563cfbff6` |
| `zstd-level15.erofs` | `8ca4ba52561cc8903f85048edfd958ef692583479748dcb8aa57e2c7aade1034` |
| `zstd-level22.erofs` | `99f79807ffd9f1216dbd624a2d8ecfcf17c9b42689fef5b5a69d0250ed84e5` |
| `zstd-partial-ref.erofs` | `cdef7c2a397722723dcc762044612a179358f9dbe4dcd879ac08e462cf9628d1` |
| `zstd-partial-ref-corrupt.erofs` | `ed6f4b23f6b6426e6af9180e892f03097d16a6b969edd68ad42d9a1ff8d2325e` |

### Source hashes

| Source | Size | SHA256 |
|---|---:|---|
| `large/large.bin` | 268435456 | `78f61f8eb37b5aeee026b579d244d766935d5655c0ac5383a96f631048611cfd` |
| `levels/level.dat` | 8388608 | `ddda39737f0f6093e828a032ec161511fefbb1fa361bc6cbffdbc91e48e4c461` |
| `lz4/compressed.bin` | 8388608 | `3ff012b76087c4da65ce0b69813a76f47ea367e95782edf8b8cd6cd3ec4d1880` |
| `lzma-large/large.bin` | 104857601 | `de846af6c7e47fac72c0576c449fd0fc1fe9587286c9158ae08c81804c77f66b` |
| `microlzma/one-byte.bin` | 1 | `333e0a1e27815d0ceee55c473fe3dc93d56c63e3bee2b3b4aee8eed6d70191a3` |
| `microlzma/block-4k.bin` | 4096 | `42b2e4ac3afeb366a6407573d5a91a961775e0fe374b0941f19681c4e3f9ea96` |
| `microlzma/boundary-16k.bin` | 16384 | `1b5a7306ca67b75c18228d08f281eb7474b31a1a1ccbe4d680b7942fc81265b9` |
| `partial/a.dat` | 1048576 | `c7ac0fce9c56d732e4b8328c1ca48ae33ee4d449166bd25d2c88322c1a852d9f` |
| `partial/b.dat` | 700000 | `926a9bb05b20cb3da745eaff6e7fec38fb43d7fa155276474367550b67b97589` |
| `partial/control.bin` | 32768 | `7544a26039c5257ee07c1280468edb1f61f0b0edaa25273b15e0252a9cc5c90a` |
| `partial-deflate/a.dat` | 1048576 | `c7ac0fce9c56d732e4b8328c1ca48ae33ee4d449166bd25d2c88322c1a852d9f` |
| `partial-deflate/b.dat` | 100000 | `1fbe057da0cb994652ef664a4aa00628e948578055665160fc63e7079469da21` |
| `partial-deflate/control.bin` | 32768 | `7544a26039c5257ee07c1280468edb1f61f0b0edaa25273b15e0252a9cc5c90a` |
| `shape/shape.dat` | 1048576 | `5be510e6b43f1ed0cda4261288ea70df11607b6ced29bc90d32ed2849ecc5e35` |
| `ztail/inline.dat` | 131071 | `e54a4bac3b6b1c01ee846dbccdf234ddb30ed06dc13f1af1df0fbbc397431ce5` |
| `ztail/exact-pcluster.dat` | 4096 | `14587a494e72ecdc7d26b4c0b947d91d44eba4365b252d1a4ec10ba979978c52` |
| `ztail/one-byte-tail.dat` | 4097 | `718f4c27896edf8925300c50572df92b9127e56b2b84a3a86ced4d67c3be9596` |
| `ztail/max-tail.dat` | 8191 | `5e1e898dba6a6bbcc8beb0b0b097bc04ecaaf4ad505b77bfb8646a3011628df6` |
| `ztail/zero-tail.dat` | 0 | `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855` |

## Key layout fields

| Fixture | Structured proof |
|---|---|
| LZ4 compact 4K | layout 3, map offset 2183200, `h_advise=1` |
| LZ4 full 4K | layout 1, map offset 2183200, `h_advise=0` |
| LZ4 compact 64K | layout 3, `h_advise=7`, max physical pcluster 65536 |
| LZ4 compact 256K | layout 3, `h_advise=7`, max physical pcluster 262144 |
| ztailpacking | layout 3, `h_advise=9`, `h_idata_size=536`, physical bytes 1512-2048 |
| HEAD2 | incompat `2 -> 10`, map advise `2 -> 6`, first record `1 -> 3`, pblk 1 |
| interlaced | layout 3, `h_advise=49`, 52 compressed, 1 plain, first transition 999593 |
| explicit attempt | layout 1, map offset 1312, `h_advise=2`, explicit bit absent |

The first HEAD2 logical pcluster ends at 326114; the boundary read started at
326000. The interlaced boundary read started at 999000 and crossed the proven
transition at 999593.

Partial-reference fields after reopen:

| Algorithm | a/b size | a/b pblk | b partial advise | b compressed blocks |
|---|---|---|---:|---|
| DEFLATE | 1048576 / 100000 | 1 / 1 | 32769 | 2 -> 17 |
| ZSTD | 1048576 / 700000 | 1 / 1 | 32769 | 1 -> 1 |
| MicroLZMA | 1048576 / 700000 | 1 / 1 | 32769 | 1 -> 1 |

Targeted corruption fields:

| Target | Algorithm | Pcluster | Patch |
|---|---:|---|---|
| DEFLATE `/a.dat` | 2 | 4096 + 69632 | offset 8055, length 64 |
| ZSTD `/a.dat` | 3 | 4096 + 4096 | offset 8073, length 64 |
| MicroLZMA `/a.dat` | 1 | 4096 + 4096 | offset 7957, length 64 |
| HEAD2 `/shape.dat` | 0 | 4096 + 65536 | offset 4096, length 64 |

Every corrupted image retained a valid superblock checksum. Each read was
bounded by `timeout 20`, returned errno 5, and left `control.bin` readable
where the fixture included one.

## Build and TC145

The invalid build value failed with rc 1 and the exact message
`WITH_ZSTDIO must be 0 or 1`.

| Build | Size | SHA256 | Undefined-symbol gate | Guest |
|---|---:|---|---|---|
| `WITH_ZSTDIO=0` | 73896 | `e103ebbaf7faf8041448d93022be44e7c93822a45a36a69bca2b7a2107461d09` | no `ZSTD_*`, no `bcmp` | file ID 5 load/unload PASS |
| `WITH_ZSTDIO=1` | 78728 | `56ffcce006eed1e555121d9b8f523578272ac3d82c27a19b635d0a0a664c8370` | five formal API names, no `bcmp` | file ID 5 load/unload PASS |

The enabled undefined ZSTD set was exactly
`ZSTD_DCtx_setParameter`, `ZSTD_createDCtx_advanced`,
`ZSTD_decompressStream`, `ZSTD_freeDCtx`, and `ZSTD_isError`.

The disabled module read the LZ4 control hash
`3ff012b76087c4da65ce0b69813a76f47ea367e95782edf8b8cd6cd3ec4d1880`.
A direct ZSTD mount returned rc 1 with the required message; `truss` proved
`nmount` returned `ERR#45 EOPNOTSUPP`. The enabled module read ZSTD hash
`ddda39737f0f6093e828a032ec161511fefbb1fa361bc6cbffdbc91e48e4c461`.

## Per-TC results

| TC | Manual evidence | Result |
|---|---|---|
| TC003 | compact LZ4 full hash/cmp; first 1024 bytes cmp | PASS |
| TC004 | LZMA level 6 full hash/cmp; 102400/10240 and EOF 10000 cmp | PASS |
| TC084 | full-index LZ4 full hash/cmp; 4000/8192 cross-extent cmp | PASS |
| TC085 | 256 MiB full hash/cmp; 50/200 MiB ranges and two 4K offsets cmp | PASS |
| TC086 | deterministic sequential 4K and 1 MiB block reads both full cmp | PASS |
| TC087 | offsets 0, 4096, 65536, 1048576, and 8384512 source cmp | PASS |
| TC088 | 4K/64K/256K images full hash and 409600/40960 source cmp | PASS |
| TC089 | 0/4096, 4096/4096, 2048/4096, and 0/16384 source cmp | PASS |
| TC090 | 0/65536, 4096/4096, 65504/64, and 0/262144 source cmp | PASS |
| TC091 | ztail full hash/cmp and final 4096 bytes cmp | PASS |
| TC092 | actual 4096, 4097, 8191, and 0-byte files full hash/cmp | PASS |
| TC102 | DEFLATE level 1 full hash/cmp and two fixed ranges | PASS |
| TC103 | DEFLATE level 6 full hash/cmp and two fixed ranges | PASS |
| TC104 | DEFLATE level 9 full hash/cmp and two fixed ranges | PASS |
| TC105 | ZSTD level 1 full hash/cmp and two fixed ranges | PASS |
| TC106 | ZSTD level 15 full hash/cmp and two fixed ranges | PASS |
| TC107 | ZSTD level 22 full hash/cmp and two fixed ranges | PASS |
| TC108 | 104857601-byte LZMA level 6 full hash/cmp; 0/50/99 MiB ranges; active 0 | PASS |
| TC109 | actual 1B/4K/16K files match; 16K inode proven compressed LZMA | PASS |
| TC110 | valid LZMA control; targeted read EIO; same-image control; active 0 | PASS |
| TC143 | DEFLATE/ZSTD a+b full, partial ranges, targeted EIO, controls, active 0 | PASS |
| TC144 | MicroLZMA a+b full, partial ranges, targeted EIO, control, active 0 | PASS |
| TC145 | invalid gate, both builds/symbol sets/KLDs, disabled rejection, enabled read | PASS |
| TC146 | HEAD2 PASS; interlaced PASS; explicit mapped payload SHELVED | PARTIAL |

TC108 used a 1800-second hard timeout for each complete read under QEMU TCG.
It completed without timeout; the long duration was diagnostic only.

## Explicit extent disposition

erofs-utils 1.8.6 source had zero matches for
`Z_EROFS_ADVISE_EXTENTS`, `z_erofs_extent_recsize`, and the on-disk
`struct z_erofs_extent`. The fresh `--max-extent-bytes=65536` attempt remained
ordinary full-index metadata. The structured transformer refused an
unverifiable metadata/payload relocation. Existing `review_fixtures.py` only
builds a negative `pa + plen` overflow extent table, not a valid mapped
payload.

FreeBSD and Linux ABI/control flow for 4/8/16/32-byte records was reviewed.
That is static support, not dynamic positive coverage. Full details and
acceptance criteria are in `issues/extent-metadata-fixture-unavailable.md`.

## Stability and cleanup

- Every mount was read-only and every md provider was detached.
- All corruption probes returned errno 5 before their 20-second timeout.
- No dmesg delta, panic, trap, or OOM was observed.
- EROFS active allocations returned to zero after each corruption/large test.
- Final guest verification: 25 image hashes and 19 source hashes matched.
- Final guest: zero mounts, zero md providers, no EROFS allocator row, no EROFS
  KLD, and responsive FreeBSD 15.0-RELEASE-p8.
- The dedicated VM was powered off and port 9225 was released after evidence
  collection.
