Withdraw the 16-byte tie record claim: block size is a multiple of 16, not records

The previous commit inferred a 16-byte record from "922 of 922 consecutive block
sizes are a multiple of 16". That inference does not hold, and the claim is
withdrawn rather than softened.

What survives:

- Every one of those 922 blocks opens with a u32 that is positive and a multiple
  of 4, on 922 of 922, ranging 48 to 1744 with 17 distinct values across level
  0's LOD0 blocks. The block opens with a count, not a size and not a pointer.
- Reading that u32 as a byte size and chaining to the next block lands exactly on
  the next block start on 0 of 1383 blocks. Not a size chain.
- Assuming [header][count][count uniform records] and solving for the record size
  gives no answer: no record size tiles the block for any header size up to 512
  bytes. Not 16, not 12, not 8.
- Reading the block as uniform 16-byte units gives fields spanning their entire
  legal range -- u32@0 from -2139029504 to 2139029587, u16@8 and u16@10 both
  0..65535, and 8969 distinct values in i16@0 on level 0. Uniform units would not
  produce that.

So the 16 is a property of the block size, not of a record. The earlier commit
also claimed a record size "on the classes where it can be measured"; those
classes are still correctly identified, but what they measure is the block size.

The strict-increase disproof from two commits ago stands untouched and is what
should have prevented this: the word at +0 was already known not to behave, so
treating 16-byte units as records contradicted a measurement sitting in the same
file. Divisibility is arithmetic; it is not evidence of a record boundary.

Roadmap updated to say block sizes are established and the record layout is not,
with the three measurements that rule the 16-byte reading out.
This commit is contained in:
2026-10-12 03:56:41 +02:00
parent 855e640f39
commit 881fd48e9a
2 changed files with 38 additions and 17 deletions
+24 -4
View File
@@ -1125,16 +1125,36 @@ The sample was twelve units out of 1,724,334. Both the monotonic reading and the
quantisation were artifacts of that sample, and the disproof is asserted in quantisation were artifacts of that sample, and the disproof is asserted in
`crates/gc-extract/tests/disc.rs` so it cannot creep back. `crates/gc-extract/tests/disc.rs` so it cannot creep back.
**Record size: 16 bytes, on the classes where it can be measured.** The earlier **Record size: RETRACTED. Block size is a multiple of 16; the records are not a
uniform 16 bytes.** The earlier
"divisible by 16" figure was computed from the "next `packets` offset ends this "divisible by 16" figure was computed from the "next `packets` offset ends this
block" rule, which is unsound because **`packets` is strictly increasing on only block" rule, which is unsound because **`packets` is strictly increasing on only
461 of 1,864 classes**. On the other 1,403 the two offsets are unordered, so they 461 of 1,864 classes**. On the other 1,403 the two offsets are unordered, so they
cannot both be block starts into one ascending region. cannot both be block starts into one ascending region.
Restricting to the 461 classes where the rule does hold: **922 of 922** Restricting to the 461 classes where the rule does hold: **922 of 922**
consecutive block sizes are a multiple of 16. That is the evidence for a 16-byte consecutive block sizes are a multiple of 16. That was taken as evidence for a
record, and it is confined to the subset where it can be checked. The other 1,403 16-byte record. **It is not**, and the record-size claim is withdrawn.
classes remain unmeasured rather than measured-and-different.
What actually survives, and what killed it:
- Every one of those **922 blocks opens with a `u32` that is positive and a
multiple of 4** (922/922), ranging 48 to 1,744 with 17 distinct values across
level 0's LOD0 blocks. So the block opens with a count, not a size and not a
pointer.
- Reading that `u32` as a byte size and chaining to the next block lands exactly
on the next block start on **0 of 1,383** blocks. It is not a size chain.
- Assuming `[header][count][count uniform records]` and solving for the record
size: **no record size tiles the block for any header size up to 512 bytes.**
Not 16, not 12, not 8.
- Reading the block as uniform 16-byte units gives fields spanning their entire
legal range -- `u32@0` from -2,139,029,504 to 2,139,029,587, `u16@8` and
`u16@10` both 0..65,535, and 8,969 distinct values in `i16@0` alone on level 0.
Uniform units would not produce that.
So the 16 is a property of the **block size**, not of a record. The previous
commit's "record size is 16 bytes" was an inference from a divisibility fact that
does not carry it, and it is withdrawn rather than softened.
**`packets[0]` is a constant, not an offset.** It reads **256 on 1,864 of 1,864** **`packets[0]` is a constant, not an offset.** It reads **256 on 1,864 of 1,864**
classes, while `packets[1]` and `packets[2]` vary widely and land at different classes, while `packets[1]` and `packets[2]` vary widely and land at different
+14 -13
View File
@@ -247,19 +247,20 @@ Phase 1 hands over the extents; this phase works out what each one contains.
despite the field name). All **1,864** tie classes resolve, with despite the field name). All **1,864** tie classes resolve, with
`o_class` agreeing on every one, and all **5,592** LOD block offsets land `o_class` agreeing on every one, and all **5,592** LOD block offsets land
inside `core_data`. inside `core_data`.
- [~] The tie **record size is 16 bytes**, established on the classes where it can - [~] Tie **block sizes** are established: `packets` is strictly increasing on
be checked: `packets` is strictly increasing on only **461 of 1,864** only **461 of 1,864** classes, and on those **922 of 922** consecutive
classes, and on those **922 of 922** consecutive block sizes are a multiple block sizes are a multiple of 16. `packets[0]` reads **256 on 1,864 of
of 16. The remaining 1,403 classes are unmeasured, not measured-and- 1,864** classes and is a constant, not an offset -- `TIE_PACKETS0`. Every
different. `packets[0]` reads **256 on 1,864 of 1,864** classes and is a one of the 922 blocks opens with a `u32` count, positive and a multiple of
constant, not an offset -- `TIE_PACKETS0`. 4 (48 to 1,744).
- [ ] The tie **record contents are not decoded.** One reading is **disproved**: - [ ] The tie **record layout is not decoded, and a 16-byte record is
the word at `+0` of a 16-byte unit is strictly increasing on **0 of 1,864** withdrawn.** Block sizes being multiples of 16 does not make the records
blocks, despite looking exactly like a linked list on the first twelve 16 bytes: reading the block as uniform units gives fields spanning their
units of one class, and `i16[0]` takes 8,969 distinct values on level 0 whole legal range (`u32@0` from -2,139,029,504 to 2,139,029,587), and
rather than the two a sample suggested. A 12-unit sample of a 1.7M-unit assuming `[header][count][count uniform records]` yields **no record size
population is the pooled-claim error rule 3a exists to prevent; the test that tiles the block for any header up to 512 bytes**. The opening `u32`
asserts both the disproof and the new bounds so neither can creep back. is a count, not a size -- chaining it as one lands on the next block start
on 0 of 1,383 blocks.
- [~] `shrub` — class table done (48-byte entries, not 32; reading shrub at - [~] `shrub` — class table done (48-byte entries, not 32; reading shrub at
32 still gives 231 sane-looking entries of 358, which is the hazard). 32 still gives 231 sane-looking entries of 358, which is the hazard).
Geometry header parsed and checked field by field on all 358 spans: Geometry header parsed and checked field by field on all 358 spans: