# Pre-12 Batch 09: compression header responsibility

Date: 2026-08-13

## Scope

- Removed the direct `internal.h` include from `decompressor.c` and the four
  `decompressor_*.c` backend consumers that already include `compress.h`.
- Made no declaration, definition, function, storage-duration, or public API
  changes.

## Candidate source

Batch 04 created `compress.h` with a direct `internal.h` include and added
`compress.h` to these five translation units while retaining their direct
`internal.h` includes. Batch 06 then made LZMA, DEFLATE, and ZSTD backend
functions private and exposed only their descriptor objects through
`compress.h`. This left exactly five duplicate include edges attributable to
Batches 04/06.

## Static proof

- `compress.h` remains the sole owner of `z_erofs_decompress_req`,
  `z_erofs_decompressor`, the LZ4 decompressor prototype, and the three
  backend descriptor declarations.
- `internal.h` remains the sole public owner of `z_erofs_decompress` and
  `z_erofs_parse_cfgs`; it does not include `compress.h`.
- The include graph remains acyclic: each affected translation unit includes
  `compress.h`, and `compress.h` includes `internal.h`, which includes only
  `erofs_fs.h` among project headers.
- Each affected consumer therefore still sees the same complete request,
  descriptor, mount, map, and superblock types through one guarded include
  path. No backend prototype or descriptor declaration is duplicated between
  `internal.h` and `compress.h`.
- The source diff removes exactly one `#include "internal.h"` line from each
  of five authorized files and changes no other token.
- `git diff --check` and `git diff --cached --check` were required for this
  batch.

## Deferred validation

No build, QEMU, smoke, feature, or other dynamic validation was run under the
execution constraint. The required FreeBSD KLD `WITH_ZSTDIO=0/1` matrix and
final Plain/LZ4/LZMA validation remain deferred.
