authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-08 13:50:06-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-08 13:50:06-07:00
logfa4842b0710f130a915f5ae0cea755b17503825f
tree16615ac2372c4f48e6f1bd565598b8745679d162
parentc3891b37112bb60d6f963ef3adae5a1f5c3e5e73
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU

feat: reconcile offline subtree moves and deletion

Queue stable tree intents with observed placement, raw deletion fingerprints and replacement identities. Preserve independent remote content, require explicit review for changed deletion targets, and retain uncertain revision evidence across retries and recovery export. Migrate caches to schema eight without dropping queued work or receipts. Validated with 95 offline tests, 144 Python tests, 60 seeded twelve-client schedules and 802 ASan schedules. Three cold OneNote captures retain all 793 active objects across 39 pages. iPhone and Simulator checks with SMB, workspace Clippy and example builds pass. Assisted-by: gpt-6-astra

93 files changed, 1847 insertions(+), 15 deletions(-)

corpus/outline-edit/README.md+18
......@@ -128,3 +128,21 @@ plus the `tree::tests::group_normalization_preserves_unequal_indentation_and_ove
128128unit test. Cold-open the resulting `ordinary`, `groups-cells`, `cross-container`
129129and `unequal-groups` notebooks with expected page counts 15, 12, 12 and 1,
130130respectively, using `tools/native_runner.py --collect-notebook`.
131
132`offline-tree` reconciles moves/deletions and dependent text edits against the
133fourteen ordinary native controls. Three already-converged moves confirm without
134publication, seven competing structure/content changes require explicit review,
135and four deleted targets retain the complete local branch. The cold capture
136preserves all 247 active graph objects across fifteen pages, three tags, and
1376,497 explicit character-format comparisons per image. Its `cases.json` records
138the native input cases and outcomes. Regenerate with the offline sync test
139`native_tree_and_layout_changes_reconcile_without_discarding_unreviewed_content`,
140setting `ONESTORE_OFFLINE_TREE_OUTPUT` to a new absolute directory, then cold-open
141its `candidate` with `--expected-pages 15 --collect-notebook`.
142
143Its `cell-delete` and `cell-move` captures additionally verify local edits to an
144emptied cell's replacement paragraph while preserving remote text in the other
145cell. They retain 272 and 274 active objects, respectively, with 8,201 and 8,377
146explicit format comparisons per image. Regenerate with the offline sync test
147`emptied_cell_replacement_is_durable_and_cannot_be_silently_omitted_on_replay`,
148using the same output variable; cold-open each candidate with twelve expected pages.
corpus/outline-edit/offline-tree/candidate/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/offline-tree/candidate/synthetic.one differ
corpus/outline-edit/offline-tree/cases.json created+72
......@@ -0,0 +1,72 @@
1[
2 {
3 "page": "Move leaf down",
4 "result": "converged",
5 "space": "{B7267338-BF83-0893-27A7-37F606DD20C8},1"
6 },
7 {
8 "page": "Move subtree down",
9 "result": "converged",
10 "space": "{9B80D7CA-18B4-02B0-1E85-6E8AA0DAD827},1"
11 },
12 {
13 "page": "Move subtree up",
14 "result": "converged",
15 "space": "{7538095C-389B-07D8-2991-B2BC46EBD52A},1"
16 },
17 {
18 "page": "Indent subtree",
19 "result": "reviewed",
20 "space": "{651463E3-C768-0C93-363D-FCE642B07408},1"
21 },
22 {
23 "page": "Outdent subtree",
24 "result": "reviewed",
25 "space": "{8384083C-60ED-0F7C-2F15-8B20B878B3EB},1"
26 },
27 {
28 "page": "Collapse subtree",
29 "result": "reviewed",
30 "space": "{FF88B513-029C-00E2-0082-9E3DCE1D7796},1"
31 },
32 {
33 "page": "Expand subtree",
34 "result": "reviewed",
35 "space": "{850B34E4-D62A-042B-138A-B2A905CEE28E},1"
36 },
37 {
38 "page": "Delete leaf",
39 "result": "retained",
40 "space": "{363FE055-44E1-0B27-14A8-46278FD681FF},1"
41 },
42 {
43 "page": "Delete subtree",
44 "result": "retained",
45 "space": "{8BBAD88F-D248-0959-00B3-2438A7065330},1"
46 },
47 {
48 "page": "Delete only paragraph",
49 "result": "retained",
50 "space": "{A4CB3BA2-767F-0AE8-0916-AF142D995822},1"
51 },
52 {
53 "page": "Delete outline",
54 "result": "retained",
55 "space": "{80E80543-87A1-0C3A-0816-22B190BDFC87},1"
56 },
57 {
58 "page": "Move outline",
59 "result": "reviewed",
60 "space": "{16207F40-69C9-0CA1-09B5-DC5712DB2BBE},1"
61 },
62 {
63 "page": "Resize outline",
64 "result": "reviewed",
65 "space": "{CD420421-73F7-0F11-02EC-35FCA348998C},1"
66 },
67 {
68 "page": "Automatic outline size",
69 "result": "reviewed",
70 "space": "{F383096F-2121-0225-1E62-AB37C9B15B33},1"
71 }
72]
\ No newline at end of file
corpus/outline-edit/offline-tree/cell-delete/candidate/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/offline-tree/cell-delete/candidate/synthetic.one differ
corpus/outline-edit/offline-tree/cell-delete/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-37ACD671 -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/offline-tree/cell-delete/cold/notebook/Open Notebook.onetoc2 created
Binary files /dev/null and b/corpus/outline-edit/offline-tree/cell-delete/cold/notebook/Open Notebook.onetoc2 differ
corpus/outline-edit/offline-tree/cell-delete/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/offline-tree/cell-delete/cold/notebook/synthetic.one differ
corpus/outline-edit/offline-tree/cell-delete/cold/read/environment.json created+7
......@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-37ACD671",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/outline-edit/offline-tree/cell-delete/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="{6B0BE757-0B17-4AB5-9448-0167E37969DB}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T21:01:41.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{9488491C-538F-0CE6-01E5-83799F2D5FFD}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T21:01:41.000Z" color="#8AA8E4"><one:Page ID="{B8C1BA9A-DA44-4FF7-8682-2BE8631543E2}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{891EC705-089A-4D4E-B24C-E43DB5D2D605}{1}{B0}" name="Indent first subtree" dateTime="2026-09-08T19:25:53.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{C8E66CC5-2C16-4437-B0CC-48A30F6AE685}{1}{B0}" name="Outdent first group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{FFA29120-BC45-4D02-80E8-E29B4E652735}{1}{B0}" name="Delete only grouped subtree" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{B8DBE177-025F-4FC8-8756-5B4A986B3D1E}{1}{B0}" name="Delete unindented sibling after group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{1ECC6D47-5D60-4016-847B-183D822211B7}{1}{B0}" name="Delete cell subtree" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{993C4EFA-C0F9-4055-BDF2-97322443771E}{1}{B0}" name="Delete sole cell paragraph" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{2F41890E-1D6A-42D2-91F0-B849325909A5}{1}{B0}" name="Move numbered subtree down" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{AE110943-899B-4A3E-BC68-19E1C27BFB75}{1}{B0}" name="Delete numbered subtree" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{C4BC86AD-D39F-4C69-9DB8-A379B9F53378}{1}{B0}" name="Indent bullet subtree" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{30B2C2BB-7756-484E-8A1F-78990E67F4AF}{1}{B0}" name="Outdent child across indentation gap" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/><one:Page ID="{E8644E2D-F34F-440C-841F-E47CACB9AC1C}{1}{B0}" name="Move cell subtree down" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:32.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/outline-edit/offline-tree/cell-delete/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="{1ECC6D47-5D60-4016-847B-183D822211B7}{1}{B0}" name="Delete cell subtree" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{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:25:57.000Z" objectID="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{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:56.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{40}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{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="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{42}{B0}" lastModifiedTime="2026-09-08T19:25:57.000Z"><one:Cell lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{43}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{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="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{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="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{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="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{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="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{71}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{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="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{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="{80FCA370-D86B-4E8D-8A06-2E245A1A90F2}{80}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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="{2F41890E-1D6A-42D2-91F0-B849325909A5}{1}{B0}" name="Move numbered subtree down" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{457A6D1D-1C2B-46B1-B49F-798584850C74}{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="{457A6D1D-1C2B-46B1-B49F-798584850C74}{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="{457A6D1D-1C2B-46B1-B49F-798584850C74}{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="{457A6D1D-1C2B-46B1-B49F-798584850C74}{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="{457A6D1D-1C2B-46B1-B49F-798584850C74}{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="{457A6D1D-1C2B-46B1-B49F-798584850C74}{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="{457A6D1D-1C2B-46B1-B49F-798584850C74}{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="{457A6D1D-1C2B-46B1-B49F-798584850C74}{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="{457A6D1D-1C2B-46B1-B49F-798584850C74}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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="{30B2C2BB-7756-484E-8A1F-78990E67F4AF}{1}{B0}" name="Outdent child across indentation gap" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{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="{1582E2A4-166A-4EB9-B732-E2EF8E903691}{77}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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="{891EC705-089A-4D4E-B24C-E43DB5D2D605}{1}{B0}" name="Indent first subtree" dateTime="2026-09-08T19:25:53.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{464B7012-CFF5-4C60-9061-A1B10E0604E3}{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="{464B7012-CFF5-4C60-9061-A1B10E0604E3}{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="{464B7012-CFF5-4C60-9061-A1B10E0604E3}{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="{464B7012-CFF5-4C60-9061-A1B10E0604E3}{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="{464B7012-CFF5-4C60-9061-A1B10E0604E3}{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="{464B7012-CFF5-4C60-9061-A1B10E0604E3}{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="{464B7012-CFF5-4C60-9061-A1B10E0604E3}{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="{464B7012-CFF5-4C60-9061-A1B10E0604E3}{66}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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="{993C4EFA-C0F9-4055-BDF2-97322443771E}{1}{B0}" name="Delete sole cell paragraph" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{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-08T20:59:54.000Z" objectID="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{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-08T20:59:54.000Z" objectID="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{24}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T20:59:54.000Z" objectID="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{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="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{26}{B0}" lastModifiedTime="2026-09-08T20:59:54.000Z"><one:Cell lastModifiedTime="2026-09-08T20:59:54.000Z" objectID="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{27}{B0}" style="font-family:Calibri;font-size:11.0pt"><one:OEChildren><one:OE creationTime="2026-09-08T20:59:54.000Z" lastModifiedTime="2026-09-08T20:59:54.000Z" objectID="{84982C5D-7826-0249-098B-791D50D0945E}{1}{B0}" alignment="left"><one:T><![CDATA[Local replacement]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T20:59:54.000Z" objectID="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{39}{B0}" author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T20:59:54.000Z" objectID="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{42}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Remote 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="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{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="{72426837-3A99-4C7B-9998-DCEC440A7F4B}{48}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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="{AE110943-899B-4A3E-BC68-19E1C27BFB75}{1}{B0}" name="Delete numbered subtree" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{90B340D4-A3DE-4374-9368-C5B87261DE91}{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="{90B340D4-A3DE-4374-9368-C5B87261DE91}{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="{90B340D4-A3DE-4374-9368-C5B87261DE91}{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="{90B340D4-A3DE-4374-9368-C5B87261DE91}{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="{90B340D4-A3DE-4374-9368-C5B87261DE91}{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="{90B340D4-A3DE-4374-9368-C5B87261DE91}{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="{90B340D4-A3DE-4374-9368-C5B87261DE91}{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="{90B340D4-A3DE-4374-9368-C5B87261DE91}{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="{90B340D4-A3DE-4374-9368-C5B87261DE91}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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="{B8C1BA9A-DA44-4FF7-8682-2BE8631543E2}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{DF0D1226-9131-4C41-8970-A7339C89A683}{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="{D868BAD1-624C-074B-3924-643957E2D475}{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="{DF0D1226-9131-4C41-8970-A7339C89A683}{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/offline-tree/cell-delete/cold/read/page-007.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="{B8DBE177-025F-4FC8-8756-5B4A986B3D1E}{1}{B0}" name="Delete unindented sibling after group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{C9894687-2C71-4AFE-A9FA-A4DCC594D841}{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="{C9894687-2C71-4AFE-A9FA-A4DCC594D841}{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="{C9894687-2C71-4AFE-A9FA-A4DCC594D841}{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="{C9894687-2C71-4AFE-A9FA-A4DCC594D841}{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="{C9894687-2C71-4AFE-A9FA-A4DCC594D841}{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="{C9894687-2C71-4AFE-A9FA-A4DCC594D841}{56}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/cold/read/page-008.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="{C4BC86AD-D39F-4C69-9DB8-A379B9F53378}{1}{B0}" name="Indent bullet subtree" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{FD97F45F-3684-444B-81EB-6F99A9A45075}{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="{FD97F45F-3684-444B-81EB-6F99A9A45075}{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="{FD97F45F-3684-444B-81EB-6F99A9A45075}{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="{FD97F45F-3684-444B-81EB-6F99A9A45075}{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="{FD97F45F-3684-444B-81EB-6F99A9A45075}{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="{FD97F45F-3684-444B-81EB-6F99A9A45075}{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="{FD97F45F-3684-444B-81EB-6F99A9A45075}{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="{FD97F45F-3684-444B-81EB-6F99A9A45075}{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="{FD97F45F-3684-444B-81EB-6F99A9A45075}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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="{C8E66CC5-2C16-4437-B0CC-48A30F6AE685}{1}{B0}" name="Outdent first group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{53910748-A4F7-43DF-8BFD-80F6C079363F}{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:25:57.000Z" objectID="{53910748-A4F7-43DF-8BFD-80F6C079363F}{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="{53910748-A4F7-43DF-8BFD-80F6C079363F}{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="{53910748-A4F7-43DF-8BFD-80F6C079363F}{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="{53910748-A4F7-43DF-8BFD-80F6C079363F}{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="{53910748-A4F7-43DF-8BFD-80F6C079363F}{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="{53910748-A4F7-43DF-8BFD-80F6C079363F}{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="{53910748-A4F7-43DF-8BFD-80F6C079363F}{67}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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="{E8644E2D-F34F-440C-841F-E47CACB9AC1C}{1}{B0}" name="Move cell subtree down" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{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:26:01.000Z" objectID="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{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:26:01.000Z" objectID="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{40}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{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="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{42}{B0}" lastModifiedTime="2026-09-08T19:26:01.000Z"><one:Cell lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{43}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{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="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{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="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{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="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{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="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{71}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{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="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{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="{83511A5F-AC80-4684-AA3C-EC95B81697A3}{80}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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="{FFA29120-BC45-4D02-80E8-E29B4E652735}{1}{B0}" name="Delete only grouped subtree" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:32.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="{E0BE55D3-6D97-4006-B601-9B96FA282FC1}{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="{E0BE55D3-6D97-4006-B601-9B96FA282FC1}{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="{E0BE55D3-6D97-4006-B601-9B96FA282FC1}{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="{E0BE55D3-6D97-4006-B601-9B96FA282FC1}{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="{E0BE55D3-6D97-4006-B601-9B96FA282FC1}{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="{E0BE55D3-6D97-4006-B601-9B96FA282FC1}{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="{E0BE55D3-6D97-4006-B601-9B96FA282FC1}{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="{E0BE55D3-6D97-4006-B601-9B96FA282FC1}{67}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-delete/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/offline-tree/cell-delete/cold/run.json created+18
......@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/offline-tree-native-01/cell-delete/candidate",
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/offline-tree/cell-delete/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/offline-tree/cell-delete/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/offline-tree/cell-delete/cold/source.json created+8
......@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 88240,
5 "sha256": "963f5c960c690ff21451787f2a0028573cdc3ce4edeb887a8ed115997fcda194",
6 "mtime_ns": 1788901194571318513
7 }
8]
corpus/outline-edit/offline-tree/cell-delete/cold/teardown.json created+1
......@@ -0,0 +1 @@
1../../../offline/cold/teardown.json
\ No newline at end of file
corpus/outline-edit/offline-tree/cell-move/candidate/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/offline-tree/cell-move/candidate/synthetic.one differ
corpus/outline-edit/offline-tree/cell-move/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-B3E79CAE -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/offline-tree/cell-move/cold/notebook/Open Notebook.onetoc2 created
Binary files /dev/null and b/corpus/outline-edit/offline-tree/cell-move/cold/notebook/Open Notebook.onetoc2 differ
corpus/outline-edit/offline-tree/cell-move/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/offline-tree/cell-move/cold/notebook/synthetic.one differ
corpus/outline-edit/offline-tree/cell-move/cold/read/environment.json created+7
......@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-B3E79CAE",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/outline-edit/offline-tree/cell-move/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="{A19DCDCF-0AC0-452D-B383-F53F50FED971}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T21:01:31.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{B7E28970-93E4-08E2-06C2-10F27F160AB2}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T21:01:31.000Z" color="#8AA8E4"><one:Page ID="{9BAB7AF6-1A2F-4BF3-81A5-B863832E16AD}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{AA740769-C8F1-494A-B56B-77B655E9834A}{1}{B0}" name="Indent first subtree" dateTime="2026-09-08T19:25:53.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{EB8CACA9-EC7D-4033-B7EB-DB28EF51B3CA}{1}{B0}" name="Outdent first group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{DCC8514C-7C2E-4906-87CF-7110AE5E727A}{1}{B0}" name="Delete only grouped subtree" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{9BB1211B-C234-4BCC-8071-C8C178506851}{1}{B0}" name="Delete unindented sibling after group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{3DA6AD2B-9D0B-4412-835C-8BB6621944F8}{1}{B0}" name="Delete cell subtree" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{BA568E96-0092-4451-BAD5-04B9C4782251}{1}{B0}" name="Delete sole cell paragraph" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{0C2B4962-DD01-46D6-96D7-2BC2D2625CEA}{1}{B0}" name="Move numbered subtree down" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{8D7BC92F-49F0-4E3A-BB4F-8A6A2240AE3A}{1}{B0}" name="Delete numbered subtree" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{E7D646C1-13F4-486D-9A9F-30F259CE6637}{1}{B0}" name="Indent bullet subtree" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{13D802D7-B73D-4C4A-8D38-EB12EE5CA1E0}{1}{B0}" name="Outdent child across indentation gap" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:30.000Z" pageLevel="1"/><one:Page ID="{CB0E8E41-3324-4008-8338-77F74C82F953}{1}{B0}" name="Move cell subtree down" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:31.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/outline-edit/offline-tree/cell-move/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="{0C2B4962-DD01-46D6-96D7-2BC2D2625CEA}{1}{B0}" name="Move numbered subtree down" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{6610AD71-DC40-42B5-B3B8-EA0E64BE593B}{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="{6610AD71-DC40-42B5-B3B8-EA0E64BE593B}{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="{6610AD71-DC40-42B5-B3B8-EA0E64BE593B}{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="{6610AD71-DC40-42B5-B3B8-EA0E64BE593B}{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="{6610AD71-DC40-42B5-B3B8-EA0E64BE593B}{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="{6610AD71-DC40-42B5-B3B8-EA0E64BE593B}{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="{6610AD71-DC40-42B5-B3B8-EA0E64BE593B}{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="{6610AD71-DC40-42B5-B3B8-EA0E64BE593B}{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="{6610AD71-DC40-42B5-B3B8-EA0E64BE593B}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/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="{13D802D7-B73D-4C4A-8D38-EB12EE5CA1E0}{1}{B0}" name="Outdent child across indentation gap" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{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="{36E822C8-D601-4ABD-B015-71646EAB63DE}{77}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/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="{3DA6AD2B-9D0B-4412-835C-8BB6621944F8}{1}{B0}" name="Delete cell subtree" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{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:25:57.000Z" objectID="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{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:56.000Z" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{40}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{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="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{42}{B0}" lastModifiedTime="2026-09-08T19:25:57.000Z"><one:Cell lastModifiedTime="2026-09-08T19:25:57.000Z" objectID="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{43}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{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="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{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="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{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="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{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="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{71}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T19:25:56.000Z" objectID="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{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="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{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="{A396631C-1800-4A89-8D21-BDAFBA21C5BD}{80}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/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="{8D7BC92F-49F0-4E3A-BB4F-8A6A2240AE3A}{1}{B0}" name="Delete numbered subtree" dateTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{B3D980B8-63B5-4770-944F-5633925A8BDE}{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="{B3D980B8-63B5-4770-944F-5633925A8BDE}{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="{B3D980B8-63B5-4770-944F-5633925A8BDE}{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="{B3D980B8-63B5-4770-944F-5633925A8BDE}{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="{B3D980B8-63B5-4770-944F-5633925A8BDE}{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="{B3D980B8-63B5-4770-944F-5633925A8BDE}{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="{B3D980B8-63B5-4770-944F-5633925A8BDE}{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="{B3D980B8-63B5-4770-944F-5633925A8BDE}{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="{B3D980B8-63B5-4770-944F-5633925A8BDE}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/cold/read/page-004.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="{9BAB7AF6-1A2F-4BF3-81A5-B863832E16AD}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{FC67D24A-515A-4845-8E57-34B87CB2F3CC}{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="{FB027ABD-A227-034F-3E03-F7B2B7D9813A}{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="{FC67D24A-515A-4845-8E57-34B87CB2F3CC}{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/offline-tree/cell-move/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="{9BB1211B-C234-4BCC-8071-C8C178506851}{1}{B0}" name="Delete unindented sibling after group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{EAE386EB-EC1A-4EFA-AEDD-375725AF8D0E}{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="{EAE386EB-EC1A-4EFA-AEDD-375725AF8D0E}{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="{EAE386EB-EC1A-4EFA-AEDD-375725AF8D0E}{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="{EAE386EB-EC1A-4EFA-AEDD-375725AF8D0E}{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="{EAE386EB-EC1A-4EFA-AEDD-375725AF8D0E}{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="{EAE386EB-EC1A-4EFA-AEDD-375725AF8D0E}{56}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/cold/read/page-006.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="{AA740769-C8F1-494A-B56B-77B655E9834A}{1}{B0}" name="Indent first subtree" dateTime="2026-09-08T19:25:53.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{6521B07E-0F9E-4864-9746-323AEE3D51AC}{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="{6521B07E-0F9E-4864-9746-323AEE3D51AC}{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="{6521B07E-0F9E-4864-9746-323AEE3D51AC}{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="{6521B07E-0F9E-4864-9746-323AEE3D51AC}{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="{6521B07E-0F9E-4864-9746-323AEE3D51AC}{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="{6521B07E-0F9E-4864-9746-323AEE3D51AC}{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="{6521B07E-0F9E-4864-9746-323AEE3D51AC}{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="{6521B07E-0F9E-4864-9746-323AEE3D51AC}{66}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/cold/read/page-007.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="{BA568E96-0092-4451-BAD5-04B9C4782251}{1}{B0}" name="Delete sole cell paragraph" dateTime="2026-09-08T19:25:56.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{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-08T20:59:55.000Z" objectID="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{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-08T20:59:55.000Z" objectID="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{24}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T20:59:55.000Z" objectID="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{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="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{26}{B0}" lastModifiedTime="2026-09-08T20:59:55.000Z"><one:Cell lastModifiedTime="2026-09-08T20:59:55.000Z" objectID="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{27}{B0}" style="font-family:Calibri;font-size:11.0pt"><one:OEChildren><one:OE creationTime="2026-09-08T20:59:54.000Z" lastModifiedTime="2026-09-08T20:59:55.000Z" objectID="{466AF8EB-8F09-078A-10EB-F91E010545E1}{1}{B0}" alignment="left"><one:T><![CDATA[Local replacement]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T20:59:55.000Z" objectID="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{39}{B0}" author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T20:59:55.000Z" objectID="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{42}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Remote Other cell]]></one:T></one:OE><one:OE lastModifiedBy="Offline" creationTime="2026-09-08T19:25:57.000Z" lastModifiedTime="2026-09-08T20:59:55.000Z" objectID="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{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="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{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="{5128A85B-FAF2-487F-9EBF-4F67A4312A04}{48}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/cold/read/page-008.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="{CB0E8E41-3324-4008-8338-77F74C82F953}{1}{B0}" name="Move cell subtree down" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:31.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="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{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:26:01.000Z" objectID="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{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:26:01.000Z" objectID="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{40}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{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="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{42}{B0}" lastModifiedTime="2026-09-08T19:26:01.000Z"><one:Cell lastModifiedTime="2026-09-08T19:26:01.000Z" objectID="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{43}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{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="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{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="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{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="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{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="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{71}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T19:25:58.000Z" objectID="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{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="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{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="{A03BDA33-6CEB-4280-AD1B-7F1E582DC2EC}{80}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/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="{DCC8514C-7C2E-4906-87CF-7110AE5E727A}{1}{B0}" name="Delete only grouped subtree" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{C3D495BF-ADFC-4402-B126-081D1A137A8E}{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="{C3D495BF-ADFC-4402-B126-081D1A137A8E}{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="{C3D495BF-ADFC-4402-B126-081D1A137A8E}{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="{C3D495BF-ADFC-4402-B126-081D1A137A8E}{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="{C3D495BF-ADFC-4402-B126-081D1A137A8E}{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="{C3D495BF-ADFC-4402-B126-081D1A137A8E}{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="{C3D495BF-ADFC-4402-B126-081D1A137A8E}{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="{C3D495BF-ADFC-4402-B126-081D1A137A8E}{67}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/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="{E7D646C1-13F4-486D-9A9F-30F259CE6637}{1}{B0}" name="Indent bullet subtree" dateTime="2026-09-08T19:25:58.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{DEFD3433-F6EF-404F-86CC-FC12499F053A}{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="{DEFD3433-F6EF-404F-86CC-FC12499F053A}{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="{DEFD3433-F6EF-404F-86CC-FC12499F053A}{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="{DEFD3433-F6EF-404F-86CC-FC12499F053A}{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="{DEFD3433-F6EF-404F-86CC-FC12499F053A}{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="{DEFD3433-F6EF-404F-86CC-FC12499F053A}{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="{DEFD3433-F6EF-404F-86CC-FC12499F053A}{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="{DEFD3433-F6EF-404F-86CC-FC12499F053A}{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="{DEFD3433-F6EF-404F-86CC-FC12499F053A}{74}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/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="{EB8CACA9-EC7D-4033-B7EB-DB28EF51B3CA}{1}{B0}" name="Outdent first group" dateTime="2026-09-08T19:25:55.000Z" lastModifiedTime="2026-09-08T21:01:30.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="{70FBC724-649C-47DB-8CDA-137D20426370}{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:25:57.000Z" objectID="{70FBC724-649C-47DB-8CDA-137D20426370}{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="{70FBC724-649C-47DB-8CDA-137D20426370}{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="{70FBC724-649C-47DB-8CDA-137D20426370}{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="{70FBC724-649C-47DB-8CDA-137D20426370}{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="{70FBC724-649C-47DB-8CDA-137D20426370}{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="{70FBC724-649C-47DB-8CDA-137D20426370}{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="{70FBC724-649C-47DB-8CDA-137D20426370}{67}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cell-move/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/offline-tree/cell-move/cold/run.json created+18
......@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/offline-tree-native-01/cell-move/candidate",
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/offline-tree/cell-move/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/offline-tree/cell-move/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/offline-tree/cell-move/cold/source.json created+8
......@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 88104,
5 "sha256": "0d50bcef1e1b80d7920777e4734412e7549c484972aac0d9fbb313757ff85929",
6 "mtime_ns": 1788901195424267841
7 }
8]
corpus/outline-edit/offline-tree/cell-move/cold/teardown.json created+1
......@@ -0,0 +1 @@
1../../../offline/cold/teardown.json
\ No newline at end of file
corpus/outline-edit/offline-tree/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-7605A4F1 -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/offline-tree/cold/notebook/Open Notebook.onetoc2 created
Binary files /dev/null and b/corpus/outline-edit/offline-tree/cold/notebook/Open Notebook.onetoc2 differ
corpus/outline-edit/offline-tree/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/outline-edit/offline-tree/cold/notebook/synthetic.one differ
corpus/outline-edit/offline-tree/cold/read/environment.json created+7
......@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-7605A4F1",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/outline-edit/offline-tree/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="{4437ABDC-5AC2-49A9-9C5C-E1A5C7E9E2A7}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T20:54:15.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{4CC0B35D-61B1-0B37-1406-AAA5F5928A62}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T20:54:15.000Z" color="#8AA8E4"><one:Page ID="{608940DB-E87A-4826-9361-023409AA967D}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T20:54:15.000Z" pageLevel="1"/><one:Page ID="{B3B70D17-19E0-4C0B-89FD-BD3D18A23DA9}{1}{B0}" name="Move leaf down" dateTime="2026-09-08T18:00:47.000Z" lastModifiedTime="2026-09-08T18:02:45.000Z" pageLevel="1"/><one:Page ID="{9F11A9E5-BED7-4628-B0DF-E441BEA5C546}{1}{B0}" name="Move subtree down" dateTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:02:47.000Z" pageLevel="1"/><one:Page ID="{71A97773-9EF8-4340-87CB-38775894C84B}{1}{B0}" name="Move subtree up" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:49.000Z" pageLevel="1"/><one:Page ID="{61851DCC-610B-480B-9867-762D5CCF6969}{1}{B0}" name="Indent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.000Z" pageLevel="1"/><one:Page ID="{87157613-C68E-4BE4-814F-01EBA607AE8A}{1}{B0}" name="Outdent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" pageLevel="1"/><one:Page ID="{FB19CB3C-A4FF-447A-AED8-14F6D0626AF7}{1}{B0}" name="Collapse subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:54:15.000Z" pageLevel="1"/><one:Page ID="{819A4ACB-7049-40B3-BDD0-38621BB1FFEF}{1}{B0}" name="Expand subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:54:15.000Z" pageLevel="1"/><one:Page ID="{32AE9E7A-E282-4FBF-BAF2-CCEC91A99C9E}{1}{B0}" name="Delete leaf" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:03:01.000Z" pageLevel="1"/><one:Page ID="{8F2BA6A0-742B-4DC1-AEE9-AEF3B9794E51}{1}{B0}" name="Delete subtree" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:03.000Z" pageLevel="1"/><one:Page ID="{A05A458D-D01C-4E70-A74C-25DF33E64543}{1}{B0}" name="Delete only paragraph" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:05.000Z" pageLevel="1"/><one:Page ID="{84797B6C-21C2-48A2-A64C-A87A8EC2E1E6}{1}{B0}" name="Delete outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:54:15.000Z" pageLevel="1"/><one:Page ID="{12B1016F-CFAA-4839-A7EF-569C0CA436DF}{1}{B0}" name="Move outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:54:15.000Z" pageLevel="1"/><one:Page ID="{C9D37A0E-D594-4B89-ACB6-BF37BD3784ED}{1}{B0}" name="Resize outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:54:15.000Z" pageLevel="1"/><one:Page ID="{F7127740-8742-46BD-B038-21FCD7CE4652}{1}{B0}" name="Automatic outline size" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:54:15.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/outline-edit/offline-tree/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="{12B1016F-CFAA-4839-A7EF-569C0CA436DF}{1}{B0}" name="Move outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:54:15.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="{42BAE8B4-5A99-4699-A960-8187225CB694}{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-08T20:52:34.000Z" objectID="{42BAE8B4-5A99-4699-A960-8187225CB694}{70}{B0}"><one:Position x="480.0" y="108.0" z="0"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:52:34.000Z" objectID="{42BAE8B4-5A99-4699-A960-8187225CB694}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cold/read/page-001.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="{32AE9E7A-E282-4FBF-BAF2-CCEC91A99C9E}{1}{B0}" name="Delete leaf" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:03:01.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:03:00.000Z" objectID="{D80611C3-6B53-48D9-8EF7-318D345F2905}{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-08T18:03:01.000Z" objectID="{D80611C3-6B53-48D9-8EF7-318D345F2905}{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:03:00.000Z" objectID="{D80611C3-6B53-48D9-8EF7-318D345F2905}{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:03:00.000Z" objectID="{D80611C3-6B53-48D9-8EF7-318D345F2905}{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:03:00.000Z" objectID="{D80611C3-6B53-48D9-8EF7-318D345F2905}{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:03:00.000Z" objectID="{D80611C3-6B53-48D9-8EF7-318D345F2905}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cold/read/page-002.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="{608940DB-E87A-4826-9361-023409AA967D}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T20:54:15.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="{0745E867-A30F-4B90-9C93-8EEFF636731C}{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="{00204090-5072-009A-2CC7-4DE53D5D01EA}{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="{0745E867-A30F-4B90-9C93-8EEFF636731C}{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/offline-tree/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="{61851DCC-610B-480B-9867-762D5CCF6969}{1}{B0}" name="Indent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:50.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:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{5E184D21-AE60-4C57-85AF-ACA901E69D58}{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-08T20:52:29.000Z" objectID="{5E184D21-AE60-4C57-85AF-ACA901E69D58}{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:50.000Z" lastModifiedTime="2026-09-08T20:52:29.000Z" objectID="{5E184D21-AE60-4C57-85AF-ACA901E69D58}{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:02:50.000Z" objectID="{5E184D21-AE60-4C57-85AF-ACA901E69D58}{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-08T20:52:29.000Z" objectID="{5E184D21-AE60-4C57-85AF-ACA901E69D58}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:52:29.000Z" objectID="{5E184D21-AE60-4C57-85AF-ACA901E69D58}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/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="{71A97773-9EF8-4340-87CB-38775894C84B}{1}{B0}" name="Move subtree up" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:49.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="{3BD678B5-56A6-41A6-B3B6-997E4C91FFC1}{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="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T18:02:49.000Z" objectID="{3BD678B5-56A6-41A6-B3B6-997E4C91FFC1}{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:02:48.000Z" objectID="{3BD678B5-56A6-41A6-B3B6-997E4C91FFC1}{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:02:48.000Z" objectID="{3BD678B5-56A6-41A6-B3B6-997E4C91FFC1}{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:02:48.000Z" objectID="{3BD678B5-56A6-41A6-B3B6-997E4C91FFC1}{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:02:48.000Z" objectID="{3BD678B5-56A6-41A6-B3B6-997E4C91FFC1}{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:02:48.000Z" objectID="{3BD678B5-56A6-41A6-B3B6-997E4C91FFC1}{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-08T20:52:28.000Z" objectID="{3BD678B5-56A6-41A6-B3B6-997E4C91FFC1}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:52:28.000Z" objectID="{3BD678B5-56A6-41A6-B3B6-997E4C91FFC1}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cold/read/page-005.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="{819A4ACB-7049-40B3-BDD0-38621BB1FFEF}{1}{B0}" name="Expand subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:54:15.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:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{B58CA911-E457-4077-A117-95ACF6863143}{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-08T20:52:32.000Z" objectID="{B58CA911-E457-4077-A117-95ACF6863143}{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:02:59.000Z" lastModifiedTime="2026-09-08T18:02:59.000Z" objectID="{B58CA911-E457-4077-A117-95ACF6863143}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:02:59.000Z" lastModifiedTime="2026-09-08T18:02:59.000Z" objectID="{B58CA911-E457-4077-A117-95ACF6863143}{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-08T20:52:32.000Z" objectID="{B58CA911-E457-4077-A117-95ACF6863143}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:52:32.000Z" objectID="{B58CA911-E457-4077-A117-95ACF6863143}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/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="{84797B6C-21C2-48A2-A64C-A87A8EC2E1E6}{1}{B0}" name="Delete outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:54:15.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="{7CE813A4-5D5A-4640-8B58-A898117F1A5D}{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="{7CE813A4-5D5A-4640-8B58-A898117F1A5D}{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="{7CE813A4-5D5A-4640-8B58-A898117F1A5D}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cold/read/page-007.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="{87157613-C68E-4BE4-814F-01EBA607AE8A}{1}{B0}" name="Outdent subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:02:52.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:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{1E1CF424-4F0D-4528-93F8-65D334DE8D23}{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-08T20:52:30.000Z" objectID="{1E1CF424-4F0D-4528-93F8-65D334DE8D23}{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:50.000Z" lastModifiedTime="2026-09-08T18:02:52.000Z" objectID="{1E1CF424-4F0D-4528-93F8-65D334DE8D23}{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:02:52.000Z" objectID="{1E1CF424-4F0D-4528-93F8-65D334DE8D23}{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-08T20:52:30.000Z" objectID="{1E1CF424-4F0D-4528-93F8-65D334DE8D23}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:52:30.000Z" objectID="{1E1CF424-4F0D-4528-93F8-65D334DE8D23}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/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="{8F2BA6A0-742B-4DC1-AEE9-AEF3B9794E51}{1}{B0}" name="Delete subtree" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:03.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="{7709038A-6677-4A72-AEA2-D6D50AE82B85}{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-08T18:03:03.000Z" objectID="{7709038A-6677-4A72-AEA2-D6D50AE82B85}{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:03:02.000Z" objectID="{7709038A-6677-4A72-AEA2-D6D50AE82B85}{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:03:02.000Z" objectID="{7709038A-6677-4A72-AEA2-D6D50AE82B85}{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:03:02.000Z" objectID="{7709038A-6677-4A72-AEA2-D6D50AE82B85}{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:03:02.000Z" objectID="{7709038A-6677-4A72-AEA2-D6D50AE82B85}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/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="{9F11A9E5-BED7-4628-B0DF-E441BEA5C546}{1}{B0}" name="Move subtree down" dateTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:02: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-08T18:00:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{E30B7A6D-19AC-405E-B05E-BC8076F866E9}{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-08T18:02:47.000Z" objectID="{E30B7A6D-19AC-405E-B05E-BC8076F866E9}{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:02:46.000Z" objectID="{E30B7A6D-19AC-405E-B05E-BC8076F866E9}{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:02:46.000Z" objectID="{E30B7A6D-19AC-405E-B05E-BC8076F866E9}{65}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T18:02:46.000Z" objectID="{E30B7A6D-19AC-405E-B05E-BC8076F866E9}{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:02:46.000Z" objectID="{E30B7A6D-19AC-405E-B05E-BC8076F866E9}{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:02:46.000Z" objectID="{E30B7A6D-19AC-405E-B05E-BC8076F866E9}{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-08T20:52:27.000Z" objectID="{E30B7A6D-19AC-405E-B05E-BC8076F866E9}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:52:27.000Z" objectID="{E30B7A6D-19AC-405E-B05E-BC8076F866E9}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cold/read/page-010.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="{A05A458D-D01C-4E70-A74C-25DF33E64543}{1}{B0}" name="Delete only paragraph" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T18:03:05.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:03:04.000Z" objectID="{CCF9A31B-C8EF-4371-BF34-C6A3CCBB409D}{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:03:04.000Z" objectID="{CCF9A31B-C8EF-4371-BF34-C6A3CCBB409D}{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:03:04.000Z" objectID="{CCF9A31B-C8EF-4371-BF34-C6A3CCBB409D}{50}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cold/read/page-011.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="{B3B70D17-19E0-4C0B-89FD-BD3D18A23DA9}{1}{B0}" name="Move leaf down" dateTime="2026-09-08T18:00:47.000Z" lastModifiedTime="2026-09-08T18:02:45.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="{07ADBE19-D6B5-464B-8633-E8AF4B5066FF}{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-08T18:02:45.000Z" objectID="{07ADBE19-D6B5-464B-8633-E8AF4B5066FF}{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="{07ADBE19-D6B5-464B-8633-E8AF4B5066FF}{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="{07ADBE19-D6B5-464B-8633-E8AF4B5066FF}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Trailing sibling]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:00:48.000Z" lastModifiedTime="2026-09-08T18:00:49.000Z" objectID="{07ADBE19-D6B5-464B-8633-E8AF4B5066FF}{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-08T20:52:26.000Z" objectID="{07ADBE19-D6B5-464B-8633-E8AF4B5066FF}{59}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:49.000Z" lastModifiedTime="2026-09-08T20:52:26.000Z" objectID="{07ADBE19-D6B5-464B-8633-E8AF4B5066FF}{60}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cold/read/page-012.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="{C9D37A0E-D594-4B89-ACB6-BF37BD3784ED}{1}{B0}" name="Resize outline" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:54:15.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="{00121AD6-7530-417B-9FC4-ACF8CD4B29AF}{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-08T20:52:35.000Z" objectID="{00121AD6-7530-417B-9FC4-ACF8CD4B29AF}{70}{B0}"><one:Position x="480.0" y="108.0" z="0"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:52:35.000Z" objectID="{00121AD6-7530-417B-9FC4-ACF8CD4B29AF}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/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="{F7127740-8742-46BD-B038-21FCD7CE4652}{1}{B0}" name="Automatic outline size" dateTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:54:15.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="{CAA72034-3D15-42E6-809D-A8C4A8D36B88}{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-08T20:52:35.000Z" objectID="{CAA72034-3D15-42E6-809D-A8C4A8D36B88}{70}{B0}"><one:Position x="480.0" y="108.0" z="0"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:51.000Z" lastModifiedTime="2026-09-08T20:52:35.000Z" objectID="{CAA72034-3D15-42E6-809D-A8C4A8D36B88}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/cold/read/page-014.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="{FB19CB3C-A4FF-447A-AED8-14F6D0626AF7}{1}{B0}" name="Collapse subtree" dateTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:54:15.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:50.000Z" lastModifiedTime="2026-09-08T18:00:50.000Z" objectID="{77E4B6FE-8E93-4F9D-AEBF-83F249A8E890}{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-08T20:52:31.000Z" objectID="{77E4B6FE-8E93-4F9D-AEBF-83F249A8E890}{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:02:56.000Z" lastModifiedTime="2026-09-08T18:02:56.000Z" objectID="{77E4B6FE-8E93-4F9D-AEBF-83F249A8E890}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Anchor]]></one:T></one:OE><one:OE creationTime="2026-09-08T18:02:56.000Z" lastModifiedTime="2026-09-08T18:02:56.000Z" objectID="{77E4B6FE-8E93-4F9D-AEBF-83F249A8E890}{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-08T20:52:31.000Z" objectID="{77E4B6FE-8E93-4F9D-AEBF-83F249A8E890}{70}{B0}"><one:Position x="480.0" y="108.0" z="1"/><one:Size width="132.6431274414062" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-08T18:00:50.000Z" lastModifiedTime="2026-09-08T20:52:31.000Z" objectID="{77E4B6FE-8E93-4F9D-AEBF-83F249A8E890}{71}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Offline Other outline]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/outline-edit/offline-tree/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/offline-tree/cold/run.json created+18
......@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/offline-tree-native-01/candidate",
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/offline-tree/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/offline-tree/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/offline-tree/cold/source.json created+8
......@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 152736,
5 "sha256": "c724b5590d30d8a2ba5d12a25ba1e62bb05792947fd5405b65e68e9b2ae7c256",
6 "mtime_ns": 1788900756034686311
7 }
8]
corpus/outline-edit/offline-tree/cold/teardown.json created+1
......@@ -0,0 +1 @@
1../../offline/cold/teardown.json
\ No newline at end of file
crates/onestore-offline/README.md+19-3
......@@ -31,7 +31,8 @@ its styles as one intent and one publication. Keep that value across retries; it
3131the new text for subsequent offline edits. Pending entries expose
3232`Operation::Text(TextEdit)`, `Operation::Insert(Insertion)`,
3333`Operation::Format(FormatEdit)`, `Operation::Split(SplitEdit)`,
34`Operation::Join(JoinEdit)` and `Operation::Outline(OutlineEdit)` through their
34`Operation::Join(JoinEdit)`, `Operation::Outline(OutlineEdit)` and
35`Operation::Tree(TreeEdit)` through their
3536`operation` field. Synchronization applies these in queue order, so an inserted
3637outline can precede its paragraphs and their later edits. Missing anchors or
3738existing insertion identities preserve a conflict and the complete local image.
......@@ -98,8 +99,23 @@ reserved wrapping width that they clear. Missing targets preserve the local bran
9899against both current images, preserving dependent intents. An uncertain layout
99100attempt requires its original revision; converged values cannot establish its receipt.
100101
101Recognized earlier caches migrate transactionally to version seven, which adds
102layout intents and layout conflicts. The migration retains
102`tree` accepts the core `onestore::TreeEdit`. Moves preserve independent remote
103text, formatting and descendants. A competing ancestor, indentation or sibling
104crossing produces `StructureChanged`; unrelated sibling insertions/deletions can
105merge. An anchor must remain a direct child of the requested destination. An
106already satisfied move still requires guarded confirmation before acknowledgement.
107Deletion compares the selected raw property graph, including referenced styles,
108tags, unknown fields and internal attachments. Changed content produces
109`ContentChanged`; property order, CompactID numbering and modification timestamps
110do not affect that comparison. Missing targets retain `TargetUnavailable`.
111`rebase_tree_conflict(id, local, remote)` reviews the original move/deletion against
112both current images. An emptied cell's replacement paragraph/text identities must
113remain the same before replay or review; later queued edits keep their targets.
114Uncertain tree attempts require their original revision for confirmation, even
115when an independent move or deletion has the same visible effect.
116
117Recognized earlier caches migrate transactionally to version eight, which adds
118tree intents and content conflicts. The migration retains
103119images, local IDs, publication attempts, conflicts,
104120receipts and the autoincrement sequence; it does not reuse acknowledged IDs when
105121the pending queue is empty.
crates/onestore-offline/examples/cache_probe.rs+2-1
......@@ -140,7 +140,8 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
140140 }
141141 onestore_offline::Operation::Split(_)
142142 | onestore_offline::Operation::Join(_)
143 | onestore_offline::Operation::Outline(_) => {
143 | onestore_offline::Operation::Outline(_)
144 | onestore_offline::Operation::Tree(_) => {
144145 panic!("Unexpected operation for this fixture")
145146 }
146147 };
crates/onestore-offline/src/lib.rs+4-1
......@@ -15,10 +15,12 @@ mod paragraph;
1515mod rebase;
1616mod recovery;
1717mod schema;
18mod tree;
1819pub use formatting::FormatEdit;
1920pub use outline::OutlineEdit;
2021pub use paragraph::{JoinEdit, SplitEdit};
2122pub use recovery::{Recovery, RecoverySummary};
23pub use tree::TreeEdit;
2224mod sync;
2325pub use sync::{ConflictKind, EditStatus, Remote};
2426mod worker;
......@@ -49,7 +51,7 @@ pub enum Error {
4951type Result<T> = std::result::Result<T, Error>;
5052
5153const APPLICATION_ID: u32 = 0x4f4e454f;
52const SCHEMA_VERSION: u32 = 7;
54const SCHEMA_VERSION: u32 = 8;
5355
5456/// Text and its observed precondition, retained across cache reopen and rebasing.
5557#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
......@@ -70,6 +72,7 @@ pub enum Operation {
7072 Split(SplitEdit),
7173 Join(JoinEdit),
7274 Outline(OutlineEdit),
75 Tree(TreeEdit),
7376}
7477
7578/// A locally acknowledged intent; its ID remains stable across cache reopen.
crates/onestore-offline/src/schema.rs+1-1
......@@ -3,7 +3,7 @@ use rusqlite::{OptionalExtension, Transaction};
33
44const CONFLICTS: &str = "CREATE TABLE conflicts (
55 edit_id INTEGER PRIMARY KEY REFERENCES edits(id) ON DELETE CASCADE,
6 kind INTEGER NOT NULL CHECK(kind BETWEEN 0 AND 5)
6 kind INTEGER NOT NULL CHECK(kind BETWEEN 0 AND 6)
77) STRICT;";
88
99const ASSETS: &str = "CREATE TABLE assets (
crates/onestore-offline/src/sync.rs+25
......@@ -20,6 +20,7 @@ pub enum ConflictKind {
2020 FormattingChanged = 3,
2121 StructureChanged = 4,
2222 LayoutChanged = 5,
23 ContentChanged = 6,
2324}
2425
2526#[derive(Debug, Clone, Copy, PartialEq, Eq)]
......@@ -136,6 +137,7 @@ impl Replica {
136137 Operation::Split(edit) => edit.prepare(&snapshot, intent.space)?,
137138 Operation::Join(edit) => edit.prepare(&snapshot, intent.space)?,
138139 Operation::Outline(edit) => edit.prepare(&snapshot, intent.space)?,
140 Operation::Tree(edit) => edit.prepare(&snapshot, intent.space)?,
139141 Operation::Insert(insertion) => {
140142 PreparedEdit::insert(&snapshot, intent.space, insertion)
141143 .map_err(|_| ConflictKind::UnsupportedEdit)
......@@ -306,6 +308,13 @@ impl Replica {
306308 )
307309 .into());
308310 }
311 Operation::Tree(_) => {
312 return Err(io::Error::new(
313 io::ErrorKind::InvalidInput,
314 "Review the subtree edit using rebase_tree_conflict",
315 )
316 .into());
317 }
309318 Operation::Insert(_) => {
310319 return Err(io::Error::new(
311320 io::ErrorKind::InvalidInput,
......@@ -398,6 +407,21 @@ impl Replica {
398407 })
399408 }
400409
410 /// Reviews the original subtree intent against both current cache images.
411 /// Replacement paragraph identities must remain unchanged for dependent edits.
412 pub fn rebase_tree_conflict(&self, id: u64, local: &[u8], remote: &[u8]) -> Result<()> {
413 self.resolve_conflict(id, local, remote, |intent| {
414 let Operation::Tree(edit) = intent.operation else {
415 return Err(io::Error::new(
416 io::ErrorKind::InvalidInput,
417 "Select a subtree move or deletion conflict",
418 )
419 .into());
420 };
421 Ok(Operation::Tree(edit.review(remote, intent.space)?))
422 })
423 }
424
401425 fn resolve_conflict(
402426 &self,
403427 id: u64,
......@@ -519,6 +543,7 @@ pub(crate) fn status(connection: &Connection, id: u64) -> Result<Option<EditStat
519543 3 => ConflictKind::FormattingChanged,
520544 4 => ConflictKind::StructureChanged,
521545 5 => ConflictKind::LayoutChanged,
546 6 => ConflictKind::ContentChanged,
522547 _ => {
523548 return Err(io::Error::new(
524549 io::ErrorKind::InvalidData,
crates/onestore-offline/src/tree.rs created+370
......@@ -0,0 +1,370 @@
1use super::*;
2use onestore::{FileDataReference, IdStream, ObjectData, PropertySets, ResolvedRevision, Value};
3use serde::{Deserialize, Serialize};
4use sha2::{Digest, Sha256};
5use std::collections::{BTreeMap, BTreeSet};
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8#[serde(deny_unknown_fields)]
9struct Observed {
10 path: Vec<(ExGuid, u8)>,
11 siblings: BTreeMap<ExGuid, bool>,
12 destination: Vec<(ExGuid, u8)>,
13 content: Option<[u8; 32]>,
14}
15
16/// A subtree intent with observed placement, deletion content and replacement identities.
17#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18#[serde(deny_unknown_fields)]
19pub struct TreeEdit {
20 pub intent: onestore::TreeEdit,
21 observed: Observed,
22 created: BTreeSet<ExGuid>,
23}
24
25fn fingerprint(store: &Store<'_>, raw: &ResolvedRevision<'_>, root: ExGuid) -> Result<[u8; 32]> {
26 let mut objects = BTreeMap::new();
27 let mut pending = vec![root];
28 while let Some(id) = pending.pop() {
29 if objects.contains_key(&id) {
30 continue;
31 }
32 let object = &raw.objects[&id];
33 let references = object.references()?;
34 pending.extend(&references.objects);
35 let mut hash = Sha256::new();
36 hash.update(object.jcid.to_le_bytes());
37 match object.data {
38 ObjectData::Properties(bytes) => {
39 hash.update([0]);
40 let properties = PropertySets::parse(bytes)?;
41 let mut objects = references.objects.into_iter();
42 let mut spaces = references.object_spaces.into_iter();
43 let mut contexts = references.contexts.into_iter();
44 let mut fields = Vec::new();
45 for set in &properties.sets {
46 let mut values = BTreeMap::new();
47 for property in set {
48 let mut value = Sha256::new();
49 match &property.value {
50 Value::NoData => {}
51 Value::Bytes(bytes) => value.update(bytes),
52 Value::References {
53 stream,
54 compact_ids,
55 } => {
56 let references = match stream {
57 IdStream::Objects => &mut objects,
58 IdStream::ObjectSpaces => &mut spaces,
59 IdStream::Contexts => &mut contexts,
60 };
61 for reference in references.take(compact_ids.len() / 4) {
62 value.update(reference.guid);
63 value.update(reference.n.to_le_bytes());
64 }
65 }
66 Value::Sets(_) => {}
67 }
68 if property.id != 0x14001d7a {
69 values.insert(property.id, value);
70 }
71 }
72 fields.push(values);
73 }
74 // Arena indices and CompactIDs can change without changing property content.
75 let mut sets = vec![[0; 32]; properties.sets.len()];
76 for at in (0..properties.sets.len()).rev() {
77 for property in &properties.sets[at] {
78 if let Value::Sets(children) = &property.value {
79 let value = fields[at].get_mut(&property.id).unwrap();
80 for child in children.clone() {
81 value.update(sets[child]);
82 }
83 }
84 }
85 let mut set = Sha256::new();
86 for (id, value) in &fields[at] {
87 set.update(id.to_le_bytes());
88 set.update(value.clone().finalize());
89 }
90 sets[at] = set.finalize().into();
91 }
92 hash.update(sets[0]);
93 }
94 ObjectData::File {
95 reference,
96 extension,
97 } => {
98 hash.update([1]);
99 hash.update(Sha256::digest(reference));
100 hash.update(Sha256::digest(extension));
101 if let Some(FileDataReference::Internal(guid)) = object.file_reference()? {
102 hash.update(Sha256::digest(store.file_data(guid)?));
103 }
104 }
105 ObjectData::Encrypted(_) => unreachable!("references rejected encrypted content"),
106 }
107 objects.insert(id, <[u8; 32]>::from(hash.finalize()));
108 }
109 let mut hash = Sha256::new();
110 for (id, value) in objects {
111 hash.update(id.guid);
112 hash.update(id.n.to_le_bytes());
113 hash.update(value);
114 }
115 Ok(hash.finalize().into())
116}
117
118fn observe(source: &[u8], space: ExGuid, intent: &onestore::TreeEdit) -> Result<Option<Observed>> {
119 let store = Store::parse(source)?;
120 let index = RevisionIndex::parse(&store)?;
121 let document = Document::parse(&index)?;
122 let Some(section) = document.spaces.get(&space) else {
123 return Ok(None);
124 };
125 let Some(rid) = section.contexts.get(&ExGuid::default()) else {
126 return Ok(None);
127 };
128 let view = &section.revisions[rid];
129 let pages: Vec<_> = document
130 .pages()?
131 .into_iter()
132 .filter_map(|(sid, page)| (sid == space).then_some(page))
133 .collect();
134 if pages.len() != 1 {
135 return Ok(None);
136 }
137 let object = intent.object();
138 let mut targets = vec![object];
139 if let Some((parent, _)) = intent.destination() {
140 targets.push(parent);
141 }
142 let Some(paths) = active_paths(view, &pages, &targets) else {
143 return Ok(None);
144 };
145 let Some(parent) = paths[0].first() else {
146 return Ok(None);
147 };
148 let children = &view.nodes[parent].children;
149 let Some(position) = children.iter().position(|id| *id == object) else {
150 return Ok(None);
151 };
152 let levels = |path: &[ExGuid]| {
153 path.iter()
154 .map(|id| (*id, view.nodes[id].child_level.unwrap_or(1)))
155 .collect::<Vec<_>>()
156 };
157 let destination = if let Some((parent, _)) = intent.destination() {
158 levels(&[&[parent], paths[1].as_slice()].concat())
159 } else {
160 Vec::new()
161 };
162 Ok(Some(Observed {
163 path: levels(&paths[0]),
164 siblings: children
165 .iter()
166 .enumerate()
167 .filter_map(|(at, id)| (*id != object).then_some((*id, at < position)))
168 .collect(),
169 destination,
170 content: if intent.destination().is_none() {
171 Some(fingerprint(&store, &index.resolve(space, *rid)?, object)?)
172 } else {
173 None
174 },
175 }))
176}
177
178fn mutable_objects(source: &[u8], space: ExGuid) -> Result<BTreeSet<ExGuid>> {
179 let store = Store::parse(source)?;
180 let index = RevisionIndex::parse(&store)?;
181 let raw = index.resolve(space, index.spaces[&space].labels[&(ExGuid::default(), 1)])?;
182 Ok(raw
183 .reachable()?
184 .into_iter()
185 .filter(|id| raw.objects[id].jcid & 0x100000 == 0)
186 .collect())
187}
188
189impl Replica {
190 /// Queues a move or deletion, retaining content changes for explicit deletion review.
191 pub fn tree(
192 &self,
193 source: &[u8],
194 space: ExGuid,
195 intent: &onestore::TreeEdit,
196 ) -> Result<Option<u64>> {
197 let (edit, prepared) = TreeEdit::capture(source, space, intent)?;
198 self.record(source, space, Operation::Tree(edit), &prepared)
199 }
200}
201
202impl TreeEdit {
203 pub(crate) fn capture<'a>(
204 source: &'a [u8],
205 space: ExGuid,
206 intent: &onestore::TreeEdit,
207 ) -> Result<(Self, PreparedEdit<'a>)> {
208 let prepared = PreparedEdit::tree(source, space, intent)?;
209 let observed = observe(source, space, intent)?.ok_or_else(|| {
210 io::Error::new(
211 io::ErrorKind::InvalidData,
212 "Prepared subtree edit has no active target",
213 )
214 })?;
215 let before = mutable_objects(source, space)?;
216 let after = mutable_objects(prepared.as_bytes(), space)?;
217 Ok((
218 Self {
219 intent: intent.clone(),
220 observed,
221 created: &after - &before,
222 },
223 prepared,
224 ))
225 }
226
227 pub(crate) fn prepare<'a>(
228 &self,
229 source: &'a [u8],
230 space: ExGuid,
231 ) -> Result<std::result::Result<PreparedEdit<'a>, ConflictKind>> {
232 let Some(current) = observe(source, space, &self.intent)? else {
233 return Ok(Err(ConflictKind::TargetUnavailable));
234 };
235 let prepared = match PreparedEdit::tree(source, space, &self.intent) {
236 Ok(prepared) => prepared,
237 Err(_) => return Ok(Err(ConflictKind::UnsupportedEdit)),
238 };
239 let after = mutable_objects(prepared.as_bytes(), space)?;
240 if prepared.as_bytes() == source {
241 return Ok(if self.created.is_subset(&after) {
242 Ok(prepared)
243 } else {
244 Err(ConflictKind::StructureChanged)
245 });
246 }
247 if current.path != self.observed.path
248 || current.destination != self.observed.destination
249 || current.siblings.iter().any(|(id, before)| {
250 self.observed
251 .siblings
252 .get(id)
253 .is_some_and(|was_before| before != was_before)
254 })
255 || &after - &mutable_objects(source, space)? != self.created
256 {
257 return Ok(Err(ConflictKind::StructureChanged));
258 }
259 if current.content != self.observed.content {
260 return Ok(Err(ConflictKind::ContentChanged));
261 }
262 Ok(Ok(prepared))
263 }
264
265 pub(crate) fn review(&self, source: &[u8], space: ExGuid) -> Result<Self> {
266 let (reviewed, _) = Self::capture(source, space, &self.intent)?;
267 if reviewed.created != self.created {
268 return Err(io::Error::new(
269 io::ErrorKind::InvalidInput,
270 "The subtree edit would change its replacement paragraph identities",
271 )
272 .into());
273 }
274 Ok(reviewed)
275 }
276}
277
278#[cfg(test)]
279mod tests {
280 use super::*;
281 use onestore::Object;
282 use std::sync::Arc;
283
284 fn set(fields: &[(u32, Vec<u8>)]) -> Vec<u8> {
285 let mut bytes = u16::try_from(fields.len()).unwrap().to_le_bytes().to_vec();
286 for (id, _) in fields {
287 bytes.extend(id.to_le_bytes());
288 }
289 for (_, value) in fields {
290 bytes.extend(value);
291 }
292 bytes
293 }
294
295 #[test]
296 fn deletion_fingerprint_resolves_references_and_nested_sets_without_storage_order() {
297 let source = onestore::create_section("fingerprint.one", "Original", "Author").unwrap();
298 let store = Store::parse(&source).unwrap();
299 let root = ExGuid {
300 guid: [1; 16],
301 n: 1,
302 };
303 let child = ExGuid {
304 guid: [2; 16],
305 n: 7,
306 };
307 let hash = |reverse: bool, global: u32, timestamp: u32, change: usize| {
308 let mut fields = vec![
309 (0x14001d7a, timestamp.to_le_bytes().to_vec()),
310 (0x20000001, vec![]),
311 (
312 0x44000002,
313 set(&[(0x14000003, (u32::from(change == 1)).to_le_bytes().to_vec())]),
314 ),
315 (
316 0x44000004,
317 set(&[(if change == 2 { 0x08000005 } else { 0x88000005 }, vec![])]),
318 ),
319 ];
320 if reverse {
321 fields.reverse();
322 }
323 let mut bytes = 0x80000001_u32.to_le_bytes().to_vec();
324 bytes.extend(((global << 8) | child.n).to_le_bytes());
325 bytes.extend(set(&fields));
326 let mut child_bytes = 0x80000000_u32.to_le_bytes().to_vec();
327 child_bytes.extend(set(&[(
328 0x14000006,
329 (u32::from(change == 3)).to_le_bytes().to_vec(),
330 )]));
331 let ids = Arc::new(BTreeMap::from([(
332 global,
333 if change == 4 { [3; 16] } else { child.guid },
334 )]));
335 let target = ExGuid {
336 guid: ids[&global],
337 ..child
338 };
339 let raw = ResolvedRevision {
340 roots: BTreeMap::from([(1, root)]),
341 objects: BTreeMap::from([
342 (
343 root,
344 Object {
345 jcid: 0x6000d,
346 reference_count: 1,
347 data: ObjectData::Properties(&bytes),
348 global_ids: ids.clone(),
349 },
350 ),
351 (
352 target,
353 Object {
354 jcid: 0x6000e,
355 reference_count: 1,
356 data: ObjectData::Properties(&child_bytes),
357 global_ids: ids,
358 },
359 ),
360 ]),
361 };
362 fingerprint(&store, &raw, root).unwrap()
363 };
364 let original = hash(false, 0, 1, 0);
365 assert_eq!(original, hash(true, 137, 2, 0));
366 for change in 1..=4 {
367 assert_ne!(original, hash(true, 137, 2, change));
368 }
369 }
370}
crates/onestore-offline/tests/cache.rs+4-4
......@@ -796,8 +796,8 @@ fn unrecognized_persisted_operations_are_rejected_without_dropping_fields() {
796796}
797797
798798#[test]
799fn prior_schema_migrations_retain_queue_evidence_assets_and_enable_layout_conflicts() {
800 for (version, ceiling) in [(5, 3), (6, 4)] {
799fn prior_schema_migrations_retain_queue_evidence_assets_and_enable_content_conflicts() {
800 for (version, ceiling) in [(5, 3), (6, 4), (7, 5)] {
801801 use onestore_offline::{ConflictKind, EditStatus, Recovery};
802802 use sha2::{Digest, Sha256};
803803 let directory = tempfile::tempdir().unwrap();
......@@ -903,13 +903,13 @@ fn prior_schema_migrations_retain_queue_evidence_assets_and_enable_layout_confli
903903 .unwrap(),
904904 current_version
905905 );
906 db.execute("INSERT INTO conflicts VALUES (1001,5)", [])
906 db.execute("INSERT INTO conflicts VALUES (1001,6)", [])
907907 .unwrap();
908908 drop(db);
909909 let cache = Replica::open(&path).unwrap();
910910 assert_eq!(
911911 cache.status(1001).unwrap(),
912 Some(EditStatus::Conflict(ConflictKind::LayoutChanged))
912 Some(EditStatus::Conflict(ConflictKind::ContentChanged))
913913 );
914914 }
915915}
crates/onestore-offline/tests/support/tree_schedule.rs created+246
......@@ -0,0 +1,246 @@
1use crate::disk;
2use onestore::{
3 CommitError, ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, TreeEdit,
4 document::{Document, Kind},
5};
6use onestore_offline::{EditStatus, Operation, Remote, Replica};
7use std::{io, sync::LazyLock};
8
9static SOURCE: LazyLock<(Vec<u8>, ExGuid, ExGuid)> = LazyLock::new(|| {
10 let mut source =
11 onestore::create_section("tree-schedule.one", "Original 🦀 é 0", "Author").unwrap();
12 let store = Store::parse(&source).unwrap();
13 let index = RevisionIndex::parse(&store).unwrap();
14 let document = Document::parse(&index).unwrap();
15 let (sid, page) = document.pages().unwrap()[0];
16 let space = &document.spaces[&sid];
17 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
18 let outline = *view.nodes[&page]
19 .children
20 .iter()
21 .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
22 .unwrap();
23 for at in 1..12 {
24 let insert =
25 Insertion::paragraph(outline, None, &format!("Original 🦀 é {at}"), "Author").unwrap();
26 source = PreparedEdit::insert(&source, sid, &insert)
27 .unwrap()
28 .as_bytes()
29 .to_vec();
30 }
31 (source, sid, outline)
32});
33
34fn rows(source: &[u8]) -> Vec<(ExGuid, ExGuid, String)> {
35 let (_, sid, outline) = &*SOURCE;
36 let store = Store::parse(source).unwrap();
37 assert!(store.checksum_mismatches.is_empty());
38 let index = RevisionIndex::parse(&store).unwrap();
39 index.validate_current().unwrap();
40 let document = Document::parse(&index).unwrap();
41 let space = &document.spaces[sid];
42 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
43 let (_, page) = document
44 .pages()
45 .unwrap()
46 .into_iter()
47 .find(|(space, _)| space == sid)
48 .unwrap();
49 if !view.nodes[&page].children.contains(outline) {
50 return Vec::new();
51 }
52 let node = &view.nodes[outline];
53 let mut rows = Vec::new();
54 for paragraph in &node.children {
55 let node = &view.nodes[paragraph];
56 assert!(node.children.is_empty());
57 let [text] = node.content.as_slice() else {
58 panic!()
59 };
60 let Kind::RichText { text: value, .. } = &view.nodes[text].kind else {
61 panic!()
62 };
63 rows.push((*paragraph, *text, value.clone()));
64 }
65 rows
66}
67
68struct Session<'a> {
69 disk: &'a mut disk::Disk,
70 operation: Option<&'a Operation>,
71}
72
73impl Remote for Session<'_> {
74 fn read(&mut self) -> io::Result<Vec<u8>> {
75 Ok(self.disk.visible.clone())
76 }
77 fn publish(&mut self, edit: &PreparedEdit<'_>) -> Result<(), CommitError> {
78 let before = rows(&self.disk.visible);
79 let mut expected = before.clone();
80 match self.operation.unwrap() {
81 Operation::Tree(edit) => {
82 let at = expected
83 .iter()
84 .position(|(id, _, _)| *id == edit.intent.object())
85 .unwrap();
86 let row = expected.remove(at);
87 if let Some((parent, anchor)) = edit.intent.destination() {
88 assert_eq!(parent, SOURCE.2);
89 let at = anchor
90 .map(|anchor| {
91 expected
92 .iter()
93 .position(|(id, _, _)| *id == anchor)
94 .unwrap()
95 })
96 .unwrap_or(expected.len());
97 expected.insert(at, row);
98 }
99 }
100 Operation::Text(edit) => {
101 assert_eq!(edit.range, 0..1);
102 let (_, _, text) = expected
103 .iter_mut()
104 .find(|(_, id, _)| *id == edit.object)
105 .unwrap();
106 text.replace_range(0..1, &edit.replacement);
107 }
108 _ => panic!(),
109 }
110 assert_eq!(rows(edit.as_bytes()), expected);
111 let result = edit.commit(self.disk);
112 let durable = rows(&self.disk.durable);
113 assert!(durable == before || durable == expected);
114 if result.is_ok() {
115 assert_eq!(durable, expected);
116 }
117 result
118 }
119 fn confirm(&mut self, snapshot: &[u8]) -> Result<(), CommitError> {
120 onestore::confirm_snapshot(self.disk, snapshot)
121 }
122}
123
124pub fn run(input: &[u8]) {
125 let (source, sid, outline) = &*SOURCE;
126 let directory = tempfile::tempdir().unwrap();
127 let mut replicas: [Option<Replica>; 12] = std::array::from_fn(|_| None);
128 let mut disk = disk::Disk {
129 visible: source.clone(),
130 durable: source.clone(),
131 operation: 0,
132 fail_at: None,
133 write_limit: 4096,
134 random: 1,
135 };
136 for step in input.chunks_exact(8).take(48) {
137 let actor = usize::from(step[0]) % replicas.len();
138 let path = directory.path().join(format!("{actor}.sqlite"));
139 let cache = replicas[actor].get_or_insert_with(|| Replica::create(&path, source).unwrap());
140 let snapshot = cache.snapshot().unwrap();
141 let pending = cache.pending().unwrap();
142 let local = rows(&snapshot);
143 match step[1] % 8 {
144 0..=2 if !local.is_empty() => {
145 let target = usize::from(step[2]) % local.len();
146 let id = match step[1] % 8 {
147 0 => {
148 let before =
149 (step[3] & 1 == 0).then(|| local[usize::from(step[4]) % local.len()].0);
150 cache
151 .tree(
152 &snapshot,
153 *sid,
154 &TreeEdit::move_to(local[target].0, *outline, before, "Offline")
155 .unwrap(),
156 )
157 .unwrap()
158 }
159 1 => cache
160 .tree(
161 &snapshot,
162 *sid,
163 &TreeEdit::delete(local[target].0, "Offline").unwrap(),
164 )
165 .unwrap(),
166 _ => cache
167 .edit_text(
168 &snapshot,
169 *sid,
170 local[target].1,
171 0..1,
172 &char::from(b'A' + step[3] % 26).to_string(),
173 )
174 .unwrap(),
175 };
176 let next = cache.pending().unwrap();
177 assert_eq!(next[..pending.len()], pending);
178 assert_eq!(next.len(), pending.len() + usize::from(id.is_some()));
179 }
180 3 | 4 => {
181 disk.operation = 0;
182 disk.fail_at = (step[4] != 0)
183 .then_some(usize::from(u16::from_le_bytes([step[4], step[5]])) % 2048 + 1);
184 disk.write_limit = if step[6] & 1 == 0 { 17 } else { 4096 };
185 disk.random = u64::from(step[7]) + 1;
186 let _ = cache.sync_once(&mut Session {
187 disk: &mut disk,
188 operation: pending.first().map(|p| &p.operation),
189 });
190 let next = cache.pending().unwrap();
191 if next.len() == pending.len() {
192 assert_eq!(next, pending);
193 } else {
194 assert_eq!(next, pending[1..]);
195 let Some(EditStatus::Published { revision }) =
196 cache.status(pending[0].id).unwrap()
197 else {
198 panic!()
199 };
200 let store = Store::parse(&disk.durable).unwrap();
201 let index = RevisionIndex::parse(&store).unwrap();
202 assert!(index.spaces[sid].revisions.contains_key(&revision));
203 }
204 if !next.is_empty() {
205 assert!(cache.snapshot().unwrap() == snapshot);
206 }
207 disk.visible.clone_from(&disk.durable);
208 }
209 5 => {
210 let mut expected = rows(&disk.visible);
211 if !expected.is_empty() {
212 let target = usize::from(step[2]) % expected.len();
213 let (_, text, content) = &mut expected[target];
214 let at = u32::try_from(content.encode_utf16().count()).unwrap();
215 content.push('R');
216 let snapshot = disk.visible.clone();
217 let edit = PreparedEdit::text(&snapshot, *sid, *text, at..at, "R").unwrap();
218 disk.fail_at = None;
219 edit.commit(&mut disk).unwrap();
220 assert_eq!(rows(&disk.durable), expected);
221 }
222 }
223 _ => {
224 if step[1] % 8 == 6
225 && let Some(first) = pending.first()
226 && matches!(first.operation, Operation::Tree(_))
227 && matches!(
228 cache.status(first.id).unwrap(),
229 Some(EditStatus::Conflict(_))
230 )
231 {
232 let remote = cache.remote_snapshot().unwrap();
233 let _ = cache.rebase_tree_conflict(first.id, &snapshot, &remote);
234 }
235 let pending = cache.pending().unwrap();
236 drop(replicas[actor].take());
237 let cache = Replica::open(&path).unwrap();
238 assert!(cache.snapshot().unwrap() == snapshot);
239 assert_eq!(cache.pending().unwrap(), pending);
240 replicas[actor] = Some(cache);
241 }
242 }
243 rows(&disk.durable);
244 rows(&replicas[actor].as_ref().unwrap().snapshot().unwrap());
245 }
246}
crates/onestore-offline/tests/sync.rs+6
......@@ -5,8 +5,14 @@ use onestore::{
55use onestore_offline::{ConflictKind, EditStatus, Error, Remote, Replica};
66use std::io;
77
8#[path = "../../onestore/tests/support/disk.rs"]
9mod disk;
810#[path = "sync/outline.rs"]
911mod outline;
12#[path = "sync/tree.rs"]
13mod tree;
14#[path = "support/tree_schedule.rs"]
15mod tree_schedule;
1016
1117mod paragraph {
1218 use super::*;
crates/onestore-offline/tests/sync/outline.rs+2-2
......@@ -1,7 +1,7 @@
11use super::*;
22use onestore::OutlineEdit as Change;
33
4fn fixture() -> (Vec<u8>, ExGuid, ExGuid, ExGuid, ExGuid) {
4pub(super) fn fixture() -> (Vec<u8>, ExGuid, ExGuid, ExGuid, ExGuid) {
55 let source = onestore::create_section("layout.one", "Original 🦀 é", "Author").unwrap();
66 let (sid, text, _) = text(&source);
77 let store = Store::parse(&source).unwrap();
......@@ -24,7 +24,7 @@ fn fixture() -> (Vec<u8>, ExGuid, ExGuid, ExGuid, ExGuid) {
2424 (source, sid, outline, paragraph, text)
2525}
2626
27fn node(source: &[u8], sid: ExGuid, object: ExGuid) -> serde_json::Value {
27pub(super) fn node(source: &[u8], sid: ExGuid, object: ExGuid) -> serde_json::Value {
2828 let store = Store::parse(source).unwrap();
2929 let index = RevisionIndex::parse(&store).unwrap();
3030 index.validate_current().unwrap();
crates/onestore-offline/tests/sync/tree.rs created+716
......@@ -0,0 +1,716 @@
1use super::*;
2use onestore::{Insertion, TreeEdit};
3
4#[test]
5fn twelve_offline_clients_reconcile_tree_text_and_interrupted_publication() {
6 let mut random = 1940_u64;
7 for _ in 0..60 {
8 let input: Vec<_> = (0..384)
9 .map(|_| {
10 random ^= random << 13;
11 random ^= random >> 7;
12 random ^= random << 17;
13 random as u8
14 })
15 .collect();
16 tree_schedule::run(&input);
17 }
18}
19
20fn fixture() -> (Vec<u8>, ExGuid, ExGuid, [ExGuid; 4], [ExGuid; 4]) {
21 let (mut source, sid, outline, first, text) = super::outline::fixture();
22 let mut paragraphs = [first; 4];
23 let mut texts = [text; 4];
24 for at in 1..4 {
25 let insertion =
26 Insertion::paragraph(outline, None, &format!("Sibling {at}"), "Author").unwrap();
27 source = PreparedEdit::insert(&source, sid, &insertion)
28 .unwrap()
29 .as_bytes()
30 .to_vec();
31 paragraphs[at] = insertion.object();
32 texts[at] = insertion.text_object();
33 }
34 (source, sid, outline, paragraphs, texts)
35}
36
37fn children(source: &[u8], sid: ExGuid, object: ExGuid) -> Vec<ExGuid> {
38 let store = Store::parse(source).unwrap();
39 let index = RevisionIndex::parse(&store).unwrap();
40 index.validate_current().unwrap();
41 let document = Document::parse(&index).unwrap();
42 let space = &document.spaces[&sid];
43 space.revisions[&space.contexts[&ExGuid::default()]].nodes[&object]
44 .children
45 .clone()
46}
47
48#[test]
49fn move_preserves_remote_content_and_dependent_edits_through_reopen() {
50 let (source, sid, outline, paragraphs, texts) = fixture();
51 let directory = tempfile::tempdir().unwrap();
52 let path = directory.path().join("cache.sqlite");
53 let cache = Replica::create(&path, &source).unwrap();
54 let intent = TreeEdit::move_to(paragraphs[0], outline, None, "Offline").unwrap();
55 let id = cache.tree(&source, sid, &intent).unwrap().unwrap();
56 let dependent = cache
57 .edit_text(&cache.snapshot().unwrap(), sid, texts[0], 0..0, "Local ")
58 .unwrap()
59 .unwrap();
60 let local = cache.snapshot().unwrap();
61 let queue = cache.pending().unwrap();
62 drop(cache);
63 let cache = Replica::open(&path).unwrap();
64 assert_eq!(cache.pending().unwrap(), queue);
65 assert_eq!(cache.snapshot().unwrap(), local);
66 let edited = PreparedEdit::format(
67 &source,
68 sid,
69 texts[0],
70 0..8,
71 &[onestore::TextAttribute::Bold(true)],
72 )
73 .unwrap();
74 let descendant =
75 Insertion::paragraph(paragraphs[0], None, "New remote child", "Remote").unwrap();
76 let remote = PreparedEdit::insert(edited.as_bytes(), sid, &descendant).unwrap();
77 let mut server = Server::new(remote.as_bytes());
78 for expected in [id, dependent] {
79 assert!(
80 matches!(cache.sync_once(&mut server).unwrap(), Some((actual, EditStatus::Published { .. })) if actual == expected)
81 );
82 }
83 assert_eq!(
84 children(&server.durable, sid, outline),
85 [paragraphs[1], paragraphs[2], paragraphs[3], paragraphs[0]]
86 );
87 assert_eq!(
88 children(&server.durable, sid, paragraphs[0]),
89 [descendant.object()]
90 );
91 let node = super::outline::node(&server.durable, sid, texts[0]);
92 assert_eq!(node["kind"]["text"], "Local Original 🦀 é");
93 let store = Store::parse(&server.durable).unwrap();
94 let index = RevisionIndex::parse(&store).unwrap();
95 let document = Document::parse(&index).unwrap();
96 let space = &document.spaces[&sid];
97 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
98 assert_eq!(view.text_runs(texts[0]).unwrap()[0].format.bold, Some(true));
99 assert!(cache.pending().unwrap().is_empty());
100 assert_eq!(server.publications, 2);
101}
102
103#[test]
104fn deletion_requires_review_of_remote_content_and_preserves_later_work() {
105 let (source, sid, outline, paragraphs, texts) = fixture();
106 let child = Insertion::paragraph(paragraphs[0], None, "Descendant", "Author").unwrap();
107 let source = PreparedEdit::insert(&source, sid, &child)
108 .unwrap()
109 .as_bytes()
110 .to_vec();
111 for remote in [
112 PreparedEdit::text(&source, sid, texts[0], 0..0, "Remote ")
113 .unwrap()
114 .as_bytes()
115 .to_vec(),
116 PreparedEdit::text(&source, sid, child.text_object(), 0..0, "Remote ")
117 .unwrap()
118 .as_bytes()
119 .to_vec(),
120 PreparedEdit::format(
121 &source,
122 sid,
123 child.text_object(),
124 0..10,
125 &[onestore::TextAttribute::Italic(true)],
126 )
127 .unwrap()
128 .as_bytes()
129 .to_vec(),
130 PreparedEdit::insert(
131 &source,
132 sid,
133 &Insertion::paragraph(paragraphs[0], None, "New child", "Remote").unwrap(),
134 )
135 .unwrap()
136 .as_bytes()
137 .to_vec(),
138 ] {
139 let directory = tempfile::tempdir().unwrap();
140 let path = directory.path().join("cache.sqlite");
141 let cache = Replica::create(&path, &source).unwrap();
142 let intent = TreeEdit::delete(paragraphs[0], "Offline").unwrap();
143 let id = cache.tree(&source, sid, &intent).unwrap().unwrap();
144 let dependent = cache
145 .edit_text(&cache.snapshot().unwrap(), sid, texts[1], 0..0, "Local ")
146 .unwrap()
147 .unwrap();
148 let queue = cache.pending().unwrap();
149 let local = cache.snapshot().unwrap();
150 let mut server = Server::new(&remote);
151 assert_eq!(
152 cache.sync_once(&mut server).unwrap(),
153 Some((id, EditStatus::Conflict(ConflictKind::ContentChanged)))
154 );
155 assert_eq!(server.publications, 0);
156 assert_eq!(cache.pending().unwrap(), queue);
157 assert_eq!(cache.snapshot().unwrap(), local);
158 assert!(cache.rebase_tree_conflict(id, &source, &remote).is_err());
159 assert!(cache.rebase_tree_conflict(id, &local, &source).is_err());
160 assert!(
161 cache
162 .rebase_tree_conflict(dependent, &local, &remote)
163 .is_err()
164 );
165 assert!(cache.rebase_conflict(id, &local, &remote, 0..0).is_err());
166 let archive = directory.path().join("recovery.sqlite");
167 cache.export_recovery(&archive).unwrap();
168 let recovery = onestore_offline::Recovery::open(&archive).unwrap();
169 assert_eq!(recovery.pending().unwrap(), queue);
170 assert_eq!(recovery.status(id).unwrap(), cache.status(id).unwrap());
171 assert!(recovery.snapshot().unwrap() == local);
172 drop(cache);
173 let cache = Replica::open(&path).unwrap();
174 assert_eq!(
175 cache.status(id).unwrap(),
176 Some(EditStatus::Conflict(ConflictKind::ContentChanged))
177 );
178 cache.rebase_tree_conflict(id, &local, &remote).unwrap();
179 assert_eq!(cache.pending().unwrap()[1], queue[1]);
180 assert_eq!(cache.snapshot().unwrap(), local);
181 for expected in [id, dependent] {
182 assert!(
183 matches!(cache.sync_once(&mut server).unwrap(), Some((actual, EditStatus::Published { .. })) if actual == expected)
184 );
185 }
186 assert_eq!(children(&server.durable, sid, outline), paragraphs[1..]);
187 assert_eq!(
188 super::outline::node(&server.durable, sid, texts[1])["kind"]["text"],
189 "Local Sibling 1"
190 );
191 }
192}
193
194#[test]
195fn sibling_and_ancestry_changes_have_explicit_merge_or_conflict() {
196 let (source, sid, outline, p, texts) = fixture();
197 let insertion = Insertion::paragraph(outline, Some(p[0]), "New sibling", "Remote").unwrap();
198 let cases = [
199 (
200 PreparedEdit::insert(&source, sid, &insertion)
201 .unwrap()
202 .as_bytes()
203 .to_vec(),
204 None,
205 ),
206 (
207 PreparedEdit::tree(&source, sid, &TreeEdit::delete(p[1], "Remote").unwrap())
208 .unwrap()
209 .as_bytes()
210 .to_vec(),
211 None,
212 ),
213 (
214 PreparedEdit::tree(
215 &source,
216 sid,
217 &TreeEdit::move_to(p[1], outline, None, "Remote").unwrap(),
218 )
219 .unwrap()
220 .as_bytes()
221 .to_vec(),
222 None,
223 ),
224 (
225 PreparedEdit::tree(
226 &source,
227 sid,
228 &TreeEdit::move_to(p[0], outline, Some(p[2]), "Remote").unwrap(),
229 )
230 .unwrap()
231 .as_bytes()
232 .to_vec(),
233 Some(ConflictKind::StructureChanged),
234 ),
235 (
236 PreparedEdit::tree(
237 &source,
238 sid,
239 &TreeEdit::move_to(p[0], p[1], None, "Remote").unwrap(),
240 )
241 .unwrap()
242 .as_bytes()
243 .to_vec(),
244 Some(ConflictKind::StructureChanged),
245 ),
246 (
247 PreparedEdit::tree(&source, sid, &TreeEdit::delete(p[0], "Remote").unwrap())
248 .unwrap()
249 .as_bytes()
250 .to_vec(),
251 Some(ConflictKind::TargetUnavailable),
252 ),
253 ];
254 for (remote, expected) in cases {
255 let directory = tempfile::tempdir().unwrap();
256 let cache = Replica::create(directory.path().join("cache.sqlite"), &source).unwrap();
257 let intent = TreeEdit::move_to(p[0], outline, None, "Offline").unwrap();
258 let id = cache.tree(&source, sid, &intent).unwrap().unwrap();
259 let mut server = Server::new(&remote);
260 let result = cache.sync_once(&mut server).unwrap().unwrap();
261 assert_eq!(result.0, id);
262 if let Some(kind) = expected {
263 assert_eq!(result.1, EditStatus::Conflict(kind));
264 assert_eq!(server.publications, 0);
265 } else {
266 assert!(matches!(result.1, EditStatus::Published { .. }));
267 assert_eq!(children(&server.durable, sid, outline).last(), Some(&p[0]));
268 assert_eq!(
269 super::outline::node(&server.durable, sid, texts[0])["kind"]["text"],
270 "Original 🦀 é"
271 );
272 }
273 }
274}
275
276#[test]
277fn moved_destination_and_missing_anchor_retain_conflicts_but_unrelated_text_does_not() {
278 let (source, sid, outline, p, texts) = fixture();
279 let child = Insertion::paragraph(p[1], None, "Anchor", "Author").unwrap();
280 let source = PreparedEdit::insert(&source, sid, &child)
281 .unwrap()
282 .as_bytes()
283 .to_vec();
284 let intent = TreeEdit::move_to(p[0], p[1], Some(child.object()), "Offline").unwrap();
285 let cases = [
286 (
287 PreparedEdit::tree(
288 &source,
289 sid,
290 &TreeEdit::move_to(p[1], p[2], None, "Remote").unwrap(),
291 )
292 .unwrap()
293 .as_bytes()
294 .to_vec(),
295 ConflictKind::StructureChanged,
296 ),
297 (
298 PreparedEdit::tree(
299 &source,
300 sid,
301 &TreeEdit::move_to(child.object(), outline, None, "Remote").unwrap(),
302 )
303 .unwrap()
304 .as_bytes()
305 .to_vec(),
306 ConflictKind::UnsupportedEdit,
307 ),
308 ];
309 for (remote, kind) in cases {
310 let directory = tempfile::tempdir().unwrap();
311 let cache = Replica::create(directory.path().join("cache.sqlite"), &source).unwrap();
312 let id = cache.tree(&source, sid, &intent).unwrap().unwrap();
313 let mut server = Server::new(&remote);
314 assert_eq!(
315 cache.sync_once(&mut server).unwrap(),
316 Some((id, EditStatus::Conflict(kind)))
317 );
318 assert_eq!(server.publications, 0);
319 }
320 let directory = tempfile::tempdir().unwrap();
321 let cache = Replica::create(directory.path().join("cache.sqlite"), &source).unwrap();
322 let id = cache
323 .tree(&source, sid, &TreeEdit::delete(p[0], "Offline").unwrap())
324 .unwrap()
325 .unwrap();
326 let remote = PreparedEdit::text(&source, sid, texts[1], 0..0, "Remote ").unwrap();
327 let mut server = Server::new(remote.as_bytes());
328 assert!(
329 matches!(cache.sync_once(&mut server).unwrap(), Some((n, EditStatus::Published { .. })) if n == id)
330 );
331 assert_eq!(
332 super::outline::node(&server.durable, sid, texts[1])["kind"]["text"],
333 "Remote Sibling 1"
334 );
335}
336
337#[test]
338fn unknown_tree_attempts_require_revision_evidence_even_when_effect_is_visible() {
339 let (source, sid, outline, p, _) = fixture();
340 for deletion in [false, true] {
341 for fault in [
342 Fault::UnknownBefore,
343 Fault::UnknownAfter,
344 Fault::Before,
345 Fault::Committed,
346 ] {
347 let directory = tempfile::tempdir().unwrap();
348 let path = directory.path().join("cache.sqlite");
349 let cache = Replica::create(&path, &source).unwrap();
350 let intent = if deletion {
351 TreeEdit::delete(p[0], "Offline")
352 } else {
353 TreeEdit::move_to(p[0], outline, None, "Offline")
354 }
355 .unwrap();
356 let id = cache.tree(&source, sid, &intent).unwrap().unwrap();
357 let mut server = Server::new(&source);
358 server.fault = fault;
359 assert!(cache.sync_once(&mut server).is_err());
360 let local = cache.snapshot().unwrap();
361 let before = cache.status(id).unwrap();
362 drop(cache);
363 let cache = Replica::open(&path).unwrap();
364 assert_eq!(cache.status(id).unwrap(), before);
365 if matches!(fault, Fault::UnknownBefore) {
366 let independent = if deletion {
367 TreeEdit::delete(p[0], "Other")
368 } else {
369 TreeEdit::move_to(p[0], outline, None, "Other")
370 }
371 .unwrap();
372 server = Server::new(
373 PreparedEdit::tree(&source, sid, &independent)
374 .unwrap()
375 .as_bytes(),
376 );
377 assert!(
378 matches!(cache.sync_once(&mut server).unwrap(), Some((n, EditStatus::AwaitingConfirmation { .. })) if n == id)
379 );
380 assert!(
381 cache
382 .rebase_tree_conflict(id, &local, &server.visible)
383 .is_err()
384 );
385 assert_eq!(server.publications, 0);
386 assert_eq!(cache.snapshot().unwrap(), local);
387 } else if matches!(fault, Fault::Committed) {
388 assert!(matches!(
389 cache.status(id).unwrap(),
390 Some(EditStatus::Published { .. })
391 ));
392 } else {
393 assert!(
394 matches!(cache.sync_once(&mut server).unwrap(), Some((n, EditStatus::Published { .. })) if n == id)
395 );
396 assert_eq!(
397 server.publications,
398 if matches!(fault, Fault::Before) { 2 } else { 1 }
399 );
400 let saved = cache.snapshot().unwrap();
401 assert!(saved[..212] == server.durable[..212]);
402 assert!(saved[252..] == server.durable[252..]);
403 assert_eq!(
404 children(&saved, sid, outline),
405 children(&server.durable, sid, outline)
406 );
407 }
408 }
409 }
410}
411
412#[test]
413fn independently_satisfied_move_confirms_without_republication() {
414 let (source, sid, outline, p, _) = fixture();
415 let directory = tempfile::tempdir().unwrap();
416 let cache = Replica::create(directory.path().join("cache.sqlite"), &source).unwrap();
417 let id = cache
418 .tree(
419 &source,
420 sid,
421 &TreeEdit::move_to(p[0], outline, None, "Offline").unwrap(),
422 )
423 .unwrap()
424 .unwrap();
425 let remote = PreparedEdit::tree(
426 &source,
427 sid,
428 &TreeEdit::move_to(p[0], outline, None, "Remote").unwrap(),
429 )
430 .unwrap();
431 let mut server = Server::new(remote.as_bytes());
432 assert!(
433 matches!(cache.sync_once(&mut server).unwrap(), Some((n, EditStatus::Published { .. })) if n == id)
434 );
435 assert_eq!(server.publications, 0);
436 assert_eq!(server.confirmations, 1);
437}
438
439#[test]
440fn emptied_cell_replacement_is_durable_and_cannot_be_silently_omitted_on_replay() {
441 let source =
442 include_bytes!("../../../../corpus/outline-edit/tree/before/notebook/synthetic.one");
443 let store = Store::parse(source).unwrap();
444 let index = RevisionIndex::parse(&store).unwrap();
445 let document = Document::parse(&index).unwrap();
446 let (sid, page) = document.pages().unwrap().into_iter().find(|(sid, _)| {
447 let space = &document.spaces[sid];
448 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
449 matches!(&view.nodes[&view.roots[&2]].kind, Kind::Metadata { title: Some(title), .. } if title == "Delete sole cell paragraph")
450 }).unwrap();
451 let space = &document.spaces[&sid];
452 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
453 let mut pending = vec![page];
454 let mut selected = None;
455 let mut other = None;
456 while let Some(id) = pending.pop() {
457 let node = &view.nodes[&id];
458 pending.extend(&node.children);
459 pending.extend(&node.content);
460 if matches!(node.kind, Kind::Cell { .. }) {
461 let paragraph = node.children[0];
462 let text = view.nodes[&paragraph].content[0];
463 if matches!(&view.nodes[&text].kind, Kind::RichText { text, .. } if text.starts_with("Target "))
464 {
465 selected = Some((id, paragraph));
466 } else {
467 other = Some((id, text));
468 }
469 }
470 }
471 let (cell, target) = selected.unwrap();
472 let (other_cell, other_text) = other.unwrap();
473 for move_out in [false, true] {
474 for competing_child in [false, true] {
475 let directory = tempfile::tempdir().unwrap();
476 let path = directory.path().join("cell.sqlite");
477 let cache = Replica::create(&path, source).unwrap();
478 let intent = if move_out {
479 TreeEdit::move_to(target, other_cell, None, "Offline")
480 } else {
481 TreeEdit::delete(target, "Offline")
482 }
483 .unwrap();
484 let id = cache.tree(source, sid, &intent).unwrap().unwrap();
485 let local = cache.snapshot().unwrap();
486 let replacement = children(&local, sid, cell);
487 assert_eq!(replacement.len(), 1);
488 assert_ne!(replacement[0], target);
489 let replacement_text: ExGuid =
490 super::outline::node(&local, sid, replacement[0])["content"][0]
491 .as_str()
492 .unwrap()
493 .parse()
494 .unwrap();
495 let dependent = cache
496 .edit_text(&local, sid, replacement_text, 0..0, "Local replacement")
497 .unwrap()
498 .unwrap();
499 let local = cache.snapshot().unwrap();
500 let queue = cache.pending().unwrap();
501 drop(cache);
502 let cache = Replica::open(&path).unwrap();
503 assert_eq!(cache.pending().unwrap(), queue);
504 assert_eq!(cache.snapshot().unwrap(), local);
505 let remote = if competing_child {
506 PreparedEdit::insert(
507 source,
508 sid,
509 &Insertion::paragraph(cell, None, "Remote sibling", "Remote").unwrap(),
510 )
511 .unwrap()
512 .as_bytes()
513 .to_vec()
514 } else {
515 PreparedEdit::text(source, sid, other_text, 0..0, "Remote ")
516 .unwrap()
517 .as_bytes()
518 .to_vec()
519 };
520 let mut server = Server::new(&remote);
521 if competing_child {
522 assert_eq!(
523 cache.sync_once(&mut server).unwrap(),
524 Some((id, EditStatus::Conflict(ConflictKind::StructureChanged)))
525 );
526 assert_eq!(server.publications, 0);
527 assert!(cache.rebase_tree_conflict(id, &local, &remote).is_err());
528 assert_eq!(cache.pending().unwrap(), queue);
529 assert_eq!(cache.snapshot().unwrap(), local);
530 } else {
531 for expected in [id, dependent] {
532 assert!(
533 matches!(cache.sync_once(&mut server).unwrap(), Some((actual, EditStatus::Published { .. })) if actual == expected)
534 );
535 }
536 assert_eq!(children(&server.durable, sid, cell), replacement);
537 assert_eq!(
538 super::outline::node(&server.durable, sid, replacement_text)["kind"]["text"],
539 "Local replacement"
540 );
541 assert_eq!(
542 super::outline::node(&server.durable, sid, other_text)["kind"]["text"],
543 "Remote Other cell"
544 );
545 if let Some(output) = std::env::var_os("ONESTORE_OFFLINE_TREE_OUTPUT") {
546 let output = std::path::PathBuf::from(output)
547 .join(if move_out { "cell-move" } else { "cell-delete" })
548 .join("candidate");
549 std::fs::create_dir_all(&output).unwrap();
550 std::fs::write(output.join("synthetic.one"), &server.durable).unwrap();
551 }
552 }
553 }
554 }
555}
556
557#[test]
558fn native_tree_and_layout_changes_reconcile_without_discarding_unreviewed_content() {
559 let source = include_bytes!("../../../../corpus/outline-edit/before/notebook/synthetic.one");
560 let native = include_bytes!("../../../../corpus/outline-edit/after/notebook/synthetic.one");
561 let store = Store::parse(source).unwrap();
562 let index = RevisionIndex::parse(&store).unwrap();
563 let document = Document::parse(&index).unwrap();
564 let mut server = Server::new(native);
565 let mut counts = [0; 3];
566 let mut records = Vec::new();
567 for (sid, page) in document.pages().unwrap() {
568 let space = &document.spaces[&sid];
569 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
570 let Kind::Metadata {
571 title: Some(name), ..
572 } = &view.nodes[&view.roots[&2]].kind
573 else {
574 continue;
575 };
576 if name == "Unicode rich text" {
577 continue;
578 }
579 let outlines: Vec<_> = view.nodes[&page]
580 .children
581 .iter()
582 .copied()
583 .filter(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
584 .collect();
585 if outlines.len() != 2 {
586 continue;
587 }
588 let outline = outlines[0];
589 let other = view.nodes[&outlines[1]].children[0];
590 let dependent_text = view.nodes[&other].content[0];
591 let mut pending = vec![outline];
592 let mut paragraphs = std::collections::BTreeMap::new();
593 while let Some(id) = pending.pop() {
594 let node = &view.nodes[&id];
595 pending.extend(&node.children);
596 if let Some(text) = node.content.first()
597 && let Kind::RichText { text, .. } = &view.nodes[text].kind
598 {
599 paragraphs.insert(text.as_str(), id);
600 }
601 }
602 let target = *paragraphs
603 .iter()
604 .find(|(text, _)| text.starts_with("Target "))
605 .unwrap()
606 .1;
607 let (intent, conflict) = match name.as_str() {
608 "Move leaf down" | "Move subtree down" => {
609 (TreeEdit::move_to(target, outline, None, "Offline"), None)
610 }
611 "Move subtree up" => (
612 TreeEdit::move_to(target, outline, Some(paragraphs["Anchor"]), "Offline"),
613 None,
614 ),
615 "Indent subtree" | "Outdent subtree" => (
616 TreeEdit::delete(target, "Offline"),
617 Some(ConflictKind::StructureChanged),
618 ),
619 "Collapse subtree" | "Expand subtree" => (
620 TreeEdit::delete(target, "Offline"),
621 Some(ConflictKind::ContentChanged),
622 ),
623 "Delete leaf" | "Delete subtree" | "Delete only paragraph" => (
624 TreeEdit::delete(target, "Offline"),
625 Some(ConflictKind::TargetUnavailable),
626 ),
627 "Delete outline" => (
628 TreeEdit::delete(outline, "Offline"),
629 Some(ConflictKind::TargetUnavailable),
630 ),
631 "Move outline" | "Resize outline" | "Automatic outline size" => (
632 TreeEdit::delete(outline, "Offline"),
633 Some(ConflictKind::ContentChanged),
634 ),
635 _ => panic!("{name}"),
636 };
637 let intent = intent.unwrap();
638 let directory = tempfile::tempdir().unwrap();
639 let path = directory.path().join("native.sqlite");
640 let cache = Replica::create(&path, source).unwrap();
641 let id = cache.tree(source, sid, &intent).unwrap().unwrap();
642 let dependent = cache
643 .edit_text(
644 &cache.snapshot().unwrap(),
645 sid,
646 dependent_text,
647 0..0,
648 "Offline ",
649 )
650 .unwrap()
651 .unwrap();
652 let local = cache.snapshot().unwrap();
653 let queue = cache.pending().unwrap();
654 let old_publications = server.publications;
655 let (actual, status) = cache.sync_once(&mut server).unwrap().unwrap();
656 assert_eq!(actual, id);
657 if let Some(kind) = conflict {
658 assert_eq!(status, EditStatus::Conflict(kind), "{name}");
659 assert_eq!(server.publications, old_publications);
660 assert_eq!(cache.pending().unwrap(), queue);
661 assert!(cache.snapshot().unwrap() == local);
662 drop(cache);
663 let cache = Replica::open(&path).unwrap();
664 assert_eq!(cache.status(id).unwrap(), Some(status));
665 if kind == ConflictKind::TargetUnavailable {
666 counts[2] += 1;
667 assert!(
668 cache
669 .rebase_tree_conflict(id, &local, &server.visible)
670 .is_err()
671 );
672 records.push(serde_json::json!({"page": name, "space": sid, "result": "retained"}));
673 continue;
674 }
675 counts[1] += 1;
676 cache
677 .rebase_tree_conflict(id, &local, &server.visible)
678 .unwrap();
679 assert_eq!(cache.pending().unwrap()[1], queue[1]);
680 for expected in [id, dependent] {
681 assert!(
682 matches!(cache.sync_once(&mut server).unwrap(), Some((actual, EditStatus::Published { .. })) if actual == expected)
683 );
684 }
685 } else {
686 counts[0] += 1;
687 assert!(matches!(status, EditStatus::Published { .. }), "{name}");
688 assert_eq!(server.publications, old_publications);
689 assert!(
690 matches!(cache.sync_once(&mut server).unwrap(), Some((actual, EditStatus::Published { .. })) if actual == dependent)
691 );
692 }
693 assert_eq!(
694 super::outline::node(&server.durable, sid, dependent_text)["kind"]["text"],
695 format!(
696 "Offline {}",
697 match &view.nodes[&dependent_text].kind {
698 Kind::RichText { text, .. } => text,
699 _ => panic!(),
700 }
701 )
702 );
703 records.push(serde_json::json!({"page": name, "space": sid, "result": if conflict.is_some() { "reviewed" } else { "converged" }}));
704 }
705 assert_eq!(counts, [3, 7, 4]);
706 if let Some(output) = std::env::var_os("ONESTORE_OFFLINE_TREE_OUTPUT") {
707 let output = std::path::PathBuf::from(output);
708 std::fs::create_dir_all(output.join("candidate")).unwrap();
709 std::fs::write(output.join("candidate/synthetic.one"), &server.durable).unwrap();
710 std::fs::write(
711 output.join("manifest.json"),
712 serde_json::to_vec_pretty(&records).unwrap(),
713 )
714 .unwrap();
715 }
716}
crates/onestore/src/objects.rs+1
......@@ -34,6 +34,7 @@ pub struct ResolvedRevision<'a> {
3434}
3535
3636/// Occurrences retain multiplicity for native reference counts.
37/// Each stream follows property arena order, including nested sets.
3738#[derive(Debug, Default)]
3839pub struct ObjectReferences {
3940 pub objects: Vec<ExGuid>,
crates/onestore/src/tree.rs+12
......@@ -38,6 +38,18 @@ pub struct TreeEdit {
3838}
3939
4040impl TreeEdit {
41 pub fn object(&self) -> ExGuid {
42 self.object
43 }
44
45 /// Move destination and direct sibling anchor; deletion has no destination.
46 pub fn destination(&self) -> Option<(ExGuid, Option<ExGuid>)> {
47 match self.placement {
48 Placement::Delete => None,
49 Placement::Move { parent, before } => Some((parent, before)),
50 }
51 }
52
4153 /// Removes a paragraph or ordinary outline and its descendants from the active tree.
4254 /// Historical objects remain available; an emptied table cell receives an empty paragraph.
4355 pub fn delete(object: ExGuid, author: &str) -> Result<Self, Error> {
fuzz/Cargo.toml+7
......@@ -107,3 +107,10 @@ path = "fuzz_targets/tree.rs"
107107test = false
108108doc = false
109109bench = false
110
111[[bin]]
112name = "offline_tree"
113path = "fuzz_targets/offline_tree.rs"
114test = false
115doc = false
116bench = false
fuzz/fuzz_targets/offline_tree.rs created+9
......@@ -0,0 +1,9 @@
1#![no_main]
2use libfuzzer_sys::fuzz_target;
3
4#[path = "../../crates/onestore/tests/support/disk.rs"]
5mod disk;
6#[path = "../../crates/onestore-offline/tests/support/tree_schedule.rs"]
7mod tree_schedule;
8
9fuzz_target!(|input: &[u8]| tree_schedule::run(input));
tools/test_outline_edit.py+7-3
......@@ -20,8 +20,12 @@ compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare']
2020
2121class OutlineEditTest(unittest.TestCase):
2222 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
23 for name, pages in [
24 ('rust-tree/ordinary', 15), ('rust-tree/groups-cells', 12),
25 ('rust-tree/cross-container', 12), ('rust-tree/unequal-groups', 1),
26 ('offline-tree', 15), ('offline-tree/cell-delete', 12), ('offline-tree/cell-move', 12),
27 ]:
28 fixture = FIXTURE / name
2529 with self.subTest(case=name), TemporaryDirectory() as temporary:
2630 models = {}
2731 for phase, notebook in [('candidate', fixture / 'candidate'), ('cold', fixture / 'cold/notebook')]:
......@@ -42,7 +46,7 @@ class OutlineEditTest(unittest.TestCase):
4246 for _, node in walk(old, page):
4347 for oid in node['kind'].get('lists', []):
4448 self.assertEqual(old['nodes'][oid], saved['nodes'][oid])
45 if name == 'unequal-groups':
49 if name == 'rust-tree/unequal-groups':
4650 capture, = (fixture / 'cold/read').glob('page-*.xml')
4751 root = ET.parse(capture).getroot()
4852 self.assertEqual([(group.get('indent'), ''.join(Text(group.find('one:OE/one:T', ns).text or '').parts))