authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-07 21:38:05-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-07 21:38:05-07:00
log49bc9b2d95d93ceb9f25de3e238e89ce6fbfb21e
treed1a7020f27ecc5ceebf8cf1e7c8b2d3b316bb55c
parent3a32cbb2aad5a83965908734e6595ea252557f7f
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU

feat: publish formatted insertions as one durable intent

Add nonoverlapping UTF-16 styles to paragraph and outline insertion without a second revision or offline queue entry. Preserve intent identities through serialization, replay and placement review; reject malformed spans before source parsing. Validate native cold reads, controlled reverse edits and direct keyboard editing, empty-style continuation, historical preservation, interrupted publication, old-cache compatibility, twelve-client mixed editing and offline recovery. Retain public native fixtures and stateful sanitizer coverage. Assisted-by: gpt-6-astra

140 files changed, 2765 insertions(+), 40 deletions(-)

corpus/formatted-insertion/README.md created+31
...@@ -0,0 +1,31 @@
1# Atomic formatted insertions
2
3Synthetic Rust paragraph/outline insertions with independent OneNote 2010 cold
4reads. The native paragraph and table inputs descend from the public
5`native/20260905-05` corpus. `manifest.json` records stable intents and file hashes;
6each capture retains its native environment and run provenance. Attachment exports
7link to existing identical public payloads.
8
9Generate new candidates with the ignored `export_native_formatted_insertions` test
10and `ONESTORE_INSERT_OUTPUT` set to a new absolute directory. Each child directory
11is a separate notebook: the candidates can share source section identities.
12Use `tools/native_runner.py` with one child directory and `--expected-pages 1`.
13`tools/native/formatted-insertion.ps1` performs an unchanged native HTML round trip
14followed by a native prefix edit for the four nonempty cases.
15
16The unchanged round trip establishes native font substitution before checking the
17edit's exact character styles. Table updates omit the outline's measured `Size`:
18resubmitting it made two unlocked columns oscillate in native XML, including after
19a fresh cache reopen. Those unsettled captures are excluded. The retained table
20reverse capture omits that measurement; paragraph and ordinary outline captures
21retain it.
22
23`native-cell/ui` records a direct keyboard prefix edit, without HTML resubmission.
24Its native XML settles, preserves every prior character's style, and the resulting
25file passes the same model oracle. The capture includes the keyboard script and
26screenshot.
27
28COM omits the empty outline. Its cold-reopened file retains the empty rich-text
29object and style; `empty/typed-after-cold` adds text to that retained object and
30verifies the 18-point italic result in another independent native cold read.
31`tools/test_formatted_insertion.py` checks these captures without a live VM.
corpus/formatted-insertion/empty-typed/candidate/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/empty-typed/candidate/synthetic.one differ
corpus/formatted-insertion/empty-typed/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/empty-typed/cold/notebook/synthetic.one differ
corpus/formatted-insertion/empty-typed/cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-7135C1A2",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/empty-typed/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="{B38138D7-F157-4B10-8B91-349F1179632C}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:49:19.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{A42E0040-CACE-0692-3494-76901850CE52}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:49:19.000Z" color="#8AA8E4"><one:Page ID="{7D48D92B-74D0-0597-050C-7AF738E2B7E0}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:49:19.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/empty-typed/cold/read/page-000.xml created+3
...@@ -0,0 +1,3 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{7D48D92B-74D0-0597-050C-7AF738E2B7E0}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:49:19.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-08T04:47:24.000Z" objectID="{A42E0040-CACE-0692-3494-76901850CE52}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{A42E0040-CACE-0692-3494-76901850CE52}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline style="font-family:Calibri;font-size:18.0pt" author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{3BFCF1C3-BFC6-0049-1138-D820866F0C0D}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="158.7714996337891" height="21.9726734161377"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{3BFCF1C3-BFC6-0049-1138-D820866F0C0D}{3}{B0}" alignment="left"><one:T><![CDATA[<span
3style='font-style:italic'>Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/empty-typed/cold/read/payloads.json created+3
...@@ -0,0 +1,3 @@
1[
2
3]
\ No newline at end of file
corpus/formatted-insertion/empty-typed/cold/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/empty-typed",
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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8"
17 }
18}
corpus/formatted-insertion/empty-typed/cold/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 6016,
5 "sha256": "855460055414c52034d0cf62b2e855b460deaedc17d1f276d6b3738458608f2e",
6 "mtime_ns": 1788842844349962032
7 }
8]
corpus/formatted-insertion/empty-typed/cold/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
corpus/formatted-insertion/empty-typed/reverse/control-before.xml created+3
...@@ -0,0 +1,3 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{16390213-3B15-03C0-2FEB-38DCB7F70E1A}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:46.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-08T04:47:24.000Z" objectID="{CF5FDB78-850B-00C5-1E73-34BB974577A8}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{CF5FDB78-850B-00C5-1E73-34BB974577A8}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline style="font-family:Calibri;font-size:18.0pt" author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="158.7714996337891" height="21.9726734161377"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{3}{B0}" alignment="left"><one:T><![CDATA[<span
3style='font-style:italic'>Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/empty-typed/reverse/control-update.xml created+2
...@@ -0,0 +1,2 @@
1<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{16390213-3B15-03C0-2FEB-38DCB7F70E1A}{1}{B0}"><one:Outline style="font-family:Calibri;font-size:18.0pt" author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{1}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="72.0" y="144.0" z="1" /><one:Size width="158.7714996337891" height="21.9726734161377" /><one:Indents><one:Indent level="0" indent="0.0" /></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{3}{B0}" alignment="left"><one:T><![CDATA[<span
2style='font-style:italic'>Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
\ No newline at end of file
corpus/formatted-insertion/empty-typed/reverse/edit-before.xml created+3
...@@ -0,0 +1,3 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{16390213-3B15-03C0-2FEB-38DCB7F70E1A}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:46.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 style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{CF5FDB78-850B-00C5-1E73-34BB974577A8}{23}{B0}"><one:Position x="36.0" y="36.0" z="1"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{CF5FDB78-850B-00C5-1E73-34BB974577A8}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{1}{B0}"><one:Position x="72.0" y="144.0" z="0"/><one:Size width="158.7714996337891" height="21.9726734161377"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{3}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:18.0pt"><one:T><![CDATA[<span
3style='font-style:italic'>Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/empty-typed/reverse/edit-update.xml created+2
...@@ -0,0 +1,2 @@
1<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{16390213-3B15-03C0-2FEB-38DCB7F70E1A}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{1}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="72.0" y="144.0" z="0" /><one:Size width="158.7714996337891" height="21.9726734161377" /><one:Indents><one:Indent level="0" indent="0.0" /></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{508D2AFB-F003-061E-3BDF-9A0B097AB5F7}{3}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:18.0pt"><one:T>&lt;span
2style='font-style:italic'&gt;Native Typed café &amp;#129408;&lt;/span&gt;</one:T></one:OE></one:OEChildren></one:Outline></one:Page>
\ No newline at end of file
corpus/formatted-insertion/empty-typed/reverse/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/empty-typed/reverse/notebook/synthetic.one differ
corpus/formatted-insertion/empty-typed/reverse/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-8F1E54CA",
5 "cold": false,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/empty-typed/reverse/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="{F9BA22F6-DA01-4734-87A1-B4C6DD99C88D}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:07:07.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{3639FAA6-1E08-0FC0-3700-B846335A2C86}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:07:07.000Z" color="#8AA8E4"><one:Page ID="{EF5F23CD-A016-0CC5-0698-B42113E85534}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:07:07.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/empty-typed/reverse/read/page-000.xml created+3
...@@ -0,0 +1,3 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{EF5F23CD-A016-0CC5-0698-B42113E85534}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:07:07.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 style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{3639FAA6-1E08-0FC0-3700-B846335A2C86}{23}{B0}"><one:Position x="36.0" y="36.0" z="1"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{3639FAA6-1E08-0FC0-3700-B846335A2C86}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{A9EB0B25-6B00-091B-12AC-16F6AD65EED9}{1}{B0}"><one:Position x="72.0" y="144.0" z="0"/><one:Size width="158.7714996337891" height="43.9453468322754"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:06:55.000Z" objectID="{A9EB0B25-6B00-091B-12AC-16F6AD65EED9}{3}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:18.0pt"><one:T><![CDATA[<span
3style='font-style:italic'>Native Typed café &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/empty-typed/reverse/read/payloads.json created+3
...@@ -0,0 +1,3 @@
1[
2
3]
\ No newline at end of file
corpus/formatted-insertion/empty-typed/reverse/reverse-verification.json created+5
...@@ -0,0 +1,5 @@
1{
2 "paragraphs": 2,
3 "characters": 27,
4 "exact_native_character_styles_after_control": true
5}
corpus/formatted-insertion/empty-typed/reverse/run.json created+19
...@@ -0,0 +1,19 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/empty-typed",
3 "expected_pages": 1,
4 "author": "evidence/m10/formatted-reverse-controlled.ps1",
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 "author.ps1": "4362d0ba551eb00b2eca1c5563d76352469f85d3981155bf2682c159a03ddedb",
16 "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331",
17 "read.ps1": "df4244a18ab3e9c21083b8df61b08b863e8cce0ec4bf0c9cd742a8ee6f79877d"
18 }
19}
corpus/formatted-insertion/empty-typed/reverse/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 6016,
5 "sha256": "855460055414c52034d0cf62b2e855b460deaedc17d1f276d6b3738458608f2e",
6 "mtime_ns": 1788842844349962032
7 }
8]
corpus/formatted-insertion/empty-typed/reverse/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
corpus/formatted-insertion/empty/candidate/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/empty/candidate/synthetic.one differ
corpus/formatted-insertion/empty/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/empty/cold/notebook/synthetic.one differ
corpus/formatted-insertion/empty/cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-6DB25082",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/empty/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="{A60F5D0F-AE39-49B1-B687-94A26771424E}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:49:17.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{8EAF1BA2-D0D2-0DEF-0CDD-B07549372B65}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:49:17.000Z" color="#8AA8E4"><one:Page ID="{57C9C2C9-6ECC-0EEA-3D45-BC12698552D7}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:49:17.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/empty/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="{57C9C2C9-6ECC-0EEA-3D45-BC12698552D7}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:49:17.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-08T04:47:24.000Z" objectID="{8EAF1BA2-D0D2-0DEF-0CDD-B07549372B65}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8EAF1BA2-D0D2-0DEF-0CDD-B07549372B65}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/empty/cold/read/payloads.json created+3
...@@ -0,0 +1,3 @@
1[
2
3]
\ No newline at end of file
corpus/formatted-insertion/empty/cold/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/empty",
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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8"
17 }
18}
corpus/formatted-insertion/empty/cold/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 5624,
5 "sha256": "bd592be42dc93e95444174ceceb19d1fc718fbe53c08403f87b6dec3207dc38d",
6 "mtime_ns": 1788842844347041269
7 }
8]
corpus/formatted-insertion/empty/cold/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
corpus/formatted-insertion/empty/typed-after-cold/candidate/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/empty/typed-after-cold/candidate/synthetic.one differ
corpus/formatted-insertion/empty/typed-after-cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-2A09ABA3",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/empty/typed-after-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="{57C8FDE8-BE28-4C01-8B6F-A901BAEA2926}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:57:05.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{AE4499B4-D894-042B-2496-FDB9EA794340}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:57:05.000Z" color="#8AA8E4"><one:Page ID="{772240DF-668A-072E-150E-F1DECACB3AF2}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:57:05.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/empty/typed-after-cold/read/page-000.xml created+3
...@@ -0,0 +1,3 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{772240DF-668A-072E-150E-F1DECACB3AF2}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:57:05.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-08T04:47:24.000Z" objectID="{AE4499B4-D894-042B-2496-FDB9EA794340}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{AE4499B4-D894-042B-2496-FDB9EA794340}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline style="font-family:Calibri;font-size:18.0pt" author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:53:58.000Z" objectID="{6EC06BD8-3CC0-0838-13B5-8BFED2119B71}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="268.0195007324219" height="21.9726734161377"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:53:58.000Z" objectID="{6EC06BD8-3CC0-0838-13B5-8BFED2119B71}{3}{B0}" alignment="left"><one:T><![CDATA[<span
3style='font-style:italic'>Typed after native reopen &#129408;</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/empty/typed-after-cold/read/payloads.json created+3
...@@ -0,0 +1,3 @@
1[
2
3]
\ No newline at end of file
corpus/formatted-insertion/manifest.json created+963
...@@ -0,0 +1,963 @@
1{
2 "generator": "crates/onestore/tests/insertion.rs:export_native_formatted_insertions",
3 "cases": [
4 {
5 "intent": {
6 "author": "Rich author",
7 "created": 1473310044,
8 "formats": [
9 {
10 "attributes": [
11 {
12 "Bold": true
13 },
14 {
15 "Underline": true
16 }
17 ],
18 "guid": [
19 207,
20 169,
21 223,
22 216,
23 230,
24 235,
25 235,
26 75,
27 185,
28 94,
29 69,
30 228,
31 117,
32 205,
33 151,
34 134
35 ],
36 "range": {
37 "end": 4,
38 "start": 0
39 }
40 },
41 {
42 "attributes": [
43 {
44 "Font": "Arial"
45 },
46 {
47 "FontSize": 13.5
48 }
49 ],
50 "guid": [
51 233,
52 34,
53 183,
54 44,
55 7,
56 99,
57 201,
58 75,
59 140,
60 220,
61 83,
62 226,
63 209,
64 176,
65 83,
66 88
67 ],
68 "range": {
69 "end": 7,
70 "start": 5
71 }
72 },
73 {
74 "attributes": [
75 {
76 "Italic": true
77 },
78 {
79 "Strike": true
80 }
81 ],
82 "guid": [
83 30,
84 196,
85 121,
86 136,
87 27,
88 75,
89 93,
90 79,
91 181,
92 130,
93 25,
94 17,
95 13,
96 139,
97 35,
98 217
99 ],
100 "range": {
101 "end": 14,
102 "start": 8
103 }
104 },
105 {
106 "attributes": [
107 {
108 "Superscript": true
109 }
110 ],
111 "guid": [
112 101,
113 236,
114 26,
115 203,
116 134,
117 120,
118 215,
119 67,
120 170,
121 155,
122 81,
123 250,
124 86,
125 214,
126 214,
127 111
128 ],
129 "range": {
130 "end": 17,
131 "start": 15
132 }
133 },
134 {
135 "attributes": [
136 {
137 "Color": [
138 12,
139 34,
140 56
141 ]
142 },
143 {
144 "Highlight": [
145 255,
146 255,
147 0
148 ]
149 }
150 ],
151 "guid": [
152 57,
153 2,
154 72,
155 237,
156 92,
157 155,
158 100,
159 72,
160 130,
161 100,
162 120,
163 181,
164 179,
165 69,
166 97,
167 11
168 ],
169 "range": {
170 "end": 23,
171 "start": 18
172 }
173 },
174 {
175 "attributes": [
176 {
177 "Subscript": true
178 }
179 ],
180 "guid": [
181 189,
182 73,
183 14,
184 147,
185 222,
186 140,
187 144,
188 65,
189 176,
190 86,
191 229,
192 249,
193 220,
194 119,
195 252,
196 192
197 ],
198 "range": {
199 "end": 26,
200 "start": 24
201 }
202 },
203 {
204 "attributes": [
205 {
206 "Bold": false
207 },
208 {
209 "Italic": false
210 },
211 {
212 "Color": null
213 },
214 {
215 "Highlight": null
216 }
217 ],
218 "guid": [
219 165,
220 80,
221 86,
222 53,
223 207,
224 121,
225 164,
226 68,
227 169,
228 152,
229 106,
230 34,
231 115,
232 110,
233 230,
234 151
235 ],
236 "range": {
237 "end": 30,
238 "start": 27
239 }
240 }
241 ],
242 "guid": [
243 205,
244 161,
245 237,
246 192,
247 33,
248 131,
249 161,
250 64,
251 168,
252 94,
253 233,
254 150,
255 178,
256 37,
257 36,
258 190
259 ],
260 "parent": "{71AF36A5-6150-452F-B7F3-66BFFF4C3582},22",
261 "placement": {
262 "Outline": {
263 "x": 72.0,
264 "y": 144.0
265 }
266 },
267 "text": "Bold \ud83e\udd80 italic e\u0301 color \u6771\u4eac\rEnd"
268 },
269 "name": "outline",
270 "space": "{A8C9EFCE-DF4E-462A-866B-6AD8DFFE4C30},1",
271 "candidate_sha256": "76f6b743caa9dc2b5ab342d6e6a742125ecbcd0ca2372062b42acbd08b5ebb4c",
272 "cold_sha256": "151a49d8cf2e607a10a9c948286ce7eb3eb754fa90e9557a74a2cb1f1f0204cb",
273 "reverse_sha256": "8127b63d52ecbc2ad88a0d4f0eccb7fc8b086983f25db40b5f3396616f39cc53",
274 "omitted_table_outline_size": false
275 },
276 {
277 "intent": {
278 "author": "Rich author",
279 "created": 1473310044,
280 "formats": [
281 {
282 "attributes": [
283 {
284 "Bold": true
285 },
286 {
287 "Underline": true
288 }
289 ],
290 "guid": [
291 141,
292 194,
293 83,
294 170,
295 169,
296 68,
297 33,
298 76,
299 139,
300 83,
301 12,
302 156,
303 72,
304 95,
305 145,
306 140
307 ],
308 "range": {
309 "end": 4,
310 "start": 0
311 }
312 },
313 {
314 "attributes": [
315 {
316 "Font": "Arial"
317 },
318 {
319 "FontSize": 13.5
320 }
321 ],
322 "guid": [
323 168,
324 249,
325 0,
326 182,
327 1,
328 200,
329 117,
330 66,
331 179,
332 210,
333 69,
334 6,
335 83,
336 62,
337 157,
338 171
339 ],
340 "range": {
341 "end": 7,
342 "start": 5
343 }
344 },
345 {
346 "attributes": [
347 {
348 "Italic": true
349 },
350 {
351 "Strike": true
352 }
353 ],
354 "guid": [
355 152,
356 84,
357 172,
358 67,
359 218,
360 72,
361 77,
362 67,
363 143,
364 158,
365 58,
366 16,
367 177,
368 251,
369 222,
370 20
371 ],
372 "range": {
373 "end": 14,
374 "start": 8
375 }
376 },
377 {
378 "attributes": [
379 {
380 "Superscript": true
381 }
382 ],
383 "guid": [
384 29,
385 165,
386 47,
387 217,
388 107,
389 120,
390 31,
391 79,
392 148,
393 67,
394 148,
395 232,
396 78,
397 245,
398 157,
399 68
400 ],
401 "range": {
402 "end": 17,
403 "start": 15
404 }
405 },
406 {
407 "attributes": [
408 {
409 "Color": [
410 12,
411 34,
412 56
413 ]
414 },
415 {
416 "Highlight": [
417 255,
418 255,
419 0
420 ]
421 }
422 ],
423 "guid": [
424 165,
425 189,
426 67,
427 237,
428 2,
429 56,
430 67,
431 70,
432 169,
433 71,
434 239,
435 10,
436 236,
437 192,
438 119,
439 48
440 ],
441 "range": {
442 "end": 23,
443 "start": 18
444 }
445 },
446 {
447 "attributes": [
448 {
449 "Subscript": true
450 }
451 ],
452 "guid": [
453 116,
454 118,
455 37,
456 115,
457 74,
458 111,
459 247,
460 70,
461 172,
462 126,
463 100,
464 131,
465 159,
466 151,
467 38,
468 234
469 ],
470 "range": {
471 "end": 26,
472 "start": 24
473 }
474 },
475 {
476 "attributes": [
477 {
478 "Bold": false
479 },
480 {
481 "Italic": false
482 },
483 {
484 "Color": null
485 },
486 {
487 "Highlight": null
488 }
489 ],
490 "guid": [
491 32,
492 151,
493 42,
494 7,
495 76,
496 55,
497 143,
498 75,
499 178,
500 217,
501 234,
502 71,
503 135,
504 25,
505 75,
506 145
507 ],
508 "range": {
509 "end": 30,
510 "start": 27
511 }
512 }
513 ],
514 "guid": [
515 191,
516 62,
517 177,
518 4,
519 17,
520 246,
521 2,
522 68,
523 130,
524 157,
525 199,
526 46,
527 35,
528 34,
529 28,
530 139
531 ],
532 "parent": "{03D49648-056C-0F08-32C9-0424E8496E7D},10",
533 "placement": {
534 "Paragraph": {
535 "before": "{03D49648-056C-0F08-32C9-0424E8496E7D},11"
536 }
537 },
538 "text": "Bold \ud83e\udd80 italic e\u0301 color \u6771\u4eac\rEnd"
539 },
540 "name": "native-paragraph",
541 "space": "{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1",
542 "candidate_sha256": "202823512283be980b6a139adcf5f4f369d15f17d60ed7b23f9f2289513aa4e9",
543 "cold_sha256": "efb61aaedbe12cb00434f7e581259d112480158cacb66961d4168081b77a1112",
544 "reverse_sha256": "753b320528748faa1ae11ee5eb710530d15636361674aab37f4c442ee5b9dd7b",
545 "omitted_table_outline_size": false
546 },
547 {
548 "intent": {
549 "author": "Rich author",
550 "created": 1473310044,
551 "formats": [
552 {
553 "attributes": [
554 {
555 "Bold": true
556 },
557 {
558 "Underline": true
559 }
560 ],
561 "guid": [
562 148,
563 53,
564 156,
565 113,
566 44,
567 188,
568 95,
569 71,
570 170,
571 198,
572 38,
573 41,
574 148,
575 201,
576 99,
577 234
578 ],
579 "range": {
580 "end": 4,
581 "start": 0
582 }
583 },
584 {
585 "attributes": [
586 {
587 "Font": "Arial"
588 },
589 {
590 "FontSize": 13.5
591 }
592 ],
593 "guid": [
594 17,
595 187,
596 223,
597 32,
598 237,
599 203,
600 222,
601 66,
602 134,
603 24,
604 65,
605 131,
606 32,
607 188,
608 202,
609 177
610 ],
611 "range": {
612 "end": 7,
613 "start": 5
614 }
615 },
616 {
617 "attributes": [
618 {
619 "Italic": true
620 },
621 {
622 "Strike": true
623 }
624 ],
625 "guid": [
626 201,
627 233,
628 230,
629 86,
630 91,
631 117,
632 20,
633 68,
634 142,
635 220,
636 224,
637 178,
638 139,
639 52,
640 180,
641 203
642 ],
643 "range": {
644 "end": 14,
645 "start": 8
646 }
647 },
648 {
649 "attributes": [
650 {
651 "Superscript": true
652 }
653 ],
654 "guid": [
655 145,
656 203,
657 90,
658 115,
659 34,
660 107,
661 73,
662 66,
663 160,
664 157,
665 25,
666 141,
667 249,
668 128,
669 72,
670 159
671 ],
672 "range": {
673 "end": 17,
674 "start": 15
675 }
676 },
677 {
678 "attributes": [
679 {
680 "Color": [
681 12,
682 34,
683 56
684 ]
685 },
686 {
687 "Highlight": [
688 255,
689 255,
690 0
691 ]
692 }
693 ],
694 "guid": [
695 53,
696 51,
697 180,
698 64,
699 45,
700 92,
701 153,
702 70,
703 163,
704 88,
705 171,
706 172,
707 200,
708 222,
709 35,
710 19
711 ],
712 "range": {
713 "end": 23,
714 "start": 18
715 }
716 },
717 {
718 "attributes": [
719 {
720 "Subscript": true
721 }
722 ],
723 "guid": [
724 249,
725 231,
726 26,
727 88,
728 247,
729 6,
730 107,
731 65,
732 131,
733 6,
734 89,
735 211,
736 188,
737 246,
738 100,
739 155
740 ],
741 "range": {
742 "end": 26,
743 "start": 24
744 }
745 },
746 {
747 "attributes": [
748 {
749 "Bold": false
750 },
751 {
752 "Italic": false
753 },
754 {
755 "Color": null
756 },
757 {
758 "Highlight": null
759 }
760 ],
761 "guid": [
762 136,
763 160,
764 124,
765 20,
766 185,
767 141,
768 156,
769 75,
770 163,
771 89,
772 177,
773 152,
774 149,
775 251,
776 1,
777 204
778 ],
779 "range": {
780 "end": 30,
781 "start": 27
782 }
783 }
784 ],
785 "guid": [
786 245,
787 178,
788 40,
789 105,
790 54,
791 125,
792 175,
793 68,
794 190,
795 59,
796 54,
797 206,
798 186,
799 206,
800 134,
801 87
802 ],
803 "parent": "{C38843E2-F74B-04BD-24AA-A8F3BCAAF6CF},14",
804 "placement": {
805 "Paragraph": {
806 "before": null
807 }
808 },
809 "text": "Bold \ud83e\udd80 italic e\u0301 color \u6771\u4eac\rEnd"
810 },
811 "name": "native-cell",
812 "space": "{64183EF4-4E19-0CBE-3D3B-88FF17D58B1C},1",
813 "candidate_sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351",
814 "cold_sha256": "b7324075349e45f31d9e9fb8638691f58efff1989be65f12f7711dc359898a64",
815 "reverse_sha256": "04134b8db9b52aaf43dc5dfc90464d54802890e5d4966e7163a977e2ebd77e1e",
816 "omitted_table_outline_size": true,
817 "ui_sha256": "d67b70016af71db07a8012b85a5016897c08b715c6db8953e1fc45cfe008bc27"
818 },
819 {
820 "intent": {
821 "author": "Rich author",
822 "created": 1473310044,
823 "formats": [
824 {
825 "attributes": [
826 {
827 "Italic": true
828 },
829 {
830 "FontSize": 18.0
831 }
832 ],
833 "guid": [
834 135,
835 82,
836 13,
837 244,
838 205,
839 187,
840 105,
841 65,
842 153,
843 17,
844 70,
845 241,
846 83,
847 89,
848 99,
849 163
850 ],
851 "range": {
852 "end": 0,
853 "start": 0
854 }
855 }
856 ],
857 "guid": [
858 201,
859 196,
860 43,
861 177,
862 4,
863 133,
864 60,
865 73,
866 128,
867 208,
868 16,
869 248,
870 199,
871 36,
872 237,
873 179
874 ],
875 "parent": "{71AF36A5-6150-452F-B7F3-66BFFF4C3582},22",
876 "placement": {
877 "Outline": {
878 "x": 72.0,
879 "y": 144.0
880 }
881 },
882 "text": ""
883 },
884 "name": "empty",
885 "space": "{A8C9EFCE-DF4E-462A-866B-6AD8DFFE4C30},1",
886 "candidate_sha256": "bd592be42dc93e95444174ceceb19d1fc718fbe53c08403f87b6dec3207dc38d",
887 "cold_sha256": "a0a59d1c5676e2b6742e13791f888c91a3e0494c980b66fb6ef0a3bf324fac7a"
888 },
889 {
890 "intent": {
891 "author": "Rich author",
892 "created": 1473310044,
893 "formats": [
894 {
895 "attributes": [
896 {
897 "Italic": true
898 },
899 {
900 "FontSize": 18.0
901 }
902 ],
903 "guid": [
904 183,
905 9,
906 145,
907 10,
908 11,
909 69,
910 244,
911 73,
912 144,
913 49,
914 203,
915 207,
916 41,
917 174,
918 161,
919 107
920 ],
921 "range": {
922 "end": 0,
923 "start": 0
924 }
925 }
926 ],
927 "guid": [
928 38,
929 199,
930 125,
931 238,
932 88,
933 20,
934 244,
935 67,
936 146,
937 95,
938 200,
939 15,
940 97,
941 115,
942 247,
943 221
944 ],
945 "parent": "{71AF36A5-6150-452F-B7F3-66BFFF4C3582},22",
946 "placement": {
947 "Outline": {
948 "x": 72.0,
949 "y": 144.0
950 }
951 },
952 "text": ""
953 },
954 "name": "empty-typed",
955 "space": "{A8C9EFCE-DF4E-462A-866B-6AD8DFFE4C30},1",
956 "candidate_sha256": "855460055414c52034d0cf62b2e855b460deaedc17d1f276d6b3738458608f2e",
957 "cold_sha256": "12dcec5c696b989e0f78d76db6af8542104dec82e90b705269d53a8c52332871",
958 "reverse_sha256": "bc64aba71aba93596edff6ed270ea8ff17285c31cb79e357a5640edf6e934112",
959 "omitted_table_outline_size": false
960 }
961 ],
962 "native_author": "tools/native/formatted-insertion.ps1"
963}
corpus/formatted-insertion/native-cell/candidate/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/native-cell/candidate/synthetic.one differ
corpus/formatted-insertion/native-cell/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/native-cell/cold/notebook/synthetic.one differ
corpus/formatted-insertion/native-cell/cold/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment created+1
...@@ -0,0 +1 @@
1../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment
\ No newline at end of file
corpus/formatted-insertion/native-cell/cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-382BC211",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/native-cell/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="{C908BAFF-4738-41AD-8781-DF368EC1A41C}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:49:18.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{00A6EA90-3D33-0BF5-1CBF-DA0341FB877E}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:49:18.000Z" color="#8AA8E4"><one:Page ID="{2CEF1916-B4F8-48E4-9BD8-7292BDC39B61}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T04:49:18.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/native-cell/cold/read/page-000.xml created+21
...@@ -0,0 +1,21 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{2CEF1916-B4F8-48E4-9BD8-7292BDC39B61}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T04:49:18.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="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{4B23B1AA-FF8D-4B52-942A-FE49425F7E00}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{4B23B1AA-FF8D-4B52-942A-FE49425F7E00}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
3style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
4style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
5style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
6style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
7lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{1D936DBF-4CD8-410F-8E9C-7CC1E6539A49}{10}{B0}"><one:Position x="144.0" y="96.0" z="1"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{1D936DBF-4CD8-410F-8E9C-7CC1E6539A49}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{20BA0530-AA42-48A1-B8EC-D7350A3ED2C7}{10}{B0}"><one:Position x="144.0" y="192.0" z="2"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{20BA0530-AA42-48A1-B8EC-D7350A3ED2C7}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA
8AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{A5A01D50-6C3A-4B67-9D41-B0CB3EEF1DF4}{10}{B0}"><one:Position x="264.0" y="192.0" z="3"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{A5A01D50-6C3A-4B67-9D41-B0CB3EEF1DF4}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{10}{B0}"><one:Position x="144.0" y="312.0" z="4"/><one:Size width="182.6545715332031" height="50.55070495605469"/><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{12}{B0}"><one:Columns><one:Column index="0" width="129.3788909912109"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{13}{B0}" lastModifiedTime="2026-09-08T04:47:24.000Z"><one:Cell lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="Rich author" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{21DF9517-87D7-00F5-18D8-CCA310D8962A}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
9text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
10style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
11Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
12font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
13font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
14Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
15Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1611.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
17background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
18Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
19Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
2011.0pt'><br>
21End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{8B7F6400-0DAA-40E7-8249-529E16BCE6B2}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-cell/cold/read/payloads.json created+10
...@@ -0,0 +1,10 @@
1[
2 {
3 "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7",
4 "name": "fictitious-attachment.txt",
5 "object": "{A5A01D50-6C3A-4B67-9D41-B0CB3EEF1DF4}{11}{B0}",
6 "kind": "InsertedFile",
7 "page": "{2CEF1916-B4F8-48E4-9BD8-7292BDC39B61}{1}{B0}",
8 "bytes": 43
9 }
10]
\ No newline at end of file
corpus/formatted-insertion/native-cell/cold/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-cell",
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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8"
17 }
18}
corpus/formatted-insertion/native-cell/cold/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 27800,
5 "sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351",
6 "mtime_ns": 1788842844345306887
7 }
8]
corpus/formatted-insertion/native-cell/cold/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
corpus/formatted-insertion/native-cell/reverse/control-before.xml created+21
...@@ -0,0 +1,21 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{BE914D0C-20F2-4E33-AE0F-7458034A05F5}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:09:10.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="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{D95DE5B0-6B87-4D85-A1FD-F883FCD6E094}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{D95DE5B0-6B87-4D85-A1FD-F883FCD6E094}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
3style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
4style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
5style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
6style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
7lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{8FED39A5-D8D2-47D8-BB4B-7A0B58DA04DD}{10}{B0}"><one:Position x="144.0" y="96.0" z="1"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{8FED39A5-D8D2-47D8-BB4B-7A0B58DA04DD}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{B2C4512A-3E48-4E76-8D3B-D1FFB4B74C53}{10}{B0}"><one:Position x="144.0" y="192.0" z="2"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{B2C4512A-3E48-4E76-8D3B-D1FFB4B74C53}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA
8AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{37DE494A-F830-4DB0-A896-B60180668360}{10}{B0}"><one:Position x="264.0" y="192.0" z="3"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{37DE494A-F830-4DB0-A896-B60180668360}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{10}{B0}"><one:Position x="144.0" y="312.0" z="4"/><one:Size width="183.4246368408203" height="50.55070495605469"/><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{12}{B0}"><one:Columns><one:Column index="0" width="130.1489715576172"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{1901301A-99A0-4630-B79E-5454A8357826}{13}{B0}" lastModifiedTime="2026-09-08T04:47:24.000Z"><one:Cell lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="Rich author" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{B3A1C10D-13DD-0622-2D0F-CA69AE5108BE}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
9text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
10style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
11Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
12font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
13font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
14Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
15Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1611.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
17background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
18Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
19Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
2011.0pt'><br>
21End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-cell/reverse/control-update.xml created+14
...@@ -0,0 +1,14 @@
1<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{BE914D0C-20F2-4E33-AE0F-7458034A05F5}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{10}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="144.0" y="312.0" z="4" /><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{12}{B0}"><one:Columns><one:Column index="0" width="130.1489715576172" /><one:Column index="1" width="45.14567184448242" /></one:Columns><one:Row objectID="{1901301A-99A0-4630-B79E-5454A8357826}{13}{B0}" lastModifiedTime="2026-09-08T04:47:24.000Z"><one:Cell lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="Rich author" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{B3A1C10D-13DD-0622-2D0F-CA69AE5108BE}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
2text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
3style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
4Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
5font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
6font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
7Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
8Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
911.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
10background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
11Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
12Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1311.0pt'><br>
14End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page>
\ No newline at end of file
corpus/formatted-insertion/native-cell/reverse/edit-before.xml created+23
...@@ -0,0 +1,23 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{BE914D0C-20F2-4E33-AE0F-7458034A05F5}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:09:10.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="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{D95DE5B0-6B87-4D85-A1FD-F883FCD6E094}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="1"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{D95DE5B0-6B87-4D85-A1FD-F883FCD6E094}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
3style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
4style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
5style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
6style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
7lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{8FED39A5-D8D2-47D8-BB4B-7A0B58DA04DD}{10}{B0}"><one:Position x="144.0" y="96.0" z="2"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{8FED39A5-D8D2-47D8-BB4B-7A0B58DA04DD}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{B2C4512A-3E48-4E76-8D3B-D1FFB4B74C53}{10}{B0}"><one:Position x="144.0" y="192.0" z="3"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{B2C4512A-3E48-4E76-8D3B-D1FFB4B74C53}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA
8AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{37DE494A-F830-4DB0-A896-B60180668360}{10}{B0}"><one:Position x="264.0" y="192.0" z="4"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{37DE494A-F830-4DB0-A896-B60180668360}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{10}{B0}"><one:Position x="144.0" y="312.0" z="0"/><one:Size width="186.5719451904297" height="51.85495376586914"/><one:OEChildren><one:OE creationTime="2026-09-08T05:09:16.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{16}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{17}{B0}"><one:Columns><one:Column index="0" width="133.2962799072266"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{18}{B0}" lastModifiedTime="2026-09-08T05:09:19.000Z"><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{19}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" authorInitials="S" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B3A1C10D-13DD-0622-2D0F-CA69AE5108BE}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold;
9text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Bold</span><span
10style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span
11style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span
12style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
13style='font-style:italic;text-decoration:line-through;font-family:Calibri;
14font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri;
15font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super;
16font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span
17style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
18style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow;
19mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri;
20font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub;
21font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span
22style='font-family:Calibri;font-size:11.0pt' lang=en-US><br>
23End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{39}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-cell/reverse/edit-update.xml created+16
...@@ -0,0 +1,16 @@
1<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{BE914D0C-20F2-4E33-AE0F-7458034A05F5}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{10}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="144.0" y="312.0" z="0" /><one:OEChildren><one:OE creationTime="2026-09-08T05:09:16.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{16}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{17}{B0}"><one:Columns><one:Column index="0" width="133.2962799072266" /><one:Column index="1" width="45.14567184448242" /></one:Columns><one:Row objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{18}{B0}" lastModifiedTime="2026-09-08T05:09:19.000Z"><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{19}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" authorInitials="S" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B3A1C10D-13DD-0622-2D0F-CA69AE5108BE}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T>&lt;span style='font-weight:bold;
2text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US&gt;Native Bold&lt;/span&gt;&lt;span
3style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt; &lt;/span&gt;&lt;span
4style='font-family:Calibri;font-size:13.5pt' lang=en-US&gt;&amp;#129408;&lt;/span&gt;&lt;span
5style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span
6style='font-style:italic;text-decoration:line-through;font-family:Calibri;
7font-size:11.0pt' lang=x-none&gt;italic&lt;/span&gt;&lt;span style='font-family:Calibri;
8font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:super;
9font-family:Calibri;font-size:11.0pt' lang=x-none&gt;é&lt;/span&gt;&lt;span
10style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span
11style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow;
12mso-highlight:yellow' lang=x-none&gt;color&lt;/span&gt;&lt;span style='font-family:Calibri;
13font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:sub;
14font-family:SimSun;font-size:11.0pt' lang=x-none&gt;東京&lt;/span&gt;&lt;span
15style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt;&lt;br&gt;
16End&lt;/span&gt;</one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{B9A78589-7D39-4DF3-8EE7-24F5FF45921B}{39}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{1901301A-99A0-4630-B79E-5454A8357826}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page>
\ No newline at end of file
corpus/formatted-insertion/native-cell/reverse/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/native-cell/reverse/notebook/synthetic.one differ
corpus/formatted-insertion/native-cell/reverse/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment created+1
...@@ -0,0 +1 @@
1../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment
\ No newline at end of file
corpus/formatted-insertion/native-cell/reverse/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-0BC5CBA6",
5 "cold": false,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/native-cell/reverse/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="{1D5CE013-2ABD-43D2-AEFD-1F7020778E2F}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:09:31.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{B21D4528-7E27-0476-2024-E7DD43378AE0}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:09:31.000Z" color="#8AA8E4"><one:Page ID="{9E54B6AE-F7EC-4767-A743-4F4CBF0F96FF}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:09:31.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/native-cell/reverse/read/page-000.xml created+23
...@@ -0,0 +1,23 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{9E54B6AE-F7EC-4767-A743-4F4CBF0F96FF}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:09:31.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="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{F9981E12-BC99-44D1-A8B1-C3974093739E}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="1"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{F9981E12-BC99-44D1-A8B1-C3974093739E}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
3style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
4style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
5style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
6style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
7lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{AF28C207-0FCC-4E8C-B207-411FE49F97D7}{10}{B0}"><one:Position x="144.0" y="96.0" z="2"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{AF28C207-0FCC-4E8C-B207-411FE49F97D7}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{9201AA88-E956-4722-8477-EAEB08F2DF59}{10}{B0}"><one:Position x="144.0" y="192.0" z="3"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{9201AA88-E956-4722-8477-EAEB08F2DF59}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA
8AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{171BB2E8-2F2E-44E4-A1DA-8D153C23106A}{10}{B0}"><one:Position x="264.0" y="192.0" z="4"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{171BB2E8-2F2E-44E4-A1DA-8D153C23106A}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{39C4CBB8-4EBE-4F64-BED2-6F401470EB2C}{10}{B0}"><one:Position x="144.0" y="312.0" z="0"/><one:Size width="218.9918212890625" height="51.85495376586914"/><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{51}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{52}{B0}"><one:Columns><one:Column index="0" width="165.7161407470703"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{53}{B0}" lastModifiedTime="2026-09-08T05:09:19.000Z"><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{54}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{39C4CBB8-4EBE-4F64-BED2-6F401470EB2C}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" authorInitials="S" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{93643AAF-C4C3-0F76-2443-F17D12149BB4}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold;
9text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Native Bold</span><span
10style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span
11style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span
12style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
13style='font-style:italic;text-decoration:line-through;font-family:Calibri;
14font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri;
15font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super;
16font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span
17style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
18style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow;
19mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri;
20font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub;
21font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span
22style='font-family:Calibri;font-size:11.0pt' lang=en-US><br>
23End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{99627E2B-AA27-44A7-87AB-1FE143000111}{68}{B0}" lastModifiedByInitials="V"><one:OEChildren><one:OE creationTime="2026-09-08T05:09:19.000Z" lastModifiedTime="2026-09-08T05:09:19.000Z" objectID="{39C4CBB8-4EBE-4F64-BED2-6F401470EB2C}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-cell/reverse/read/payloads.json created+10
...@@ -0,0 +1,10 @@
1[
2 {
3 "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7",
4 "name": "fictitious-attachment.txt",
5 "object": "{171BB2E8-2F2E-44E4-A1DA-8D153C23106A}{11}{B0}",
6 "kind": "InsertedFile",
7 "page": "{9E54B6AE-F7EC-4767-A743-4F4CBF0F96FF}{1}{B0}",
8 "bytes": 43
9 }
10]
\ No newline at end of file
corpus/formatted-insertion/native-cell/reverse/reverse-verification.json created+5
...@@ -0,0 +1,5 @@
1{
2 "paragraphs": 5,
3 "characters": 112,
4 "exact_native_character_styles_after_control": true
5}
corpus/formatted-insertion/native-cell/reverse/run.json created+19
...@@ -0,0 +1,19 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-cell",
3 "expected_pages": 1,
4 "author": "evidence/m10/formatted-reverse-auto-size.ps1",
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 "author.ps1": "c5ebc74731fd4813803623b014ce9d6dbd6d2564918189865731807e6c458f9a",
16 "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331",
17 "read.ps1": "df4244a18ab3e9c21083b8df61b08b863e8cce0ec4bf0c9cd742a8ee6f79877d"
18 }
19}
corpus/formatted-insertion/native-cell/reverse/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 27800,
5 "sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351",
6 "mtime_ns": 1788842844345306887
7 }
8]
corpus/formatted-insertion/native-cell/reverse/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
corpus/formatted-insertion/native-cell/ui/before-read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment created+1
...@@ -0,0 +1 @@
1../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment
\ No newline at end of file
corpus/formatted-insertion/native-cell/ui/before-read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-1DC21C3F",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/native-cell/ui/before-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="{9335E9A4-2BB5-44D1-BA50-B989AA6E0C31}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:17:48.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{7E619436-410B-0C9C-22EE-6EC96252B880}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:17:48.000Z" color="#8AA8E4"><one:Page ID="{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:17:48.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/native-cell/ui/before-read/page-000.xml created+21
...@@ -0,0 +1,21 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:17:48.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="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{35E4CF0C-83B5-4C3B-AA7B-4A8361F641FE}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{35E4CF0C-83B5-4C3B-AA7B-4A8361F641FE}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
3style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
4style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
5style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
6style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
7lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{63541319-30E0-4666-B0CD-C80BC5FAA5B7}{10}{B0}"><one:Position x="144.0" y="96.0" z="1"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-05T05:06:57.000Z" objectID="{63541319-30E0-4666-B0CD-C80BC5FAA5B7}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{5E7D7B96-D67A-4FC8-86BD-63FF2997ED39}{10}{B0}"><one:Position x="144.0" y="192.0" z="2"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{5E7D7B96-D67A-4FC8-86BD-63FF2997ED39}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA
8AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{DB6763F6-1002-4C0E-A310-04011D46220A}{10}{B0}"><one:Position x="264.0" y="192.0" z="3"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{10}{B0}"><one:Position x="144.0" y="312.0" z="4"/><one:Size width="182.6545715332031" height="50.55070495605469"/><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{12}{B0}"><one:Columns><one:Column index="0" width="129.3788909912109"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{13}{B0}" lastModifiedTime="2026-09-08T04:47:24.000Z"><one:Cell lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="Rich author" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{5F18EBB1-FBEF-079C-2689-78693371A9D4}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
9text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
10style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
11Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
12font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
13font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
14Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
15Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1611.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
17background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
18Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
19Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
2011.0pt'><br>
21End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-05T05:07:00.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-cell/ui/before-read/payloads.json created+10
...@@ -0,0 +1,10 @@
1[
2 {
3 "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7",
4 "name": "fictitious-attachment.txt",
5 "object": "{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}",
6 "kind": "InsertedFile",
7 "page": "{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}",
8 "bytes": 43
9 }
10]
\ No newline at end of file
corpus/formatted-insertion/native-cell/ui/edit.ahk created+10
...@@ -0,0 +1,10 @@
1#Requires AutoHotkey v2.0
2OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1)))
3hwnd := WinExist("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE")
4if !hwnd
5 throw Error("OneNote window is missing")
6WinActivate(hwnd)
7if !WinWaitActive(hwnd,, 5)
8 throw Error("OneNote window is not active")
9Send "{Left}"
10SendText "UI "
corpus/formatted-insertion/native-cell/ui/edit.json created+13
...@@ -0,0 +1,13 @@
1{
2 "exit": 0,
3 "stdout": "",
4 "stderr": "",
5 "w": 1280,
6 "h": 720,
7 "error": null,
8 "win": {
9 "title": "Fictitious: caf\u00e9, \u6771\u4eac, \u0645\u0631\u062d\u0628\u0627 - Microsoft OneNote",
10 "class": "Framework::CFrame",
11 "dialog": false
12 }
13}
\ No newline at end of file
corpus/formatted-insertion/native-cell/ui/edit.png created
Binary files /dev/null and b/corpus/formatted-insertion/native-cell/ui/edit.png differ
corpus/formatted-insertion/native-cell/ui/navigate.ahk created+20
...@@ -0,0 +1,20 @@
1#Requires AutoHotkey v2.0
2OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1)))
3dm := Buffer(220, 0)
4NumPut("UShort", 220, dm, 68)
5if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm)
6 throw Error("Cannot inspect display mode")
7NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72)
8NumPut("UInt", 1280, dm, 172)
9NumPut("UInt", 720, dm, 176)
10if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0
11 throw Error("Display mode rejected")
12app := ComObject("OneNote.Application")
13app.NavigateTo("{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}", "{5F18EBB1-FBEF-079C-2689-78693371A9D4}{1}{B0}", false)
14hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10)
15if !hwnd
16 throw Error("OneNote window did not appear")
17WinMaximize(hwnd)
18WinActivate(hwnd)
19if !WinWaitActive(hwnd,, 10)
20 throw Error("OneNote window did not become active")
corpus/formatted-insertion/native-cell/ui/navigate.json created+13
...@@ -0,0 +1,13 @@
1{
2 "exit": 0,
3 "stdout": "",
4 "stderr": "",
5 "w": 1280,
6 "h": 720,
7 "error": null,
8 "win": {
9 "title": "Fictitious: caf\u00e9, \u6771\u4eac, \u0645\u0631\u062d\u0628\u0627 - Microsoft OneNote",
10 "class": "Framework::CFrame",
11 "dialog": false
12 }
13}
\ No newline at end of file
corpus/formatted-insertion/native-cell/ui/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/native-cell/ui/notebook/synthetic.one differ
corpus/formatted-insertion/native-cell/ui/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment created+1
...@@ -0,0 +1 @@
1../../../../append/round-01/native/append-01-complex/read/af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7.attachment
\ No newline at end of file
corpus/formatted-insertion/native-cell/ui/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-1DC21C3F",
5 "cold": false,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/native-cell/ui/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="{9335E9A4-2BB5-44D1-BA50-B989AA6E0C31}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:21:04.000Z" color="#B49EDE" isCurrentlyViewed="true"><one:Section name="synthetic" ID="{7E619436-410B-0C9C-22EE-6EC96252B880}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:21:04.000Z" color="#8AA8E4" isCurrentlyViewed="true"><one:Page ID="{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:20:59.000Z" pageLevel="1" isCurrentlyViewed="true"/></one:Section></one:Notebook>
corpus/formatted-insertion/native-cell/ui/read/page-000.xml created+21
...@@ -0,0 +1,21 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}" name="Fictitious: café, 東京, مرحبا" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:21:45.000Z" pageLevel="1" isCurrentlyViewed="true" 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="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{35E4CF0C-83B5-4C3B-AA7B-4A8361F641FE}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="14.30000114440918"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{35E4CF0C-83B5-4C3B-AA7B-4A8361F641FE}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
3style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
4style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
5style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
6style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
7lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{63541319-30E0-4666-B0CD-C80BC5FAA5B7}{10}{B0}"><one:Position x="144.0" y="96.0" z="1"/><one:Size width="167.0449523925781" height="13.42771339416504"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:57.000Z" lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{63541319-30E0-4666-B0CD-C80BC5FAA5B7}{11}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Fictitious positioned outline.]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{5E7D7B96-D67A-4FC8-86BD-63FF2997ED39}{10}{B0}"><one:Position x="144.0" y="192.0" z="2"/><one:Size width="72.0" height="0.750005722045898"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:58.000Z" lastModifiedTime="2026-09-05T05:06:58.000Z" objectID="{5E7D7B96-D67A-4FC8-86BD-63FF2997ED39}{11}{B0}" alignment="left"><one:Image format="png" originalPageNumber="0"><one:Data>iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAusB9Y9J1uoA
8AAAASUVORK5CYII=</one:Data></one:Image></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{DB6763F6-1002-4C0E-A310-04011D46220A}{10}{B0}"><one:Position x="264.0" y="192.0" z="3"/><one:Size width="72.00001525878906" height="63.0"/><one:OEChildren><one:OE creationTime="2026-09-05T05:06:59.000Z" lastModifiedTime="2026-09-05T05:06:59.000Z" objectID="{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}" alignment="left"><one:InsertedFile pathCache="C:\Users\clover\AppData\Local\Microsoft\OneNote\14.0\OneNoteOfflineCache_Files\458001d8-0f1e-451f-81cb-621828fc0b39.txt" pathSource="C:\one-tests\runs\20260905-05\assets\fictitious-attachment.txt" preferredName="fictitious-attachment.txt"/></one:OE></one:OEChildren></one:Outline><one:Outline author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{10}{B0}"><one:Position x="144.0" y="312.0" z="4"/><one:Size width="195.2552032470703" height="50.55070495605469"/><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{11}{B0}" alignment="left"><one:Table bordersVisible="true" lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{12}{B0}"><one:Columns><one:Column index="0" width="141.9795227050781"/><one:Column index="1" width="45.14567184448242"/></one:Columns><one:Row objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{13}{B0}" lastModifiedTime="2026-09-08T05:20:59.000Z"><one:Cell lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{14}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{17}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left cell]]></one:T></one:OE><one:OE author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:20:59.000Z" objectID="{5F18EBB1-FBEF-079C-2689-78693371A9D4}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
9text-decoration:underline;font-family:Calibri;font-size:11.0pt'>UI Bold</span><span
10style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
11Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
12font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
13font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
14Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
15Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1611.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
17background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
18Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
19Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
2011.0pt'><br>
21End</span>]]></one:T></one:OE></one:OEChildren></one:Cell><one:Cell lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{22}{B0}" lastModifiedByInitials="S"><one:OEChildren><one:OE creationTime="2026-09-05T05:07:00.000Z" lastModifiedTime="2026-09-08T05:20:08.000Z" objectID="{F5B81AA6-7192-478E-BC18-E6543515D94C}{25}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right cell]]></one:T></one:OE></one:OEChildren></one:Cell></one:Row></one:Table></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-cell/ui/read/payloads.json created+10
...@@ -0,0 +1,10 @@
1[
2 {
3 "sha256": "af1af4b8987109ce1e335e538910fb3860b7c57eb3b6110a06aa2114e06d69a7",
4 "name": "fictitious-attachment.txt",
5 "object": "{DB6763F6-1002-4C0E-A310-04011D46220A}{11}{B0}",
6 "kind": "InsertedFile",
7 "page": "{522867B0-C8C0-4F8D-A589-C6589E6AA49F}{1}{B0}",
8 "bytes": 43
9 }
10]
\ No newline at end of file
corpus/formatted-insertion/native-cell/ui/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/corpus/formatted-insertion/native-cell/candidate",
3 "expected_pages": 1,
4 "author": null,
5 "author_timeout_seconds": 600,
6 "inspect": true,
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": "df4244a18ab3e9c21083b8df61b08b863e8cce0ec4bf0c9cd742a8ee6f79877d"
17 }
18}
corpus/formatted-insertion/native-cell/ui/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 27800,
5 "sha256": "2d01da4a2c8a0cba582d97460b708c77eca38617f9103f4a3cc9eea33f0e0351",
6 "mtime_ns": 1788844254905915500
7 }
8]
corpus/formatted-insertion/native-cell/ui/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
corpus/formatted-insertion/native-paragraph/candidate/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/native-paragraph/candidate/synthetic.one differ
corpus/formatted-insertion/native-paragraph/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/native-paragraph/cold/notebook/synthetic.one differ
corpus/formatted-insertion/native-paragraph/cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-3A29493B",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/native-paragraph/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="{94392AC7-D3ED-4D43-A6F0-56DDDBDC19F9}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:52:44.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{D26EFE31-822A-0358-00F3-8768C1B3CD8C}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:52:44.000Z" color="#8AA8E4"><one:Page ID="{FE270DB7-0BE1-4049-8794-2FF93D8BD193}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T04:52:44.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/native-paragraph/cold/read/page-000.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="{FE270DB7-0BE1-4049-8794-2FF93D8BD193}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T04:52:44.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="{99EBA50B-4094-43FF-8866-A322C21734F2}{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="{9E8E0DFC-B3E9-08F5-3832-6028097C4604}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
5Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
6font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
7font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
8Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
9Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1011.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
11background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
12Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
13Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1411.0pt'><br>
15End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{99EBA50B-4094-43FF-8866-A322C21734F2}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
16style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
17style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
18style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
19style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
20lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-paragraph/cold/read/payloads.json created+3
...@@ -0,0 +1,3 @@
1[
2
3]
\ No newline at end of file
corpus/formatted-insertion/native-paragraph/cold/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-paragraph",
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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8"
17 }
18}
corpus/formatted-insertion/native-paragraph/cold/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 18672,
5 "sha256": "202823512283be980b6a139adcf5f4f369d15f17d60ed7b23f9f2289513aa4e9",
6 "mtime_ns": 1788842844336692559
7 }
8]
corpus/formatted-insertion/native-paragraph/cold/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
corpus/formatted-insertion/native-paragraph/reverse/control-before.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="{1B7A8098-ED5A-422F-B4CC-AF462C16CB92}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:00:42.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="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{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="{7BD380D3-5552-0A93-0B6A-E09718E15C05}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
5Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
6font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
7font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
8Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
9Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1011.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
11background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
12Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
13Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1411.0pt'><br>
15End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
16style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
17style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
18style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
19style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
20lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-paragraph/reverse/control-update.xml created+19
...@@ -0,0 +1,19 @@
1<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1B7A8098-ED5A-422F-B4CC-AF462C16CB92}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{10}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><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="{7BD380D3-5552-0A93-0B6A-E09718E15C05}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
2text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
3style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
4Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
5font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
6font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
7Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
8Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
911.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
10background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
11Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
12Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1311.0pt'><br>
14End</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="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
15style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
16style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
17style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
18style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
19lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
\ No newline at end of file
corpus/formatted-insertion/native-paragraph/reverse/edit-before.xml created+22
...@@ -0,0 +1,22 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1B7A8098-ED5A-422F-B4CC-AF462C16CB92}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="43.3349609375"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7BD380D3-5552-0A93-0B6A-E09718E15C05}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span
5style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span
6style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
7style='font-style:italic;text-decoration:line-through;font-family:Calibri;
8font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri;
9font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super;
10font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span
11style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
12style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow;
13mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri;
14font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub;
15font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span
16style='font-family:Calibri;font-size:11.0pt' lang=en-US><br>
17End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
18style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
19style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
20style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
21style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
22lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-paragraph/reverse/edit-update.xml created+21
...@@ -0,0 +1,21 @@
1<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1B7A8098-ED5A-422F-B4CC-AF462C16CB92}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{10}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="36.0" y="14.40000057220459" z="0" /><one:Size width="127.5136947631836" height="43.3349609375" /><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7BD380D3-5552-0A93-0B6A-E09718E15C05}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T>&lt;span style='font-weight:bold;
2text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US&gt;Native Bold&lt;/span&gt;&lt;span
3style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt; &lt;/span&gt;&lt;span
4style='font-family:Calibri;font-size:13.5pt' lang=en-US&gt;&amp;#129408;&lt;/span&gt;&lt;span
5style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span
6style='font-style:italic;text-decoration:line-through;font-family:Calibri;
7font-size:11.0pt' lang=x-none&gt;italic&lt;/span&gt;&lt;span style='font-family:Calibri;
8font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:super;
9font-family:Calibri;font-size:11.0pt' lang=x-none&gt;é&lt;/span&gt;&lt;span
10style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span
11style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow;
12mso-highlight:yellow' lang=x-none&gt;color&lt;/span&gt;&lt;span style='font-family:Calibri;
13font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:sub;
14font-family:SimSun;font-size:11.0pt' lang=x-none&gt;東京&lt;/span&gt;&lt;span
15style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt;&lt;br&gt;
16End&lt;/span&gt;</one:T></one:OE><one:OE author="snow" authorInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{7CB62824-A62F-4199-BB3E-239DD38A2EF3}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
17style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
18style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
19style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
20style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
21lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
\ No newline at end of file
corpus/formatted-insertion/native-paragraph/reverse/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/native-paragraph/reverse/notebook/synthetic.one differ
corpus/formatted-insertion/native-paragraph/reverse/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-E17E9EEE",
5 "cold": false,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/native-paragraph/reverse/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="{643EE131-1C57-48AE-A2E3-79A6724309F6}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:02:00.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{F55CE73E-E1CC-04D6-18B6-DF16A6EFDE4A}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:02:00.000Z" color="#8AA8E4"><one:Page ID="{D91514B8-6807-47C7-9FD1-77875AD7C255}{1}{B0}" name="Native Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:02:00.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/native-paragraph/reverse/read/page-000.xml created+22
...@@ -0,0 +1,22 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{D91514B8-6807-47C7-9FD1-77875AD7C255}{1}{B0}" name="Native Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T05:02: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="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{BED9BC04-2372-4471-9023-FB5CA54B2734}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="57.63496017456055"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{B9BC14F3-D00F-0F7B-2077-38566E2055C2}{1}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Native Bold</span><span
4style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span
5style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span
6style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
7style='font-style:italic;text-decoration:line-through;font-family:Calibri;
8font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri;
9font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super;
10font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span
11style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
12style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow;
13mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri;
14font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub;
15font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span
16style='font-family:Calibri;font-size:11.0pt' lang=en-US><br>
17End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-08T05:00:50.000Z" objectID="{BED9BC04-2372-4471-9023-FB5CA54B2734}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
18style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
19style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
20style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
21style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
22lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/native-paragraph/reverse/read/payloads.json created+3
...@@ -0,0 +1,3 @@
1[
2
3]
\ No newline at end of file
corpus/formatted-insertion/native-paragraph/reverse/reverse-verification.json created+5
...@@ -0,0 +1,5 @@
1{
2 "paragraphs": 2,
3 "characters": 63,
4 "exact_native_character_styles_after_control": true
5}
corpus/formatted-insertion/native-paragraph/reverse/run.json created+19
...@@ -0,0 +1,19 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/native-paragraph",
3 "expected_pages": 1,
4 "author": "evidence/m10/formatted-reverse-controlled.ps1",
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 "author.ps1": "4362d0ba551eb00b2eca1c5563d76352469f85d3981155bf2682c159a03ddedb",
16 "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331",
17 "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8"
18 }
19}
corpus/formatted-insertion/native-paragraph/reverse/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 18672,
5 "sha256": "202823512283be980b6a139adcf5f4f369d15f17d60ed7b23f9f2289513aa4e9",
6 "mtime_ns": 1788842844336692559
7 }
8]
corpus/formatted-insertion/native-paragraph/reverse/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
corpus/formatted-insertion/outline/candidate/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/outline/candidate/synthetic.one differ
corpus/formatted-insertion/outline/cold/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/outline/cold/notebook/synthetic.one differ
corpus/formatted-insertion/outline/cold/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-21E15CBC",
5 "cold": true,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/outline/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="{FD9B23E7-27DD-42DA-B9EB-7D7C38E67AC6}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T04:53:07.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{BF888060-5534-0692-36B6-7F1D9A763BAE}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T04:53:07.000Z" color="#8AA8E4"><one:Page ID="{66EE590B-EB2A-0597-072E-737ABAC4421C}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:52:56.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/outline/cold/read/page-000.xml created+15
...@@ -0,0 +1,15 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{66EE590B-EB2A-0597-072E-737ABAC4421C}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:52:56.000Z" pageLevel="1" lang="en-US"><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{BF888060-5534-0692-36B6-7F1D9A763BAE}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{BF888060-5534-0692-36B6-7F1D9A763BAE}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{0ECA1708-B745-031C-291B-F034D71F2A92}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="468.0" height="28.60299110412598"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{0ECA1708-B745-031C-291B-F034D71F2A92}{3}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
5Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
6font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
7font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
8Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
9Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1011.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
11background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
12Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
13Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1411.0pt'><br>
15End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/outline/cold/read/payloads.json created+3
...@@ -0,0 +1,3 @@
1[
2
3]
\ No newline at end of file
corpus/formatted-insertion/outline/cold/run.json created+18
...@@ -0,0 +1,18 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/outline",
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": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8"
17 }
18}
corpus/formatted-insertion/outline/cold/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 7776,
5 "sha256": "76f6b743caa9dc2b5ab342d6e6a742125ecbcd0ca2372062b42acbd08b5ebb4c",
6 "mtime_ns": 1788842844332249915
7 }
8]
corpus/formatted-insertion/outline/cold/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
corpus/formatted-insertion/outline/reverse/control-before.xml created+15
...@@ -0,0 +1,15 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1ADF0406-C7FD-03BA-0A13-462805F7226D}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:19.000Z" pageLevel="1" lang="en-US"><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{C3B9DD6D-79E3-00BF-3B8B-4A4F25455BDF}{23}{B0}"><one:Position x="36.0" y="36.0" z="0"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{C3B9DD6D-79E3-00BF-3B8B-4A4F25455BDF}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{1}{B0}"><one:Position x="72.0" y="144.0" z="1"/><one:Size width="468.0" height="28.60299110412598"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{3}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
5Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
6font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
7font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
8Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
9Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1011.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
11background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
12Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
13Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1411.0pt'><br>
15End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/outline/reverse/control-update.xml created+14
...@@ -0,0 +1,14 @@
1<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1ADF0406-C7FD-03BA-0A13-462805F7226D}{1}{B0}"><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{1}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="72.0" y="144.0" z="1" /><one:Size width="468.0" height="28.60299110412598" /><one:Indents><one:Indent level="0" indent="0.0" /></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{3}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
2text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
3style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
4Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
5font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
6font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
7Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
8Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
911.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
10background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
11Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
12Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1311.0pt'><br>
14End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
\ No newline at end of file
corpus/formatted-insertion/outline/reverse/edit-before.xml created+17
...@@ -0,0 +1,17 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1ADF0406-C7FD-03BA-0A13-462805F7226D}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:19.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 style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{C3B9DD6D-79E3-00BF-3B8B-4A4F25455BDF}{23}{B0}"><one:Position x="36.0" y="36.0" z="1"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{C3B9DD6D-79E3-00BF-3B8B-4A4F25455BDF}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{1}{B0}"><one:Position x="72.0" y="144.0" z="0"/><one:Size width="468.0" height="29.90723991394043"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{3}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span
5style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span
6style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
7style='font-style:italic;text-decoration:line-through;font-family:Calibri;
8font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri;
9font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super;
10font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span
11style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
12style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow;
13mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri;
14font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub;
15font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span
16style='font-family:Calibri;font-size:11.0pt' lang=en-US><br>
17End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/outline/reverse/edit-update.xml created+16
...@@ -0,0 +1,16 @@
1<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{1ADF0406-C7FD-03BA-0A13-462805F7226D}{1}{B0}"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" /><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{1}{B0}" xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote"><one:Position x="72.0" y="144.0" z="0" /><one:Size width="468.0" height="29.90723991394043" /><one:Indents><one:Indent level="0" indent="0.0" /></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{72FB4A05-9B92-0531-2426-C566682C4AE3}{3}{B0}" alignment="left" quickStyleIndex="0"><one:T>&lt;span style='font-weight:bold;
2text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US&gt;Native Bold&lt;/span&gt;&lt;span
3style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt; &lt;/span&gt;&lt;span
4style='font-family:Calibri;font-size:13.5pt' lang=en-US&gt;&amp;#129408;&lt;/span&gt;&lt;span
5style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span
6style='font-style:italic;text-decoration:line-through;font-family:Calibri;
7font-size:11.0pt' lang=x-none&gt;italic&lt;/span&gt;&lt;span style='font-family:Calibri;
8font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:super;
9font-family:Calibri;font-size:11.0pt' lang=x-none&gt;é&lt;/span&gt;&lt;span
10style='font-family:Calibri;font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span
11style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow;
12mso-highlight:yellow' lang=x-none&gt;color&lt;/span&gt;&lt;span style='font-family:Calibri;
13font-size:11.0pt' lang=x-none&gt; &lt;/span&gt;&lt;span style='vertical-align:sub;
14font-family:SimSun;font-size:11.0pt' lang=x-none&gt;東京&lt;/span&gt;&lt;span
15style='font-family:Calibri;font-size:11.0pt' lang=en-US&gt;&lt;br&gt;
16End&lt;/span&gt;</one:T></one:OE></one:OEChildren></one:Outline></one:Page>
\ No newline at end of file
corpus/formatted-insertion/outline/reverse/notebook/synthetic.one created
Binary files /dev/null and b/corpus/formatted-insertion/outline/reverse/notebook/synthetic.one differ
corpus/formatted-insertion/outline/reverse/read/environment.json created+7
...@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-129C20F7",
5 "cold": false,
6 "onenote": "14.0.4763.1000"
7}
corpus/formatted-insertion/outline/reverse/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="{ACF9AA90-C944-4381-97F0-8AAE2DE5FAEF}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T05:04:40.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{D32B2090-2B9E-07F2-3796-17BEC4F45F8E}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T05:04:40.000Z" color="#8AA8E4"><one:Page ID="{0A4DF9FB-9580-04F7-060E-1BD9E446263C}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:40.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/formatted-insertion/outline/reverse/read/page-000.xml created+17
...@@ -0,0 +1,17 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{0A4DF9FB-9580-04F7-060E-1BD9E446263C}{1}{B0}" name="Original" dateTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:40.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 style="font-family:Calibri;font-size:11.0pt" author="Author" lastModifiedBy="Author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{D32B2090-2B9E-07F2-3796-17BEC4F45F8E}{23}{B0}"><one:Position x="36.0" y="36.0" z="1"/><one:Size width="101.66748046875" height="13.4277172088623"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{D32B2090-2B9E-07F2-3796-17BEC4F45F8E}{24}{B0}" alignment="left"><one:T><![CDATA[Original]]></one:T></one:OE></one:OEChildren></one:Outline><one:Outline author="Rich author" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{6269B7F8-C9EF-027C-283B-9897899D4EB2}{1}{B0}"><one:Position x="72.0" y="144.0" z="0"/><one:Size width="468.0" height="29.90723991394043"/><one:Indents><one:Indent level="0" indent="0.0"/></one:Indents><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T05:04:27.000Z" objectID="{6269B7F8-C9EF-027C-283B-9897899D4EB2}{3}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt' lang=en-US>Native Bold</span><span
4style='font-family:Calibri;font-size:11.0pt' lang=en-US> </span><span
5style='font-family:Calibri;font-size:13.5pt' lang=en-US>&#129408;</span><span
6style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
7style='font-style:italic;text-decoration:line-through;font-family:Calibri;
8font-size:11.0pt' lang=x-none>italic</span><span style='font-family:Calibri;
9font-size:11.0pt' lang=x-none> </span><span style='vertical-align:super;
10font-family:Calibri;font-size:11.0pt' lang=x-none>é</span><span
11style='font-family:Calibri;font-size:11.0pt' lang=x-none> </span><span
12style='font-family:Calibri;font-size:11.0pt;color:#0C2238;background:yellow;
13mso-highlight:yellow' lang=x-none>color</span><span style='font-family:Calibri;
14font-size:11.0pt' lang=x-none> </span><span style='vertical-align:sub;
15font-family:SimSun;font-size:11.0pt' lang=x-none>東京</span><span
16style='font-family:Calibri;font-size:11.0pt' lang=en-US><br>
17End</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/formatted-insertion/outline/reverse/read/payloads.json created+3
...@@ -0,0 +1,3 @@
1[
2
3]
\ No newline at end of file
corpus/formatted-insertion/outline/reverse/reverse-verification.json created+5
...@@ -0,0 +1,5 @@
1{
2 "paragraphs": 2,
3 "characters": 44,
4 "exact_native_character_styles_after_control": true
5}
corpus/formatted-insertion/outline/reverse/run.json created+19
...@@ -0,0 +1,19 @@
1{
2 "notebook": "/Users/clo/dev/one/evidence/m10/formatted-insertion-isolated/outline",
3 "expected_pages": 1,
4 "author": "evidence/m10/formatted-reverse-controlled.ps1",
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 "author.ps1": "4362d0ba551eb00b2eca1c5563d76352469f85d3981155bf2682c159a03ddedb",
16 "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331",
17 "read.ps1": "086789e467779add0fc071ad8c524c2b02d3d0d609aea4a41f3128cadba371e8"
18 }
19}
corpus/formatted-insertion/outline/reverse/source.json created+8
...@@ -0,0 +1,8 @@
1[
2 {
3 "path": "synthetic.one",
4 "bytes": 7776,
5 "sha256": "76f6b743caa9dc2b5ab342d6e6a742125ecbcd0ca2372062b42acbd08b5ebb4c",
6 "mtime_ns": 1788842844332249915
7 }
8]
corpus/formatted-insertion/outline/reverse/teardown.json created+1
...@@ -0,0 +1 @@
1{"absent": true}
crates/onestore-offline/README.md+4-6
...@@ -26,7 +26,8 @@ assert_eq!(pending.last().map(|edit| edit.id), local_id);...@@ -26,7 +26,8 @@ assert_eq!(pending.last().map(|edit| edit.id), local_id);
26```26```
2727
28`insert` accepts the core library's `Insertion` value and durably retains its28`insert` accepts the core library's `Insertion` value and durably retains its
29object identities. Keep that value across retries; its `text_object()` identifies29intent identities. `Insertion::with_formatting` queues text and
30its styles as one intent and one publication. Keep that value across retries; its `text_object()` identifies
30the new text for subsequent offline edits. Pending entries expose31the new text for subsequent offline edits. Pending entries expose
31`Operation::Text(TextEdit)`, `Operation::Insert(Insertion)` or32`Operation::Text(TextEdit)`, `Operation::Insert(Insertion)` or
32`Operation::Format(FormatEdit)` through their33`Operation::Format(FormatEdit)` through their
...@@ -47,12 +48,9 @@ use onestore::{ExGuid, Insertion, TextAttribute};...@@ -47,12 +48,9 @@ use onestore::{ExGuid, Insertion, TextAttribute};
47use onestore_offline::{EditStatus, Replica};48use onestore_offline::{EditStatus, Replica};
48# fn add_outline(cache: &Replica, space: ExGuid, page: ExGuid)49# fn add_outline(cache: &Replica, space: ExGuid, page: ExGuid)
49# -> Result<(), Box<dyn std::error::Error>> {50# -> Result<(), Box<dyn std::error::Error>> {
50let outline = Insertion::outline(page, 144.0, 216.0, "Offline outline", "Author")?;51let outline = Insertion::outline(page, 144.0, 216.0, "Offline outline", "Author")?
52 .with_formatting(0..7, &[TextAttribute::Bold(true)])?;
51let id = cache.insert(&cache.snapshot()?, space, &outline)?;53let id = cache.insert(&cache.snapshot()?, space, &outline)?;
52cache.format(
53 &cache.snapshot()?, space, outline.text_object(), 0..7,
54 &[TextAttribute::Bold(true)],
55)?;
56if let Some(id) = id {54if let Some(id) = id {
57 // A running worker may already have advanced this state.55 // A running worker may already have advanced this state.
58 match cache.status(id)? {56 match cache.status(id)? {
crates/onestore-offline/examples/smb_offline_client.rs+8-1
...@@ -301,7 +301,14 @@ fn queue_document(...@@ -301,7 +301,14 @@ fn queue_document(
301 &text,301 &text,
302 "Offline document writer",302 "Offline document writer",
303 )?303 )?
304 };304 }
305 .with_formatting(
306 0..u32::try_from(text.encode_utf16().count())?,
307 &[
308 TextAttribute::FontSize(13.5),
309 TextAttribute::Color(Some([0x44, 0x55, 0x66])),
310 ],
311 )?;
305 let parent = if operation.is_multiple_of(2) {312 let parent = if operation.is_multiple_of(2) {
306 insertion.object()313 insertion.object()
307 } else {314 } else {
crates/onestore-offline/tests/cache.rs+14-1
...@@ -609,7 +609,9 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() {...@@ -609,7 +609,9 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() {
609 "Author",609 "Author",
610 )610 )
611 .unwrap()611 .unwrap()
612 };612 }
613 .with_formatting(0..6, &[onestore::TextAttribute::Italic(true)])
614 .unwrap();
613 loop {615 loop {
614 assert!(616 assert!(
615 Instant::now() < deadline,617 Instant::now() < deadline,
...@@ -691,6 +693,17 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() {...@@ -691,6 +693,17 @@ fn twelve_local_clients_preserve_inserted_identities_and_dependent_edits() {
691 format!("Edited Paragraph {client}:{sequence}")693 format!("Edited Paragraph {client}:{sequence}")
692 };694 };
693 assert!(matches!(&v.nodes[id].kind,Kind::RichText{text,..} if *text==wanted));695 assert!(matches!(&v.nodes[id].kind,Kind::RichText{text,..} if *text==wanted));
696 let runs = v.text_runs(*id).unwrap();
697 assert_eq!(runs[0].format.italic, Some(true));
698 assert_eq!(
699 runs[0].text,
700 if sequence == 0 {
701 "Client"
702 } else {
703 "Edited Paragr"
704 }
705 );
706 assert!(runs[1..].iter().all(|run| run.format.italic != Some(true)));
694 }707 }
695 }708 }
696}709}
crates/onestore-offline/tests/sync.rs+35-5
...@@ -1736,8 +1736,10 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() {...@@ -1736,8 +1736,10 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() {
1736 let doc = Document::parse(&index).unwrap();1736 let doc = Document::parse(&index).unwrap();
1737 let (_, page) = doc.pages().unwrap()[0];1737 let (_, page) = doc.pages().unwrap()[0];
1738 let cache = Replica::create(&path, &source).unwrap();1738 let cache = Replica::create(&path, &source).unwrap();
1739 let outline =1739 let outline = Insertion::outline(page, 72.0, 144.0, "Offline outline", "Offline author")
1740 Insertion::outline(page, 72.0, 144.0, "Offline outline", "Offline author").unwrap();1740 .unwrap()
1741 .with_formatting(0..7, &[onestore::TextAttribute::Italic(true)])
1742 .unwrap();
1741 let first = cache.insert(&source, sid, &outline).unwrap().unwrap();1743 let first = cache.insert(&source, sid, &outline).unwrap().unwrap();
1742 let snapshot = cache.snapshot().unwrap();1744 let snapshot = cache.snapshot().unwrap();
1743 let paragraph = Insertion::paragraph(1745 let paragraph = Insertion::paragraph(
...@@ -1746,6 +1748,8 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() {...@@ -1746,6 +1748,8 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() {
1746 "Offline paragraph 🦀",1748 "Offline paragraph 🦀",
1747 "Offline author",1749 "Offline author",
1748 )1750 )
1751 .unwrap()
1752 .with_formatting(8..17, &[onestore::TextAttribute::Bold(true)])
1749 .unwrap();1753 .unwrap();
1750 let second = cache.insert(&snapshot, sid, &paragraph).unwrap().unwrap();1754 let second = cache.insert(&snapshot, sid, &paragraph).unwrap().unwrap();
1751 let third = cache1755 let third = cache
...@@ -1786,6 +1790,12 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() {...@@ -1786,6 +1790,12 @@ fn offline_insertions_survive_reopen_rebase_and_dependent_text_edits() {
1786 ] {1790 ] {
1787 assert!(matches!(&v.nodes[&id].kind,Kind::RichText{text,..} if text==wanted));1791 assert!(matches!(&v.nodes[&id].kind,Kind::RichText{text,..} if text==wanted));
1788 }1792 }
1793 let outline_runs = v.text_runs(outline.text_object()).unwrap();
1794 assert_eq!(outline_runs[0].text, "Offline");
1795 assert_eq!(outline_runs[0].format.italic, Some(true));
1796 let runs = v.text_runs(paragraph.text_object()).unwrap();
1797 assert_eq!(runs[1].text, "paragraph");
1798 assert_eq!(runs[1].format.bold, Some(true));
1789 assert_eq!(1799 assert_eq!(
1790 v.nodes[&outline.object()].children.last(),1800 v.nodes[&outline.object()].children.last(),
1791 Some(&paragraph.object())1801 Some(&paragraph.object())
...@@ -1811,8 +1821,12 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object...@@ -1811,8 +1821,12 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object
1811 let doc = Document::parse(&index).unwrap();1821 let doc = Document::parse(&index).unwrap();
1812 let (sid, page) = doc.pages().unwrap()[0];1822 let (sid, page) = doc.pages().unwrap()[0];
1813 let cache = Replica::create(&path, &source).unwrap();1823 let cache = Replica::create(&path, &source).unwrap();
1814 let insertion =1824 let insertion = Insertion::outline(page, 144.0, 144.0, "Uncertain insertion", "Author")
1815 Insertion::outline(page, 144.0, 144.0, "Uncertain insertion", "Author").unwrap();1825 .unwrap()
1826 .with_formatting(0..9, &[onestore::TextAttribute::Bold(true)])
1827 .unwrap()
1828 .with_formatting(10..19, &[onestore::TextAttribute::Italic(true)])
1829 .unwrap();
1816 let id = cache.insert(&source, sid, &insertion).unwrap().unwrap();1830 let id = cache.insert(&source, sid, &insertion).unwrap().unwrap();
1817 let local = cache.snapshot().unwrap();1831 let local = cache.snapshot().unwrap();
1818 let mut server = Server::new(&source);1832 let mut server = Server::new(&source);
...@@ -1860,6 +1874,15 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object...@@ -1860,6 +1874,15 @@ fn uncertain_insertions_reconcile_the_original_revision_without_duplicate_object
1860 let v = &s.revisions[&s.contexts[&ExGuid::default()]];1874 let v = &s.revisions[&s.contexts[&ExGuid::default()]];
1861 assert_eq!(v.nodes.values().filter(|node|matches!(&node.kind,Kind::RichText{text,..} if text=="Uncertain insertion")).count(),1);1875 assert_eq!(v.nodes.values().filter(|node|matches!(&node.kind,Kind::RichText{text,..} if text=="Uncertain insertion")).count(),1);
1862 assert!(v.nodes.contains_key(&insertion.object()));1876 assert!(v.nodes.contains_key(&insertion.object()));
1877 let runs = v.text_runs(insertion.text_object()).unwrap();
1878 assert_eq!(runs.len(), 3);
1879 assert_eq!(runs[0].text, "Uncertain");
1880 assert_eq!(runs[0].format.bold, Some(true));
1881 assert_eq!(runs[1].text, " ");
1882 assert_ne!(runs[1].format.bold, Some(true));
1883 assert_ne!(runs[1].format.italic, Some(true));
1884 assert_eq!(runs[2].text, "insertion");
1885 assert_eq!(runs[2].format.italic, Some(true));
1863 assert!(cache.pending().unwrap().is_empty());1886 assert!(cache.pending().unwrap().is_empty());
1864 }1887 }
1865 }1888 }
...@@ -2668,7 +2691,9 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() {...@@ -2668,7 +2691,9 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() {
2668 Insertion::outline(page, 144.0, 144.0, "Offline", "Author").unwrap()2691 Insertion::outline(page, 144.0, 144.0, "Offline", "Author").unwrap()
2669 } else {2692 } else {
2670 Insertion::paragraph(parent, Some(anchor.object()), "Offline", "Author").unwrap()2693 Insertion::paragraph(parent, Some(anchor.object()), "Offline", "Author").unwrap()
2671 };2694 }
2695 .with_formatting(0..7, &[A::Italic(true)])
2696 .unwrap();
2672 let cache = Replica::create(&path, &source).unwrap();2697 let cache = Replica::create(&path, &source).unwrap();
2673 let first = cache.insert(&source, sid, &insertion).unwrap().unwrap();2698 let first = cache.insert(&source, sid, &insertion).unwrap().unwrap();
2674 let second = cache2699 let second = cache
...@@ -2754,6 +2779,10 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() {...@@ -2754,6 +2779,10 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() {
2754 };2779 };
2755 assert_eq!(rebased.object(), insertion.object());2780 assert_eq!(rebased.object(), insertion.object());
2756 assert_eq!(rebased.text_object(), insertion.text_object());2781 assert_eq!(rebased.text_object(), insertion.text_object());
2782 assert_eq!(
2783 serde_json::to_value(&rebased).unwrap()["formats"],
2784 serde_json::to_value(&insertion).unwrap()["formats"]
2785 );
2757 assert_eq!(cache.status(first).unwrap(), Some(EditStatus::Pending));2786 assert_eq!(cache.status(first).unwrap(), Some(EditStatus::Pending));
2758 drop(cache);2787 drop(cache);
2759 let cache = Replica::open(&path).unwrap();2788 let cache = Replica::open(&path).unwrap();
...@@ -2775,6 +2804,7 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() {...@@ -2775,6 +2804,7 @@ fn reviewed_insertion_placements_preserve_identity_and_dependent_operations() {
2775 "Offline 🦀"2804 "Offline 🦀"
2776 );2805 );
2777 assert!(runs.iter().all(|r| r.format.bold == Some(true)));2806 assert!(runs.iter().all(|r| r.format.bold == Some(true)));
2807 assert!(runs.iter().all(|r| r.format.italic == Some(true)));
2778 if outline_case {2808 if outline_case {
2779 assert_eq!(2809 assert_eq!(
2780 (2810 (
crates/onestore/README.md+3-1
...@@ -71,7 +71,9 @@ passwords, unsupported protection profiles and work-limit failures remain distin...@@ -71,7 +71,9 @@ passwords, unsupported protection profiles and work-limit failures remain distin
71The source stays encrypted; protected writes are rejected.71The source stays encrypted; protected writes are rejected.
72Insertions update child references, reference counts, modification times and automatic72Insertions update child references, reference counts, modification times and automatic
73titles atomically. Paragraphs can be nested or inserted into table cells; outline73titles atomically. Paragraphs can be nested or inserted into table cells; outline
74coordinates use points. Retain the `Insertion` value for rebasing: creating another74coordinates use points. `Insertion::with_formatting` includes nonoverlapping UTF-16
75spans in that same publication; gaps keep the default insertion style. Empty text
76accepts one `0..0` span for subsequent typing. Retain the `Insertion` value for rebasing: creating another
75value creates different object identities. Duplicate insertion identities require77value creates different object identities. Duplicate insertion identities require
76reconciliation. Formatting accepts explicit attributes, preserves inherited values,78reconciliation. Formatting accepts explicit attributes, preserves inherited values,
77and gives retired immutable styles zero current references while retaining history.79and gives retired immutable styles zero current references while retaining history.
crates/onestore/src/formatting.rs+28-20
...@@ -91,26 +91,7 @@ pub(crate) fn format_text(...@@ -91,26 +91,7 @@ pub(crate) fn format_text(
91 "Select a text range and at least one formatting attribute",91 "Select a text range and at least one formatting attribute",
92 ));92 ));
93 }93 }
94 let mut values = Vec::new();94 let values = attribute_values(attributes)?;
95 let mut seen = BTreeSet::new();
96 for attribute in attributes {
97 let (id, value) = attribute.property()?;
98 if !seen.insert(id & 0x7fffffff) {
99 return Err(invalid("Specify each formatting attribute once"));
100 }
101 values.push((id, value));
102 }
103 if attributes.contains(&TextAttribute::Superscript(true))
104 && attributes.contains(&TextAttribute::Subscript(true))
105 {
106 return Err(invalid("Text cannot be both superscript and subscript"));
107 }
108 // Setting either script position clears its mutually exclusive counterpart.
109 for (set, opposite) in [(0x88001c08, 0x08001c09), (0x88001c09, 0x08001c08)] {
110 if values.iter().any(|(id, _)| *id == set) && !seen.contains(&opposite) {
111 values.push((opposite, Vec::new()));
112 }
113 }
114 let store = Store::parse(source)?;95 let store = Store::parse(source)?;
115 let index = RevisionIndex::parse(&store)?;96 let index = RevisionIndex::parse(&store)?;
116 index.validate_current()?;97 index.validate_current()?;
...@@ -286,3 +267,30 @@ pub(crate) fn format_text(...@@ -286,3 +267,30 @@ pub(crate) fn format_text(
286 Ok(changed)267 Ok(changed)
287 })268 })
288}269}
270
271pub(crate) fn attribute_values(attributes: &[TextAttribute]) -> Result<Vec<(u32, Vec<u8>)>, Error> {
272 if attributes.is_empty() {
273 return Err(invalid("Choose at least one formatting attribute"));
274 }
275 let mut values = Vec::new();
276 let mut seen = BTreeSet::new();
277 for attribute in attributes {
278 let (id, value) = attribute.property()?;
279 if !seen.insert(id & 0x7fffffff) {
280 return Err(invalid("Specify each formatting attribute once"));
281 }
282 values.push((id, value));
283 }
284 if attributes.contains(&TextAttribute::Superscript(true))
285 && attributes.contains(&TextAttribute::Subscript(true))
286 {
287 return Err(invalid("Text cannot be both superscript and subscript"));
288 }
289 // Setting either script position clears its mutually exclusive counterpart.
290 for (set, opposite) in [(0x88001c08, 0x08001c09), (0x88001c09, 0x08001c08)] {
291 if values.iter().any(|(id, _)| *id == set) && !seen.contains(&opposite) {
292 values.push((opposite, Vec::new()));
293 }
294 }
295 Ok(values)
296}
crates/onestore/src/insertion.rs+110
...@@ -8,6 +8,7 @@ use crate::{...@@ -8,6 +8,7 @@ use crate::{
8use serde::{Deserialize, Serialize};8use serde::{Deserialize, Serialize};
9use std::{9use std::{
10 collections::{BTreeMap, BTreeSet},10 collections::{BTreeMap, BTreeSet},
11 ops::Range,
11 sync::Arc,12 sync::Arc,
12};13};
1314
...@@ -22,6 +23,14 @@ enum Placement {...@@ -22,6 +23,14 @@ enum Placement {
22 Outline { x: f32, y: f32 },23 Outline { x: f32, y: f32 },
23}24}
2425
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
27#[serde(deny_unknown_fields)]
28struct FormatSpan {
29 guid: [u8; 16],
30 range: Range<u32>,
31 attributes: Vec<crate::TextAttribute>,
32}
33
25/// A paragraph or outline insertion with stable object identities and creation time.34/// A paragraph or outline insertion with stable object identities and creation time.
26/// Retain this intent across rebases; constructing another intent allocates different identities.35/// Retain this intent across rebases; constructing another intent allocates different identities.
27#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]36#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
...@@ -33,9 +42,29 @@ pub struct Insertion {...@@ -33,9 +42,29 @@ pub struct Insertion {
33 text: String,42 text: String,
34 author: String,43 author: String,
35 created: u32,44 created: u32,
45 #[serde(default, skip_serializing_if = "Vec::is_empty")]
46 formats: Vec<FormatSpan>,
36}47}
3748
38impl Insertion {49impl Insertion {
50 /// Adds a nonoverlapping UTF-16 formatting span, retaining all existing identities.
51 /// Gaps use the ordinary insertion style; only empty text accepts a zero-length span.
52 pub fn with_formatting(
53 &self,
54 range: Range<u32>,
55 attributes: &[crate::TextAttribute],
56 ) -> Result<Self, Error> {
57 let mut intent = self.clone();
58 intent.formats.push(FormatSpan {
59 guid: fresh_guid()?,
60 range,
61 attributes: attributes.to_vec(),
62 });
63 intent.formats.sort_by_key(|span| span.range.start);
64 intent.validate()?;
65 Ok(intent)
66 }
67
39 /// Inserts before a direct child, or appends when `before` is None.68 /// Inserts before a direct child, or appends when `before` is None.
40 /// The parent must be an editable outline, paragraph, outline group or table cell.69 /// The parent must be an editable outline, paragraph, outline group or table cell.
41 /// Carriage returns represent soft line breaks; line feeds and embedded-field markers are rejected.70 /// Carriage returns represent soft line breaks; line feeds and embedded-field markers are rejected.
...@@ -89,6 +118,7 @@ impl Insertion {...@@ -89,6 +118,7 @@ impl Insertion {
89 text: text.to_owned(),118 text: text.to_owned(),
90 author: author.to_owned(),119 author: author.to_owned(),
91 created: current_timestamps()?.0,120 created: current_timestamps()?.0,
121 formats: Vec::new(),
92 };122 };
93 intent.validate()?;123 intent.validate()?;
94 Ok(intent)124 Ok(intent)
...@@ -125,6 +155,37 @@ impl Insertion {...@@ -125,6 +155,37 @@ impl Insertion {
125 {155 {
126 return Err(invalid("Outline coordinates must be finite"));156 return Err(invalid("Outline coordinates must be finite"));
127 }157 }
158 if !self.formats.is_empty() {
159 let units: Vec<_> = self.text.encode_utf16().collect();
160 let length = u32::try_from(units.len())
161 .map_err(|_| invalid("Text exceeds UTF-16 offset range"))?;
162 let mut identities = BTreeSet::from([self.guid]);
163 let mut end = 0;
164 for span in &self.formats {
165 if span.guid == [0; 16] || !identities.insert(span.guid) {
166 return Err(invalid("Formatting identities must be distinct"));
167 }
168 if span.range.start > span.range.end
169 || span.range.end > length
170 || span.range.start < end
171 || (span.range.is_empty() && (!units.is_empty() || self.formats.len() != 1))
172 {
173 return Err(invalid(
174 "Formatting spans must be nonoverlapping ranges within the new text",
175 ));
176 }
177 for boundary in [span.range.start, span.range.end] {
178 if boundary > 0
179 && boundary < length
180 && (0xd800..=0xdbff).contains(&units[boundary as usize - 1])
181 {
182 return Err(invalid("Formatting boundary splits a surrogate pair"));
183 }
184 }
185 crate::formatting::attribute_values(&span.attributes)?;
186 end = span.range.end;
187 }
188 }
128 Ok(())189 Ok(())
129 }190 }
130191
...@@ -243,6 +304,55 @@ impl Insertion {...@@ -243,6 +304,55 @@ impl Insertion {
243 },304 },
244 );305 );
245 }306 }
307 if !self.formats.is_empty() {
308 let default = ExGuid {
309 guid: self.guid,
310 n: 5,
311 };
312 let mut segments = Vec::new();
313 let mut end = 0;
314 for span in &self.formats {
315 if end < span.range.start {
316 segments.push((span.range.start, default));
317 }
318 let id = ExGuid {
319 guid: span.guid,
320 n: 1,
321 };
322 let mut style = PropertyObject {
323 jcid: 0x12004d,
324 bytes: properties(&default_text_style())?,
325 global_ids: Arc::new(BTreeMap::from([(0, span.guid)])),
326 };
327 let values = crate::formatting::attribute_values(&span.attributes)?;
328 style.set(
329 &values
330 .iter()
331 .map(|(id, value)| (*id, value.as_slice()))
332 .collect::<Vec<_>>(),
333 )?;
334 new.insert(id, style);
335 segments.push((span.range.end, id));
336 end = span.range.end;
337 }
338 let length = u32::try_from(self.text.encode_utf16().count())
339 .map_err(|_| invalid("Text exceeds UTF-16 offset range"))?;
340 if end < length {
341 segments.push((length, default));
342 }
343 if !segments.iter().any(|(_, id)| *id == default) {
344 new.remove(&default);
345 }
346 let target = new.get_mut(&self.text_object()).unwrap();
347 let mut references = Vec::new();
348 let mut ends = Vec::new();
349 for (end, id) in segments {
350 references.extend_from_slice(&target.reference(id)?);
351 ends.extend_from_slice(&end.to_le_bytes());
352 }
353 ends.truncate(ends.len() - 4);
354 target.set(&[(0x24001e13, &references), (0x1c001e12, &ends)])?;
355 }
246 if let Placement::Outline { x, y } = self.placement {356 if let Placement::Outline { x, y } = self.placement {
247 new.insert(357 new.insert(
248 self.object(),358 self.object(),
crates/onestore/tests/insertion.rs+354-4
...@@ -6,7 +6,7 @@ mod current;...@@ -6,7 +6,7 @@ mod current;
6mod disk;6mod disk;
77
8use onestore::{8use onestore::{
9 ExGuid, Insertion, PreparedEdit, RevisionIndex, Store,9 ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, TextAttribute as A,
10 document::{Document, Kind},10 document::{Document, Kind},
11};11};
1212
...@@ -28,6 +28,335 @@ fn targets(source: &[u8]) -> (ExGuid, ExGuid, ExGuid, ExGuid, ExGuid) {...@@ -28,6 +28,335 @@ fn targets(source: &[u8]) -> (ExGuid, ExGuid, ExGuid, ExGuid, ExGuid) {
28 (sid, page, outline, paragraph, text)28 (sid, page, outline, paragraph, text)
29}29}
3030
31#[test]
32fn atomic_formatted_insertions_match_a_character_model_and_preserve_history() {
33 use serde_json::json;
34 let source = onestore::create_section("rich.one", "Original", "Author").unwrap();
35 let (sid, page, outline, _, _) = targets(&source);
36 let text = "ab🦀 e\u{301} 東京\rEnd\t!";
37 let plain = Insertion::paragraph(outline, None, text, "Author").unwrap();
38 assert!(
39 serde_json::to_value(&plain)
40 .unwrap()
41 .get("formats")
42 .is_none()
43 );
44 let restored: Insertion = serde_json::from_slice(&serde_json::to_vec(&plain).unwrap()).unwrap();
45 assert_eq!(plain, restored);
46 let base = PreparedEdit::insert(&source, sid, &plain).unwrap();
47 let base_store = Store::parse(base.as_bytes()).unwrap();
48 let base_index = RevisionIndex::parse(&base_store).unwrap();
49 let base_doc = Document::parse(&base_index).unwrap();
50 let base_space = &base_doc.spaces[&sid];
51 let base_view = &base_space.revisions[&base_space.contexts[&ExGuid::default()]];
52 let default =
53 serde_json::to_value(&base_view.text_runs(plain.text_object()).unwrap()[0].format).unwrap();
54 let offsets: Vec<u32> = std::iter::once(0)
55 .chain(text.chars().scan(0, |n, c| {
56 *n += c.len_utf16() as u32;
57 Some(*n)
58 }))
59 .collect();
60 let old_store = Store::parse(&source).unwrap();
61 let old_index = RevisionIndex::parse(&old_store).unwrap();
62 for seed in 1..=48_u64 {
63 let mut random = seed;
64 let mut expected: Vec<_> = text.chars().map(|c| (c, default.clone())).collect();
65 let mut intent = if seed % 2 == 0 {
66 Insertion::outline(page, 72.0, 144.0, text, "Author").unwrap()
67 } else {
68 plain.clone()
69 };
70 // Descending construction also exercises persisted ordering independently of call order.
71 for i in (0..expected.len()).rev() {
72 random ^= random << 13;
73 random ^= random >> 7;
74 random ^= random << 17;
75 let (attributes, values) = match random % 8 {
76 0 => continue,
77 1 => (
78 vec![A::Bold(true), A::Underline(true)],
79 json!({"bold":true,"underline":true}),
80 ),
81 2 => (
82 vec![A::Italic(true), A::Strike(true)],
83 json!({"italic":true,"strike":true}),
84 ),
85 3 => (
86 vec![A::Font("Arial".into()), A::FontSize(13.5)],
87 json!({"font":"Arial","font_size":13.5}),
88 ),
89 4 => (
90 vec![
91 A::Color(Some([12, 34, 56])),
92 A::Highlight(Some([255, 255, 0])),
93 ],
94 json!({"color":0x38220c,"highlight":0x00ffff}),
95 ),
96 5 => (
97 vec![A::Superscript(true)],
98 json!({"superscript":true,"subscript":false}),
99 ),
100 6 => (
101 vec![A::Subscript(true)],
102 json!({"subscript":true,"superscript":false}),
103 ),
104 _ => (
105 vec![A::Bold(false), A::Color(None), A::Highlight(None)],
106 json!({"bold":false,"color":0xff000000_u32,"highlight":0xff000000_u32}),
107 ),
108 };
109 intent = intent
110 .with_formatting(offsets[i]..offsets[i + 1], &attributes)
111 .unwrap();
112 for (key, value) in values.as_object().unwrap() {
113 expected[i].1[key] = value.clone();
114 }
115 }
116 let restored: Insertion =
117 serde_json::from_slice(&serde_json::to_vec(&intent).unwrap()).unwrap();
118 assert_eq!(restored, intent);
119 let edited = PreparedEdit::insert(&source, sid, &restored).unwrap();
120 let store = Store::parse(edited.as_bytes()).unwrap();
121 assert_eq!(
122 store.header.transaction_count,
123 old_store.header.transaction_count + 1
124 );
125 let index = RevisionIndex::parse(&store).unwrap();
126 index.validate_current().unwrap();
127 assert_eq!(
128 index.spaces[&sid].revisions.len(),
129 old_index.spaces[&sid].revisions.len() + 1
130 );
131 for (space, old) in &old_index.spaces {
132 for revision in old.revisions.keys() {
133 assert_eq!(
134 format!("{:?}", old_index.resolve(*space, *revision).unwrap()),
135 format!("{:?}", index.resolve(*space, *revision).unwrap())
136 );
137 }
138 }
139 let document = Document::parse(&index).unwrap();
140 let space = &document.spaces[&sid];
141 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
142 let actual: Vec<_> = view
143 .text_runs(intent.text_object())
144 .unwrap()
145 .into_iter()
146 .flat_map(|run| {
147 let format = serde_json::to_value(run.format).unwrap();
148 run.text.chars().map(move |c| (c, format.clone()))
149 })
150 .collect();
151 assert_eq!(actual, expected, "seed {seed}");
152 }
153}
154
155#[test]
156fn invalid_or_forged_insertion_formats_fail_before_source_parsing() {
157 use serde_json::json;
158 let source = onestore::create_section("invalid-rich.one", "Original", "Author").unwrap();
159 let (sid, _, outline, _, _) = targets(&source);
160 let plain = Insertion::paragraph(outline, None, "a🦀e\u{301}b", "Author").unwrap();
161 for (start, end) in [(0, 0), (2, 3), (1, 2), (4, 3), (0, 7)] {
162 let range = start..end;
163 assert!(plain.with_formatting(range, &[A::Bold(true)]).is_err());
164 }
165 for attributes in [
166 vec![],
167 vec![A::Bold(true), A::Bold(false)],
168 vec![A::FontSize(f32::NAN)],
169 vec![A::FontSize(5.5)],
170 vec![A::Font("a\0b".into())],
171 vec![A::Superscript(true), A::Subscript(true)],
172 ] {
173 assert!(plain.with_formatting(1..3, &attributes).is_err());
174 }
175 let formatted = plain.with_formatting(1..3, &[A::Bold(true)]).unwrap();
176 for range in [0..3, 1..3, 1..4] {
177 assert!(
178 formatted
179 .with_formatting(range, &[A::Italic(true)])
180 .is_err()
181 );
182 }
183 let encoded = serde_json::to_value(&formatted).unwrap();
184 for mutate in 0..6 {
185 let mut value = encoded.clone();
186 match mutate {
187 0 => value["formats"][0]["guid"] = serde_json::to_value([0; 16]).unwrap(),
188 1 => value["formats"][0]["guid"] = value["guid"].clone(),
189 2 => {
190 let duplicate = value["formats"][0].clone();
191 value["formats"].as_array_mut().unwrap().push(duplicate);
192 }
193 3 => value["formats"][0]["range"] = json!({"start":2,"end":3}),
194 4 => value["formats"][0]["attributes"] = json!([]),
195 _ => value["formats"][0]["range"] = json!({"start":0,"end":u32::MAX}),
196 }
197 let forged: Insertion = serde_json::from_value(value).unwrap();
198 let error = PreparedEdit::insert(&[], sid, &forged).err().unwrap();
199 assert_eq!(
200 error,
201 PreparedEdit::insert(&source, sid, &forged).err().unwrap()
202 );
203 }
204}
205
206#[test]
207fn formatted_empty_insertions_preserve_the_insertion_style_for_later_typing() {
208 let source = onestore::create_section("empty-rich.one", "Original", "Author").unwrap();
209 let (sid, page, outline, _, _) = targets(&source);
210 for plain in [
211 Insertion::outline(page, 72.0, 144.0, "", "Author").unwrap(),
212 Insertion::paragraph(outline, None, "", "Author").unwrap(),
213 ] {
214 let intent = plain
215 .with_formatting(0..0, &[A::Italic(true), A::FontSize(18.0)])
216 .unwrap();
217 assert!(intent.with_formatting(0..0, &[A::Bold(true)]).is_err());
218 let inserted = PreparedEdit::insert(&source, sid, &intent).unwrap();
219 let typed = PreparedEdit::text(
220 inserted.as_bytes(),
221 sid,
222 intent.text_object(),
223 0..0,
224 "Typed 🦀",
225 )
226 .unwrap();
227 for (bytes, text) in [(inserted.as_bytes(), ""), (typed.as_bytes(), "Typed 🦀")] {
228 let store = Store::parse(bytes).unwrap();
229 let index = RevisionIndex::parse(&store).unwrap();
230 index.validate_current().unwrap();
231 let document = Document::parse(&index).unwrap();
232 let space = &document.spaces[&sid];
233 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
234 let runs = view.text_runs(intent.text_object()).unwrap();
235 assert_eq!(runs.len(), 1);
236 assert_eq!(runs[0].text, text);
237 assert_eq!(runs[0].format.italic, Some(true));
238 assert_eq!(runs[0].format.font_size, Some(18.0));
239 }
240 }
241}
242
243#[test]
244#[ignore = "exports formatted insertion candidates for cold native validation"]
245fn export_native_formatted_insertions() {
246 use std::{fs, path::PathBuf};
247 let output = PathBuf::from(std::env::var_os("ONESTORE_INSERT_OUTPUT").unwrap());
248 assert!(output.is_absolute());
249 fs::create_dir(&output).unwrap();
250 let generated = onestore::create_section("rich.one", "Original", "Author").unwrap();
251 let unicode = include_bytes!(
252 "../../../corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one"
253 );
254 let table = include_bytes!(
255 "../../../corpus/native/20260905-05/snapshots/07-table/notebook/synthetic.one"
256 );
257 let text = "Bold 🦀 italic e\u{301} color 東京\rEnd";
258 let mut manifest = Vec::new();
259 for (name, source, empty) in [
260 ("outline", generated.as_slice(), false),
261 ("native-paragraph", unicode.as_slice(), false),
262 ("native-cell", table.as_slice(), false),
263 ("empty", generated.as_slice(), true),
264 ("empty-typed", generated.as_slice(), true),
265 ] {
266 let (sid, page, outline, paragraph, _) = targets(source);
267 let insertion = match name {
268 "native-paragraph" => {
269 Insertion::paragraph(outline, Some(paragraph), text, "Rich author")
270 }
271 "native-cell" => {
272 let store = Store::parse(source).unwrap();
273 let index = RevisionIndex::parse(&store).unwrap();
274 let document = Document::parse(&index).unwrap();
275 let space = &document.spaces[&sid];
276 let view = &space.revisions[&space.contexts[&ExGuid::default()]];
277 let cell = *view
278 .nodes
279 .iter()
280 .find(|(_, node)| matches!(node.kind, Kind::Cell { .. }))
281 .unwrap()
282 .0;
283 Insertion::paragraph(cell, None, text, "Rich author")
284 }
285 _ => Insertion::outline(
286 page,
287 72.0,
288 144.0,
289 if empty { "" } else { text },
290 "Rich author",
291 ),
292 }
293 .unwrap();
294 let mut intent = insertion;
295 if empty {
296 intent = intent
297 .with_formatting(0..0, &[A::Italic(true), A::FontSize(18.0)])
298 .unwrap();
299 } else {
300 for (label, attributes) in [
301 ("Bold", vec![A::Bold(true), A::Underline(true)]),
302 ("🦀", vec![A::Font("Arial".into()), A::FontSize(13.5)]),
303 ("italic", vec![A::Italic(true), A::Strike(true)]),
304 ("e\u{301}", vec![A::Superscript(true)]),
305 (
306 "color",
307 vec![
308 A::Color(Some([12, 34, 56])),
309 A::Highlight(Some([255, 255, 0])),
310 ],
311 ),
312 ("東京", vec![A::Subscript(true)]),
313 (
314 "End",
315 vec![
316 A::Bold(false),
317 A::Italic(false),
318 A::Color(None),
319 A::Highlight(None),
320 ],
321 ),
322 ] {
323 let start = text[..text.find(label).unwrap()].encode_utf16().count() as u32;
324 intent = intent
325 .with_formatting(
326 start..start + label.encode_utf16().count() as u32,
327 &attributes,
328 )
329 .unwrap();
330 }
331 }
332 let inserted = PreparedEdit::insert(source, sid, &intent).unwrap();
333 let bytes = if name == "empty-typed" {
334 PreparedEdit::text(
335 inserted.as_bytes(),
336 sid,
337 intent.text_object(),
338 0..0,
339 "Typed café 🦀",
340 )
341 .unwrap()
342 .as_bytes()
343 .to_vec()
344 } else {
345 inserted.as_bytes().to_vec()
346 };
347 current::current(&bytes);
348 let notebook = output.join(name);
349 fs::create_dir(&notebook).unwrap();
350 fs::write(notebook.join("synthetic.one"), &bytes).unwrap();
351 manifest.push(serde_json::json!({"name":name,"space":sid,"intent":intent}));
352 }
353 fs::write(
354 output.join("manifest.json"),
355 serde_json::to_vec_pretty(&manifest).unwrap(),
356 )
357 .unwrap();
358}
359
31#[test]360#[test]
32fn paragraph_and_outline_insertions_publish_metadata_and_references_together() {361fn paragraph_and_outline_insertions_publish_metadata_and_references_together() {
33 let source = onestore::create_section("insertion.one", "Original", "Original author").unwrap();362 let source = onestore::create_section("insertion.one", "Original", "Original author").unwrap();
...@@ -165,11 +494,15 @@ fn repeated_insertions_and_formatting_share_immutable_objects() {...@@ -165,11 +494,15 @@ fn repeated_insertions_and_formatting_share_immutable_objects() {
165fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits() {494fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits() {
166 let source = onestore::create_section("rebase.one", "Original", "Author").unwrap();495 let source = onestore::create_section("rebase.one", "Original", "Author").unwrap();
167 let (sid, _, outline, paragraph, text) = targets(&source);496 let (sid, _, outline, paragraph, text) = targets(&source);
168 let intent = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author").unwrap();497 let intent = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author")
498 .unwrap()
499 .with_formatting(0..3, &[A::Bold(true), A::Color(Some([12, 34, 56]))])
500 .unwrap();
169 let encoded = serde_json::to_vec(&intent).unwrap();501 let encoded = serde_json::to_vec(&intent).unwrap();
170 let restored: Insertion = serde_json::from_slice(&encoded).unwrap();502 let restored: Insertion = serde_json::from_slice(&encoded).unwrap();
171 assert_eq!(intent.object(), restored.object());503 assert_eq!(intent.object(), restored.object());
172 assert_eq!(intent.text_object(), restored.text_object());504 assert_eq!(intent.text_object(), restored.text_object());
505 assert_eq!(intent, restored);
173 let original_preparation = PreparedEdit::insert(&source, sid, &intent).unwrap();506 let original_preparation = PreparedEdit::insert(&source, sid, &intent).unwrap();
174 let remote = PreparedEdit::text(&source, sid, text, 0..0, "Remote ").unwrap();507 let remote = PreparedEdit::text(&source, sid, text, 0..0, "Remote ").unwrap();
175 let updated = PreparedEdit::insert(remote.as_bytes(), sid, &restored).unwrap();508 let updated = PreparedEdit::insert(remote.as_bytes(), sid, &restored).unwrap();
...@@ -188,6 +521,12 @@ fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits(...@@ -188,6 +521,12 @@ fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits(
188 assert!(521 assert!(
189 matches!(&view.nodes[&restored.text_object()].kind, Kind::RichText { text, .. } if text == "Inserted")522 matches!(&view.nodes[&restored.text_object()].kind, Kind::RichText { text, .. } if text == "Inserted")
190 );523 );
524 let runs = view.text_runs(restored.text_object()).unwrap();
525 assert_eq!(runs[0].text, "Ins");
526 assert_eq!(runs[0].format.bold, Some(true));
527 assert_eq!(runs[0].format.color, Some(0x38220c));
528 assert_eq!(runs[1].text, "erted");
529 assert_ne!(runs[1].format.bold, Some(true));
191 assert!(PreparedEdit::insert(original_preparation.as_bytes(), sid, &restored).is_err());530 assert!(PreparedEdit::insert(original_preparation.as_bytes(), sid, &restored).is_err());
192 assert!(PreparedEdit::insert(updated.as_bytes(), sid, &restored).is_err());531 assert!(PreparedEdit::insert(updated.as_bytes(), sid, &restored).is_err());
193}532}
...@@ -196,8 +535,14 @@ fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits(...@@ -196,8 +535,14 @@ fn serialized_insertions_rebase_with_the_same_objects_and_preserve_remote_edits(
196fn repositioning_preserves_intent_identity_and_kind() {535fn repositioning_preserves_intent_identity_and_kind() {
197 let source = onestore::create_section("placement.one", "Original", "Author").unwrap();536 let source = onestore::create_section("placement.one", "Original", "Author").unwrap();
198 let (sid, page, outline, paragraph, _) = targets(&source);537 let (sid, page, outline, paragraph, _) = targets(&source);
199 let p = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author").unwrap();538 let p = Insertion::paragraph(outline, Some(paragraph), "Inserted", "Author")
200 let o = Insertion::outline(page, 144.0, 144.0, "Inserted", "Author").unwrap();539 .unwrap()
540 .with_formatting(1..4, &[A::Italic(true)])
541 .unwrap();
542 let o = Insertion::outline(page, 144.0, 144.0, "Inserted", "Author")
543 .unwrap()
544 .with_formatting(0..8, &[A::FontSize(18.0)])
545 .unwrap();
201 assert!(p.reposition_outline(page, 72.0, 72.0).is_err());546 assert!(p.reposition_outline(page, 72.0, 72.0).is_err());
202 assert!(o.reposition_paragraph(outline, None).is_err());547 assert!(o.reposition_paragraph(outline, None).is_err());
203 assert!(p.reposition_paragraph(ExGuid::default(), None).is_err());548 assert!(p.reposition_paragraph(ExGuid::default(), None).is_err());
...@@ -344,6 +689,11 @@ fn insertion_publication_faults_expose_only_complete_graphs_and_title_caches() {...@@ -344,6 +689,11 @@ fn insertion_publication_faults_expose_only_complete_graphs_and_title_caches() {
344 Insertion::paragraph(outline, Some(paragraph), "First 🦀", "New author").unwrap(),689 Insertion::paragraph(outline, Some(paragraph), "First 🦀", "New author").unwrap(),
345 Insertion::outline(page, 0.0, 0.0, "First 🦀", "New author").unwrap(),690 Insertion::outline(page, 0.0, 0.0, "First 🦀", "New author").unwrap(),
346 ] {691 ] {
692 let intent = intent
693 .with_formatting(0..3, &[A::Bold(true), A::FontSize(18.0)])
694 .unwrap()
695 .with_formatting(6..8, &[A::Italic(true), A::Highlight(Some([255, 255, 0]))])
696 .unwrap();
347 let edit = PreparedEdit::insert(source, sid, &intent).unwrap();697 let edit = PreparedEdit::insert(source, sid, &intent).unwrap();
348 let before = current::current(source);698 let before = current::current(source);
349 let after = current::current(edit.as_bytes());699 let after = current::current(edit.as_bytes());
fuzz/Cargo.toml+7
...@@ -77,3 +77,10 @@ path = "fuzz_targets/edit_text.rs"...@@ -77,3 +77,10 @@ path = "fuzz_targets/edit_text.rs"
77test = false77test = false
78doc = false78doc = false
79bench = false79bench = false
80
81[[bin]]
82name = "insert"
83path = "fuzz_targets/insert.rs"
84test = false
85doc = false
86bench = false
fuzz/fuzz_targets/insert.rs created+135
...@@ -0,0 +1,135 @@
1#![no_main]
2use libfuzzer_sys::fuzz_target;
3use onestore::{
4 CommitState, ExGuid, Insertion, PreparedEdit, RevisionIndex, Store, TextAttribute as A,
5 document::{Document, Kind},
6};
7use std::sync::LazyLock;
8
9#[path = "../../crates/onestore/tests/support/current.rs"]
10mod current;
11#[path = "../../crates/onestore/tests/support/disk.rs"]
12mod disk;
13
14static SOURCE: LazyLock<(Vec<u8>, ExGuid, ExGuid, ExGuid)> = LazyLock::new(|| {
15 let bytes = include_bytes!(
16 "../../corpus/native/20260905-05/snapshots/03-format-unicode/notebook/synthetic.one"
17 )
18 .to_vec();
19 let store = Store::parse(&bytes).unwrap();
20 let index = RevisionIndex::parse(&store).unwrap();
21 let document = Document::parse(&index).unwrap();
22 let (space, page) = document.pages().unwrap()[0];
23 let s = &document.spaces[&space];
24 let view = &s.revisions[&s.contexts[&ExGuid::default()]];
25 let outline = *view.nodes[&page]
26 .children
27 .iter()
28 .find(|id| matches!(view.nodes[id].kind, Kind::Outline { .. }))
29 .unwrap();
30 (bytes, space, page, outline)
31});
32
33fuzz_target!(|input: &[u8]| {
34 let (source, space, page, outline) = &*SOURCE;
35 if let Ok(intent) = serde_json::from_slice::<Insertion>(input)
36 && let Ok(prepared) = PreparedEdit::insert(source, *space, &intent)
37 {
38 current::current(prepared.as_bytes());
39 }
40 let mut persisted = source.clone();
41 let mut caches = std::array::from_fn::<_, 12, _>(|_| source.clone());
42 for step in input.chunks_exact(8).take(12) {
43 let actor = usize::from(step[0]) % caches.len();
44 if step[1] % 4 == 0 {
45 caches[actor].clone_from(&persisted);
46 }
47 let source = &caches[actor];
48 let text =
49 ["", "ab", "🦀e\u{301}東京\rEnd", "same style same style"][usize::from(step[2]) % 4];
50 let offsets: Vec<u32> = std::iter::once(0)
51 .chain(text.chars().scan(0, |n, c| {
52 *n += c.len_utf16() as u32;
53 Some(*n)
54 }))
55 .collect();
56 let first = usize::from(step[3]) % offsets.len();
57 let second = usize::from(step[4]) % offsets.len();
58 let (start, end) = (first.min(second), first.max(second));
59 let plain = if step[1] & 1 == 0 {
60 Insertion::paragraph(*outline, None, text, "Insertion fuzz").unwrap()
61 } else {
62 Insertion::outline(*page, 72.0, 144.0, text, "Insertion fuzz").unwrap()
63 };
64 let enabled = step[5] & 1 != 0;
65 let intent = if start != end || text.is_empty() {
66 plain
67 .with_formatting(
68 offsets[start]..offsets[end],
69 &[A::Bold(enabled), A::FontSize(18.0)],
70 )
71 .unwrap()
72 } else {
73 plain
74 };
75 let encoded = serde_json::to_vec(&intent).unwrap();
76 let intent: Insertion = serde_json::from_slice(&encoded).unwrap();
77 let edit = PreparedEdit::insert(source, *space, &intent).unwrap();
78 let store = Store::parse(edit.as_bytes()).unwrap();
79 let index = RevisionIndex::parse(&store).unwrap();
80 let document = Document::parse(&index).unwrap();
81 let s = &document.spaces[space];
82 let view = &s.revisions[&s.contexts[&ExGuid::default()]];
83 let actual: Vec<_> = view
84 .text_runs(intent.text_object())
85 .unwrap()
86 .into_iter()
87 .flat_map(|run| {
88 run.text.chars().map(move |c| {
89 (
90 c,
91 run.format.bold.unwrap_or(false),
92 run.format.font_size.unwrap(),
93 )
94 })
95 })
96 .collect();
97 let expected: Vec<_> = text
98 .chars()
99 .enumerate()
100 .map(|(i, c)| {
101 if (start..end).contains(&i) {
102 (c, enabled, 18.0)
103 } else {
104 (c, false, 11.0)
105 }
106 })
107 .collect();
108 assert_eq!(actual, expected);
109 let before = current::current(&persisted);
110 let after = current::current(edit.as_bytes());
111 let mut disk = disk::Disk {
112 visible: persisted.clone(),
113 durable: persisted.clone(),
114 operation: 0,
115 fail_at: (step[6] != 0).then_some(usize::from(step[6])),
116 write_limit: if step[7] & 1 == 0 { 17 } else { 4096 },
117 random: u64::from(step[7]) + 1,
118 };
119 let result = edit.commit(&mut disk);
120 let observed = current::current(&disk.durable);
121 match result {
122 Ok(()) => assert_eq!(observed, after),
123 Err(error) => {
124 assert!(observed == before || observed == after);
125 if error.state == CommitState::NotCommitted {
126 assert_eq!(observed, before);
127 }
128 if error.state == CommitState::Committed {
129 assert_eq!(observed, after);
130 }
131 }
132 }
133 persisted = disk.durable;
134 }
135});
tools/native/formatted-insertion.ps1 created+53
...@@ -0,0 +1,53 @@
1param([Parameter(Mandatory=$true)][string]$Root, [string]$CloneHost = '')
2Set-StrictMode -Version Latest
3$ErrorActionPreference = 'Stop'
4& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost
5$app = New-Object -ComObject OneNote.Application
6$notebook = ''
7try {
8 $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0)
9 $section = ''
10 $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0)
11 $deadline = [DateTime]::UtcNow.AddSeconds(60)
12 do {
13 $hierarchy = ''
14 $app.GetHierarchy($section, 4, [ref]$hierarchy, 1)
15 [xml]$tree = $hierarchy
16 $pages = @($tree.SelectNodes('//*[local-name()="Page"]'))
17 if ($pages.Count -eq 1) { break }
18 Start-Sleep -Milliseconds 250
19 } while ([DateTime]::UtcNow -lt $deadline)
20 if ($pages.Count -ne 1) { throw 'Expected one fixture page.' }
21 $pageId = $pages[0].GetAttribute('ID')
22 foreach ($phase in @('control', 'edit')) {
23 $content = ''
24 $app.GetPageContent($pageId, [ref]$content, 1, 1)
25 [IO.File]::WriteAllText((Join-Path $Root ($phase + '-before.xml')), $content, [Text.Encoding]::UTF8)
26 [xml]$page = $content
27 $matches = @($page.SelectNodes('//*[local-name()="T"]') | Where-Object {
28 $plain = [regex]::Replace($_.InnerText, '<[^>]*>', '')
29 $plain.StartsWith('Bold ') -or $plain.StartsWith('Typed ')
30 })
31 if ($matches.Count -ne 1) { throw 'Expected one inserted rich paragraph.' }
32 $target = $matches[0]
33 if ($phase -eq 'edit') { $target.InnerText = $target.InnerText.Replace('Bold', 'Native Bold').Replace('Typed', 'Native Typed') }
34 $outline = $target
35 while ($outline.LocalName -ne 'Outline') { $outline = $outline.ParentNode }
36 $update = '<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="' + $pageId + '">'
37 foreach ($style in $page.SelectNodes('/*/*[local-name()="QuickStyleDef"]')) { $update += $style.OuterXml }
38 if ($outline.SelectSingleNode('.//*[local-name()="Table"]')) {
39 # Resubmitting measured outline size constrains native table auto-fit.
40 foreach ($size in @($outline.SelectNodes('*[local-name()="Size"]'))) { [void]$outline.RemoveChild($size) }
41 }
42 $update += $outline.OuterXml + '</one:Page>'
43 [IO.File]::WriteAllText((Join-Path $Root ($phase + '-update.xml')), $update, [Text.Encoding]::UTF8)
44 $app.UpdatePageContent($update, [DateTime]::MinValue, 1, $false)
45 }
46 $app.SyncHierarchy($notebook)
47} finally {
48 if ($notebook) { $app.CloseNotebook($notebook, $false) }
49 [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app)
50 $app = $null
51 [GC]::Collect()
52 [GC]::WaitForPendingFinalizers()
53}
tools/native/read.ps1+4-1
...@@ -40,6 +40,7 @@ try {...@@ -40,6 +40,7 @@ try {
40 }40 }
41 $deadline = [DateTime]::UtcNow.AddSeconds(300)41 $deadline = [DateTime]::UtcNow.AddSeconds(300)
42 $previous = ''42 $previous = ''
43 $lastChange = ''
43 $stableSince = [DateTime]::UtcNow44 $stableSince = [DateTime]::UtcNow
44 $settled = $false45 $settled = $false
45 do {46 do {
...@@ -62,6 +63,7 @@ try {...@@ -62,6 +63,7 @@ try {
62 }63 }
63 $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] }))64 $signature = [String]::Join('|', @($pages.Keys | Sort-Object | ForEach-Object { $_ + $pages[$_] }))
64 if ($signature -ne $previous) {65 if ($signature -ne $previous) {
66 $lastChange = $previous
65 $previous = $signature67 $previous = $signature
66 $stableSince = [DateTime]::UtcNow68 $stableSince = [DateTime]::UtcNow
67 }69 }
...@@ -71,6 +73,7 @@ try {...@@ -71,6 +73,7 @@ try {
71 Start-Sleep -Milliseconds 25073 Start-Sleep -Milliseconds 250
72 } while ([DateTime]::UtcNow -lt $deadline)74 } while ([DateTime]::UtcNow -lt $deadline)
73 if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) {75 if (-not $settled -or ($ExpectedPages -ge 0 -and $pages.Count -ne $ExpectedPages) -or ($ExpectedPages -lt 0 -and $pages.Count -eq 0)) {
76 [IO.File]::WriteAllText((Join-Path $output 'previous-signature.txt'), $lastChange, [Text.Encoding]::UTF8)
74 $index = 077 $index = 0
75 foreach ($id in @($pages.Keys | Sort-Object)) {78 foreach ($id in @($pages.Keys | Sort-Object)) {
76 [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8)79 [IO.File]::WriteAllText((Join-Path $output ('unsettled-{0:d3}.xml' -f $index)), $pages[$id], [Text.Encoding]::UTF8)
...@@ -79,7 +82,7 @@ try {...@@ -79,7 +82,7 @@ try {
79 $hierarchy = ''82 $hierarchy = ''
80 $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1)83 $app.GetHierarchy($notebookId, 4, [ref]$hierarchy, 1)
81 [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8)84 [IO.File]::WriteAllText((Join-Path $output 'unsettled-hierarchy.xml'), $hierarchy, [Text.Encoding]::UTF8)
82 throw "Expected $ExpectedPages pages; OneNote returned $($pages.Count)."85 throw "Expected $ExpectedPages stable pages; OneNote returned $($pages.Count), settled=$settled."
83 }86 }
84 $index = 087 $index = 0
85 $payloads = @()88 $payloads = @()
tools/offline_document_history.py+6-1
...@@ -80,6 +80,11 @@ def document_history(logs, operations):...@@ -80,6 +80,11 @@ def document_history(logs, operations):
80 assert formatted['range'] == [1, len(text.encode('utf-16-le')) // 2 - 2]80 assert formatted['range'] == [1, len(text.encode('utf-16-le')) // 2 - 2]
81 assert formatted['attributes'] == [{'Bold': True}, {'FontSize': 18 + number % 9}, {'Color': [18, 52, 86]}]81 assert formatted['attributes'] == [{'Bold': True}, {'FontSize': 18 + number % 9}, {'Color': [18, 52, 86]}]
82 old = [(char, False, 11, 0xff000000) for char in text]82 old = [(char, False, 11, 0xff000000) for char in text]
83 if insertion.get('formats'):
84 span, = insertion['formats']
85 assert span['range'] == {'start': 0, 'end': len(text.encode('utf-16-le')) // 2}, 'Initial formatting range differs from workload'
86 assert span['attributes'] == [{'FontSize': 13.5}, {'Color': [68, 85, 102]}], 'Initial formatting attributes differ from workload'
87 old = [(char, False, 13.5, 0x665544) for char in text]
83 new = [(char, True, 18 + number % 9, 0x563412) if 0 < i < len(text)-1 else old[i] for i, char in enumerate(text)]88 new = [(char, True, 18 + number % 9, 0x563412) if 0 < i < len(text)-1 else old[i] for i, char in enumerate(text)]
84 assert target not in documents, 'Two insertion intents share an object identity'89 assert target not in documents, 'Two insertion intents share an object identity'
85 created, changed = linked[inserted['id']], linked[formatted['id']]90 created, changed = linked[inserted['id']], linked[formatted['id']]
...@@ -158,6 +163,6 @@ def verify_native(paragraphs, documents):...@@ -158,6 +163,6 @@ def verify_native(paragraphs, documents):
158 if color == 0xff000000:163 if color == 0xff000000:
159 assert native_color in ('automatic', None), 'Native automatic color changed'164 assert native_color in ('automatic', None), 'Native automatic color changed'
160 else:165 else:
161 assert ImageColor.getrgb(native_color) == (18, 52, 86), 'Native color differs from intent'166 assert ImageColor.getrgb(native_color) == (color & 255, (color >> 8) & 255, (color >> 16) & 255), 'Native color differs from intent'
162 checks += 3167 checks += 3
163 return checks168 return checks
tools/test_formatted_insertion.py created+57
...@@ -0,0 +1,57 @@
1import json
2from pathlib import Path
3import runpy
4import shutil
5from tempfile import TemporaryDirectory
6import unittest
7import xml.etree.ElementTree as ET
8
9from native_format import native_characters
10from native_xml import ns
11
12ROOT = Path(__file__).resolve().parent.parent
13FIXTURE = ROOT / 'corpus/formatted-insertion'
14compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare']
15
16
17class FormattedInsertionTest(unittest.TestCase):
18 def test_cold_native_content_and_formatting(self):
19 manifest = json.loads((FIXTURE / 'manifest.json').read_text())
20 for case in manifest['cases']:
21 with self.subTest(case=case['name']), TemporaryDirectory() as temporary:
22 fixture = FIXTURE / case['name']
23 native = Path(temporary) / 'read'
24 shutil.copytree(fixture / 'cold/read', native)
25 compare(fixture / 'candidate', native)
26 with TemporaryDirectory() as temporary:
27 fixture = FIXTURE / 'empty/typed-after-cold'
28 native = Path(temporary) / 'read'
29 shutil.copytree(fixture / 'read', native)
30 compare(fixture / 'candidate', native)
31
32 def test_native_edits_preserve_the_observed_character_styles(self):
33 manifest = json.loads((FIXTURE / 'manifest.json').read_text())
34 for case in manifest['cases']:
35 for variant, before_file, prefix in [('reverse', 'edit-before.xml', 'Native '),
36 ('ui', 'before-read/page-000.xml', 'UI ')]:
37 if variant + '_sha256' not in case:
38 continue
39 with self.subTest(case=case['name'], variant=variant), TemporaryDirectory() as temporary:
40 fixture = FIXTURE / case['name'] / variant
41 native = Path(temporary) / 'read'
42 shutil.copytree(fixture / 'read', native)
43 compare(fixture / 'notebook', native)
44 before = ET.parse(fixture / before_file).getroot()
45 after = ET.parse(native / 'page-000.xml').getroot()
46 expected = native_characters(before, before.findall('one:Outline', ns))
47 changed = 0
48 for index, paragraph in enumerate(expected):
49 if ''.join(char for char, _ in paragraph).startswith(('Bold ', 'Typed ')):
50 expected[index] = [(char, paragraph[0][1]) for char in prefix] + paragraph
51 changed += 1
52 self.assertEqual(changed, 1)
53 self.assertEqual(native_characters(after, after.findall('one:Outline', ns)), expected)
54
55
56if __name__ == '__main__':
57 unittest.main()
tools/test_offline_document_history.py+28
...@@ -60,6 +60,34 @@ class DocumentHistoryTests(unittest.TestCase):...@@ -60,6 +60,34 @@ class DocumentHistoryTests(unittest.TestCase):
60 events.remove(next(row for row in events if row['event'] == name))60 events.remove(next(row for row in events if row['event'] == name))
61 with self.subTest(event=name), self.assertRaises(AssertionError): document_history(logs, 2)61 with self.subTest(event=name), self.assertRaises(AssertionError): document_history(logs, 2)
6262
63 def test_formatted_insertions_are_atomic_in_every_observed_snapshot(self):
64 for events in self.logs.values():
65 for row in events:
66 insertion = row.get('insertion')
67 if insertion:
68 insertion['formats'] = [{'guid': list(uuid.uuid4().bytes_le),
69 'range': {'start': 0, 'end': len(insertion['text'].encode('utf-16-le')) // 2},
70 'attributes': [{'FontSize': 13.5}, {'Color': [68, 85, 102]}]}]
71 for key in ('documents', 'document_changes'):
72 for document in (row.get(key) or {}).values():
73 for run in document['runs']:
74 if run['size'] == 11:
75 run['size'] = 13.5
76 run['color'] = 0x665544
77 documents = document_history(self.logs, 2)
78 paragraphs = [[(char, {'bold': bold, 'font_size': size,
79 'color': '#123456' if color == 0x563412 else '#445566'})
80 for char, bold, size, color in row['new']] for row in documents.values()]
81 self.assertEqual(verify_native(paragraphs, documents), sum(len(row['new'])*3 for row in documents.values()))
82 baseline = copy.deepcopy(self.logs)
83 for event, key in [('remote_attempt', 'document_changes'), ('read', 'documents')]:
84 for field, value in [('size', 11), ('color', 0xff000000)]:
85 logs = copy.deepcopy(baseline)
86 row = next(row for row in logs['w0'] if row['event'] == event)
87 next(iter(row[key].values()))['runs'][0][field] = value
88 with self.subTest(event=event, field=field), self.assertRaises(AssertionError):
89 document_history(logs, 2)
90
63 def test_retired_format_receipt_requires_current_revision_and_exact_observed_effect(self):91 def test_retired_format_receipt_requires_current_revision_and_exact_observed_effect(self):
64 events = self.logs['w0']92 events = self.logs['w0']
65 attempt = next(row for row in events if row['event'] == 'remote_attempt' and row['revision'] == 'revision-3')93 attempt = next(row for row in events if row['event'] == 'remote_attempt' and row['revision'] == 'revision-3')