feat: write paragraph alignment, direction and spacing through the page model

The page writer lowers paragraph-level formatting from the model: alignment,
right-to-left direction and the space before, after and between lines. A
value applies when every run of the paragraph carries it and the stored
paragraph differs; alignment also refreshes the layout alignment bits, and
ancestors take the modification time. Alignment outside left, centre and
right, negative, non-finite or out-of-range spacing, runs that disagree on a
paragraph value, and generated title fields are refused before any write.

corpus/paragraph-format holds a native fixture of six paragraphs (defaults,
explicit zeros, centred spacing, right-aligned RTL, an inherited named style
and the same style overridden), the writer's candidate that centres every
paragraph with 0/2/16 pt spacing, and a fresh OneNote 2010 read of both. The
cold read shows each paragraph centred with the written spacing, the zero
space before omitted, RTL and quick styles retained and the bold/italic runs
unchanged; tools/test_paragraph_format.py checks this without a VM, and the
notebook suite covers reopen, rebase against a remote text edit and a lost
publication reply for each attribute.

Assisted-by: gpt-6-astra
Assisted-by: claude-fable-5.1
b6b6e903d6clover caruso committed on 9/13/2026, 12:00:32 AMparentcffb5ce
33 files changedLine totals unavailable