feat: write note tags and tag definitions through the page model

Note tags on paragraphs and text objects, and the tag definitions the page
model carries, are differences the page writer now lowers. A property-set
array writer joins the property patcher: an encoded array of sets is inserted
whole with its nested object references appended to the reference stream in
traversal order, which is where a rewritten tag array sits. The writer
rewrites an element's tag array from the model (definition reference, action
type, status, creation, completion, start and due dates and task id), creates
definition objects for definitions new to the section under writer identities
that squash renames to the model's, and refuses a second tag with the same
action type on one element as OneNote does. The model mutation driver toggles
tags.

corpus/tag-edit is the native gate: a Rust-authored page with two definitions
and open, completed, doubly tagged and untagged paragraphs, cold-read by
OneNote 2010 with the definitions, completion states and dates intact;
tools/test_tag_edit.py checks it without a VM.

Assisted-by: claude-fable-5.1
190fb2d10cclover caruso committed on 9/13/2026, 12:00:32 AMparent8a86e3a
24 files changedLine totals unavailable