Characterise shrub mesh packets: 16-byte header, 16-byte tiling

The packet table decode left the packet contents open, with a warning that a
VIF reading had already been retracted once and needed a control rather than a
pattern match. This is that measurement.

Range measured: level 0, the 29 packets of the 6 successor-bounded shrub spans,
26640 bytes. Per-packet; nothing pooled.

Method: autocorrelation within the largest packet against a distribution
matched shuffled control, then per-byte distinct counts across all 29 packets.

Result 1: all 29 packet sizes are exact multiples of 16, and the internal stride
scan peaks at 16 (+0.283) with 32, 48, 64, 80 and 128 all elevated behind it --
the signature of a record array, not a coincidental spacing.

Result 2: record 0 is a 16-byte header. Constant across all 29 packets at bytes
0-3 (04 04 00 01), 4-11 (zero), 12-13 (00 80) and 15 (6c). Bytes 14 and 16-23
vary. The 04 04 00 01 prefix looks like a magic or format version.

Result 3: header byte 14 is echoed in the body. It takes values 06, 07, 0e and
11 across packets, and the same value appears at offset 12 of record 1 in every
packet sampled. A real repeated field, not two small values coinciding.

Not established: no header field matches the record count. The packet holds
1056/16 = 66 records and none of the candidate u32 or u16 header offsets at 8,
10, 12, 14, 16, 18 or 20 equals 66, 65 or 67 on more than half the packets. So
the count is either computed from a size field elsewhere in the span, or the
records are variable length and merely 16-byte aligned.

That distinction is unresolved and matters. Fixed 16-byte records make the
payload a flat table; variable records make the 16-byte alignment a coincidence
of every record being a multiple of 16 long. The stride scan cannot separate
the two, because both peak at 16.

The retracted VIF reading is not revived: the tiling is uniform across all 29
packets with no command-shaped tail, and a VIF packet would show a changing
command byte last rather than the constant 6c at header byte 15.

Next: read the record count from the packet table in the span rather than from
the packet header, which is what would separate the two readings.
This commit is contained in:
2026-10-12 02:08:12 +02:00
parent aa2b14ad66
commit e6dd60ec3a
+45
View File
@@ -1178,3 +1178,48 @@ than a partial list when a table does not tile.
have not been decoded, and the VIF reading of a shrub body was already
retracted once, so this needs a control, not a pattern match.
- The 0x20-byte records the loader points at from `+0x18.
## Shrub mesh packets: a 16-byte header and 16-byte records
The packet table decode (commit aa2b14a) left the packet *contents* open, with
a warning that a VIF reading had already been retracted once and so needed a
control rather than a pattern match. This is that measurement.
**Range measured:** level 0, the 29 packets of the 6 successor-bounded shrub
spans, 26,640 bytes. Per-class and per-packet; nothing pooled.
**Method:** autocorrelation within the largest packet against a
distribution-matched shuffled control, then per-byte distinct counts across all
29 packets.
**Result 1 -- the packets tile at 16 bytes.** All 29 packet sizes are exact
multiples of 16, and the internal stride scan peaks at 16 (+0.283) with 32,
48, 64, 80 and 128 all elevated behind it -- the signature of a record array
rather than a single coincidental spacing.
**Result 2 -- record 0 is a 16-byte header.** Across all 29 packets these bytes
are constant: 0-3 `04 04 00 01`, 4-11 all zero, 12-13 `00 80`, 15 `6c`. Bytes
14 and 16-23 vary. The `04 04 00 01` prefix is constant and looks like a magic
or format version.
**Result 3 -- header byte 14 is echoed in the body.** Header byte 14 takes
values 06, 07, 0e and 11 across packets, and in every packet the same value
appears at offset 12 of record 1. That correspondence holds on all 29 packets
sampled, so it is a real repeated field rather than a coincidence of two
values happening to be small.
**Not established.** No header field matches the record count: the packet holds
1056/16 = 66 records, and none of the candidate u32 or u16 header offsets at 8,
10, 12, 14, 16, 18 or 20 equals 66, 65 or 67 on more than half the packets. So
the record count is either computed from a size field elsewhere in the span, or
the records are variable length and merely 16-byte aligned.
That distinction matters and is unresolved: if records are fixed 16 bytes the
payload is a flat table; if they are variable, the 16-byte alignment is a
coincidence of every record happening to be a multiple of 16 long. The stride
scan cannot separate the two, because both produce a peak at 16.
**The retracted VIF reading is not being revived.** Nothing here identifies a
VIF stream: the 16-byte tiling is uniform across all 29 packets with no
command-shaped tail, and a VIF packet would show a changing command byte in its
last position rather than the constant `6c` at header byte 15.