| author | |
| committer | |
| log | fa4842b0710f130a915f5ae0cea755b17503825f |
| tree | 16615ac2372c4f48e6f1bd565598b8745679d162 |
| parent | c3891b37112bb60d6f963ef3adae5a1f5c3e5e73 |
| signature | Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU |
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-astra93 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 |
| 128 | 128 | unit test. Cold-open the resulting `ordinary`, `groups-cells`, `cross-container` |
| 129 | 129 | and `unequal-groups` notebooks with expected page counts 15, 12, 12 and 1, |
| 130 | 130 | respectively, using `tools/native_runner.py --collect-notebook`. |
| 131 | ||
| 132 | `offline-tree` reconciles moves/deletions and dependent text edits against the | |
| 133 | fourteen ordinary native controls. Three already-converged moves confirm without | |
| 134 | publication, seven competing structure/content changes require explicit review, | |
| 135 | and four deleted targets retain the complete local branch. The cold capture | |
| 136 | preserves all 247 active graph objects across fifteen pages, three tags, and | |
| 137 | 6,497 explicit character-format comparisons per image. Its `cases.json` records | |
| 138 | the native input cases and outcomes. Regenerate with the offline sync test | |
| 139 | `native_tree_and_layout_changes_reconcile_without_discarding_unreviewed_content`, | |
| 140 | setting `ONESTORE_OFFLINE_TREE_OUTPUT` to a new absolute directory, then cold-open | |
| 141 | its `candidate` with `--expected-pages 15 --collect-notebook`. | |
| 142 | ||
| 143 | Its `cell-delete` and `cell-move` captures additionally verify local edits to an | |
| 144 | emptied cell's replacement paragraph while preserving remote text in the other | |
| 145 | cell. They retain 272 and 274 active objects, respectively, with 8,201 and 8,377 | |
| 146 | explicit format comparisons per image. Regenerate with the offline sync test | |
| 147 | `emptied_cell_replacement_is_durable_and_cannot_be_silently_omitted_on_replay`, | |
| 148 | using 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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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; | |
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | |
| 4 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | |
| 5 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | |
| 6 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | |
| 7 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | |
| 8 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | |
| 9 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | |
| 10 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | |
| 11 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | |
| 12 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | |
| 13 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | |
| 14 | 11.0pt'><br> | |
| 15 | End</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 | |
| 16 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | |
| 17 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | |
| 18 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | |
| 19 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | |
| 20 | lang=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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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; | |
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | |
| 4 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | |
| 5 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | |
| 6 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | |
| 7 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | |
| 8 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | |
| 9 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | |
| 10 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | |
| 11 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | |
| 12 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | |
| 13 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | |
| 14 | 11.0pt'><br> | |
| 15 | End</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 | |
| 16 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | |
| 17 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | |
| 18 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | |
| 19 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | |
| 20 | lang=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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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; | |
| 3 | text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span | |
| 4 | style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family: | |
| 5 | Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri; | |
| 6 | font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through; | |
| 7 | font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family: | |
| 8 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family: | |
| 9 | Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size: | |
| 10 | 11.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238; | |
| 11 | background:yellow;mso-highlight:yellow'>color</span><span style='font-family: | |
| 12 | Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family: | |
| 13 | Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size: | |
| 14 | 11.0pt'><br> | |
| 15 | End</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 | |
| 16 | style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span | |
| 17 | style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span | |
| 18 | style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span | |
| 19 | style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed' | |
| 20 | lang=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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 | |
| 5 | style='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 | |
| 3 | style='font-weight:bold' lang=en-US>Target &#129408; é</span><span lang=en-US> </span><a | |
| 4 | href="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 |
| 31 | 31 | the new text for subsequent offline edits. Pending entries expose |
| 32 | 32 | `Operation::Text(TextEdit)`, `Operation::Insert(Insertion)`, |
| 33 | 33 | `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 | |
| 35 | 36 | `operation` field. Synchronization applies these in queue order, so an inserted |
| 36 | 37 | outline can precede its paragraphs and their later edits. Missing anchors or |
| 37 | 38 | existing 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 |
| 98 | 99 | against both current images, preserving dependent intents. An uncertain layout |
| 99 | 100 | attempt requires its original revision; converged values cannot establish its receipt. |
| 100 | 101 | |
| 101 | Recognized earlier caches migrate transactionally to version seven, which adds | |
| 102 | layout intents and layout conflicts. The migration retains | |
| 102 | `tree` accepts the core `onestore::TreeEdit`. Moves preserve independent remote | |
| 103 | text, formatting and descendants. A competing ancestor, indentation or sibling | |
| 104 | crossing produces `StructureChanged`; unrelated sibling insertions/deletions can | |
| 105 | merge. An anchor must remain a direct child of the requested destination. An | |
| 106 | already satisfied move still requires guarded confirmation before acknowledgement. | |
| 107 | Deletion compares the selected raw property graph, including referenced styles, | |
| 108 | tags, unknown fields and internal attachments. Changed content produces | |
| 109 | `ContentChanged`; property order, CompactID numbering and modification timestamps | |
| 110 | do not affect that comparison. Missing targets retain `TargetUnavailable`. | |
| 111 | `rebase_tree_conflict(id, local, remote)` reviews the original move/deletion against | |
| 112 | both current images. An emptied cell's replacement paragraph/text identities must | |
| 113 | remain the same before replay or review; later queued edits keep their targets. | |
| 114 | Uncertain tree attempts require their original revision for confirmation, even | |
| 115 | when an independent move or deletion has the same visible effect. | |
| 116 | ||
| 117 | Recognized earlier caches migrate transactionally to version eight, which adds | |
| 118 | tree intents and content conflicts. The migration retains | |
| 103 | 119 | images, local IDs, publication attempts, conflicts, |
| 104 | 120 | receipts and the autoincrement sequence; it does not reuse acknowledged IDs when |
| 105 | 121 | the 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>> { |
| 140 | 140 | } |
| 141 | 141 | onestore_offline::Operation::Split(_) |
| 142 | 142 | | onestore_offline::Operation::Join(_) |
| 143 | | onestore_offline::Operation::Outline(_) => { | |
| 143 | | onestore_offline::Operation::Outline(_) | |
| 144 | | onestore_offline::Operation::Tree(_) => { | |
| 144 | 145 | panic!("Unexpected operation for this fixture") |
| 145 | 146 | } |
| 146 | 147 | }; |
crates/onestore-offline/src/lib.rs+4-1| ... | ... | @@ -15,10 +15,12 @@ mod paragraph; |
| 15 | 15 | mod rebase; |
| 16 | 16 | mod recovery; |
| 17 | 17 | mod schema; |
| 18 | mod tree; | |
| 18 | 19 | pub use formatting::FormatEdit; |
| 19 | 20 | pub use outline::OutlineEdit; |
| 20 | 21 | pub use paragraph::{JoinEdit, SplitEdit}; |
| 21 | 22 | pub use recovery::{Recovery, RecoverySummary}; |
| 23 | pub use tree::TreeEdit; | |
| 22 | 24 | mod sync; |
| 23 | 25 | pub use sync::{ConflictKind, EditStatus, Remote}; |
| 24 | 26 | mod worker; |
| ... | ... | @@ -49,7 +51,7 @@ pub enum Error { |
| 49 | 51 | type Result<T> = std::result::Result<T, Error>; |
| 50 | 52 | |
| 51 | 53 | const APPLICATION_ID: u32 = 0x4f4e454f; |
| 52 | const SCHEMA_VERSION: u32 = 7; | |
| 54 | const SCHEMA_VERSION: u32 = 8; | |
| 53 | 55 | |
| 54 | 56 | /// Text and its observed precondition, retained across cache reopen and rebasing. |
| 55 | 57 | #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] |
| ... | ... | @@ -70,6 +72,7 @@ pub enum Operation { |
| 70 | 72 | Split(SplitEdit), |
| 71 | 73 | Join(JoinEdit), |
| 72 | 74 | Outline(OutlineEdit), |
| 75 | Tree(TreeEdit), | |
| 73 | 76 | } |
| 74 | 77 | |
| 75 | 78 | /// 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}; |
| 3 | 3 | |
| 4 | 4 | const CONFLICTS: &str = "CREATE TABLE conflicts ( |
| 5 | 5 | 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) | |
| 7 | 7 | ) STRICT;"; |
| 8 | 8 | |
| 9 | 9 | const ASSETS: &str = "CREATE TABLE assets ( |
crates/onestore-offline/src/sync.rs+25| ... | ... | @@ -20,6 +20,7 @@ pub enum ConflictKind { |
| 20 | 20 | FormattingChanged = 3, |
| 21 | 21 | StructureChanged = 4, |
| 22 | 22 | LayoutChanged = 5, |
| 23 | ContentChanged = 6, | |
| 23 | 24 | } |
| 24 | 25 | |
| 25 | 26 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] |
| ... | ... | @@ -136,6 +137,7 @@ impl Replica { |
| 136 | 137 | Operation::Split(edit) => edit.prepare(&snapshot, intent.space)?, |
| 137 | 138 | Operation::Join(edit) => edit.prepare(&snapshot, intent.space)?, |
| 138 | 139 | Operation::Outline(edit) => edit.prepare(&snapshot, intent.space)?, |
| 140 | Operation::Tree(edit) => edit.prepare(&snapshot, intent.space)?, | |
| 139 | 141 | Operation::Insert(insertion) => { |
| 140 | 142 | PreparedEdit::insert(&snapshot, intent.space, insertion) |
| 141 | 143 | .map_err(|_| ConflictKind::UnsupportedEdit) |
| ... | ... | @@ -306,6 +308,13 @@ impl Replica { |
| 306 | 308 | ) |
| 307 | 309 | .into()); |
| 308 | 310 | } |
| 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 | } | |
| 309 | 318 | Operation::Insert(_) => { |
| 310 | 319 | return Err(io::Error::new( |
| 311 | 320 | io::ErrorKind::InvalidInput, |
| ... | ... | @@ -398,6 +407,21 @@ impl Replica { |
| 398 | 407 | }) |
| 399 | 408 | } |
| 400 | 409 | |
| 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 | ||
| 401 | 425 | fn resolve_conflict( |
| 402 | 426 | &self, |
| 403 | 427 | id: u64, |
| ... | ... | @@ -519,6 +543,7 @@ pub(crate) fn status(connection: &Connection, id: u64) -> Result<Option<EditStat |
| 519 | 543 | 3 => ConflictKind::FormattingChanged, |
| 520 | 544 | 4 => ConflictKind::StructureChanged, |
| 521 | 545 | 5 => ConflictKind::LayoutChanged, |
| 546 | 6 => ConflictKind::ContentChanged, | |
| 522 | 547 | _ => { |
| 523 | 548 | return Err(io::Error::new( |
| 524 | 549 | io::ErrorKind::InvalidData, |
crates/onestore-offline/src/tree.rs created+370| ... | ... | @@ -0,0 +1,370 @@ |
| 1 | use super::*; | |
| 2 | use onestore::{FileDataReference, IdStream, ObjectData, PropertySets, ResolvedRevision, Value}; | |
| 3 | use serde::{Deserialize, Serialize}; | |
| 4 | use sha2::{Digest, Sha256}; | |
| 5 | use std::collections::{BTreeMap, BTreeSet}; | |
| 6 | ||
| 7 | #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] | |
| 8 | #[serde(deny_unknown_fields)] | |
| 9 | struct 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)] | |
| 19 | pub struct TreeEdit { | |
| 20 | pub intent: onestore::TreeEdit, | |
| 21 | observed: Observed, | |
| 22 | created: BTreeSet<ExGuid>, | |
| 23 | } | |
| 24 | ||
| 25 | fn 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 | ||
| 118 | fn 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 | ||
| 178 | fn 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 | ||
| 189 | impl 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 | ||
| 202 | impl 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)] | |
| 279 | mod 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() { |
| 796 | 796 | } |
| 797 | 797 | |
| 798 | 798 | #[test] |
| 799 | fn prior_schema_migrations_retain_queue_evidence_assets_and_enable_layout_conflicts() { | |
| 800 | for (version, ceiling) in [(5, 3), (6, 4)] { | |
| 799 | fn prior_schema_migrations_retain_queue_evidence_assets_and_enable_content_conflicts() { | |
| 800 | for (version, ceiling) in [(5, 3), (6, 4), (7, 5)] { | |
| 801 | 801 | use onestore_offline::{ConflictKind, EditStatus, Recovery}; |
| 802 | 802 | use sha2::{Digest, Sha256}; |
| 803 | 803 | let directory = tempfile::tempdir().unwrap(); |
| ... | ... | @@ -903,13 +903,13 @@ fn prior_schema_migrations_retain_queue_evidence_assets_and_enable_layout_confli |
| 903 | 903 | .unwrap(), |
| 904 | 904 | current_version |
| 905 | 905 | ); |
| 906 | db.execute("INSERT INTO conflicts VALUES (1001,5)", []) | |
| 906 | db.execute("INSERT INTO conflicts VALUES (1001,6)", []) | |
| 907 | 907 | .unwrap(); |
| 908 | 908 | drop(db); |
| 909 | 909 | let cache = Replica::open(&path).unwrap(); |
| 910 | 910 | assert_eq!( |
| 911 | 911 | cache.status(1001).unwrap(), |
| 912 | Some(EditStatus::Conflict(ConflictKind::LayoutChanged)) | |
| 912 | Some(EditStatus::Conflict(ConflictKind::ContentChanged)) | |
| 913 | 913 | ); |
| 914 | 914 | } |
| 915 | 915 | } |
crates/onestore-offline/tests/support/tree_schedule.rs created+246| ... | ... | @@ -0,0 +1,246 @@ |
| 1 | use crate::disk; | |
| 2 | use onestore::{ | |
| 3 | CommitError, ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, TreeEdit, | |
| 4 | document::{Document, Kind}, | |
| 5 | }; | |
| 6 | use onestore_offline::{EditStatus, Operation, Remote, Replica}; | |
| 7 | use std::{io, sync::LazyLock}; | |
| 8 | ||
| 9 | static 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 | ||
| 34 | fn 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 | ||
| 68 | struct Session<'a> { | |
| 69 | disk: &'a mut disk::Disk, | |
| 70 | operation: Option<&'a Operation>, | |
| 71 | } | |
| 72 | ||
| 73 | impl 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 | ||
| 124 | pub 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::{ |
| 5 | 5 | use onestore_offline::{ConflictKind, EditStatus, Error, Remote, Replica}; |
| 6 | 6 | use std::io; |
| 7 | 7 | |
| 8 | #[path = "../../onestore/tests/support/disk.rs"] | |
| 9 | mod disk; | |
| 8 | 10 | #[path = "sync/outline.rs"] |
| 9 | 11 | mod outline; |
| 12 | #[path = "sync/tree.rs"] | |
| 13 | mod tree; | |
| 14 | #[path = "support/tree_schedule.rs"] | |
| 15 | mod tree_schedule; | |
| 10 | 16 | |
| 11 | 17 | mod paragraph { |
| 12 | 18 | use super::*; |
crates/onestore-offline/tests/sync/outline.rs+2-2| ... | ... | @@ -1,7 +1,7 @@ |
| 1 | 1 | use super::*; |
| 2 | 2 | use onestore::OutlineEdit as Change; |
| 3 | 3 | |
| 4 | fn fixture() -> (Vec<u8>, ExGuid, ExGuid, ExGuid, ExGuid) { | |
| 4 | pub(super) fn fixture() -> (Vec<u8>, ExGuid, ExGuid, ExGuid, ExGuid) { | |
| 5 | 5 | let source = onestore::create_section("layout.one", "Original 🦀 é", "Author").unwrap(); |
| 6 | 6 | let (sid, text, _) = text(&source); |
| 7 | 7 | let store = Store::parse(&source).unwrap(); |
| ... | ... | @@ -24,7 +24,7 @@ fn fixture() -> (Vec<u8>, ExGuid, ExGuid, ExGuid, ExGuid) { |
| 24 | 24 | (source, sid, outline, paragraph, text) |
| 25 | 25 | } |
| 26 | 26 | |
| 27 | fn node(source: &[u8], sid: ExGuid, object: ExGuid) -> serde_json::Value { | |
| 27 | pub(super) fn node(source: &[u8], sid: ExGuid, object: ExGuid) -> serde_json::Value { | |
| 28 | 28 | let store = Store::parse(source).unwrap(); |
| 29 | 29 | let index = RevisionIndex::parse(&store).unwrap(); |
| 30 | 30 | index.validate_current().unwrap(); |
crates/onestore-offline/tests/sync/tree.rs created+716| ... | ... | @@ -0,0 +1,716 @@ |
| 1 | use super::*; | |
| 2 | use onestore::{Insertion, TreeEdit}; | |
| 3 | ||
| 4 | #[test] | |
| 5 | fn 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 | ||
| 20 | fn 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 | ||
| 37 | fn 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] | |
| 49 | fn 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] | |
| 104 | fn 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] | |
| 195 | fn 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] | |
| 277 | fn 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] | |
| 338 | fn 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] | |
| 413 | fn 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] | |
| 440 | fn 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] | |
| 558 | fn 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> { |
| 34 | 34 | } |
| 35 | 35 | |
| 36 | 36 | /// Occurrences retain multiplicity for native reference counts. |
| 37 | /// Each stream follows property arena order, including nested sets. | |
| 37 | 38 | #[derive(Debug, Default)] |
| 38 | 39 | pub struct ObjectReferences { |
| 39 | 40 | pub objects: Vec<ExGuid>, |
crates/onestore/src/tree.rs+12| ... | ... | @@ -38,6 +38,18 @@ pub struct TreeEdit { |
| 38 | 38 | } |
| 39 | 39 | |
| 40 | 40 | impl 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 | ||
| 41 | 53 | /// Removes a paragraph or ordinary outline and its descendants from the active tree. |
| 42 | 54 | /// Historical objects remain available; an emptied table cell receives an empty paragraph. |
| 43 | 55 | pub fn delete(object: ExGuid, author: &str) -> Result<Self, Error> { |
fuzz/Cargo.toml+7| ... | ... | @@ -107,3 +107,10 @@ path = "fuzz_targets/tree.rs" |
| 107 | 107 | test = false |
| 108 | 108 | doc = false |
| 109 | 109 | bench = false |
| 110 | ||
| 111 | [[bin]] | |
| 112 | name = "offline_tree" | |
| 113 | path = "fuzz_targets/offline_tree.rs" | |
| 114 | test = false | |
| 115 | doc = false | |
| 116 | bench = false |
fuzz/fuzz_targets/offline_tree.rs created+9| ... | ... | @@ -0,0 +1,9 @@ |
| 1 | #![no_main] | |
| 2 | use libfuzzer_sys::fuzz_target; | |
| 3 | ||
| 4 | #[path = "../../crates/onestore/tests/support/disk.rs"] | |
| 5 | mod disk; | |
| 6 | #[path = "../../crates/onestore-offline/tests/support/tree_schedule.rs"] | |
| 7 | mod tree_schedule; | |
| 8 | ||
| 9 | fuzz_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'] |
| 20 | 20 | |
| 21 | 21 | class OutlineEditTest(unittest.TestCase): |
| 22 | 22 | def test_rust_subtree_moves_and_deletions_survive_cold_native_reopen(self): |
| 23 | for name, pages in [('ordinary', 15), ('groups-cells', 12), ('cross-container', 12), ('unequal-groups', 1)]: | |
| 24 | fixture = FIXTURE / 'rust-tree' / name | |
| 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 | |
| 25 | 29 | with self.subTest(case=name), TemporaryDirectory() as temporary: |
| 26 | 30 | models = {} |
| 27 | 31 | for phase, notebook in [('candidate', fixture / 'candidate'), ('cold', fixture / 'cold/notebook')]: |
| ... | ... | @@ -42,7 +46,7 @@ class OutlineEditTest(unittest.TestCase): |
| 42 | 46 | for _, node in walk(old, page): |
| 43 | 47 | for oid in node['kind'].get('lists', []): |
| 44 | 48 | self.assertEqual(old['nodes'][oid], saved['nodes'][oid]) |
| 45 | if name == 'unequal-groups': | |
| 49 | if name == 'rust-tree/unequal-groups': | |
| 46 | 50 | capture, = (fixture / 'cold/read').glob('page-*.xml') |
| 47 | 51 | root = ET.parse(capture).getroot() |
| 48 | 52 | self.assertEqual([(group.get('indent'), ''.join(Text(group.find('one:OE/one:T', ns).text or '').parts)) |