# Hashline oracle corpus
This directory is the slice-1 parity boundary for the hashline surface. The
semantic oracle is `oh-my-pi/packages/hashline` at revision
`45e12e5bb758198a920c6070e7e64cb33b21beac`. The full revision is repeated in
`manifest.json` and `oracle_revision.txt`; it must not be replaced by a branch
name or a moving dependency.
## Reproducible generation
Regeneration uses only Python 3's standard library. It does not import AFT,
load a Cargo workspace, access Bun, or read a network checkout:
```text
python3 crates/aft/src/hashline/oracle/regenerate.py
python3 crates/aft/src/hashline/oracle/regenerate.py --check
```
The second command compares every generated byte with the committed files.
The manifest records each output's SHA-256 and the fixture count. JSONL rows
use sorted keys and one newline per row; this keeps diffs reviewable and makes
byte-for-byte reproduction observable.
## Corpus contract
`fixtures.jsonl` contains the pinned operation corpus. It has both accepted
and rejected rows for `PUT`, `CUT`, `REM`, and `MV`, plus LF, CRLF, mixed
terminators, BOM, empty files, missing final newlines, BOF, EOF, `$`, gaps,
one-line files, empty-file boundaries, all four repair layers, register
shapes, and mutation-checked negative controls. Every row records the oracle
revision and exact initial bytes as base64.
The only registered deviation categories are exactly:
1. `block-resolver-span` — native BlockResolver spans may differ for JSX.
2. `strict-exact-byte-verification` — AFT rejects addressed raw-byte drift
even when normalized oracle text would remain accepted.
The manifest's deviation-control rows are required to fail if either
registered deviation silently disappears. No third category is permitted.
## xxHash32 parity
`xxhash32_seed_zero.json` contains seed-zero vectors and
`tag_normalization.json` contains raw/normalized tag vectors. The three
literal anchors in the generator and the Rust unit tests (`empty`, `a`, and
`abc`) are independent cross-language checks. `xxhash32_vectors.rs` lets the
Rust tests validate every committed digest without a JSON or AFT dependency.
The tag implementation strips only `[ \\t\\r]+` immediately before LF and at
EOF, then renders the low sixteen bits as uppercase hexadecimal.