perf: parse a section once per side when saving; store the working image as a patch
A page save parsed the section about twenty times with up to four parsed copies
alive: the lowering re-read the unchanged page before every writer pass, the
write path parsed and validated the source its caller had just parsed and
validated, and squash kept both parsed images alive while checking the result.
The lowered page is now cached until a writer changes the image, typed writers
hand their validated index to the write layer, parsed sources are released
before results are checked, GUID tables are built once from a sorted list and
node lists drop their slack.
The cache stored base and working whole in one row, so every save rewrote twice
the section and every idle poll parsed, validated and rewrote both. working is
now the byte ranges where it differs from base (schema 14) and an unchanged
remote is recognised by comparison alone.
Owner 12 MiB section: 141 ms / +65 MiB to 65 ms / +29 MiB per save. 24 MiB soak
section: 780 ms / +506 MiB to 310 ms / +154 MiB; launch with two publications
7.3 s to 2.7 s; cache half the size.
Assisted-by: claude-fable-5.1
be6b82da9aclover caruso committed on 9/26/2026, 3:26:20 AMparent3d0dd98