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