authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-08 12:57:55-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-08 12:57:55-07:00
logc3891b37112bb60d6f963ef3adae5a1f5c3e5e73
tree0ddbf2487d83e3c59a63019dd4ef7f74294a15eb
parenta204407163badd07fd899ea732dc10df2b36e52c
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU

feat: move and delete page subtrees atomically

Add TreeEdit and PreparedEdit::tree for explicit same-page subtree placement and deletion. Preserve surviving identities, fields, tags, tables and history; normalize empty/group-only containers and allocate stable empty-cell replacements. Publish attribution and automatic titles with the graph. Follow resulting ancestry after group normalization, and permit retained intents to reuse identical immutable author records. Share title updates with paragraph editing. Validation: eighteen native control comparisons, four cross-container cases and unequal-group normalization; forty pages cold-open in real OneNote. Core/offline regression lanes, final tree tests, 144 Python tests, workspace Clippy and tool builds pass. Three ASan campaigns complete 1239 schedules with twelve cached clients, ordering/indentation oracles, retained-intent replay and publication interruptions. All owned VMs removed. Assisted-by: gpt-6-astra

100 files changed, 2016 insertions(+), 49 deletions(-)

corpus/outline-edit/README.md+27
...@@ -101,3 +101,30 @@ Regenerate using the same source notebook and runner, with...@@ -101,3 +101,30 @@ Regenerate using the same source notebook and runner, with
101controller at inspection readiness, move `before-read` to `before/read`, then101controller at inspection readiness, move `before-read` to `before/read`, then
102cold-open the returned notebook with `--expected-pages 12 --collect-notebook`.102cold-open the returned notebook with `--expected-pages 12 --collect-notebook`.
103The exact authoring script has one home in the reference corpus.103The exact authoring script has one home in the reference corpus.
104
105`rust-tree` retains four Rust-generated notebooks and their fresh-cache OneNote
106captures. `ordinary` and `groups-cells` apply eighteen moves/deletions from the
107native controls. Explicit bullet-subtree movement preserves its original marker.
108`cross-container` moves content between cells and outlines, moves a whole table,
109and moves a sibling beneath a paragraph while its enclosing group is normalized.
110`unequal-groups` deletes a trailing paragraph after two differently indented
111groups; native XML reports the surviving paragraphs at indentation levels three
112and two. Every surviving content identity, field, tag and table remains intact;
113an emptied cell receives new empty paragraph/text identities.
114
115The four captures cover forty pages. Public tests compare native text and
116formatting, the complete active graphs before/after cold reopen, metadata, and
117list objects. Core tests additionally compare eighteen native transformations,
118every historical object's property bytes, selected move attribution, protected
119content, reused intents, and interrupted publication. The shared stateful model
120in `crates/onestore/tests/support/tree_model.rs` checks paragraph order,
121indentation, content, automatic titles and old/new publication outcomes across
122twelve cached clients; `fuzz/fuzz_targets/tree.rs` runs that oracle under ASan.
123
124Set `ONESTORE_TREE_OUTPUT` to a new absolute directory and run the
125`native_subtree_controls_match_with_preserved_fields_and_history` and
126`cross_container_moves_keep_tables_and_replace_emptied_cells` integration tests,
127plus the `tree::tests::group_normalization_preserves_unequal_indentation_and_overlapping_moves`
128unit test. Cold-open the resulting `ordinary`, `groups-cells`, `cross-container`
129and `unequal-groups` notebooks with expected page counts 15, 12, 12 and 1,
130respectively, using `tools/native_runner.py --collect-notebook`.
corpus/outline-edit/rust-tree/cross-container/candidate/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/cross-container/candidate/synthetic.one differ
corpus/outline-edit/rust-tree/cross-container/cold/commands.jsonl created+3
...@@ -0,0 +1,3 @@
1{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null}
2{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-E6CE0929 -ExpectedPages 12", "exit": 0, "stdout": "Read 1 sections and 12 pages.\r\n", "stderr": "", "error": null}
3{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null}
corpus/outline-edit/rust-tree/cross-container/cold/notebook/Open Notebook.onetoc2 created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/cross-container/cold/notebook/Open Notebook.onetoc2 differ
corpus/outline-edit/rust-tree/cross-container/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/cross-container/cold/notebook/synthetic.one differ
corpus/outline-edit/rust-tree/cross-container/cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-E6CE0929",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/outline-edit/rust-tree/cross-container/cold/read/hierarchy.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{740FAC62-C8D2-4086-B174-375CDD9E2374}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T19:59:47.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{7CD7D6BF-0450-00B2-0AB8-4702AAC26BE7}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T19:59:47.000Z" color="#8AA8E4"><one:Page ID="{509E2539-8D9B-43A3-8DDF-EF9356FA77F8}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{614158A6-5F45-411A-B911-2046803DE21F}{1}{B0}" name="Indent first subtree" dateTime="2026-09-08T19:25:53.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{20B9F366-7BC9-4863-BB91-8CD83A85D29F}{1}{B0}" name="Outdent first group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{17FD0E83-EB9A-4156-8BB5-26E07B8A132F}{1}{B0}" name="Delete only grouped subtree" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{50847ED4-5580-439C-8C0B-9F31AD840904}{1}{B0}" name="Delete unindented sibling after group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{F693F2E4-0ABF-4C42-8F26-DC46B7CD25AD}{1}{B0}" name="Delete cell subtree" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{7163D159-9726-4C01-B6AF-534911AC4304}{1}{B0}" name="Delete sole cell paragraph" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{C71E16AD-4AB5-4E86-9AAD-7C3207B63DBF}{1}{B0}" name="Move numbered subtree down" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{464E96E0-DE44-466A-B735-DD9AF794CF6F}{1}{B0}" name="Delete numbered subtree" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{2CE3190E-8440-403D-96E5-67028C1A0762}{1}{B0}" name="Indent bullet subtree" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{D8ED5D18-2089-441A-8142-BCE23B88C0B5}{1}{B0}" name="Outdent child across indentation gap" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/><one:Page ID="{003BD18E-A490-4858-8F42-200799569806}{1}{B0}" name="Move cell subtree down" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-000.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{003BD18E-A490-4858-8F42-200799569806}{1}{B0}" name="Move cell subtree down" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move cell subtree down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="428.1300048828125" height="21.94771385192871"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{40}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{41}{B0}"><one:Columns><one:Column index="0" width="240.0" isLocked="true"/><one:Column index="1" width="180.0" isLocked="true"/></one:Columns><one:Row objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{42}{B0}" lastModifiedTime="2026-09-08T19:57:49.000Z"><one:Cell lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{43}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{66}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Cell tail]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{71}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{79}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="142.6107788085937" height="53.71086883544922"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{80}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{6B0E85FC-FB5F-4AD0-A161-28EE8DF9A3B9}{61}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-001.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{17FD0E83-EB9A-4156-8BB5-26E07B8A132F}{1}{B0}" name="Delete only grouped subtree" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{08E1CA70-3A48-4C52-BD5C-5FEDCFC71BDB}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete only grouped subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{08E1CA70-3A48-4C52-BD5C-5FEDCFC71BDB}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="169.6107788085937" height="53.71086883544922"/><one:OEChildren indent="2"><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{08E1CA70-3A48-4C52-BD5C-5FEDCFC71BDB}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{08E1CA70-3A48-4C52-BD5C-5FEDCFC71BDB}{49}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{08E1CA70-3A48-4C52-BD5C-5FEDCFC71BDB}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{08E1CA70-3A48-4C52-BD5C-5FEDCFC71BDB}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{08E1CA70-3A48-4C52-BD5C-5FEDCFC71BDB}{66}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{08E1CA70-3A48-4C52-BD5C-5FEDCFC71BDB}{67}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-002.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{20B9F366-7BC9-4863-BB91-8CD83A85D29F}{1}{B0}" name="Outdent first group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{BBCE98EB-F328-4F8B-80A0-448DF5960225}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Outdent first group]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{BBCE98EB-F328-4F8B-80A0-448DF5960225}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="169.6107788085937" height="53.71086883544922"/><one:OEChildren indent="2"><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{BBCE98EB-F328-4F8B-80A0-448DF5960225}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{BBCE98EB-F328-4F8B-80A0-448DF5960225}{49}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{BBCE98EB-F328-4F8B-80A0-448DF5960225}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{BBCE98EB-F328-4F8B-80A0-448DF5960225}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{BBCE98EB-F328-4F8B-80A0-448DF5960225}{66}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{BBCE98EB-F328-4F8B-80A0-448DF5960225}{67}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-003.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{2CE3190E-8440-403D-96E5-67028C1A0762}{1}{B0}" name="Indent bullet subtree" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{15C86BFC-615B-481F-8AB6-ABE29C4B646F}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Indent bullet subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{15C86BFC-615B-481F-8AB6-ABE29C4B646F}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{15C86BFC-615B-481F-8AB6-ABE29C4B646F}{40}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Bullet bullet="3" fontSize="11.0"/></one:List><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{15C86BFC-615B-481F-8AB6-ABE29C4B646F}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:List><one:Bullet bullet="3" fontSize="11.0"/></one:List><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{15C86BFC-615B-481F-8AB6-ABE29C4B646F}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{15C86BFC-615B-481F-8AB6-ABE29C4B646F}{61}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{15C86BFC-615B-481F-8AB6-ABE29C4B646F}{67}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Bullet bullet="3" fontSize="11.0"/></one:List><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{15C86BFC-615B-481F-8AB6-ABE29C4B646F}{73}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{15C86BFC-615B-481F-8AB6-ABE29C4B646F}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-004.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{464E96E0-DE44-466A-B735-DD9AF794CF6F}{1}{B0}" name="Delete numbered subtree" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{78ECDF77-F401-4F20-9835-01C3478EEA8B}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete numbered subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{78ECDF77-F401-4F20-9835-01C3478EEA8B}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{78ECDF77-F401-4F20-9835-01C3478EEA8B}{40}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="I."/></one:List><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{78ECDF77-F401-4F20-9835-01C3478EEA8B}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="II."/></one:List><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{78ECDF77-F401-4F20-9835-01C3478EEA8B}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{78ECDF77-F401-4F20-9835-01C3478EEA8B}{61}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{78ECDF77-F401-4F20-9835-01C3478EEA8B}{67}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="III."/></one:List><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{78ECDF77-F401-4F20-9835-01C3478EEA8B}{73}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{78ECDF77-F401-4F20-9835-01C3478EEA8B}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-005.xml created+4
...@@ -0,0 +1,4 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{50847ED4-5580-439C-8C0B-9F31AD840904}{1}{B0}" name="Delete unindented sibling after group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{21D6D924-7BAE-46AA-A2A7-60A7F07BEC5B}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete unindented sibling after group]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{21D6D924-7BAE-46AA-A2A7-60A7F07BEC5B}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="26.85543441772461"/><one:OEChildren indent="2"><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{21D6D924-7BAE-46AA-A2A7-60A7F07BEC5B}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE></one:OEChildren><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{21D6D924-7BAE-46AA-A2A7-60A7F07BEC5B}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{21D6D924-7BAE-46AA-A2A7-60A7F07BEC5B}{55}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{21D6D924-7BAE-46AA-A2A7-60A7F07BEC5B}{56}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-006.xml created+20
...@@ -0,0 +1,20 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{509E2539-8D9B-43A3-8DDF-EF9356FA77F8}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{37528D85-C6EE-4015-822D-6348A9669299}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{30372572-3593-0B1F-3279-A042620DE06F}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
5Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
6font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
7font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
8Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
9Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1011.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
11background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
12Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
13Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1411.0pt'><br>
15End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{37528D85-C6EE-4015-822D-6348A9669299}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
16style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
17style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
18style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
19style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
20lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-007.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{614158A6-5F45-411A-B911-2046803DE21F}{1}{B0}" name="Indent first subtree" dateTime="2026-09-08T19:25:53.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{AE14EFB1-982A-4034-9B3C-65CA3BE930F9}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Indent first subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{AE14EFB1-982A-4034-9B3C-65CA3BE930F9}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="53.71086883544922"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:54.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{AE14EFB1-982A-4034-9B3C-65CA3BE930F9}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{AE14EFB1-982A-4034-9B3C-65CA3BE930F9}{49}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{AE14EFB1-982A-4034-9B3C-65CA3BE930F9}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{AE14EFB1-982A-4034-9B3C-65CA3BE930F9}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{AE14EFB1-982A-4034-9B3C-65CA3BE930F9}{65}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{AE14EFB1-982A-4034-9B3C-65CA3BE930F9}{66}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-008.xml created+4
...@@ -0,0 +1,4 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{7163D159-9726-4C01-B6AF-534911AC4304}{1}{B0}" name="Delete sole cell paragraph" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{17}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete sole cell paragraph]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{23}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="428.1300048828125" height="35.37543487548828"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{24}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{25}{B0}"><one:Columns><one:Column index="0" width="240.0" isLocked="true"/><one:Column index="1" width="180.0" isLocked="true"/></one:Columns><one:Row objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{26}{B0}" lastModifiedTime="2026-09-08T19:57:49.000Z"><one:Cell lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{27}{B0}" style="font-family:Calibri;font-size:11.0pt"><one:OEChildren><one:OE creationTime="2026-09-08T19:57:49.000Z" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{35CAFB7F-C108-0755-274A-DB9DA7E47F3A}{1}{B0}" alignment="left"><one:T><![CDATA[]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{39}{B0}" author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{42}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other cell]]></one:T></one:OE><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{30}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{47}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{9A1DF794-6D46-402F-92C5-189771E54B51}{48}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-009.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{C71E16AD-4AB5-4E86-9AAD-7C3207B63DBF}{1}{B0}" name="Move numbered subtree down" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{AD25F2BE-4BF4-4AE5-BFC2-BDFEB16A386E}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move numbered subtree down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{AD25F2BE-4BF4-4AE5-BFC2-BDFEB16A386E}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{AD25F2BE-4BF4-4AE5-BFC2-BDFEB16A386E}{40}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="I."/></one:List><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{AD25F2BE-4BF4-4AE5-BFC2-BDFEB16A386E}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="II."/></one:List><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{AD25F2BE-4BF4-4AE5-BFC2-BDFEB16A386E}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{AD25F2BE-4BF4-4AE5-BFC2-BDFEB16A386E}{61}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{AD25F2BE-4BF4-4AE5-BFC2-BDFEB16A386E}{67}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="III."/></one:List><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{AD25F2BE-4BF4-4AE5-BFC2-BDFEB16A386E}{73}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{AD25F2BE-4BF4-4AE5-BFC2-BDFEB16A386E}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-010.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{D8ED5D18-2089-441A-8142-BCE23B88C0B5}{1}{B0}" name="Outdent child across indentation gap" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Outdent child across indentation gap]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="196.6107788085937" height="80.56629943847656"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T><one:OEChildren indent="2"><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other child]]></one:T></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{70}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{76}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{FDDD7D07-41B5-42ED-BC6F-2694BB7F028B}{77}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/page-011.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{F693F2E4-0ABF-4C42-8F26-DC46B7CD25AD}{1}{B0}" name="Delete cell subtree" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:59:47.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete cell subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{79}{B0}"><one:Position x="540.0" y="108.0" z="0"/><one:Size width="428.1300048828125" height="75.65858459472656"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{80}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:57:49.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{40}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{41}{B0}"><one:Columns><one:Column index="0" width="240.0" isLocked="true"/><one:Column index="1" width="180.0" isLocked="true"/></one:Columns><one:Row objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{42}{B0}" lastModifiedTime="2026-09-08T19:25:57.000Z"><one:Cell lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{43}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{61}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{66}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Cell tail]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{71}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{68A33CD3-8FB4-42D9-815B-EA5F6FF5A4E8}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/cross-container/cold/read/payloads.json created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/before/read/payloads.json
\ No newline at end of file
corpus/outline-edit/rust-tree/cross-container/cold/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/tree-rust-candidates-01/cross-container",
3 "expected_pages": 12,
4 "author": null,
5 "author_timeout_seconds": 600,
6 "inspect": false,
7 "collect_notebook": true,
8 "base": {
9 "file": "win7-office-base.qcow2",
10 "format": "qcow2",
11 "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346",
12 "virtual_size": 68719476736
13 },
14 "scripts": {
15 "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331",
16 "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41"
17 }
18}
corpus/outline-edit/rust-tree/cross-container/cold/scripts/cold.ps1 created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/reconciliation/keyboard/scripts/cold.ps1
\ No newline at end of file
corpus/outline-edit/rust-tree/cross-container/cold/scripts/read.ps1 created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/reconciliation/keyboard/scripts/read.ps1
\ No newline at end of file
corpus/outline-edit/rust-tree/cross-container/cold/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 92512,
5 "sha256": "91c80122b3854e8a91e863638b55c1b8610b80c71c59a2436b3ddae60338c75a",
6 "mtime_ns": 1788897469441332033
7 }
8]
corpus/outline-edit/rust-tree/cross-container/cold/teardown.json created+1
...@@ -0,0 +1 @@
1../../../../paragraph-edit/joined/teardown.json
\ No newline at end of file
corpus/outline-edit/rust-tree/groups-cells/candidate/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/groups-cells/candidate/synthetic.one differ
corpus/outline-edit/rust-tree/groups-cells/cold/commands.jsonl created+3
...@@ -0,0 +1,3 @@
1{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null}
2{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-619E88D9 -ExpectedPages 12", "exit": 0, "stdout": "Read 1 sections and 12 pages.\r\n", "stderr": "", "error": null}
3{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null}
corpus/outline-edit/rust-tree/groups-cells/cold/notebook/Open Notebook.onetoc2 created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/groups-cells/cold/notebook/Open Notebook.onetoc2 differ
corpus/outline-edit/rust-tree/groups-cells/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/groups-cells/cold/notebook/synthetic.one differ
corpus/outline-edit/rust-tree/groups-cells/cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-619E88D9",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/outline-edit/rust-tree/groups-cells/cold/read/hierarchy.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{82508A76-A88B-44AD-BA55-4FBA8DFFD765}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T19:50:01.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{4352C7FC-7422-04A9-172B-9FF6BDFCBA6B}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T19:50:01.000Z" color="#8AA8E4"><one:Page ID="{6F1B347A-FDE9-47B8-904C-376741C4A674}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{5EC449E5-2F37-4501-A482-F8B297033393}{1}{B0}" name="Indent first subtree" dateTime="2026-09-08T19:25:53.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{1F3CE225-0BBB-4C78-A602-542C2DBB0313}{1}{B0}" name="Outdent first group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{28781FC0-9BE8-454D-9626-FE146CB4C2A3}{1}{B0}" name="Delete only grouped subtree" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{6F016F97-25F2-4787-9198-47C5BABAD888}{1}{B0}" name="Delete unindented sibling after group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{C916E3A7-7ACD-4859-92B5-04B2A0F3F421}{1}{B0}" name="Delete cell subtree" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{4EE6C01A-E754-481A-AB3C-8BBD06929288}{1}{B0}" name="Delete sole cell paragraph" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{F89B07EE-3AC7-4A9D-873E-A4C61088EC33}{1}{B0}" name="Move numbered subtree down" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{79CB87A3-AE36-4271-AAA6-056EE0AA1EE3}{1}{B0}" name="Delete numbered subtree" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{1366084D-F432-4426-8B76-BFF69B24D6EE}{1}{B0}" name="Indent bullet subtree" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{E7684C5B-50FB-4001-9CD1-64162CB61139}{1}{B0}" name="Outdent child across indentation gap" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1"/><one:Page ID="{3FBEC0CD-D4E2-4C43-92D1-F8F38E68498A}{1}{B0}" name="Move cell subtree down" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:50:01.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-000.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1366084D-F432-4426-8B76-BFF69B24D6EE}{1}{B0}" name="Indent bullet subtree" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{2A4D7ABF-1129-4C04-9725-73168B75B5E3}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Indent bullet subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{2A4D7ABF-1129-4C04-9725-73168B75B5E3}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="169.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{2A4D7ABF-1129-4C04-9725-73168B75B5E3}{40}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Bullet bullet="3" fontSize="11.0"/></one:List><one:T><![CDATA[Anchor]]></one:T><one:OEChildren><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{2A4D7ABF-1129-4C04-9725-73168B75B5E3}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:List><one:Bullet bullet="3" fontSize="11.0"/></one:List><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{2A4D7ABF-1129-4C04-9725-73168B75B5E3}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{2A4D7ABF-1129-4C04-9725-73168B75B5E3}{61}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{2A4D7ABF-1129-4C04-9725-73168B75B5E3}{67}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Bullet bullet="3" fontSize="11.0"/></one:List><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{2A4D7ABF-1129-4C04-9725-73168B75B5E3}{73}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{2A4D7ABF-1129-4C04-9725-73168B75B5E3}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-001.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1F3CE225-0BBB-4C78-A602-542C2DBB0313}{1}{B0}" name="Outdent first group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{844B89A8-835A-4B90-9D33-9C79E2A8D3A9}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Outdent first group]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="Tree author" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{844B89A8-835A-4B90-9D33-9C79E2A8D3A9}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="53.71086883544922"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{844B89A8-835A-4B90-9D33-9C79E2A8D3A9}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{844B89A8-835A-4B90-9D33-9C79E2A8D3A9}{49}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{844B89A8-835A-4B90-9D33-9C79E2A8D3A9}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{844B89A8-835A-4B90-9D33-9C79E2A8D3A9}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{844B89A8-835A-4B90-9D33-9C79E2A8D3A9}{66}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{844B89A8-835A-4B90-9D33-9C79E2A8D3A9}{67}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-002.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{28781FC0-9BE8-454D-9626-FE146CB4C2A3}{1}{B0}" name="Delete only grouped subtree" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{3764DB33-4A3A-4849-A0CF-8719D8F9CA57}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete only grouped subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{3764DB33-4A3A-4849-A0CF-8719D8F9CA57}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="103.8432159423828" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{3764DB33-4A3A-4849-A0CF-8719D8F9CA57}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{3764DB33-4A3A-4849-A0CF-8719D8F9CA57}{66}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{3764DB33-4A3A-4849-A0CF-8719D8F9CA57}{67}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-003.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{3FBEC0CD-D4E2-4C43-92D1-F8F38E68498A}{1}{B0}" name="Move cell subtree down" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:50:01.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move cell subtree down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="428.1300048828125" height="62.23086929321289"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{40}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{41}{B0}"><one:Columns><one:Column index="0" width="240.0" isLocked="true"/><one:Column index="1" width="180.0" isLocked="true"/></one:Columns><one:Row objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{42}{B0}" lastModifiedTime="2026-09-08T19:48:22.000Z"><one:Cell lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{43}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{66}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Cell tail]]></one:T></one:OE><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{61}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{71}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{79}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{548B94BF-8B2D-4ECB-BCF2-F01A9AC77235}{80}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-004.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{4EE6C01A-E754-481A-AB3C-8BBD06929288}{1}{B0}" name="Delete sole cell paragraph" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{17}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete sole cell paragraph]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{23}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="428.1300048828125" height="21.94771385192871"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{24}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{25}{B0}"><one:Columns><one:Column index="0" width="240.0" isLocked="true"/><one:Column index="1" width="180.0" isLocked="true"/></one:Columns><one:Row objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{26}{B0}" lastModifiedTime="2026-09-08T19:48:22.000Z"><one:Cell lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{27}{B0}" style="font-family:Calibri;font-size:11.0pt"><one:OEChildren><one:OE creationTime="2026-09-08T19:48:22.000Z" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{5DDBE869-2BE9-0E10-1EB0-E73F9F6E9952}{1}{B0}" alignment="left"><one:T><![CDATA[]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{39}{B0}" author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{42}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{47}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{A598E6D7-1D34-4434-8F56-C06366DB9ADD}{48}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-005.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{5EC449E5-2F37-4501-A482-F8B297033393}{1}{B0}" name="Indent first subtree" dateTime="2026-09-08T19:25:53.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{9191FEF2-E858-442F-86AF-BD3E2CD7E175}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Indent first subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{9191FEF2-E858-442F-86AF-BD3E2CD7E175}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="53.71086883544922"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:54.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{9191FEF2-E858-442F-86AF-BD3E2CD7E175}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{9191FEF2-E858-442F-86AF-BD3E2CD7E175}{49}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{9191FEF2-E858-442F-86AF-BD3E2CD7E175}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{9191FEF2-E858-442F-86AF-BD3E2CD7E175}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{9191FEF2-E858-442F-86AF-BD3E2CD7E175}{65}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:25:55.000Z" objectID="{9191FEF2-E858-442F-86AF-BD3E2CD7E175}{66}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-006.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{6F016F97-25F2-4787-9198-47C5BABAD888}{1}{B0}" name="Delete unindented sibling after group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{1E53C867-0BDC-42B1-BF34-B853E7453DD7}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete unindented sibling after group]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{1E53C867-0BDC-42B1-BF34-B853E7453DD7}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="98.96039581298828" height="13.42771339416504"/><one:OEChildren indent="2"><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{1E53C867-0BDC-42B1-BF34-B853E7453DD7}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{1E53C867-0BDC-42B1-BF34-B853E7453DD7}{55}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{1E53C867-0BDC-42B1-BF34-B853E7453DD7}{56}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-007.xml created+20
...@@ -0,0 +1,20 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{6F1B347A-FDE9-47B8-904C-376741C4A674}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{08D79CC6-B69C-440E-9FBE-BBBCBE584315}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{0FB23431-45E1-0F04-2FEA-78B6753331E3}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
5Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
6font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
7font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
8Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
9Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1011.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
11background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
12Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
13Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1411.0pt'><br>
15End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{08D79CC6-B69C-440E-9FBE-BBBCBE584315}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
16style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
17style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
18style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
19style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
20lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-008.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{79CB87A3-AE36-4271-AAA6-056EE0AA1EE3}{1}{B0}" name="Delete numbered subtree" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{4769CE34-8473-4B3B-85A6-D93750B03B07}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete numbered subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{4769CE34-8473-4B3B-85A6-D93750B03B07}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="103.8432159423828" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{4769CE34-8473-4B3B-85A6-D93750B03B07}{40}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="I."/></one:List><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{4769CE34-8473-4B3B-85A6-D93750B03B07}{67}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="II."/></one:List><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{4769CE34-8473-4B3B-85A6-D93750B03B07}{73}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{4769CE34-8473-4B3B-85A6-D93750B03B07}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-009.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{C916E3A7-7ACD-4859-92B5-04B2A0F3F421}{1}{B0}" name="Delete cell subtree" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete cell subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="428.1300048828125" height="21.94771385192871"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{40}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{41}{B0}"><one:Columns><one:Column index="0" width="240.0" isLocked="true"/><one:Column index="1" width="180.0" isLocked="true"/></one:Columns><one:Row objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{42}{B0}" lastModifiedTime="2026-09-08T19:48:22.000Z"><one:Cell lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{43}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{66}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Cell tail]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{71}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{79}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{57262D90-FFC6-46C2-9CC8-32AB78CB7564}{80}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-010.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{E7684C5B-50FB-4001-9CD1-64162CB61139}{1}{B0}" name="Outdent child across indentation gap" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Outdent child across indentation gap]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="196.6107788085937" height="80.56629943847656"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T><one:OEChildren indent="2"><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other child]]></one:T></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{70}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{76}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{C2586C44-31C7-46F6-A1FC-FE60AC41D307}{77}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/page-011.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{F89B07EE-3AC7-4A9D-873E-A4C61088EC33}{1}{B0}" name="Move numbered subtree down" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:50:00.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{92A0E3FD-3B86-4EFE-A251-650AA654E9E2}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move numbered subtree down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{92A0E3FD-3B86-4EFE-A251-650AA654E9E2}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{92A0E3FD-3B86-4EFE-A251-650AA654E9E2}{40}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="I."/></one:List><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{92A0E3FD-3B86-4EFE-A251-650AA654E9E2}{67}{B0}" alignment="left" quickStyleIndex="0"><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="II."/></one:List><one:T><![CDATA[Trailing sibling]]></one:T></one:OE><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:48:22.000Z" objectID="{92A0E3FD-3B86-4EFE-A251-650AA654E9E2}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:List><one:Number numberSequence="1" numberFormat="##." fontSize="11.0" font="Calibri" text="III."/></one:List><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/tree"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{92A0E3FD-3B86-4EFE-A251-650AA654E9E2}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{92A0E3FD-3B86-4EFE-A251-650AA654E9E2}{61}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{92A0E3FD-3B86-4EFE-A251-650AA654E9E2}{73}{B0}"><one:Position x="540.0" y="108.0" z="1"/><one:Size width="99.85796356201171" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{92A0E3FD-3B86-4EFE-A251-650AA654E9E2}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/groups-cells/cold/read/payloads.json created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/before/read/payloads.json
\ No newline at end of file
corpus/outline-edit/rust-tree/groups-cells/cold/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/tree-rust-candidates-01/groups-cells",
3 "expected_pages": 12,
4 "author": null,
5 "author_timeout_seconds": 600,
6 "inspect": false,
7 "collect_notebook": true,
8 "base": {
9 "file": "win7-office-base.qcow2",
10 "format": "qcow2",
11 "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346",
12 "virtual_size": 68719476736
13 },
14 "scripts": {
15 "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331",
16 "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41"
17 }
18}
corpus/outline-edit/rust-tree/groups-cells/cold/scripts/cold.ps1 created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/reconciliation/keyboard/scripts/cold.ps1
\ No newline at end of file
corpus/outline-edit/rust-tree/groups-cells/cold/scripts/read.ps1 created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/reconciliation/keyboard/scripts/read.ps1
\ No newline at end of file
corpus/outline-edit/rust-tree/groups-cells/cold/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 98760,
5 "sha256": "1d61348e067f63ac3e39443085fbc1e8285ef52873b0191943ec439168f48e41",
6 "mtime_ns": 1788896902499834185
7 }
8]
corpus/outline-edit/rust-tree/groups-cells/cold/teardown.json created+1
...@@ -0,0 +1 @@
1../../../../paragraph-edit/joined/teardown.json
\ No newline at end of file
corpus/outline-edit/rust-tree/ordinary/candidate/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/ordinary/candidate/synthetic.one differ
corpus/outline-edit/rust-tree/ordinary/cold/commands.jsonl created+3
...@@ -0,0 +1,3 @@
1{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null}
2{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-91CEBD14 -ExpectedPages 15", "exit": 0, "stdout": "Read 1 sections and 15 pages.\r\n", "stderr": "", "error": null}
3{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null}
corpus/outline-edit/rust-tree/ordinary/cold/notebook/Open Notebook.onetoc2 created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/ordinary/cold/notebook/Open Notebook.onetoc2 differ
corpus/outline-edit/rust-tree/ordinary/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/ordinary/cold/notebook/synthetic.one differ
corpus/outline-edit/rust-tree/ordinary/cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-91CEBD14",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/outline-edit/rust-tree/ordinary/cold/read/hierarchy.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{CF9777E0-FB9E-4255-A1C8-2B7A35FBAD90}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T19:50:09.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{AA549593-D6DF-0AC9-1DA9-EABBDB6357E8}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T19:50:09.000Z" color="#8AA8E4"><one:Page ID="{861D6615-5F14-49D8-9ACE-422A275B4BF7}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{55232BD9-AE8E-4DF5-8052-FD233653E023}{1}{B0}" name="Move leaf down" dateTime="2026-09-08T18:00:47.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{79858F2B-09B9-47D6-B970-A45F905418CC}{1}{B0}" name="Move subtree down" dateTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{973D51BD-2996-42BE-8E64-7869766515C1}{1}{B0}" name="Move subtree up" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{87113B02-D665-49F5-91C8-3633723EB4E3}{1}{B0}" name="Indent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{618150DD-71E0-4A1A-88E0-41F588F67300}{1}{B0}" name="Outdent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{1D8DEDF2-1391-4584-A777-54E8FE93B77D}{1}{B0}" name="Collapse subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{670E6C05-C727-414D-B47F-787C35402265}{1}{B0}" name="Expand subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{D43AB8B4-55EC-4E41-B35D-8CF2BF584114}{1}{B0}" name="Delete leaf" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{69BF806E-C345-4C3F-A746-EEED978893DB}{1}{B0}" name="Delete subtree" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{46CE6343-6772-4F8E-AEE3-65C11D1798C9}{1}{B0}" name="Delete only paragraph" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{62ED5DA2-96AC-495C-AFE3-E864A0333C6C}{1}{B0}" name="Delete outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{F42527A1-78C4-49C7-AE40-16822255EB55}{1}{B0}" name="Move outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{2F475CC0-62FA-4A77-A519-FF2993C65967}{1}{B0}" name="Resize outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/><one:Page ID="{1186518E-302C-4743-B997-61E2F93F9BD8}{1}{B0}" name="Automatic outline size" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-000.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1186518E-302C-4743-B997-61E2F93F9BD8}{1}{B0}" name="Automatic outline size" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2C3306FA-8A7B-4318-8932-E8DA8622B602}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Automatic outline size]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2C3306FA-8A7B-4318-8932-E8DA8622B602}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="180.0" height="67.13858032226562" isSetByUser="true"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2C3306FA-8A7B-4318-8932-E8DA8622B602}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2C3306FA-8A7B-4318-8932-E8DA8622B602}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2C3306FA-8A7B-4318-8932-E8DA8622B602}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2C3306FA-8A7B-4318-8932-E8DA8622B602}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2C3306FA-8A7B-4318-8932-E8DA8622B602}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2C3306FA-8A7B-4318-8932-E8DA8622B602}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2C3306FA-8A7B-4318-8932-E8DA8622B602}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-001.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1D8DEDF2-1391-4584-A777-54E8FE93B77D}{1}{B0}" name="Collapse subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{91709030-39FD-4E63-A710-C3EC6759351A}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Collapse subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{91709030-39FD-4E63-A710-C3EC6759351A}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{91709030-39FD-4E63-A710-C3EC6759351A}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{91709030-39FD-4E63-A710-C3EC6759351A}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{91709030-39FD-4E63-A710-C3EC6759351A}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{91709030-39FD-4E63-A710-C3EC6759351A}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{91709030-39FD-4E63-A710-C3EC6759351A}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{91709030-39FD-4E63-A710-C3EC6759351A}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{91709030-39FD-4E63-A710-C3EC6759351A}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-002.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{2F475CC0-62FA-4A77-A519-FF2993C65967}{1}{B0}" name="Resize outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E6863C18-C25E-4085-966B-ECE6E3BAF425}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Resize outline]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E6863C18-C25E-4085-966B-ECE6E3BAF425}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E6863C18-C25E-4085-966B-ECE6E3BAF425}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E6863C18-C25E-4085-966B-ECE6E3BAF425}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E6863C18-C25E-4085-966B-ECE6E3BAF425}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E6863C18-C25E-4085-966B-ECE6E3BAF425}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E6863C18-C25E-4085-966B-ECE6E3BAF425}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E6863C18-C25E-4085-966B-ECE6E3BAF425}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E6863C18-C25E-4085-966B-ECE6E3BAF425}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-003.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{46CE6343-6772-4F8E-AEE3-65C11D1798C9}{1}{B0}" name="Delete only paragraph" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2A6D85D5-7F81-428F-B69B-86BDE24A9D17}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete only paragraph]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2A6D85D5-7F81-428F-B69B-86BDE24A9D17}{49}{B0}"><one:Position x="480.0" y="108.0" z="0"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{2A6D85D5-7F81-428F-B69B-86BDE24A9D17}{50}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-004.xml created+4
...@@ -0,0 +1,4 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{55232BD9-AE8E-4DF5-8052-FD233653E023}{1}{B0}" name="Move leaf down" dateTime="2026-09-08T18:00:47.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{E13998D7-61DB-47B5-8F9C-A8B165A1BB75}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move leaf down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:20.000Z" objectID="{E13998D7-61DB-47B5-8F9C-A8B165A1BB75}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{E13998D7-61DB-47B5-8F9C-A8B165A1BB75}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{E13998D7-61DB-47B5-8F9C-A8B165A1BB75}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T18:00:48.000Z" lastModifiedTime="2026-09-08T19:48:20.000Z" objectID="{E13998D7-61DB-47B5-8F9C-A8B165A1BB75}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{E13998D7-61DB-47B5-8F9C-A8B165A1BB75}{59}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{E13998D7-61DB-47B5-8F9C-A8B165A1BB75}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-005.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{618150DD-71E0-4A1A-88E0-41F588F67300}{1}{B0}" name="Outdent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{F888D2EA-F863-44D6-9A57-25CD1A2F50A9}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Outdent subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{F888D2EA-F863-44D6-9A57-25CD1A2F50A9}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{F888D2EA-F863-44D6-9A57-25CD1A2F50A9}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{F888D2EA-F863-44D6-9A57-25CD1A2F50A9}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{F888D2EA-F863-44D6-9A57-25CD1A2F50A9}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{F888D2EA-F863-44D6-9A57-25CD1A2F50A9}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{F888D2EA-F863-44D6-9A57-25CD1A2F50A9}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{F888D2EA-F863-44D6-9A57-25CD1A2F50A9}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{F888D2EA-F863-44D6-9A57-25CD1A2F50A9}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-006.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{62ED5DA2-96AC-495C-AFE3-E864A0333C6C}{1}{B0}" name="Delete outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{9A7C356A-EA34-47BE-82F7-E8863F8EC7D7}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete outline]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{9A7C356A-EA34-47BE-82F7-E8863F8EC7D7}{70}{B0}"><one:Position x="480.0" y="108.0" z="0"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{9A7C356A-EA34-47BE-82F7-E8863F8EC7D7}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-007.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{670E6C05-C727-414D-B47F-787C35402265}{1}{B0}" name="Expand subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{53188FDF-5339-4189-A8B8-D5B2D877ECC9}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Expand subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{53188FDF-5339-4189-A8B8-D5B2D877ECC9}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="129.6621246337891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{53188FDF-5339-4189-A8B8-D5B2D877ECC9}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" collapsed="1" objectID="{53188FDF-5339-4189-A8B8-D5B2D877ECC9}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{53188FDF-5339-4189-A8B8-D5B2D877ECC9}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{53188FDF-5339-4189-A8B8-D5B2D877ECC9}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{53188FDF-5339-4189-A8B8-D5B2D877ECC9}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{53188FDF-5339-4189-A8B8-D5B2D877ECC9}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{53188FDF-5339-4189-A8B8-D5B2D877ECC9}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-008.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{69BF806E-C345-4C3F-A746-EEED978893DB}{1}{B0}" name="Delete subtree" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{919D2544-D119-4B8C-A70D-96CB2419F60F}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{919D2544-D119-4B8C-A70D-96CB2419F60F}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="103.8432159423828" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{919D2544-D119-4B8C-A70D-96CB2419F60F}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{919D2544-D119-4B8C-A70D-96CB2419F60F}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{919D2544-D119-4B8C-A70D-96CB2419F60F}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{919D2544-D119-4B8C-A70D-96CB2419F60F}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-009.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{79858F2B-09B9-47D6-B970-A45F905418CC}{1}{B0}" name="Move subtree down" dateTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{059F5CA3-AEC2-41A0-B9F1-FC9E5809BB63}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move subtree down]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{059F5CA3-AEC2-41A0-B9F1-FC9E5809BB63}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{059F5CA3-AEC2-41A0-B9F1-FC9E5809BB63}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{059F5CA3-AEC2-41A0-B9F1-FC9E5809BB63}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{059F5CA3-AEC2-41A0-B9F1-FC9E5809BB63}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{059F5CA3-AEC2-41A0-B9F1-FC9E5809BB63}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{059F5CA3-AEC2-41A0-B9F1-FC9E5809BB63}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{059F5CA3-AEC2-41A0-B9F1-FC9E5809BB63}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{059F5CA3-AEC2-41A0-B9F1-FC9E5809BB63}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-010.xml created+20
...@@ -0,0 +1,20 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{861D6615-5F14-49D8-9ACE-422A275B4BF7}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{E1D1CEA9-1461-4A6E-953C-CEF1D8C7AE96}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{E6B4665E-E71C-0164-2568-0DFB13ACDC60}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
5Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
6font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
7font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
8Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
9Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1011.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
11background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
12Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
13Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1411.0pt'><br>
15End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{E1D1CEA9-1461-4A6E-953C-CEF1D8C7AE96}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
16style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
17style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
18style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
19style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
20lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-011.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{87113B02-D665-49F5-91C8-3633723EB4E3}{1}{B0}" name="Indent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{B88C6BEF-190E-4DA9-8C00-ECB72F1740D2}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Indent subtree]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{B88C6BEF-190E-4DA9-8C00-ECB72F1740D2}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="169.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{B88C6BEF-190E-4DA9-8C00-ECB72F1740D2}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T><one:OEChildren><one:OE lastModifiedBy="Tree author" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{B88C6BEF-190E-4DA9-8C00-ECB72F1740D2}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{B88C6BEF-190E-4DA9-8C00-ECB72F1740D2}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{B88C6BEF-190E-4DA9-8C00-ECB72F1740D2}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{B88C6BEF-190E-4DA9-8C00-ECB72F1740D2}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{B88C6BEF-190E-4DA9-8C00-ECB72F1740D2}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{B88C6BEF-190E-4DA9-8C00-ECB72F1740D2}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-012.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{973D51BD-2996-42BE-8E64-7869766515C1}{1}{B0}" name="Move subtree up" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{DD425E7B-E1C8-4058-BA19-D9606260224B}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move subtree up]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="Tree author" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{DD425E7B-E1C8-4058-BA19-D9606260224B}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{DD425E7B-E1C8-4058-BA19-D9606260224B}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{DD425E7B-E1C8-4058-BA19-D9606260224B}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{DD425E7B-E1C8-4058-BA19-D9606260224B}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{DD425E7B-E1C8-4058-BA19-D9606260224B}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{DD425E7B-E1C8-4058-BA19-D9606260224B}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{DD425E7B-E1C8-4058-BA19-D9606260224B}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{DD425E7B-E1C8-4058-BA19-D9606260224B}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-013.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{D43AB8B4-55EC-4E41-B35D-8CF2BF584114}{1}{B0}" name="Delete leaf" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{3E92370D-DC3D-4927-8758-71931AAEF48F}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Delete leaf]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T19:48:21.000Z" objectID="{3E92370D-DC3D-4927-8758-71931AAEF48F}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="103.8432159423828" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{3E92370D-DC3D-4927-8758-71931AAEF48F}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{3E92370D-DC3D-4927-8758-71931AAEF48F}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{3E92370D-DC3D-4927-8758-71931AAEF48F}{59}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{3E92370D-DC3D-4927-8758-71931AAEF48F}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/page-014.xml created+5
...@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{F42527A1-78C4-49C7-AE40-16822255EB55}{1}{B0}" name="Move outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T19:49:59.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Preserved task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A42ECE7A-EDF7-4767-A0CF-C1990CAD6B1E}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Move outline]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A42ECE7A-EDF7-4767-A0CF-C1990CAD6B1E}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="142.6107788085937" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A42ECE7A-EDF7-4767-A0CF-C1990CAD6B1E}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A42ECE7A-EDF7-4767-A0CF-C1990CAD6B1E}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a
4href="https://example.invalid/outline"><span lang=x-none>Link label</span></a>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A42ECE7A-EDF7-4767-A0CF-C1990CAD6B1E}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T style="font-family:Calibri;font-size:11.0pt"><![CDATA[<span
5style='font-style:italic'>Child</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A42ECE7A-EDF7-4767-A0CF-C1990CAD6B1E}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Grandchild]]></one:T></one:OE></one:OEChildren></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A42ECE7A-EDF7-4767-A0CF-C1990CAD6B1E}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A42ECE7A-EDF7-4767-A0CF-C1990CAD6B1E}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="99.85792541503906" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:00:51.000Z" objectID="{A42ECE7A-EDF7-4767-A0CF-C1990CAD6B1E}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/ordinary/cold/read/payloads.json created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/before/read/payloads.json
\ No newline at end of file
corpus/outline-edit/rust-tree/ordinary/cold/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/tree-rust-candidates-01/ordinary",
3 "expected_pages": 15,
4 "author": null,
5 "author_timeout_seconds": 600,
6 "inspect": false,
7 "collect_notebook": true,
8 "base": {
9 "file": "win7-office-base.qcow2",
10 "format": "qcow2",
11 "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346",
12 "virtual_size": 68719476736
13 },
14 "scripts": {
15 "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331",
16 "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41"
17 }
18}
corpus/outline-edit/rust-tree/ordinary/cold/scripts/cold.ps1 created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/reconciliation/keyboard/scripts/cold.ps1
\ No newline at end of file
corpus/outline-edit/rust-tree/ordinary/cold/scripts/read.ps1 created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/reconciliation/keyboard/scripts/read.ps1
\ No newline at end of file
corpus/outline-edit/rust-tree/ordinary/cold/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 111728,
5 "sha256": "73cdf92d1e016cb7576a8e9165bf0d94fb94e5a1e233a834dd39347011661240",
6 "mtime_ns": 1788896901734213394
7 }
8]
corpus/outline-edit/rust-tree/ordinary/cold/teardown.json created+1
...@@ -0,0 +1 @@
1../../../../paragraph-edit/joined/teardown.json
\ No newline at end of file
corpus/outline-edit/rust-tree/unequal-groups/candidate/groups.one created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/unequal-groups/candidate/groups.one differ
corpus/outline-edit/rust-tree/unequal-groups/cold/commands.jsonl created+3
...@@ -0,0 +1,3 @@
1{"command": "powershell -NoProfile -Command \"Expand-Archive -LiteralPath C:\\one-tests\\transfer.zip -DestinationPath C:\\one-tests\\runs\\capture\\notebook\"", "exit": 0, "stdout": "", "stderr": "", "error": null}
2{"command": "powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File C:\\one-tests\\read-current.ps1 -Root C:\\one-tests\\runs\\capture -CloneHost ONE-M6-FD0772B4 -ExpectedPages 1", "exit": 0, "stdout": "Read 1 sections and 1 pages.\r\n", "stderr": "", "error": null}
3{"command": "powershell -NoProfile -Command \"Compress-Archive -Force -Path C:\\one-tests\\runs\\capture\\* -DestinationPath C:\\one-tests\\captured.zip\"", "exit": 0, "stdout": "", "stderr": "", "error": null}
corpus/outline-edit/rust-tree/unequal-groups/cold/notebook/Open Notebook.onetoc2 created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/unequal-groups/cold/notebook/Open Notebook.onetoc2 differ
corpus/outline-edit/rust-tree/unequal-groups/cold/notebook/groups.one created
Binary files /dev/null and b/corpus/outline-edit/rust-tree/unequal-groups/cold/notebook/groups.one differ
corpus/outline-edit/rust-tree/unequal-groups/cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-FD0772B4",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/outline-edit/rust-tree/unequal-groups/cold/read/hierarchy.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{68AAA917-8955-44F5-9627-9C25103B5481}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T20:06:21.000Z" color="#B49EDE"><one:Section name="groups" ID="{AA60B5AA-2121-01E0-13AC-A571876DC1DF}{1}{B0}" path="C:\one-tests\runs\capture\notebook\groups.one" lastModifiedTime="2026-09-08T20:06:21.000Z" color="#8AA8E4"><one:Page ID="{B837AA21-0406-0B3B-3C6F-FD963C9704AB}{1}{B0}" name="First" dateTime="2026-09-08T20:04:10.000Z" lastModifiedTime="2026-09-08T20:06:21.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/outline-edit/rust-tree/unequal-groups/cold/read/page-000.xml created+2
...@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{B837AA21-0406-0B3B-3C6F-FD963C9704AB}{1}{B0}" name="First" dateTime="2026-09-08T20:04:10.000Z" lastModifiedTime="2026-09-08T20:06:21.000Z" pageLevel="1" style="font-family:Calibri;font-size:11.0pt" lang="en-US"><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T20:04:10.000Z" objectID="{AA60B5AA-2121-01E0-13AC-A571876DC1DF}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="140.150390625" height="26.85543441772461"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren indent="3"><one:OE creationTime="2026-09-08T20:04:10.000Z" lastModifiedTime="2026-09-08T20:04:10.000Z" objectID="{AA60B5AA-2121-01E0-13AC-A571876DC1DF}{24}{B0}" alignment="left"><one:T><![CDATA[First]]></one:T></one:OE></one:OEChildren><one:OEChildren indent="2"><one:OE creationTime="2026-09-08T20:04:10.000Z" lastModifiedTime="2026-09-08T20:04:10.000Z" objectID="{9B9964EE-6416-06E6-2720-3A2A5ACC19FE}{1}{B0}" alignment="left"><one:T><![CDATA[Second]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/rust-tree/unequal-groups/cold/read/payloads.json created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/before/read/payloads.json
\ No newline at end of file
corpus/outline-edit/rust-tree/unequal-groups/cold/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/tree-rust-candidates-01/unequal-groups",
3 "expected_pages": 1,
4 "author": null,
5 "author_timeout_seconds": 600,
6 "inspect": false,
7 "collect_notebook": true,
8 "base": {
9 "file": "win7-office-base.qcow2",
10 "format": "qcow2",
11 "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346",
12 "virtual_size": 68719476736
13 },
14 "scripts": {
15 "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331",
16 "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41"
17 }
18}
corpus/outline-edit/rust-tree/unequal-groups/cold/scripts/cold.ps1 created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/reconciliation/keyboard/scripts/cold.ps1
\ No newline at end of file
corpus/outline-edit/rust-tree/unequal-groups/cold/scripts/read.ps1 created+1
...@@ -0,0 +1 @@
1../../../../../paragraph-edit/reconciliation/keyboard/scripts/read.ps1
\ No newline at end of file
corpus/outline-edit/rust-tree/unequal-groups/cold/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "groups.one",
4 "bytes": 8784,
5 "sha256": "771ef9f745a621829ff616a6009c62f623b0132c31d78f8fc04258646916d49a",
6 "mtime_ns": 1788897850908407538
7 }
8]
corpus/outline-edit/rust-tree/unequal-groups/cold/teardown.json created+1
...@@ -0,0 +1 @@
1../../../../paragraph-edit/joined/teardown.json
\ No newline at end of file
crates/onestore/README.md+12
...@@ -53,6 +53,7 @@ harness also accepts `--client-profile release`....@@ -53,6 +53,7 @@ harness also accepts `--client-profile release`.
53| `ParagraphJoin`, `PreparedEdit::join` | Join adjacent ordinary text while preserving inherited character styles and native text-identity rules |53| `ParagraphJoin`, `PreparedEdit::join` | Join adjacent ordinary text while preserving inherited character styles and native text-identity rules |
54| `TextAttribute`, `PreparedEdit::format` | Change character formatting over a UTF-16 range while sharing immutable styles; preserve unselected runs |54| `TextAttribute`, `PreparedEdit::format` | Change character formatting over a UTF-16 range while sharing immutable styles; preserve unselected runs |
55| `OutlineEdit`, `PreparedEdit::outline` | Change ordinary outline position/width or a paragraph's saved expansion default, preserving identities and content |55| `OutlineEdit`, `PreparedEdit::outline` | Change ordinary outline position/width or a paragraph's saved expansion default, preserving identities and content |
56| `TreeEdit`, `PreparedEdit::tree` | Move or delete a subtree on one page, normalize surviving containers, and replace an emptied table cell's paragraph atomically |
56| `PreparedEdit::commit`, `PreparedEdit::commit_file` | Publish the exact prepared image under caller-held exclusion or the conservative filesystem adapter |57| `PreparedEdit::commit`, `PreparedEdit::commit_file` | Publish the exact prepared image under caller-held exclusion or the conservative filesystem adapter |
57| `read_file` | Read a snapshot under whole-file exclusion |58| `read_file` | Read a snapshot under whole-file exclusion |
58| `read_snapshot` | Read a validated snapshot through fresh positioned I/O while the caller excludes maintenance |59| `read_snapshot` | Read a validated snapshot through fresh positioned I/O while the caller excludes maintenance |
...@@ -85,6 +86,17 @@ and an automatic maximum-width hint remain distinct. Native layout generates the...@@ -85,6 +86,17 @@ and an automatic maximum-width hint remain distinct. Native layout generates the
85rendered height. Saved paragraph collapse defaults can be overridden by the native86rendered height. Saved paragraph collapse defaults can be overridden by the native
86client's cached view. [Native layout captures](../../corpus/outline-edit/README.md)87client's cached view. [Native layout captures](../../corpus/outline-edit/README.md)
87verify these edits through a fresh OneNote cache, including fields and nested content.88verify these edits through a fresh OneNote cache, including fields and nested content.
89`TreeEdit::move_to` takes an existing parent and an optional direct sibling to insert
90before; `None` appends. Paragraphs retain their descendants and explicit list styles.
91Outlines remain page children, so reordering changes their stacking order while
92retaining coordinates. `TreeEdit::delete` removes the selected subtree from the active
93graph and preserves historical objects. Empty outlines/groups are removed; surviving
94group indentation is normalized without shifting other paragraphs. Empty table cells
95receive new empty paragraph/text objects with identities retained in the intent.
96Title/protected content, ambiguous ancestry, cycles, and incompatible destinations
97reject before publication. Modification times, move attribution and automatic titles
98publish with the tree change. These explicit destinations differ from keyboard list
99indentation, which can also substitute list markers.
88Paragraph splits preserve character formatting, retain tags on the left, and clone100Paragraph splits preserve character formatting, retain tags on the left, and clone
89mutable list objects without restarting numbering. The new right paragraph/text101mutable list objects without restarting numbering. The new right paragraph/text
90identities belong to the retained `ParagraphSplit` intent. Its publication includes102identities belong to the retained `ParagraphSplit` intent. Its publication includes
crates/onestore/src/commit.rs+12
...@@ -183,6 +183,18 @@ pub struct PreparedEdit<'a> {...@@ -183,6 +183,18 @@ pub struct PreparedEdit<'a> {
183}183}
184184
185impl<'a> PreparedEdit<'a> {185impl<'a> PreparedEdit<'a> {
186 /// Moves or removes a subtree and normalizes its containers in one revision.
187 pub fn tree(
188 source: &'a [u8],
189 space: ExGuid,
190 edit: &crate::TreeEdit,
191 ) -> Result<Self, crate::Error> {
192 Ok(Self {
193 source,
194 written: edit.apply(source, space)?,
195 })
196 }
197
186 /// Changes outline geometry or a paragraph's saved expansion state, preserving content.198 /// Changes outline geometry or a paragraph's saved expansion state, preserving content.
187 pub fn outline(199 pub fn outline(
188 source: &'a [u8],200 source: &'a [u8],
crates/onestore/src/edit.rs+53-3
...@@ -1,6 +1,10 @@...@@ -1,6 +1,10 @@
1use crate::document::{Document, Kind};1use crate::{
2use crate::{Error, ExGuid, ObjectData, PropertySets, RevisionIndex, Store};2 Error, ExGuid, Object, ObjectData, PropertySets, RevisionIndex, Store,
3use std::ops::Range;3 create::string,
4 document::{Document, Element, Kind},
5 write::PropertyObject,
6};
7use std::{collections::BTreeMap, ops::Range, sync::Arc};
48
5fn title_line(text: &str) -> &str {9fn title_line(text: &str) -> &str {
6 text.trim_start().split('\r').next().unwrap()10 text.trim_start().split('\r').next().unwrap()
...@@ -458,3 +462,49 @@ pub(crate) fn page_title(...@@ -458,3 +462,49 @@ pub(crate) fn page_title(
458 }462 }
459 Ok(Some((*page, automatic, title_text.to_owned())))463 Ok(Some((*page, automatic, title_text.to_owned())))
460}464}
465
466pub(crate) fn update_title(
467 store: &Store<'_>,
468 raw: &crate::ResolvedRevision<'_>,
469 view: crate::document::Revision<'_>,
470 pages: &[ExGuid],
471 changed: &mut BTreeMap<ExGuid, PropertyObject>,
472) -> Result<(), Error> {
473 let invalid = |message| Error { offset: 0, message };
474 // Shorten the moved view's lifetime to the changed property buffers.
475 let mut view = view;
476 for (id, object) in changed.iter() {
477 view.nodes.insert(
478 *id,
479 Element::parse(
480 &Object {
481 jcid: object.jcid,
482 reference_count: 0,
483 data: ObjectData::Properties(&object.bytes),
484 global_ids: Arc::clone(&object.global_ids),
485 },
486 store,
487 )?,
488 );
489 }
490 let title = page_title(&view, pages, None)?;
491 drop(view);
492 if let Some((_, automatic, title)) = title {
493 let metadata = raw
494 .roots
495 .get(&2)
496 .ok_or_else(|| invalid("Page title metadata is unavailable"))?;
497 if raw.objects[metadata].jcid != 0x20030 {
498 return Err(invalid("Page title metadata is unavailable"));
499 }
500 let title = string(&title);
501 let mut object = PropertyObject::from_object(&raw.objects[metadata])?;
502 object.set(&[(0x1c001cf3, &title)])?;
503 changed.insert(*metadata, object);
504 changed
505 .get_mut(&pages[0])
506 .unwrap()
507 .set(&[(0x1c001d3c, if automatic { &title } else { &[0, 0] })])?;
508 }
509 Ok(())
510}
crates/onestore/src/lib.rs+2
...@@ -19,6 +19,7 @@ pub mod protected;...@@ -19,6 +19,7 @@ pub mod protected;
19mod revisions;19mod revisions;
20mod snapshot;20mod snapshot;
21mod store;21mod store;
22mod tree;
22mod write;23mod write;
2324
24pub use commit::{25pub use commit::{
...@@ -39,4 +40,5 @@ pub use properties::{IdStream, Property, PropertySets, Value};...@@ -39,4 +40,5 @@ pub use properties::{IdStream, Property, PropertySets, Value};
39pub use revisions::{ExGuid, ObjectSpace, Revision, RevisionIndex};40pub use revisions::{ExGuid, ObjectSpace, Revision, RevisionIndex};
40pub use snapshot::{read_snapshot, read_storage_snapshot};41pub use snapshot::{read_snapshot, read_storage_snapshot};
41pub use store::{Chunk, Error, FileType, Header, Node, NodeList, Reference, Store};42pub use store::{Chunk, Error, FileType, Header, Node, NodeList, Reference, Store};
43pub use tree::TreeEdit;
42pub use write::replace_property_bytes;44pub use write::replace_property_bytes;
crates/onestore/src/paragraph.rs+1-46
...@@ -2,7 +2,7 @@ use crate::{...@@ -2,7 +2,7 @@ use crate::{
2 Error, ExGuid, Object, ObjectData, PropertySets, RevisionIndex, Store,2 Error, ExGuid, Object, ObjectData, PropertySets, RevisionIndex, Store,
3 create::{current_timestamps, properties, string},3 create::{current_timestamps, properties, string},
4 document::{Document, Element, Kind},4 document::{Document, Element, Kind},
5 edit::{editable_parents, page_title},5 edit::{editable_parents, update_title},
6 write::{PropertyObject, fresh_guid, write_revision},6 write::{PropertyObject, fresh_guid, write_revision},
7};7};
8use serde::{Deserialize, Serialize};8use serde::{Deserialize, Serialize};
...@@ -373,51 +373,6 @@ fn ordinary_text<'a>(...@@ -373,51 +373,6 @@ fn ordinary_text<'a>(
373 Ok((text, runs))373 Ok((text, runs))
374}374}
375375
376fn update_title(
377 store: &Store<'_>,
378 raw: &crate::ResolvedRevision<'_>,
379 view: crate::document::Revision<'_>,
380 pages: &[ExGuid],
381 changed: &mut BTreeMap<ExGuid, PropertyObject>,
382) -> Result<(), Error> {
383 // Shorten the moved view's lifetime to the changed property buffers.
384 let mut view = view;
385 for (id, object) in changed.iter() {
386 view.nodes.insert(
387 *id,
388 Element::parse(
389 &Object {
390 jcid: object.jcid,
391 reference_count: 0,
392 data: ObjectData::Properties(&object.bytes),
393 global_ids: Arc::clone(&object.global_ids),
394 },
395 store,
396 )?,
397 );
398 }
399 let title = page_title(&view, pages, None)?;
400 drop(view);
401 if let Some((_, automatic, title)) = title {
402 let metadata = raw
403 .roots
404 .get(&2)
405 .ok_or_else(|| invalid("Page title metadata is unavailable"))?;
406 if raw.objects[metadata].jcid != 0x20030 {
407 return Err(invalid("Page title metadata is unavailable"));
408 }
409 let title = string(&title);
410 let mut object = PropertyObject::from_object(&raw.objects[metadata])?;
411 object.set(&[(0x1c001cf3, &title)])?;
412 changed.insert(*metadata, object);
413 changed
414 .get_mut(&pages[0])
415 .unwrap()
416 .set(&[(0x1c001d3c, if automatic { &title } else { &[0, 0] })])?;
417 }
418 Ok(())
419}
420
421/// Joins adjacent ordinary text in one outline or table cell.376/// Joins adjacent ordinary text in one outline or table cell.
422/// The left paragraph survives. Empty left text adopts the right text identity;377/// The left paragraph survives. Empty left text adopts the right text identity;
423/// otherwise the left text survives. The left paragraph's tags are retained.378/// otherwise the left text survives. The left paragraph's tags are retained.
crates/onestore/src/tree.rs created+597
...@@ -0,0 +1,597 @@
1use crate::{
2 Error, ExGuid, RevisionIndex, Store,
3 create::{current_timestamps, properties, string},
4 document::{Document, Kind, Revision},
5 edit::{editable_parents, update_title},
6 write::{PropertyObject, fresh_guid, write_revision},
7};
8use serde::{Deserialize, Serialize};
9use std::{
10 collections::{BTreeMap, BTreeSet},
11 sync::Arc,
12};
13
14fn invalid(message: &'static str) -> Error {
15 Error { offset: 0, message }
16}
17
18#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
19#[serde(deny_unknown_fields)]
20enum Placement {
21 Delete,
22 Move {
23 parent: ExGuid,
24 before: Option<ExGuid>,
25 },
26}
27
28/// An atomic subtree move or deletion on one active page.
29/// Retain the intent across retries so an emptied cell's replacement keeps its identity.
30#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
31#[serde(deny_unknown_fields)]
32pub struct TreeEdit {
33 guid: [u8; 16],
34 object: ExGuid,
35 placement: Placement,
36 author: String,
37 created: u32,
38}
39
40impl TreeEdit {
41 /// Removes a paragraph or ordinary outline and its descendants from the active tree.
42 /// Historical objects remain available; an emptied table cell receives an empty paragraph.
43 pub fn delete(object: ExGuid, author: &str) -> Result<Self, Error> {
44 Self::new(object, Placement::Delete, author)
45 }
46
47 /// Moves before a direct child, or appends when `before` is None.
48 /// Paragraph destinations are outlines, groups, paragraphs or cells on the same page.
49 /// Outlines remain direct page children. Content and explicit list formatting are preserved.
50 pub fn move_to(
51 object: ExGuid,
52 parent: ExGuid,
53 before: Option<ExGuid>,
54 author: &str,
55 ) -> Result<Self, Error> {
56 Self::new(object, Placement::Move { parent, before }, author)
57 }
58
59 fn new(object: ExGuid, placement: Placement, author: &str) -> Result<Self, Error> {
60 let intent = Self {
61 guid: fresh_guid()?,
62 object,
63 placement,
64 author: author.to_owned(),
65 created: current_timestamps()?.0,
66 };
67 intent.validate()?;
68 Ok(intent)
69 }
70
71 fn validate(&self) -> Result<(), Error> {
72 if self.guid == [0; 16] || self.object.guid == [0; 16] || self.author.contains('\0') {
73 return Err(invalid(
74 "Choose page content and an author name without NUL",
75 ));
76 }
77 if let Placement::Move { parent, before } = self.placement
78 && (parent.guid == [0; 16] || before.is_some_and(|id| id.guid == [0; 16]))
79 {
80 return Err(invalid("Choose a destination and sibling on the same page"));
81 }
82 Ok(())
83 }
84
85 pub(crate) fn apply(&self, source: &[u8], space: ExGuid) -> Result<Vec<u8>, Error> {
86 self.validate()?;
87 let store = Store::parse(source)?;
88 let index = RevisionIndex::parse(&store)?;
89 index.validate_current()?;
90 let mut document = Document::parse(&index)?;
91 let pages: Vec<_> = document
92 .pages()?
93 .into_iter()
94 .filter_map(|(sid, page)| (sid == space).then_some(page))
95 .collect();
96 let [page] = pages.as_slice() else {
97 return Err(invalid("Tree editing requires a single active page"));
98 };
99 let semantic = document.spaces.remove(&space).unwrap();
100 let rid = semantic.contexts[&ExGuid::default()];
101 let mut view = semantic
102 .revisions
103 .into_iter()
104 .find_map(|(id, view)| (id == rid).then_some(view))
105 .unwrap();
106 let parents = editable_parents(&view, &pages, self.object)?;
107 let path = checked_path(&view, &parents, *page, self.object)?;
108 let source_parent = *path
109 .get(1)
110 .ok_or_else(|| invalid("Select a paragraph or ordinary page outline"))?;
111 let compatible = |parent: ExGuid| match view.nodes[&self.object].kind {
112 Kind::Outline { .. } => parent == *page,
113 Kind::Paragraph { .. } => matches!(
114 view.nodes[&parent].kind,
115 Kind::Outline { .. }
116 | Kind::OutlineGroup
117 | Kind::Paragraph { .. }
118 | Kind::Cell { .. }
119 ),
120 _ => false,
121 };
122 if !compatible(source_parent) || !view.nodes[&source_parent].children.contains(&self.object)
123 {
124 return Err(invalid("Select a paragraph or ordinary page outline"));
125 }
126 let mut changed_ids = BTreeSet::from([source_parent]);
127 let mut affected = BTreeSet::from([self.object]);
128 if let Placement::Move { parent, before } = self.placement {
129 if checked_path(&view, &parents, *page, parent)?.contains(&self.object) {
130 return Err(invalid("A subtree cannot move inside itself"));
131 }
132 let destination = &view.nodes[&parent];
133 if !compatible(parent) || before.is_some_and(|id| !destination.children.contains(&id)) {
134 return Err(invalid(
135 "Choose a compatible destination and one of its direct children",
136 ));
137 }
138 let previous = destination.children.clone();
139 if parent == source_parent && before == Some(self.object) {
140 return Ok(source.to_vec());
141 }
142 view.nodes
143 .get_mut(&source_parent)
144 .unwrap()
145 .children
146 .retain(|id| *id != self.object);
147 let children = &mut view.nodes.get_mut(&parent).unwrap().children;
148 let position = before
149 .map(|id| children.iter().position(|child| *child == id).unwrap())
150 .unwrap_or(children.len());
151 children.insert(position, self.object);
152 if parent == source_parent && *children == previous {
153 return Ok(source.to_vec());
154 }
155 changed_ids.insert(parent);
156 } else {
157 view.nodes
158 .get_mut(&source_parent)
159 .unwrap()
160 .children
161 .retain(|id| *id != self.object);
162 }
163
164 let mut empty_cell = None;
165 let mut at = source_parent;
166 loop {
167 let node = &view.nodes[&at];
168 if matches!(node.kind, Kind::Page { .. } | Kind::Paragraph { .. })
169 && node.children.is_empty()
170 {
171 break;
172 }
173 if node.children.is_empty() {
174 if matches!(node.kind, Kind::Cell { .. }) {
175 empty_cell = Some(at);
176 break;
177 }
178 if !matches!(node.kind, Kind::Outline { .. } | Kind::OutlineGroup) {
179 return Err(invalid("This container cannot be emptied by a tree edit"));
180 }
181 if node.extra[0].iter().any(|field| field.id == 0x08001d0c) {
182 return Err(invalid("The emptied container cannot be deleted"));
183 }
184 let path = checked_path(&view, &parents, *page, at)?;
185 let parent = path[1];
186 view.nodes
187 .get_mut(&parent)
188 .unwrap()
189 .children
190 .retain(|id| *id != at);
191 changed_ids.remove(&at);
192 changed_ids.insert(parent);
193 at = parent;
194 continue;
195 }
196 if matches!(
197 node.kind,
198 Kind::Outline { .. } | Kind::OutlineGroup | Kind::Paragraph { .. }
199 ) && node
200 .children
201 .iter()
202 .all(|id| matches!(view.nodes[id].kind, Kind::OutlineGroup))
203 {
204 let groups = node.children.clone();
205 let minimum = groups
206 .iter()
207 .map(|id| view.nodes[id].child_level.unwrap_or(1))
208 .min()
209 .unwrap();
210 let level = node
211 .child_level
212 .unwrap_or(1)
213 .checked_add(minimum)
214 .filter(|level| *level <= 31)
215 .ok_or_else(|| {
216 invalid("Removing this group would exceed 31 child indentation levels")
217 })?;
218 let mut children = Vec::new();
219 for group in groups {
220 affected.insert(group);
221 let group_node = view.nodes.get_mut(&group).unwrap();
222 let relative = group_node.child_level.unwrap_or(1) - minimum;
223 if relative == 0 {
224 if group_node.extra[0]
225 .iter()
226 .any(|field| field.id == 0x08001d0c)
227 {
228 return Err(invalid("The redundant outline group cannot be deleted"));
229 }
230 children.extend_from_slice(&group_node.children);
231 changed_ids.remove(&group);
232 } else {
233 group_node.child_level = Some(relative);
234 children.push(group);
235 changed_ids.insert(group);
236 }
237 }
238 let node = view.nodes.get_mut(&at).unwrap();
239 node.children = children;
240 node.child_level = Some(level);
241 changed_ids.insert(at);
242 continue;
243 }
244 break;
245 }
246
247 let mut pending: Vec<_> = affected.into_iter().collect();
248 let mut checked = BTreeSet::new();
249 while let Some(id) = pending.pop() {
250 if !checked.insert(id) {
251 continue;
252 }
253 checked_path(&view, &parents, *page, id)?;
254 let node = &view.nodes[&id];
255 if matches!(self.placement, Placement::Delete)
256 && node.extra[0].iter().any(|field| field.id == 0x08001d0c)
257 {
258 return Err(invalid(
259 "The selected subtree contains content that cannot be deleted",
260 ));
261 }
262 pending.extend(
263 node.children
264 .iter()
265 .chain(&node.content)
266 .chain(&node.structure)
267 .copied(),
268 );
269 }
270 let raw = index.resolve(space, rid)?;
271 let active_parents = editable_parents(&view, &pages, *page)?;
272 let modified = current_timestamps()?.0.to_le_bytes();
273 let mut changed = BTreeMap::new();
274 let author_id = ExGuid {
275 guid: self.guid,
276 n: 3,
277 };
278 if let Some(cell) = empty_cell {
279 let paragraph = ExGuid {
280 guid: self.guid,
281 n: 1,
282 };
283 let text = ExGuid {
284 guid: self.guid,
285 n: 2,
286 };
287 view.nodes.get_mut(&cell).unwrap().children.push(paragraph);
288 for (id, jcid, values) in [
289 (
290 paragraph,
291 0x6000d,
292 vec![
293 (0x24001c1f, 2_u32.to_le_bytes().to_vec()),
294 (0x0c001c03, vec![1]),
295 (0x14001d09, self.created.to_le_bytes().to_vec()),
296 (0x14001d7a, modified.to_vec()),
297 (0x20001d78, 3_u32.to_le_bytes().to_vec()),
298 (0x20001d79, 3_u32.to_le_bytes().to_vec()),
299 ],
300 ),
301 (
302 text,
303 0x6000e,
304 vec![(0x1c001c22, Vec::new()), (0x14001d7a, modified.to_vec())],
305 ),
306 ] {
307 changed.insert(
308 id,
309 PropertyObject {
310 jcid,
311 bytes: properties(&values)?,
312 global_ids: Arc::new(BTreeMap::from([(0, self.guid)])),
313 },
314 );
315 }
316 }
317 let moved_paragraph = matches!(self.placement, Placement::Move { .. })
318 && matches!(view.nodes[&self.object].kind, Kind::Paragraph { .. });
319 if empty_cell.is_some() || moved_paragraph {
320 changed.insert(
321 author_id,
322 PropertyObject {
323 jcid: 0x120001,
324 bytes: properties(&[(0x1c001d75, string(&self.author))])?,
325 global_ids: Arc::new(BTreeMap::from([(0, self.guid)])),
326 },
327 );
328 }
329 if let Some(author) = changed.get(&author_id)
330 && raw.objects.get(&author_id).is_some_and(|old| {
331 old.jcid == author.jcid && old.data == crate::ObjectData::Properties(&author.bytes)
332 })
333 {
334 changed.remove(&author_id);
335 }
336 if changed.keys().any(|id| raw.objects.contains_key(id)) {
337 return Err(invalid(
338 "A tree-edit identity already exists; reconcile the existing edit",
339 ));
340 }
341 let mut ancestors = BTreeSet::new();
342 for id in &changed_ids {
343 ancestors.extend(checked_path(&view, &active_parents, *page, *id)?);
344 }
345 for id in ancestors {
346 let mut object = PropertyObject::from_object(&raw.objects[&id])?;
347 if changed_ids.contains(&id) {
348 let node = &view.nodes[&id];
349 let mut references = Vec::new();
350 for child in &node.children {
351 references.extend_from_slice(&object.reference(*child)?);
352 }
353 object.set(&[(0x24001c20, &references)])?;
354 if let Some(level) = node.child_level {
355 object.set(&[(0x0c001c03, &[level])])?;
356 }
357 }
358 object.set(&[(0x14001d7a, &modified)])?;
359 changed.insert(id, object);
360 }
361 if moved_paragraph {
362 let mut object = PropertyObject::from_object(&raw.objects[&self.object])?;
363 let author = object.reference(author_id)?;
364 object.set(&[(0x20001d79, &author), (0x14001d7a, &modified)])?;
365 changed.insert(self.object, object);
366 }
367 update_title(&store, &raw, view, &pages, &mut changed)?;
368 write_revision(source, space, |_| Ok(changed))
369 }
370}
371
372fn checked_path(
373 view: &Revision<'_>,
374 parents: &BTreeMap<ExGuid, Vec<ExGuid>>,
375 page: ExGuid,
376 object: ExGuid,
377) -> Result<Vec<ExGuid>, Error> {
378 let mut path = Vec::new();
379 let mut seen = BTreeSet::new();
380 let mut id = object;
381 loop {
382 if !seen.insert(id) {
383 return Err(invalid("Tree ancestry contains a cycle"));
384 }
385 let node = view
386 .nodes
387 .get(&id)
388 .ok_or_else(|| invalid("The selected page content is unavailable"))?;
389 if matches!(node.kind, Kind::Title)
390 || node.extra[0]
391 .iter()
392 .any(|field| matches!(field.id, 0x88001cb4 | 0x88001cf9 | 0x88001cb2 | 0x88001cde))
393 {
394 return Err(invalid(
395 "Title or protected content cannot be moved or deleted here",
396 ));
397 }
398 path.push(id);
399 if id == page {
400 break;
401 }
402 let [parent] = parents.get(&id).map(Vec::as_slice).unwrap_or_default() else {
403 return Err(invalid("Tree content must have one active parent"));
404 };
405 id = *parent;
406 }
407 Ok(path)
408}
409
410#[cfg(test)]
411mod tests {
412 use super::*;
413 use crate::{Insertion, PreparedEdit};
414
415 #[test]
416 fn a_retained_move_intent_can_reuse_its_immutable_author_after_another_move() {
417 let source = crate::create_section("move.one", "First", "Author").unwrap();
418 let store = Store::parse(&source).unwrap();
419 let index = RevisionIndex::parse(&store).unwrap();
420 let document = Document::parse(&index).unwrap();
421 let (sid, page) = document.pages().unwrap()[0];
422 let space = &document.spaces[&sid];
423 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
424 let outline = *view.nodes[&page]
425 .children
426 .iter()
427 .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
428 .unwrap();
429 let first = view.nodes[&outline].children[0];
430 let second = Insertion::paragraph(outline, None, "Second", "Author").unwrap();
431 let source = PreparedEdit::insert(&source, sid, &second)
432 .unwrap()
433 .as_bytes()
434 .to_vec();
435 let retained = TreeEdit::move_to(first, outline, None, "Tree author").unwrap();
436 let moved = PreparedEdit::tree(&source, sid, &retained).unwrap();
437 let reversed =
438 TreeEdit::move_to(first, outline, Some(second.object()), "Tree author").unwrap();
439 let reversed = PreparedEdit::tree(moved.as_bytes(), sid, &reversed).unwrap();
440 let repeated = PreparedEdit::tree(reversed.as_bytes(), sid, &retained).unwrap();
441 let store = Store::parse(repeated.as_bytes()).unwrap();
442 let index = RevisionIndex::parse(&store).unwrap();
443 let document = Document::parse(&index).unwrap();
444 let space = &document.spaces[&sid];
445 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
446 assert_eq!(view.nodes[&outline].children, [second.object(), first]);
447 assert_eq!(
448 view.nodes[&first].latest_author,
449 Some(ExGuid {
450 guid: retained.guid,
451 n: 3
452 })
453 );
454 }
455
456 #[test]
457 fn group_normalization_preserves_unequal_indentation_and_overlapping_moves() {
458 let source = crate::create_section("groups.one", "First", "Author").unwrap();
459 let store = Store::parse(&source).unwrap();
460 let index = RevisionIndex::parse(&store).unwrap();
461 let document = Document::parse(&index).unwrap();
462 let (sid, page) = document.pages().unwrap()[0];
463 let space = &document.spaces[&sid];
464 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
465 let outline = *view.nodes[&page]
466 .children
467 .iter()
468 .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
469 .unwrap();
470 let first = view.nodes[&outline].children[0];
471 let second = Insertion::paragraph(outline, None, "Second", "Author").unwrap();
472 let third = Insertion::paragraph(outline, None, "Third", "Author").unwrap();
473 let source = PreparedEdit::insert(&source, sid, &second)
474 .unwrap()
475 .as_bytes()
476 .to_vec();
477 let source = PreparedEdit::insert(&source, sid, &third)
478 .unwrap()
479 .as_bytes()
480 .to_vec();
481 let guid = fresh_guid().unwrap();
482 let a = ExGuid { guid, n: 1 };
483 let b = ExGuid { guid, n: 2 };
484 let source = write_revision(&source, sid, |raw| {
485 let mut changed = BTreeMap::new();
486 for (id, child, level) in [(a, first, 2), (b, second.object(), 1)] {
487 let mut group = PropertyObject {
488 jcid: 0x60019,
489 bytes: properties(&[(0x0c001c03, vec![level])])?,
490 global_ids: Arc::new(BTreeMap::from([(0, guid)])),
491 };
492 let reference = group.reference(child)?;
493 group.set(&[(0x24001c20, &reference)])?;
494 changed.insert(id, group);
495 }
496 let mut object = PropertyObject::from_object(&raw.objects[&outline])?;
497 let mut references = Vec::new();
498 for id in [a, b, third.object()] {
499 references.extend_from_slice(&object.reference(id)?);
500 }
501 object.set(&[(0x24001c20, &references)])?;
502 changed.insert(outline, object);
503 Ok(changed)
504 })
505 .unwrap();
506 for moving in [false, true] {
507 let intent = if moving {
508 TreeEdit::move_to(third.object(), a, Some(first), "Author")
509 } else {
510 TreeEdit::delete(third.object(), "Author")
511 }
512 .unwrap();
513 let edit = PreparedEdit::tree(&source, sid, &intent).unwrap();
514 let store = Store::parse(edit.as_bytes()).unwrap();
515 let index = RevisionIndex::parse(&store).unwrap();
516 index.validate_current().unwrap();
517 let document = Document::parse(&index).unwrap();
518 let space = &document.spaces[&sid];
519 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
520 assert_eq!(view.nodes[&outline].children, [a, second.object()]);
521 assert_eq!(view.nodes[&outline].child_level, Some(2));
522 assert_eq!(view.nodes[&a].child_level, Some(1));
523 assert_eq!(
524 view.nodes[&a].children,
525 if moving {
526 vec![third.object(), first]
527 } else {
528 vec![first]
529 }
530 );
531 if !moving && let Some(output) = std::env::var_os("ONESTORE_TREE_OUTPUT") {
532 let output = std::path::PathBuf::from(output).join("unequal-groups");
533 assert!(output.is_absolute());
534 std::fs::create_dir_all(output.parent().unwrap()).unwrap();
535 std::fs::create_dir(&output).unwrap();
536 std::fs::write(output.join("groups.one"), edit.as_bytes()).unwrap();
537 }
538 }
539 }
540
541 #[test]
542 fn protected_descendants_and_ambiguous_parents_reject_before_publication() {
543 let source = crate::create_section("protected.one", "Text", "Author").unwrap();
544 let store = Store::parse(&source).unwrap();
545 let index = RevisionIndex::parse(&store).unwrap();
546 let document = Document::parse(&index).unwrap();
547 let (sid, page) = document.pages().unwrap()[0];
548 let space = &document.spaces[&sid];
549 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
550 let outline = *view.nodes[&page]
551 .children
552 .iter()
553 .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
554 .unwrap();
555 let paragraph = view.nodes[&outline].children[0];
556 let text = view.nodes[&paragraph].content[0];
557 let deletion = TreeEdit::delete(paragraph, "Author").unwrap();
558 for target in [page, outline, paragraph, text] {
559 for property in [0x08001cde, 0x08001cb4, 0x08001cf9, 0x08001cb2] {
560 for enabled in [false, true] {
561 let bytes = write_revision(&source, sid, |raw| {
562 let mut object = PropertyObject::from_object(&raw.objects[&target])?;
563 object.set(&[(property | (u32::from(enabled) << 31), &[])])?;
564 Ok(BTreeMap::from([(target, object)]))
565 })
566 .unwrap();
567 assert_eq!(
568 PreparedEdit::tree(&bytes, sid, &deletion).is_err(),
569 enabled,
570 "{target}: {property:#x}"
571 );
572 }
573 }
574 }
575 for protected in [outline, paragraph, text] {
576 let bytes = write_revision(&source, sid, |raw| {
577 let mut object = PropertyObject::from_object(&raw.objects[&protected])?;
578 object.set(&[(0x08001d0c, &[])])?;
579 Ok(BTreeMap::from([(protected, object)]))
580 })
581 .unwrap();
582 assert!(PreparedEdit::tree(&bytes, sid, &deletion).is_err());
583 }
584 let bytes = write_revision(&source, sid, |raw| {
585 let mut object = PropertyObject::from_object(&raw.objects[&outline])?;
586 let reference = object.reference(paragraph)?;
587 object.set(&[(0x24001c20, &reference.repeat(2))])?;
588 Ok(BTreeMap::from([(outline, object)]))
589 })
590 .unwrap();
591 assert!(PreparedEdit::tree(&bytes, sid, &deletion).is_err());
592 let mut value = serde_json::to_value(&deletion).unwrap();
593 value["guid"] = serde_json::to_value([0_u8; 16]).unwrap();
594 let restored = serde_json::from_value(value).unwrap();
595 assert!(PreparedEdit::tree(&source, sid, &restored).is_err());
596 }
597}
crates/onestore/tests/support/tree_model.rs created+364
...@@ -0,0 +1,364 @@
1use onestore::{
2 CommitState, ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, TreeEdit,
3 document::{Document, Kind, Revision},
4};
5use std::{
6 collections::{BTreeMap, BTreeSet},
7 sync::LazyLock,
8};
9
10use crate::{current, disk};
11
12static SOURCE: LazyLock<Vec<u8>> = LazyLock::new(|| {
13 let mut source = onestore::create_section("tree.one", "Original", "Author").unwrap();
14 let store = Store::parse(&source).unwrap();
15 let index = RevisionIndex::parse(&store).unwrap();
16 let document = Document::parse(&index).unwrap();
17 let (sid, page) = document.pages().unwrap()[0];
18 let space = &document.spaces[&sid];
19 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
20 let outline = *view.nodes[&page]
21 .children
22 .iter()
23 .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
24 .unwrap();
25 let other = Insertion::outline(page, 360.0, 72.0, "Other", "Author").unwrap();
26 source = PreparedEdit::insert(&source, sid, &other)
27 .unwrap()
28 .as_bytes()
29 .to_vec();
30 for parent in [outline, other.object()] {
31 for text in ["First 🦀 é", "Second 東京", "Third"] {
32 let insertion = Insertion::paragraph(parent, None, text, "Author").unwrap();
33 source = PreparedEdit::insert(&source, sid, &insertion)
34 .unwrap()
35 .as_bytes()
36 .to_vec();
37 let child = Insertion::paragraph(insertion.object(), None, "Child", "Author").unwrap();
38 source = PreparedEdit::insert(&source, sid, &child)
39 .unwrap()
40 .as_bytes()
41 .to_vec();
42 }
43 }
44 source
45});
46
47fn forest(view: &Revision<'_>, root: ExGuid) -> BTreeMap<ExGuid, (ExGuid, u32, usize)> {
48 let mut positions = BTreeMap::new();
49 let mut pending = vec![(root, root, 0)];
50 while let Some((id, mut scope, mut level)) = pending.pop() {
51 let node = &view.nodes[&id];
52 if matches!(node.kind, Kind::Outline { .. } | Kind::Cell { .. }) {
53 scope = id;
54 level = 0;
55 }
56 assert!(
57 positions
58 .insert(id, (scope, level, positions.len()))
59 .is_none()
60 );
61 pending.extend(
62 node.children
63 .iter()
64 .rev()
65 .map(|id| (*id, scope, level + u32::from(node.child_level.unwrap_or(1)))),
66 );
67 pending.extend(node.content.iter().rev().map(|id| (*id, scope, level)));
68 }
69 positions
70}
71
72pub fn run(input: &[u8]) {
73 let Some((&selector, input)) = input.split_first() else {
74 return;
75 };
76 let source = if selector & 1 == 0 {
77 SOURCE.as_slice()
78 } else {
79 include_bytes!("../../../../corpus/outline-edit/tree/before/notebook/synthetic.one")
80 };
81 let mut persisted = source.to_vec();
82 let mut clients = vec![persisted.clone(); 12];
83 for step in input.chunks_exact(10).take(36) {
84 let client = usize::from(step[0]) % clients.len();
85 if step[1] & 1 != 0 {
86 clients[client] = persisted.clone();
87 }
88 let source = &clients[client];
89 let store = Store::parse(source).unwrap();
90 let index = RevisionIndex::parse(&store).unwrap();
91 let document = Document::parse(&index).unwrap();
92 let pages = document.pages().unwrap();
93 let (sid, page) = pages[usize::from(step[2]) % pages.len()];
94 let space = &document.spaces[&sid];
95 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
96 let before = forest(view, page);
97 let mut targets: Vec<_> = before
98 .keys()
99 .copied()
100 .filter(|id| {
101 matches!(
102 view.nodes[id].kind,
103 Kind::Paragraph { .. } | Kind::Outline { .. }
104 )
105 })
106 .collect();
107 targets.sort_by_key(|id| before[id].2);
108 if targets.is_empty() {
109 continue;
110 }
111 let target = targets[usize::from(step[3]) % targets.len()];
112 let subtree = forest(view, target);
113 let parents: BTreeMap<_, _> = before
114 .keys()
115 .flat_map(|id| view.nodes[id].children.iter().map(|child| (*child, *id)))
116 .collect();
117 let parent = parents[&target];
118 let deleting = step[1] & 6 == 0;
119 let mut expected: BTreeMap<_, _> = before
120 .iter()
121 .filter_map(|(id, pos)| {
122 matches!(view.nodes[id].kind, Kind::Paragraph { .. })
123 .then_some((*id, (pos.0, pos.1)))
124 })
125 .collect();
126 let mut ordered: Vec<_> = expected.keys().copied().collect();
127 ordered.sort_by_key(|id| before[id].2);
128 let mut expected_order = BTreeMap::<_, Vec<_>>::new();
129 for id in ordered {
130 expected_order.entry(before[&id].0).or_default().push(id);
131 }
132 let intent;
133 let mut reversal = None;
134 let edit = if deleting {
135 expected.retain(|id, _| !subtree.contains_key(id));
136 for ids in expected_order.values_mut() {
137 ids.retain(|id| !subtree.contains_key(id));
138 }
139 intent = TreeEdit::delete(target, "Tree schedule").unwrap();
140 PreparedEdit::tree(source, sid, &intent)
141 } else {
142 let mut destinations: Vec<_> = before
143 .keys()
144 .copied()
145 .filter(|id| {
146 if matches!(view.nodes[&target].kind, Kind::Outline { .. }) {
147 *id == page
148 } else {
149 matches!(
150 view.nodes[id].kind,
151 Kind::Outline { .. }
152 | Kind::OutlineGroup
153 | Kind::Paragraph { .. }
154 | Kind::Cell { .. }
155 )
156 }
157 })
158 .collect();
159 destinations.sort_by_key(|id| before[id].2);
160 if destinations.is_empty() {
161 continue;
162 }
163 let destination = destinations[usize::from(step[4]) % destinations.len()];
164 let children = &view.nodes[&destination].children;
165 let anchor = children
166 .get(usize::from(step[5]) % (children.len() + 1))
167 .copied();
168 intent = TreeEdit::move_to(target, destination, anchor, "Tree schedule").unwrap();
169 let edit = PreparedEdit::tree(source, sid, &intent);
170 if subtree.contains_key(&destination) {
171 assert!(edit.is_err());
172 continue;
173 }
174 if destination == parent && step[9] & 3 == 0 {
175 let original = &view.nodes[&parent].children;
176 let next = original.iter().position(|id| *id == target).unwrap() + 1;
177 reversal = Some(
178 TreeEdit::move_to(target, parent, original.get(next).copied(), "Tree schedule")
179 .unwrap(),
180 );
181 }
182 if matches!(view.nodes[&target].kind, Kind::Paragraph { .. }) {
183 let (scope, base, _) = before[&destination];
184 let level = base + u32::from(view.nodes[&destination].child_level.unwrap_or(1));
185 let (old_scope, old_level, _) = before[&target];
186 if anchor != Some(target) {
187 let moved: Vec<_> = expected_order[&old_scope]
188 .iter()
189 .copied()
190 .filter(|id| subtree.contains_key(id))
191 .collect();
192 expected_order
193 .get_mut(&old_scope)
194 .unwrap()
195 .retain(|id| !subtree.contains_key(id));
196 let boundary = anchor.map(|id| before[&id].2).unwrap_or_else(|| {
197 forest(view, destination)
198 .keys()
199 .map(|id| before[id].2)
200 .max()
201 .unwrap()
202 + 1
203 });
204 let sequence = expected_order.entry(scope).or_default();
205 let position = sequence
206 .iter()
207 .position(|id| before[id].2 >= boundary)
208 .unwrap_or(sequence.len());
209 sequence.splice(position..position, moved);
210 }
211 for (id, pos) in &mut expected {
212 if subtree.contains_key(id) && pos.0 == old_scope {
213 *pos = (scope, level + pos.1 - old_level);
214 }
215 }
216 }
217 edit
218 };
219 let restored = serde_json::from_value(serde_json::to_value(&intent).unwrap()).unwrap();
220 assert_eq!(intent, restored);
221 let edit = match edit {
222 Ok(edit) => edit,
223 Err(error)
224 if error.message
225 == "Removing this group would exceed 31 child indentation levels" =>
226 {
227 continue;
228 }
229 Err(error) => panic!("{intent:?}: {error:?}"),
230 };
231 let after_store = Store::parse(edit.as_bytes()).unwrap();
232 let after_index = RevisionIndex::parse(&after_store).unwrap();
233 after_index.validate_current().unwrap();
234 let after_document = Document::parse(&after_index).unwrap();
235 let space = &after_document.spaces[&sid];
236 let after = &space.revisions[&space.contexts[&ExGuid::default()]];
237 let actual = forest(after, page);
238 let mut added = BTreeSet::new();
239 for (id, pos) in &actual {
240 let node = &after.nodes[id];
241 if let Kind::Paragraph { .. } = node.kind {
242 if let Some(wanted) = expected.remove(id) {
243 assert_eq!((pos.0, pos.1), wanted, "{intent:?}: {id}");
244 } else {
245 assert!(!before.contains_key(id));
246 assert!(matches!(view.nodes[&parent].kind, Kind::Cell { .. }));
247 assert_eq!(view.nodes[&parent].children, [target]);
248 assert_eq!(node.children.len(), 0);
249 assert_eq!(node.content.len(), 1);
250 assert!(node.tags.is_empty());
251 assert!(
252 matches!(&after.nodes[&node.content[0]].kind,Kind::RichText{text,..} if text.is_empty())
253 );
254 added.insert(*id);
255 }
256 }
257 if before.contains_key(id) {
258 assert_eq!(node.content, view.nodes[id].content);
259 let mut expected_kind = serde_json::to_value(&view.nodes[id].kind).unwrap();
260 if *id == page && expected_kind["alternate_title"].is_string() {
261 let mut roots = after.nodes[&page].children.clone();
262 roots.sort_by(|a, b| {
263 let a = &after.nodes[a].layout;
264 let b = &after.nodes[b].layout;
265 a.y.unwrap_or(0.0)
266 .total_cmp(&b.y.unwrap_or(0.0))
267 .then_with(|| a.x.unwrap_or(0.0).total_cmp(&b.x.unwrap_or(0.0)))
268 });
269 let mut title = String::new();
270 for root in roots {
271 let mut nodes: Vec<_> = forest(after, root).into_iter().collect();
272 nodes.sort_by_key(|(_, pos)| pos.2);
273 for (id, _) in nodes {
274 if let Kind::RichText { text, .. } = &after.nodes[&id].kind {
275 title = text
276 .trim_start()
277 .split('\r')
278 .next()
279 .unwrap()
280 .trim_end()
281 .to_owned();
282 if !title.is_empty() {
283 break;
284 }
285 }
286 }
287 if !title.is_empty() {
288 break;
289 }
290 }
291 expected_kind["alternate_title"] = title.into();
292 let Kind::Metadata { title, .. } = &after.nodes[&after.roots[&2]].kind else {
293 panic!()
294 };
295 assert_eq!(title.as_deref(), expected_kind["alternate_title"].as_str());
296 }
297 assert_eq!(serde_json::to_value(&node.kind).unwrap(), expected_kind);
298 assert_eq!(
299 serde_json::to_value(&node.tags).unwrap(),
300 serde_json::to_value(&view.nodes[id].tags).unwrap()
301 );
302 }
303 if matches!(
304 node.kind,
305 Kind::Outline { .. } | Kind::OutlineGroup | Kind::Cell { .. }
306 ) {
307 assert!(
308 node.children
309 .iter()
310 .any(|id| matches!(after.nodes[id].kind, Kind::Paragraph { .. }))
311 );
312 }
313 }
314 assert!(expected.is_empty());
315 assert!(added.len() <= 1);
316 let mut ordered: Vec<_> = actual
317 .iter()
318 .filter(|(id, _)| {
319 matches!(after.nodes[id].kind, Kind::Paragraph { .. }) && !added.contains(id)
320 })
321 .collect();
322 ordered.sort_by_key(|(_, pos)| pos.2);
323 let mut actual_order = BTreeMap::<_, Vec<_>>::new();
324 for (id, pos) in ordered {
325 actual_order.entry(pos.0).or_default().push(*id);
326 }
327 expected_order.retain(|_, ids| !ids.is_empty());
328 assert_eq!(actual_order, expected_order, "{intent:?}");
329 if let Some(reversal) = reversal {
330 let reversed = PreparedEdit::tree(edit.as_bytes(), sid, &reversal).unwrap();
331 let replayed = PreparedEdit::tree(reversed.as_bytes(), sid, &intent).unwrap();
332 let store = Store::parse(replayed.as_bytes()).unwrap();
333 let index = RevisionIndex::parse(&store).unwrap();
334 let document = Document::parse(&index).unwrap();
335 let space = &document.spaces[&sid];
336 let replayed = &space.revisions[&space.contexts[&ExGuid::default()]];
337 assert_eq!(forest(replayed, page), actual);
338 }
339 let before = current::current(&persisted);
340 let after = current::current(edit.as_bytes());
341 let mut disk = disk::Disk {
342 visible: persisted.clone(),
343 durable: persisted.clone(),
344 operation: 0,
345 fail_at: (step[6] != 0).then_some(usize::from(u16::from_le_bytes([step[6], step[7]]))),
346 write_limit: if step[8] & 1 == 0 { 17 } else { 4096 },
347 random: u64::from(step[9]) + 1,
348 };
349 let result = edit.commit(&mut disk);
350 let actual = current::current(&disk.durable);
351 match result {
352 Ok(()) => assert_eq!(actual, after),
353 Err(error) => {
354 assert!(actual == before || actual == after);
355 match error.state {
356 CommitState::NotCommitted => assert_eq!(actual, before),
357 CommitState::Committed => assert_eq!(actual, after),
358 CommitState::Unknown => {}
359 }
360 }
361 }
362 persisted = disk.durable;
363 }
364}
crates/onestore/tests/tree.rs created+520
...@@ -0,0 +1,520 @@
1use onestore::{
2 ExGuid, PreparedEdit, RevisionIndex, Store, TreeEdit,
3 document::{Document, Kind, Revision},
4};
5use std::collections::{BTreeMap, BTreeSet};
6
7#[path = "support/current.rs"]
8mod current;
9#[path = "support/disk.rs"]
10mod disk;
11#[path = "support/tree_model.rs"]
12mod tree_model;
13
14const FIXTURES: [(&[u8], &[u8]); 2] = [
15 (
16 include_bytes!("../../../corpus/outline-edit/before/notebook/synthetic.one"),
17 include_bytes!("../../../corpus/outline-edit/after/notebook/synthetic.one"),
18 ),
19 (
20 include_bytes!("../../../corpus/outline-edit/tree/before/notebook/synthetic.one"),
21 include_bytes!("../../../corpus/outline-edit/tree/after/notebook/synthetic.one"),
22 ),
23];
24
25#[test]
26fn twelve_client_tree_schedules_preserve_content_and_indentation() {
27 let mut random = 1932_u64;
28 for _ in 0..80 {
29 let input: Vec<_> = (0..241)
30 .map(|_| {
31 random ^= random << 13;
32 random ^= random >> 7;
33 random ^= random << 17;
34 random as u8
35 })
36 .collect();
37 tree_model::run(&input);
38 }
39}
40
41fn active(view: &Revision<'_>, page: ExGuid) -> BTreeSet<ExGuid> {
42 let mut pending = vec![page];
43 let mut ids = BTreeSet::new();
44 while let Some(id) = pending.pop() {
45 assert!(ids.insert(id), "Repeated active identity: {id}");
46 let node = &view.nodes[&id];
47 pending.extend(
48 node.children
49 .iter()
50 .chain(&node.content)
51 .chain(&node.structure)
52 .copied(),
53 );
54 }
55 ids
56}
57
58fn operation(view: &Revision<'_>, page: ExGuid) -> Option<(String, ExGuid, TreeEdit)> {
59 let Kind::Metadata {
60 title: Some(name), ..
61 } = &view.nodes[&view.roots[&2]].kind
62 else {
63 panic!()
64 };
65 let ids = active(view, page);
66 let paragraphs: BTreeMap<_, _> = ids
67 .iter()
68 .filter_map(|id| {
69 let node = &view.nodes[id];
70 let text = node.content.first()?;
71 match &view.nodes[text].kind {
72 Kind::RichText { text, .. } if matches!(node.kind, Kind::Paragraph { .. }) => {
73 Some((text.as_str(), *id))
74 }
75 _ => None,
76 }
77 })
78 .collect();
79 let target = *paragraphs
80 .iter()
81 .find(|(text, _)| text.starts_with("Target "))?
82 .1;
83 let outline = *view.nodes[&page]
84 .children
85 .iter()
86 .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
87 .unwrap();
88 let parent = *ids
89 .iter()
90 .find(|id| view.nodes[id].children.contains(&target))
91 .unwrap();
92 let edit = match name.as_str() {
93 "Delete outline" => TreeEdit::delete(outline, "Tree author"),
94 name if name.starts_with("Delete") => TreeEdit::delete(target, "Tree author"),
95 "Move leaf down"
96 | "Move subtree down"
97 | "Move numbered subtree down"
98 | "Move cell subtree down" => TreeEdit::move_to(target, parent, None, "Tree author"),
99 "Move subtree up" => {
100 TreeEdit::move_to(target, parent, Some(paragraphs["Anchor"]), "Tree author")
101 }
102 "Indent subtree" | "Indent bullet subtree" => {
103 TreeEdit::move_to(target, paragraphs["Anchor"], None, "Tree author")
104 }
105 "Outdent subtree" | "Outdent first group" => TreeEdit::move_to(
106 target,
107 outline,
108 Some(paragraphs["Trailing sibling"]),
109 "Tree author",
110 ),
111 _ => return None,
112 }
113 .unwrap();
114 Some((
115 name.clone(),
116 if name == "Delete outline" {
117 outline
118 } else {
119 target
120 },
121 edit,
122 ))
123}
124
125#[test]
126fn native_subtree_controls_match_with_preserved_fields_and_history() {
127 let mut count = 0;
128 for (source, native) in FIXTURES {
129 let store = Store::parse(source).unwrap();
130 let index = RevisionIndex::parse(&store).unwrap();
131 let document = Document::parse(&index).unwrap();
132 let native_store = Store::parse(native).unwrap();
133 let native_index = RevisionIndex::parse(&native_store).unwrap();
134 let native_document = Document::parse(&native_index).unwrap();
135 let mut candidate = source.to_vec();
136 for (sid, page) in document.pages().unwrap() {
137 let space = &document.spaces[&sid];
138 let before = &space.revisions[&space.contexts[&ExGuid::default()]];
139 let Some((name, object, edit)) = operation(before, page) else {
140 continue;
141 };
142 let restored = serde_json::from_value(serde_json::to_value(&edit).unwrap()).unwrap();
143 assert_eq!(edit, restored);
144 let prepared = PreparedEdit::tree(source, sid, &restored).unwrap();
145 let after_store = Store::parse(prepared.as_bytes()).unwrap();
146 assert!(after_store.checksum_mismatches.is_empty());
147 let after_index = RevisionIndex::parse(&after_store).unwrap();
148 after_index.validate_current().unwrap();
149 let after_document = Document::parse(&after_index).unwrap();
150 let space = &after_document.spaces[&sid];
151 let after = &space.revisions[&space.contexts[&ExGuid::default()]];
152 let space = &native_document.spaces[&sid];
153 let reference = &space.revisions[&space.contexts[&ExGuid::default()]];
154 let old_ids = active(before, page);
155 let actual = active(after, page);
156 let native_ids = active(reference, page);
157 assert_eq!(
158 actual.intersection(&old_ids).collect::<Vec<_>>(),
159 native_ids.intersection(&old_ids).collect::<Vec<_>>(),
160 "{name}"
161 );
162 assert_eq!(actual.len(), native_ids.len(), "{name}");
163 let mut mutable = BTreeSet::new();
164 for view in [before, after] {
165 let ids = active(view, page);
166 if !ids.contains(&object) {
167 continue;
168 }
169 let mut pending = vec![object];
170 while let Some(id) = pending.pop() {
171 mutable.insert(id);
172 pending.extend(
173 ids.iter()
174 .filter(|parent| {
175 view.nodes[parent]
176 .children
177 .iter()
178 .chain(&view.nodes[parent].content)
179 .chain(&view.nodes[parent].structure)
180 .any(|child| *child == id)
181 })
182 .copied(),
183 );
184 }
185 }
186 let mut remap = BTreeMap::new();
187 if name == "Delete sole cell paragraph" {
188 for kind in ["Paragraph", "RichText"] {
189 let selected = |view: &Revision<'_>, ids: &BTreeSet<ExGuid>| {
190 *ids.difference(&old_ids)
191 .find(|id| {
192 serde_json::to_value(&view.nodes[id].kind).unwrap()["type"] == kind
193 })
194 .unwrap()
195 };
196 remap.insert(selected(reference, &native_ids), selected(after, &actual));
197 }
198 }
199 for id in &actual {
200 let reference_id = remap
201 .iter()
202 .find_map(|(a, b)| (b == id).then_some(*a))
203 .unwrap_or(*id);
204 let wanted = &reference.nodes[&reference_id];
205 let node = &after.nodes[id];
206 for (a, b) in [
207 (&node.children, &wanted.children),
208 (&node.content, &wanted.content),
209 (&node.structure, &wanted.structure),
210 ] {
211 assert_eq!(
212 *a,
213 b.iter()
214 .map(|id| remap.get(id).copied().unwrap_or(*id))
215 .collect::<Vec<_>>(),
216 "{name}: {id}"
217 );
218 }
219 if !node.children.is_empty() {
220 assert_eq!(node.child_level, wanted.child_level, "{name}: {id}");
221 }
222 if old_ids.contains(id) {
223 let old = &before.nodes[id];
224 let mut expected = serde_json::to_value(old).unwrap();
225 let mut actual = serde_json::to_value(node).unwrap();
226 expected["children"] = actual["children"].clone();
227 if !node.children.is_empty() {
228 expected["child_level"] = actual["child_level"].clone();
229 }
230 if mutable.contains(id)
231 || node.child_level != old.child_level
232 || node.children != old.children
233 {
234 assert!(node.modified >= old.modified);
235 expected["modified"] = actual["modified"].clone();
236 }
237 if *id == object
238 && !name.starts_with("Delete")
239 && matches!(node.kind, Kind::Paragraph { .. })
240 {
241 expected["latest_author"] = actual["latest_author"].clone();
242 assert!(
243 matches!(&after.nodes[&node.latest_author.unwrap()].kind,Kind::Author{name:Some(name)} if name=="Tree author")
244 );
245 }
246 for value in [&mut expected, &mut actual] {
247 value["extra"][0]
248 .as_array_mut()
249 .unwrap()
250 .sort_by_key(|field| field["id"].as_u64().unwrap());
251 }
252 assert_eq!(actual, expected, "{name}: preserved {id}");
253 if matches!(old.kind, Kind::RichText { .. }) {
254 assert_eq!(
255 serde_json::to_value(node).unwrap(),
256 serde_json::to_value(old).unwrap(),
257 "{name}: text {id}"
258 );
259 }
260 assert_eq!(
261 serde_json::to_value(&node.kind).unwrap(),
262 serde_json::to_value(&old.kind).unwrap(),
263 "{name}: kind {id}"
264 );
265 assert_eq!(
266 serde_json::to_value(&node.tags).unwrap(),
267 serde_json::to_value(&old.tags).unwrap(),
268 "{name}: tags {id}"
269 );
270 } else if matches!(node.kind, Kind::RichText { .. }) {
271 assert_eq!(
272 serde_json::to_value(&node.kind).unwrap(),
273 serde_json::to_value(&wanted.kind).unwrap()
274 );
275 }
276 }
277 for (sid, space) in &index.spaces {
278 for rid in space.revisions.keys() {
279 let old = index.resolve(*sid, *rid).unwrap();
280 let retained = after_index.resolve(*sid, *rid).unwrap();
281 assert_eq!(old.roots, retained.roots);
282 for (id, object) in old.objects {
283 assert_eq!(object.data, retained.objects[&id].data);
284 }
285 }
286 }
287 let another = PreparedEdit::tree(source, sid, &edit).unwrap();
288 let second_store = Store::parse(another.as_bytes()).unwrap();
289 let second_index = RevisionIndex::parse(&second_store).unwrap();
290 let second_doc = Document::parse(&second_index).unwrap();
291 let space = &second_doc.spaces[&sid];
292 assert_eq!(
293 actual,
294 active(&space.revisions[&space.contexts[&ExGuid::default()]], page)
295 );
296 candidate = PreparedEdit::tree(&candidate, sid, &edit)
297 .unwrap()
298 .as_bytes()
299 .to_vec();
300 count += 1;
301 }
302 if let Some(output) = std::env::var_os("ONESTORE_TREE_OUTPUT") {
303 let output = std::path::PathBuf::from(output).join(if source == FIXTURES[0].0 {
304 "ordinary"
305 } else {
306 "groups-cells"
307 });
308 assert!(output.is_absolute());
309 std::fs::create_dir_all(&output).unwrap();
310 std::fs::write(output.join("synthetic.one"), candidate).unwrap();
311 }
312 }
313 assert_eq!(count, 18);
314}
315
316#[test]
317fn moves_reject_cycles_wrong_parents_and_stale_siblings() {
318 let source = onestore::create_section("tree.one", "Text", "Author").unwrap();
319 let store = Store::parse(&source).unwrap();
320 let index = RevisionIndex::parse(&store).unwrap();
321 let document = Document::parse(&index).unwrap();
322 let (sid, page) = document.pages().unwrap()[0];
323 let space = &document.spaces[&sid];
324 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
325 let outline = *view.nodes[&page]
326 .children
327 .iter()
328 .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
329 .unwrap();
330 let paragraph = view.nodes[&outline].children[0];
331 let text = view.nodes[&paragraph].content[0];
332 for intent in [
333 TreeEdit::delete(page, "Author"),
334 TreeEdit::delete(text, "Author"),
335 TreeEdit::move_to(outline, paragraph, None, "Author"),
336 TreeEdit::move_to(paragraph, paragraph, None, "Author"),
337 TreeEdit::move_to(paragraph, text, None, "Author"),
338 TreeEdit::move_to(paragraph, outline, Some(page), "Author"),
339 ] {
340 assert!(PreparedEdit::tree(&source, sid, &intent.unwrap()).is_err());
341 }
342 for before in [None, Some(paragraph)] {
343 let edit = TreeEdit::move_to(paragraph, outline, before, "Author").unwrap();
344 assert_eq!(
345 PreparedEdit::tree(&source, sid, &edit).unwrap().as_bytes(),
346 source
347 );
348 }
349}
350
351#[test]
352fn publication_interruptions_expose_complete_old_or_new_trees() {
353 let source = FIXTURES[1].0;
354 let store = Store::parse(source).unwrap();
355 let index = RevisionIndex::parse(&store).unwrap();
356 let document = Document::parse(&index).unwrap();
357 let before = current::current(source);
358 let mut count = 0;
359 for (sid, page) in document.pages().unwrap() {
360 let space = &document.spaces[&sid];
361 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
362 let Some((name, _, intent)) = operation(view, page) else {
363 continue;
364 };
365 if !matches!(
366 name.as_str(),
367 "Delete sole cell paragraph"
368 | "Delete unindented sibling after group"
369 | "Move cell subtree down"
370 ) {
371 continue;
372 }
373 let edit = PreparedEdit::tree(source, sid, &intent).unwrap();
374 let after = current::current(edit.as_bytes());
375 for write_limit in [17, 4096] {
376 let disk = |fail_at| disk::Disk {
377 visible: source.to_vec(),
378 durable: source.to_vec(),
379 operation: 0,
380 fail_at,
381 write_limit,
382 random: 1931,
383 };
384 let mut success = disk(None);
385 edit.commit(&mut success).unwrap();
386 assert_eq!(success.durable, edit.as_bytes());
387 for at in 1..=success.operation {
388 let mut interrupted = disk(Some(at));
389 let failure = edit.commit(&mut interrupted).unwrap_err();
390 let actual = current::current(&interrupted.durable);
391 assert!(actual == before || actual == after, "{name}: {at}");
392 match failure.state {
393 onestore::CommitState::NotCommitted => assert_eq!(actual, before),
394 onestore::CommitState::Committed => assert_eq!(actual, after),
395 onestore::CommitState::Unknown => {}
396 }
397 }
398 }
399 count += 1;
400 }
401 assert_eq!(count, 3);
402}
403
404#[test]
405fn cross_container_moves_keep_tables_and_replace_emptied_cells() {
406 let source = FIXTURES[1].0;
407 let store = Store::parse(source).unwrap();
408 let index = RevisionIndex::parse(&store).unwrap();
409 let document = Document::parse(&index).unwrap();
410 let mut candidate = source.to_vec();
411 let mut count = 0;
412 for (sid, page) in document.pages().unwrap() {
413 let space = &document.spaces[&sid];
414 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
415 let Kind::Metadata {
416 title: Some(name), ..
417 } = &view.nodes[&view.roots[&2]].kind
418 else {
419 panic!()
420 };
421 if !matches!(
422 name.as_str(),
423 "Outdent first group"
424 | "Delete sole cell paragraph"
425 | "Move cell subtree down"
426 | "Delete cell subtree"
427 ) {
428 continue;
429 }
430 let ids = active(view, page);
431 let parents: BTreeMap<_, _> = ids
432 .iter()
433 .flat_map(|id| view.nodes[id].children.iter().map(|child| (*child, *id)))
434 .collect();
435 let target=*ids.iter().find(|id| view.nodes[id].content.first().is_some_and(|text| matches!(&view.nodes[text].kind,Kind::RichText{text,..} if text.starts_with("Target ")))).unwrap();
436 let outlines: Vec<_> = view.nodes[&page]
437 .children
438 .iter()
439 .copied()
440 .filter(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
441 .collect();
442 let cells: Vec<_> = ids
443 .iter()
444 .copied()
445 .filter(|id| matches!(view.nodes[id].kind, Kind::Cell { .. }))
446 .collect();
447 let (object, destination) = match name.as_str() {
448 "Outdent first group" => (*view.nodes[&outlines[0]].children.last().unwrap(), target),
449 "Delete sole cell paragraph" => (
450 target,
451 *cells.iter().find(|id| **id != parents[&target]).unwrap(),
452 ),
453 "Move cell subtree down" => (target, outlines[1]),
454 _ => (view.nodes[&outlines[0]].children[0], outlines[1]),
455 };
456 let intent = TreeEdit::move_to(object, destination, None, "Tree author").unwrap();
457 let edit = PreparedEdit::tree(source, sid, &intent).unwrap();
458 let store = Store::parse(edit.as_bytes()).unwrap();
459 let index = RevisionIndex::parse(&store).unwrap();
460 let document = Document::parse(&index).unwrap();
461 let space = &document.spaces[&sid];
462 let after = &space.revisions[&space.contexts[&ExGuid::default()]];
463 assert_eq!(after.nodes[&destination].children.last(), Some(&object));
464 let actual = active(after, page);
465 for id in ids.intersection(&actual) {
466 let old = &view.nodes[id];
467 let node = &after.nodes[id];
468 assert_eq!(node.content, old.content, "{name}: {id}");
469 assert_eq!(
470 serde_json::to_value(&node.kind).unwrap(),
471 serde_json::to_value(&old.kind).unwrap()
472 );
473 if matches!(
474 node.kind,
475 Kind::RichText { .. } | Kind::Table { .. } | Kind::Row | Kind::Cell { .. }
476 ) {
477 assert_eq!(
478 serde_json::to_value(&node.format).unwrap(),
479 serde_json::to_value(&old.format).unwrap()
480 );
481 assert_eq!(
482 serde_json::to_value(&node.layout).unwrap(),
483 serde_json::to_value(&old.layout).unwrap()
484 );
485 }
486 }
487 match name.as_str() {
488 "Outdent first group" => {
489 assert_eq!(after.nodes[&outlines[0]].children, [target]);
490 assert_eq!(after.nodes[&outlines[0]].child_level, Some(2));
491 assert!(!actual.contains(&parents[&target]));
492 }
493 "Delete sole cell paragraph" => {
494 let old_cell = parents[&target];
495 let replacement = after.nodes[&old_cell].children[0];
496 assert!(!ids.contains(&replacement));
497 assert_eq!(after.nodes[&old_cell].children.len(), 1);
498 let text = after.nodes[&replacement].content[0];
499 assert!(
500 matches!(&after.nodes[&text].kind,Kind::RichText{text,..} if text.is_empty())
501 );
502 }
503 "Delete cell subtree" => assert!(!actual.contains(&outlines[0])),
504 _ => assert_eq!(after.nodes[&parents[&target]].children.len(), 1),
505 }
506 candidate = PreparedEdit::tree(&candidate, sid, &intent)
507 .unwrap()
508 .as_bytes()
509 .to_vec();
510 count += 1;
511 }
512 assert_eq!(count, 4);
513 if let Some(output) = std::env::var_os("ONESTORE_TREE_OUTPUT") {
514 let output = std::path::PathBuf::from(output).join("cross-container");
515 assert!(output.is_absolute());
516 std::fs::create_dir_all(output.parent().unwrap()).unwrap();
517 std::fs::create_dir(&output).unwrap();
518 std::fs::write(output.join("synthetic.one"), candidate).unwrap();
519 }
520}
fuzz/Cargo.toml+7
...@@ -100,3 +100,10 @@ path = "fuzz_targets/offline_paragraph.rs"...@@ -100,3 +100,10 @@ path = "fuzz_targets/offline_paragraph.rs"
100test = false100test = false
101doc = false101doc = false
102bench = false102bench = false
103
104[[bin]]
105name = "tree"
106path = "fuzz_targets/tree.rs"
107test = false
108doc = false
109bench = false
fuzz/fuzz_targets/tree.rs created+11
...@@ -0,0 +1,11 @@
1#![no_main]
2use libfuzzer_sys::fuzz_target;
3
4#[path = "../../crates/onestore/tests/support/current.rs"]
5mod current;
6#[path = "../../crates/onestore/tests/support/disk.rs"]
7mod disk;
8#[path = "../../crates/onestore/tests/support/tree_model.rs"]
9mod tree_model;
10
11fuzz_target!(|input: &[u8]| tree_model::run(input));
tools/test_outline_edit.py+30
...@@ -19,6 +19,36 @@ compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare']...@@ -19,6 +19,36 @@ compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare']
1919
2020
21class OutlineEditTest(unittest.TestCase):21class OutlineEditTest(unittest.TestCase):
22 def test_rust_subtree_moves_and_deletions_survive_cold_native_reopen(self):
23 for name, pages in [('ordinary', 15), ('groups-cells', 12), ('cross-container', 12), ('unequal-groups', 1)]:
24 fixture = FIXTURE / 'rust-tree' / name
25 with self.subTest(case=name), TemporaryDirectory() as temporary:
26 models = {}
27 for phase, notebook in [('candidate', fixture / 'candidate'), ('cold', fixture / 'cold/notebook')]:
28 folder = Path(temporary) / phase
29 shutil.copytree(fixture / 'cold/read', folder / 'read')
30 compare(notebook, folder / 'read')
31 section, = notebook.glob('*.one')
32 subprocess.run([EXPORTER, section, folder / 'model'], check=True)
33 model = json.loads((folder / 'model/document.json').read_text())
34 models[phase] = {sid: (r, page) for sid, _, r, page in ordered_pages(model)}
35 self.assertEqual(len(models[phase]), pages)
36 self.assertEqual(models['candidate'].keys(), models['cold'].keys())
37 for sid, (old, page) in models['candidate'].items():
38 saved, saved_page = models['cold'][sid]
39 self.assertEqual(page, saved_page)
40 self.assertEqual(dict(walk(old, page)), dict(walk(saved, page)))
41 self.assertEqual(old['nodes'][old['roots']['2']]['kind'], saved['nodes'][saved['roots']['2']]['kind'])
42 for _, node in walk(old, page):
43 for oid in node['kind'].get('lists', []):
44 self.assertEqual(old['nodes'][oid], saved['nodes'][oid])
45 if name == 'unequal-groups':
46 capture, = (fixture / 'cold/read').glob('page-*.xml')
47 root = ET.parse(capture).getroot()
48 self.assertEqual([(group.get('indent'), ''.join(Text(group.find('one:OE/one:T', ns).text or '').parts))
49 for group in root.findall('one:Outline/one:OEChildren', ns)],
50 [('3', 'First'), ('2', 'Second')])
51
22 def test_native_group_list_and_cell_tree_controls(self):52 def test_native_group_list_and_cell_tree_controls(self):
23 fixture = FIXTURE / 'tree'53 fixture = FIXTURE / 'tree'
24 models = {}54 models = {}