Files
Cesarus85--mjolnir-vr/docs/object_matching_logs/data_encoding_obj.md
T

323 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# `data_encoding.obj` exact-match strategy log
> **Current disposition (2026-08-11): strict-exact and admitted.** The
> historical fixed-point analysis below is retained because
> it documents the 17 rejected source families that preceded the provenance
> breakthrough.
## Scope and provenance
- Translation unit: `source/memory/data_encoding.c`
- Target: `build/split/source/memory/data_encoding.obj`, split from the
January 2002 `cachebeta.exe`
- Candidate: `build/base/source/memory/data_encoding.obj`
- Compiler: Xbox XDK 3911 VC7 (`xbox/bin/vc7/CL.Exe`, version 13.00.9254.1)
- Required flags: `/nologo /c /O2 /Oy- /DDEBUG /Dxbox`, with the repository
include paths generated by `configure.py`
- Starting revision: `codex/campaign-integration` at `8cf2d5444`
- Comparator: `tools/coff_compare.py` at `8cf2d5444`, including the hardened
pairwise relocation resolver for code and non-code sections
- Target topology evidence: the January public symbols and addresses recorded
at the head of `data_encoding.c`; older source/PDB material is a hypothesis
source only and does not override the January object.
The isolated lane was configured from the repository generator. It uses the
same checked-in source/configuration, shared read-only XDK 3911 junction, local
`cachebeta.exe`, `csplit.exe`, and `objdiff-cli.exe`; no compiler flag or target
object was changed.
## Validated baseline
Command:
```powershell
ninja build\base\source\memory\data_encoding.obj build\split\source\memory\data_encoding.obj
python tools\coff_compare.py build\split\source\memory\data_encoding.obj build\base\source\memory\data_encoding.obj <all 16 function symbols>
```
The hardened baseline is **15/16 strict exact**, with **3,296/3,296 padded
function bytes**. All 14 target-owned non-code sections are strict exact:
**459/459 `.rdata` bytes**, zero relocations. The candidate additionally emits
the `buffer`, `buffer_size>=0`, and `count>=0` assertion literals in separate
COMDATs; csplit does not assign those deduplicated literals to this target
object, so they are compiler metadata/ownership differences rather than owned
target data.
Ordinary objdiff reports `_data_decode_memory` at 66.56% in the local
objdiff 3.3.1 build (earlier campaign handoff: approximately 66.64%). Ordinary
objdiff is diagnostic only; strict status comes from the hardened comparator.
### Function inventory
| Function | Padded size T/B | Relocs T/B | Normalized SHA-256 | Status |
|---|---:|---:|---|---|
| `_data_encode_new` | 112/112 | 9/9 | `8768c68e1dd89e978d0ae821e3599c950e6bc795d64bc23baef5d32486755250` | exact |
| `_data_encode_memory` | 304/304 | 17/17 | `aeaf7eb5fddeb848adc29cfd6c46546c90c32c0981b02f0f430cd511286b7aaf` | exact |
| `_data_encode_integer` | 256/256 | 10/10 | `a960315a739a4230040a899eee18700f8685df0ca0d4111043e68e8e9b2cdf79` | exact |
| `_data_encode_structures` | 256/256 | 14/14 | `d0e427473335d5a915239ee2e3230b578142375541b1afda95fa477ad302ce45` | exact |
| `_data_encode_array` | 576/576 | 43/43 | `7e3569e19e98be057aeb330fe1973dfc2afe7e13e8e49f66c61f8ed1d4971b6b` | exact |
| `_data_encode_string` | 160/160 | 6/6 | `c18aa3a96c57cd1d10274595fc7573898f2e7f77c8e58f574b567351a692405b` | exact |
| `_data_decode_new` | 112/112 | 9/9 | `f0dea9eac3ff40d6f0da3dc2ead78ee450e3b920a592869c288c27cf1bb7a78d` | exact |
| `_data_decode_structures` | 240/240 | 13/13 | `0db6222030d5655dfaada7a01714785744db752226b2d6bd63a3c1b9703e1033` | exact |
| `_data_decode_memory` | 304/304 | 19/19 | T `eb39377415e6c3e07f763e8f0f42f6ecafaf61acc0fab30fbc06062b9dc465d8`; B `9c154cab347995fa1eb87ee6b088615f4347de7947058d8336212577bfbc3cc7` | residual |
| `_data_decode_byte` | 112/112 | 4/4 | `91f5ba7bc99766592386506f438136daff739b16a34d0151810d759d89122d96` | exact |
| `_data_decode_short` | 128/128 | 5/5 | `6cc7704a74a9b48b8af5b860054bbe2ee2bee0b06fb8dc7a4a30e4611ef34118` | exact |
| `_data_decode_long` | 128/128 | 5/5 | `276c5b1dd2ccedc8e0807a589a4d11a699b213b4468a60d5a2ffca02bd540320` | exact |
| `_data_decode_int64` | 48/48 | 1/1 | `c805dccfc68c675dcfa56b15147f6009a559a3a433d23df1ac21097e37960e4d` | exact |
| `_data_decode_integer` | 112/112 | 7/7 | `2f9457b0cc9adc7f20a16b38881f7d52612e1b24ce15a4ddd754e85b3de0766e` | exact |
| `_data_decode_array` | 368/368 | 31/31 | `93eb0427d2cb6c8818cdccb5031169e42c9a2461c00022f6dc29343ead57d74c` | exact |
| `_data_decode_string` | 80/80 | 0/0 | `a19f040eff69a02e0703f67d49921b998501ed6e80d63327f349cbee99a1515c` | exact |
### Owned non-code inventory
All rows are `.rdata`, have equal target/base size, zero relocations, and
strict-equal normalized hashes.
| Owner literal (abbreviated where mangled) | Size | SHA-256 |
|---|---:|---|
| source path `c:\halo\SOURCE\memory\data_encoding.c` | 38 | `ac45863b58782998f06cb76da1351037cf0159cf84cfec4bd847608fee673c7c` |
| encoder state assertion | 79 | `4c493fd06ea83ac5ad038620f75e473ad22e9ce29b855d6ee1ca403b382f0f0c` |
| `maximum_value>0` | 16 | `882e4a931d94220788dcec61f1eba5637173959aa0f731442bb8c3d272175a7c` |
| `bs_definition` | 14 | `eba14beb7acb02e162f68248bed2808506799bb99b058f968196e698270f0a6c` |
| `source_structures` | 18 | `184b611e452e730136a62c03caae0f6a95c0a06e3fe4a44fc102205d73bcee76` |
| `element_count<=UNSIGNED_SHORT_MAX` | 34 | `8cf0d82bca902627da4f2f1a6698e6dc974e96718e775c291e07b0dc49565196` |
| `element_count<=UNSIGNED_CHAR_MAX` | 33 | `16178348f414a11c23324da5743a39b6b3ed634afa7c8a7ed25c54f35ebde403` |
| `element_count>=0` | 17 | `74e3fcb64e369c70c9d31a2c84f4c9b16504e31f50efc7aa1e560d68b9f734bb` |
| `source_array` | 13 | `39cdb9d7009172e6efa42cf694dedd287c41eac4467a37afb9ce41af15cb22f9` |
| string-buffer bounds assertion | 50 | `c93b160e3929d1b5c6af9360f6462f200045d8a87cab4e344bb063486cfec125` |
| `structure_count>=0` | 19 | `4503f200e32141fa94a71eab30a9e2007d290f3962461e83e9f9a2e33271ea9b` |
| decoder state assertion | 80 | `fb5b4e55dd29f1c0c7ca225e0a1bf51b1cfadc7b58b764967d378665f186c2e3` |
| `maximum_element_count>0` | 24 | `2825bf6555d95f6799775dbb605de1404e3f1470c603665d7bff2144bb5b5e77` |
| `element_count_reference` | 24 | `8be5ee77e570517b19ff1edfaa15cbea510c24a9f7311f44982721b8e31b4f60` |
### Residual detail
- Meaningful target code size: 295 bytes; padded section: 304 bytes.
- First normalized byte divergence: `+0x4`.
- Target begins `push ebp; mov ebp,esp; push ebx; push esi;
mov esi,[ebp+8]; push edi; xor edi,edi`.
- Baseline begins `push ebp; mov ebp,esp; push ebx;
mov ebx,[ebp+8]; push esi; xor esi,esi; push edi`.
- The target owns `state` in ESI, the returned `memory` in EDI, and
`memory_size`/the partial-width `count` path in EBX/BX.
- The baseline owns `state` in EBX, returned `memory` in ESI, and
`memory_size` in EDI, using EAX plus LEA for the scaled-count cases.
- The first strict relocation divergence is relocation 10: the default-case
source-path relocation is at target `+0xA6` versus base `+0xAA`. Relocations
11-12 inherit the four-byte drift; switch-table destinations also differ at
relocations 15-18. Counts and relocation kinds/semantic callees agree.
- Normalized differing bytes: 114 across the 304-byte padded section.
## Accepted controls
- Keep the integrated source at `8cf2d5444` as the baseline. It is readable
C and preserves all 15 strict-exact siblings plus all owned non-code data.
- The recovered switch cases, assertions, overflow gate, byte-swap call, and
offset update agree semantically and structurally with the January target.
- No source change is accepted unless `_data_decode_memory` improves and the
full 16-function plus 14-data-section sweep remains regression-free.
## Experiment matrix
Historical objects and dirty worktrees were inventoried before new work. A
scan of every available `build/base/source/memory/data_encoding.obj` found only
the two normalized candidate hashes below; more than one hundred unrelated
later worktrees all reproduce the canonical baseline hash.
In the table, `9c154cab...` means the full canonical baseline hash
`9c154cab347995fa1eb87ee6b088615f4347de7947058d8336212577bfbc3cc7`.
| ID | Source shape | Size T/B | Relocs T/B | Base hash / first divergence | Siblings | Decision |
|---|---|---:|---:|---|---|---|
| H00 | Integrated natural decoder: `memory = NULL`, `memory_size`, direct switch and overflow gate | 304/304 | 19/19 | `9c154cab...`; `+0x4`; 114 differing bytes | 15/15 exact | retained baseline |
| H01 | `register long memory_size` in the earlier **encoder** (`data-encoding-closeout-current` dirty tree), intended as a TU-wide allocation hint | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4` | 15/15 exact | reverted; code-neutral and cannot affect the residual |
| H02 | Invalid-size path reload `memory_size = *(long volatile *)&count` (`data-decode-memory-closeout-2` dirty tree) | 304/304 | 19/19 | `a85be189ba9066e2865595bdf359c1776697dc51e53db75b02b0175d5782d8c2`; `+0x5`; 171 differing bytes; first relocation mismatch index 4 | not better | reverted; worsened and volatile forcing is prohibited |
| H03 | `data-encoding-closeout` and `data-encoding-final` dirty worktrees | 304/304 | 19/19 | `9c154cab...`; no content diff (line-ending/timestamp only) | 15/15 exact | no experiment to preserve |
| E01 | Declare `memory_size` before `memory = NULL` | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; declaration order is code-neutral |
| E02 | Split `void *memory;` from `memory = NULL;` after both declarations | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; initializer spelling is code-neutral |
| E03 | `register void *memory = NULL` | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; register hint is ignored for this already-register-resident local |
| E04 | `register long memory_size` in the decoder | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; register hint is ignored |
| E05 | `register` storage on the `state` parameter | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; register hint is ignored |
| E06 | `register` storage on the `count` parameter, attempting to anchor BX before `state` | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; register hint is ignored |
| E07 | Initialize `memory_size = count` before the switch and let case 1/default inherit it | 304/304 | 19/19 | `7aec197e32f8b4791f940226f01426957e7a46f10c7309e29abe1a1c63a9ee25`; `+0x8`; 243 differing bytes; first relocation mismatch 0 | 14/15 siblings exact (`_data_decode_int64` also moved); data 14/14 | reverted; substantially worse and violates sibling gate |
| E08 | Add a local `short element_count = count` and use it after preserving the original `count>=0` assertion | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; alias is fully coalesced |
| E09 | Spell scaled counts as `count*2`, `count*4`, `count*8` | 304/304 | 19/19 | decoder unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | only 14/15 siblings exact: `_data_decode_int64` moved despite unchanged decoder bytes; data 14/14 | reverted; whole-TU compiler-state regression |
| E10 | Swap `structures`/`memory_size` declarations in exact predecessor `_data_decode_structures` | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; predecessor order is code-neutral and does not move decoder allocation |
| E11 | Split the exact predecessor’s `structures = NULL` initializer into a statement | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; no downstream allocation effect |
| E12 | Initialize `memory_size = count`, use `memory_size <<= 1/2/3`, and let case 1 inherit the initializer | 304/288 | 19/19 | `4760017a8585b2dc55a99aa83c2869c064be8c9c91bcd19719784a94e6820d16`; `+0x8`; 229 differing bytes; first relocation mismatch 0 | 14/15 siblings exact (`_data_decode_int64` moved); data 14/14 | reverted; 16 bytes short and violates sibling gate |
| E13 | Top-level `const` on the `count` definition parameter | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; ignored by codegen and VC7 warns C4028 against the header prototype |
| E14 | Declare `short element_count = count` before both existing locals and use the alias after retaining the original `count>=0` assertion | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; the alias is fully coalesced even when it leads the declaration list |
| E15 | Combined donor-inspired shape: declare `memory_size` before `memory`, then split `memory = NULL` into a statement | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; the combined declaration/initializer spelling is also code-neutral |
| E16 | Redundant `memory_size = count` initializer while retaining every switch assignment | 304/304 | 19/19 | unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 10 | 15/15 exact; data 14/14 | reverted; dead initializer is eliminated before allocation |
| E17 | Introduce `decode_state = state` before the existing locals and consistently use the alias | 304/304 | 19/19 | decoder code hash unchanged `9c154cab...`; `+0x4`; 114 differing bytes; first relocation mismatch 1 | only 12/15 siblings exact: `_data_decode_byte`, `_data_decode_short`, and `_data_decode_long` also moved; data 14/14 | reverted; alias coalesces in the residual and causes a whole-TU compiler-state regression |
| E18 | Remove the invented `memory_size = count` repair from the fatal default arm, matching the HCEA PPC invalid-path load; its exact-unique PDB record independently shows one `long` local | 304/304 | 19/19 | **target/base `eb39377415e6...`; no divergence** | **15/15 siblings exact; data 14/14** | **accepted; closes the final function** |
The prior `data-encoding-foundation`, `data-encoding-leaves`,
`data-encoding-encode`, `data-encoding-closeout`,
`data-encoding-closeout-current`, `data-encoding-final`, and
`data-decode-memory-closeout-2` branches/worktrees were inspected. The
untracked final-lane research scripts pointed to the analogous October
function by its `count>=0` assertion and expected address `0x11A430`. A
read-only Ghidra pass over the preserved October `cachebeta.xbe` confirmed the
address and recovered the complete instruction topology. The October function
uses the same ESI `state`, EDI zero/result, and EBX/BX size/count allocation as
the January target, with the same relative switch blocks: case 1 at `+0x82`,
the `<<1`, `<<2`, and `<<3` cases at `+0x87`, `+0x8E`, and `+0x96`, default at
`+0x9E`, and the post-call count reload at `+0xB8`. This rules out a
January-only compiler accident and is strong evidence for a stable original
source/lifetime shape.
A raw target-object census for the distinctive prologue
`55 8B EC 53 56 8B 75 08 57 33 FF` found five January functions. Four are
unimplemented in this integration; the only reconstructed legal-C donor is
`_rasterizer_triangle_buffer_new` on
`codex/hardware-geometry-leaves-14`. Its current XDK 3911 candidate emits that
exact ESI/EDI prologue from ordinary local declarations and an explicit zero
assignment, proving the allocator topology is expressible in legal C.
However, the donor is not strict exact as a whole (352/352 bytes, 24/24
relocations, target hash
`e90e066bbde0d04c87a43f665fcd7a131ff0e0d1c7a5354b82062ae5b822396c`,
candidate hash
`b0fdebbf1336f8336a37bb436ad10ea3ebbf9f105715dec74c87d16c283b457e`),
and it does not contain the decoder's partial-BX switch. It therefore does
not meet reopen criterion 2 or justify copying its unrelated lifetime
controls.
## Do-not-repeat list
- Do not retry H01/H02 or spelling-only versions that compile to their hashes.
- Do not perturb any of the 15 exact siblings to influence this function.
- Do not use inline assembly, volatile forcing, undefined behavior, aliasing
violations, object-byte patches, compiler pragmas, or flag changes.
- Do not accept equal size, equal relocation count, ordinary objdiff
percentage, or semantic plausibility as exactness.
- Do not chase non-owned candidate-only assertion COMDATs as target data.
## Historical residual classification (superseded)
Measured facts show matching padded size, relocation count, operations,
assertions, calls, jump-table cardinality, and behavior, but different
callee-saved register ownership, partial-width count handling, scaled-count
instruction selection, and a four-byte default-block drift. Direct declaration
orders, split/redundant initializers, register hints, local aliases,
expression spellings, and exact-predecessor perturbations either collapse to
the same bytes or regress code/strict siblings. The independent October
binary confirms that the target allocation was stable, while the only
legal-C prologue donor is neither strict exact nor a partial-BX analogue.
This residual is therefore parked as a **private register-allocation and
source-lifetime fixed point (class C)**, not accepted as matching.
## Historical reopen criteria (satisfied)
Reopen only with one of:
1. January/October source or PDB local-variable provenance showing declaration
order, explicit register hints, or an intermediate count/memory-size local;
2. a same-XDK strict-exact donor with the target ESI/EDI/EBX allocation and
partial-BX switch shape;
3. a legal-C, defined-behavior source control demonstrated to move the first
divergence without regressing siblings.
## Historical disposition (superseded)
Parked at **15/16 strict-exact functions and 14/14 strict-exact owned non-code
sections**. The natural integrated C remains the least invasive,
regression-free candidate. The TU is not eligible for `Matching` while
`_data_decode_memory` remains non-exact.
## 2026-08-11 provenance breakthrough and closure
The HCEA `RELEASE_CACHE` PDB provides an exact-unique cross-build mapping for
`data_decode_memory`. It records the cross-build parameter shape
`(data_encoding_state *state, short count, long code)` and exactly one local,
`long size`; January disassembly independently proves the argument widths.
The actual HCEA PPC body loads that uninitialized stack local on the invalid
selector path, and a later HCEA reconstruction documents the same defect.
All known January callers use only `-8`, `-4`, `-2`, or `1`. January remains
the byte oracle, but the combined provenance made the omission evidence-backed
rather than speculative.
The reconstruction reference is
`surreptitiousresearch/halocea@0dadebb5671751b8730110f90bf6c10df5f6312c`,
`src/data_decode_memory.c`; it is corroboration only, not the byte oracle.
Removing only the fallback `memory_size = count` assignment after the fatal
assertion and `system_exit(-1)` reproduces January exactly:
- `_data_decode_memory`: 304/304 padded bytes, 19/19 relocations, normalized
SHA-256 `eb39377415e6c3e07f763e8f0f42f6ecafaf61acc0fab30fbc06062b9dc465d8`;
- all 15 sibling functions remain strict-exact, giving 16/16 functions and
3,296/3,296 padded function bytes;
- all 14 January-owned `.rdata` sections remain strict-exact, totaling 459
bytes with zero relocations.
This is admitted under the original-bug policy, not as a general undefined-
behavior codegen technique. January's otherwise anomalous post-fatal reload,
the instruction-identical October topology, the exact-unique HCEA PDB local
record, and the HCEA PPC invalid-path load corroborate the omission.
The production comment identifies the defect. A corrected build should
initialize `memory_size` before leaving the invalid-code case; the former
defined fallback is measured above as H00 and differs in 114 normalized byte
positions despite matching size and relocation count.
Independent bounded safety variants confirm that exactness is specific to the
recovered omission: `memory_size = count` restores candidate hash
`9c154cab...` with 114 differing bytes; a zero initializer produces a
288-byte function; an explicit default zero produces 304 bytes with 94
differing positions; and an immediate `return NULL` produces 304 bytes with
166 differences. These are documented with the complete source-shape matrix
in `research/data_decode_memory_codegen/REPORT.md`.
### Final admission gates
- XDK/Ninja translation-unit rebuild: exit 0.
- Consolidated `halobetacache_build`: exit 0.
- Hardened semantic audit: all 16 functions are in the accepted ledger;
`_data_decode_memory` contributes 295 meaningful bytes from its strict
304-byte section and all 19 relocations.
- Admission audit: no candidate, contradiction, or revocation for
`source/memory/data_encoding` after the Matching label.
- Post-admission `ninja progress`: Halo 263/468 objects, 3,133/7,574
functions, 366,428/1,770,166 code bytes, and 45.65% data.
- Tooling regression suite: 149/149 `unittest` tests pass.
## 2026-08-13 independent admission revalidation
The completed object was independently transplanted after the separately
verified `data_packets.obj` admission, onto campaign base
`5b2fbf0ff8782dc0899038e330125f1accfa1508`. The current configured XDK 3911
compiler reports VC7 13.00.9254.1 and uses unchanged
`/O2 /Oy- /DDEBUG /Dxbox` flags.
- All sixteen functions are strict-exact: 3,296/3,296 padded code bytes. The
final `_data_decode_memory` section is 304/304 bytes with 19/19 exact
relocation records and normalized SHA-256
`eb39377415e6c3e07f763e8f0f42f6ecafaf61acc0fab30fbc06062b9dc465d8`.
- All fourteen target-owned `.rdata` COMDATs are semantically and
ownership-exact: 459/459 bytes and zero relocations. The three
candidate-only assertion COMDATs are unchanged from the clean campaign
baseline and remain known select-any ownership artifacts.
- The clean pre-change regression manifest covered `data_encoding`,
`data_packets`, and `data_packet_groups`. The final comparison reports zero
`changed_nonexact` functions in every unit. Its only non-green records are
the reviewed Matching/semantic-ledger changes, the four newly exact
functions across the two admitted objects, and compiler-local `$L...`
movement inside those newly exact sections; external symbols and owned data
are unchanged.
- The consolidated build, semantic report, and progress gate pass with zero
unit errors. The current tooling suite passes 173/173 tests.
- The closing edit introduces no assembly, force-inlining, alignment
directive, magic offset, raw tag/object access, compiler flag, or comparison
exception. The uninitialized `memory_size` path is the original shipped
defect proven above; the production `BUG (original)` comment names the safe
repair explicitly.
## 2026-08-30 source-credibility revalidation
The later credibility audit removed the encoder's volatile parameter type-pun,
volatile array-pointer qualifier, `register` hint, redundant count alias, and
invented fatal-edge fallback assignment. Ordinary direct C remains strict
exact across all 16 functions and all owned data. The evidence, bounded
experiment matrix, hashes, and validation are recorded in
`data_encoding_obj_jonas_credibility_cleanup_20260830.md`.