diff --git a/docs/formats/core-data-regions.md b/docs/formats/core-data-regions.md index 5d1d65d..ceca9c1 100644 --- a/docs/formats/core-data-regions.md +++ b/docs/formats/core-data-regions.md @@ -983,3 +983,51 @@ array is a per-type field, not a common one at a fixed offset. The moby reference itself is unaffected: 38.6x excess measured across all records stands, since it does not depend on which slots were counted. + +## Shrub body records on level 0: six varying bytes, two constant + +**Range measured:** level 0, shrub class table 7 entries at core index offset +10176. Six classes are bounded by a successor; the seventh runs to the end of +`core_data` and is excluded, because its span contains the whole post-shrub +region and is not wholly records. + +**Method:** bound each span by the next class's geometry offset, take the body +from `data_offset` to the span end, and split into 8-byte records. + +**Result: 164 records across 6 bounded bodies**, body lengths 192 (twice), 208 +(twice), 224, 240. + +Per-byte, over those 164 records: + +| byte | distinct | zero | +|---|---|---| +| 0 | 74 | 60 | +| 1 | 58 | 65 | +| 2 | 76 | 43 | +| 3 | 62 | 48 | +| 4 | 72 | 35 | +| 5 | 59 | 38 | +| **6** | **1** | **164** | +| **7** | **1** | **164** | + +Bytes 6 and 7 are zero in every record. Bytes 0 to 5 take 58 to 76 distinct +values of a possible 164, with only 21-39% zero -- that is, uniformly varied +rather than sparse. + +Read as `u32` the fields are not plausible: `u32[0]` ranges 0 to 4,294,871,316 +and no field is monotone across the body. So the six bytes are not two packed +32-bit values. + +**What this settles.** The six-varying-plus-two-constant shape holds on level 0 +as a per-level partition rather than only in aggregate across the disc's +8,938 records, which is what rule 3a asks for. Two trailing zero bytes are +padding or a flag pair, not data. + +**What it does not.** Whether the six bytes are six `u8` fields, or an `f32` +plus two `u16`, or something else, is unresolved -- the `u32` reading is +excluded but no positive reading is established. + +**Process note.** The first attempt at this used `ClassEntry` and a +hand-computed `o_class` offset instead of `ShrubClassEntry`, and every +`ShrubHeader::region` call failed. The parser was not wrong; the caller was. +The working call shape was already in the disc test.