fix(mesh): pre-pivot sub-meshes must cover their pool, not just index in range

The last two blocks that under-covered their vertex pool were f102_break.dat and
f104_break.dat in ptc_pack.xpr, each reading a neighbouring block's index buffer
against the wrong declaration (414 verts indexed to 404; 160 indexed to 79).
Their marker lists do not map onto the stored blocks -- only 2 of 9 and 4 of 10
sub-meshes decoded at all. Requiring coverage (max_idx + 4 >= vtx_count) for
pre-pivot sub-meshes drops exactly the mismatched pieces.

Every decoded sub-mesh disc-wide now covers its pool: 8580 at slack 0, 49 within
tolerance, none beyond, none negative. Coverage 6069/6294, inconsistency 56,
truth table 46/46 -- all unchanged. Suite green.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-12 04:57:49 +00:00
parent 6634d79c2e
commit ee2b98341d
3 changed files with 52 additions and 3 deletions

View File

@@ -995,6 +995,20 @@ Everything else holds: 6 069/6 294 decoded, cross-container inconsistency 56, th
capture truth table still 46/46 claimed with 0 unclaimed, suite green. The vertex
total falls by 1 546 — exactly the garbage that is no longer emitted.
**The same reasoning finished the job.** The two remaining outliers were the only
decoded blocks that did not cover their pool: `f102_break.dat` had a sub-mesh
declared 414 vertices whose indices stopped at 404, and `f104_break.dat` one
declared 160 whose indices stopped at 79 — both reading a *neighbouring* block's
index buffer against the wrong declaration. These are grouped `.dat` composites
in `ptc_pack.xpr` whose marker lists (9 and 10 entries) clearly do not map 1:1
onto the stored blocks; only 2 of 9 and 4 of 10 sub-meshes ever decoded. Applying
the **coverage** requirement to pre-pivot sub-meshes as well drops exactly those
two mismatched pieces and keeps the rest.
Every decoded sub-mesh on the disc now covers its own vertex pool: **8 580 at
slack 0, 49 within the ±4 tolerance, none beyond it, none negative.** Coverage,
consistency and the capture oracle are all unchanged by the tightening.
### Coverage has a denominator now, and the misses have a cause breakdown
Coverage has been quoted as "resources decoded" with no total. `examples/undecoded.rs`