feat: write table rows, columns and new tables through the page model

Table structure in the page model is a difference the writer now lowers.
Native rows and cells are plain containers: a new cell carries the
modification time, the indent array copied from a sibling cell and the flags
every native cell has; a new row lists its cells; every table has its row and
cell order rebuilt to the model, and its column count, widths (in inches),
lock bitmap and border flag rewritten. A new table starts as an empty text
paragraph placed like any other, whose content the structure pass replaces
with the table before the deferred cell containers receive their paragraphs.
Paragraphs of removed rows and cells are covered by the removal. Table
identity, layout and tags, and cell layout, indents and shading stay fixed;
an emptied cell keeps the replacement paragraph the tree writer provides.

corpus/table-edit is the native gate: a Rust-created two-by-two table on a
fresh page, and a native table on the tree fixture with a third column and a
second row added, both cold-read by OneNote 2010 with widths, locks, borders,
rows and cell text intact; tools/test_table_edit.py checks both without a VM.

Assisted-by: claude-fable-5.1
59c8648048clover caruso committed on 9/13/2026, 12:00:32 AMparent8b4f45b
48 files changedLine totals unavailable