diff --git a/.gitignore b/.gitignore index 47686d6..1d58dfc 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,9 @@ dist-demo dist-ssr test-results playwright-report +# Generated benchmark reports and local archives +/docs/benchmarks/ +/benchmark-results/ *.local # Editor directories and files diff --git a/CLAUDE.md b/CLAUDE.md index 9a13b52..5d06a69 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -8,7 +8,7 @@ ## WASM Files When updating docxodus: -1. Install the explicitly targeted engine version; this integration pins `docxodus@12.6.1` and optional `@docxodus/export@12.6.1`. +1. Install the explicitly targeted engine version; this integration pins `docxodus@12.6.2` and optional `@docxodus/export@12.6.2`. 2. Update matching pins and run `npm run sync:wasm`. Never patch the digest-verified runtime files. 3. Run `npm run check`, `npm run test:browser`, and the eligible-host PDF test. 4. Keep the complete API audit passing; React UI imports `docxodus/core`, not the upstream editor or `docxodus/react`. diff --git a/README.md b/README.md index b65275a..9d88cca 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # react-docxodus-viewer React components and hooks for viewing, editing, reviewing, comparing, verifying, -and exporting Word documents with **Docxodus 12.6.1**. The viewer uses the core +and exporting Word documents with **Docxodus 12.6.2**. The viewer uses the core engine and a React-owned pagination component; it does not load the upstream browser editor or ribbon. @@ -14,7 +14,7 @@ browser editor or ribbon. Requires React 18+ and an ESM-capable application bundler. ```sh -npm install react-docxodus-viewer docxodus@12.6.1 +npm install react-docxodus-viewer docxodus@12.6.2 npx rdv-copy-runtime public/docxodus ``` @@ -159,7 +159,7 @@ continue to style the viewer controls and panels. - `/export-browser`: complete upstream browser export contracts/helpers. Keep the materializer bundle static; use `loadBrowserExporter()` for actual bundled apps. - `/server`: complete `@docxodus/export` Node/PDF API. Install the optional companion - with `npm install @docxodus/export@12.6.1`. + with `npm install @docxodus/export@12.6.2`. - `/assets`: Node build helper `copyDocxodusRuntime(directory)`. - `/styles.css`: viewer, editor, and feature-panel styles. @@ -192,7 +192,7 @@ for each opened file. Downloads retain the document name. npm install npm run dev # sync verified assets, then start Vite npm run check # lint, unit tests, types, library/demo builds, API audit -npm run test:browser # actual 12.6.1 WASM workflows +npm run test:browser # actual 12.6.2 WASM workflows npm run test:performance # NVCA opening, zoom, typing and layout benchmark npm run test:stress # NVCA editing and independent DOCX integrity checks npm run test:package # packed consumer imports, types and runtime-copy command @@ -203,7 +203,7 @@ Set `DOCXODUS_REQUIRE_PDF=1` to make an unavailable PDF environment fail that te Set `RDV_TEST_PORT` to run browser checks on a different local port. Use `RDV_TEST_PREVIEW=1` after building to exercise the production demo. This runs the studio and module examples; source-only API harness tests remain development checks. -The API audit compares every published export against the installed 12.6.1 +The API audit compares every published export against the installed 12.6.2 TypeScript declarations and checks identity of the built runtime exports. See the [performance campaign](docs/performance.md) for measurements, regression guards, and the next optimization targets. diff --git a/WASM_CDN_ISSUES.md b/WASM_CDN_ISSUES.md index 06a5f1c..65db0d9 100644 --- a/WASM_CDN_ISSUES.md +++ b/WASM_CDN_ISSUES.md @@ -1,13 +1,13 @@ -# Docxodus 12.6.1 runtime deployment +# Docxodus 12.6.2 runtime deployment Deploy runtime files from the same package version as the JavaScript engine. The -React package pins 12.6.1; earlier .NET 8 assets cannot be mixed with its .NET 10 +React package pins 12.6.2; earlier .NET 8 assets cannot be mixed with its .NET 10 runtime. This document supersedes the older 3.x CDN workarounds. ## Copy verified static assets ```sh -npm install docxodus@12.6.1 +npm install docxodus@12.6.2 npx rdv-copy-runtime public/docxodus ``` @@ -42,7 +42,7 @@ available for custom hosting layouts. ## Export bundles must remain byte-identical -The 12.6.1 browser materializer fetches its own module and verifies its length and +The 12.6.2 browser materializer fetches its own module and verifies its length and SHA-256 against `export-assets.json`. Rebundling, minifying, rewriting imports or appending a source-map comment changes those bytes and causes an explicit runtime verification failure. Runtime WASM and worker files are also verified. @@ -94,7 +94,7 @@ Check the actual response headers, requested URLs and matching package version. ## Node/PDF export -Install `@docxodus/export@12.6.1` and import `/server` only in Node. The companion +Install `@docxodus/export@12.6.2` and import `/server` only in Node. The companion owns its runtime deployment and browser materialization pipeline. It requires a non-root host with Chromium's sandbox and, on Linux, permitted user namespaces. `checkExportEnvironment()` reports deployment findings without rendering a file. diff --git a/demo/App.tsx b/demo/App.tsx index 35636bc..103d22f 100644 --- a/demo/App.tsx +++ b/demo/App.tsx @@ -13,7 +13,7 @@ import '../src/styles/DocumentViewer.css'; import './App.css'; const WASM_BASE_PATH = import.meta.env.BASE_URL + 'wasm/'; -const FINGERPRINT = 'react-studio-v12.6.1'; +const FINGERPRINT = 'react-studio-v12.6.2'; const snapshotBytes = (session: DocxSession) => session.save(); const docxMime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; type Panel = 'edit' | 'review' | 'comments' | 'annotations' | 'history' | 'verify' | 'export'; @@ -136,7 +136,7 @@ function Workspace() { }}>

DOCXODUS / {tab === 'document' ? 'WORKSPACE' : tab === 'compare' ? 'COMPARE' : 'ANNOTATIONS'}

{tab === 'document' ? (ready ? filename.replace(/\.docx$/i, '') : 'A little space to think.') : tab === 'compare' ? 'Every difference, in context.' : 'Give your document meaning.'}

diff --git a/docs/12.6.1-upgrade.md b/docs/12.6.1-upgrade.md index 34829f9..43d5883 100644 --- a/docs/12.6.1-upgrade.md +++ b/docs/12.6.1-upgrade.md @@ -1,5 +1,8 @@ # Docxodus 12.6.1 integration +Historical notes for 12.6.1. The current integration uses +[12.6.2 and its leading-tab insertion fix](12.6.2-upgrade.md). + The browser engine and optional `@docxodus/export` companion are pinned to 12.6.1. Reinstall dependencies and copy the matching runtime with `npx rdv-copy-runtime public/docxodus` (or `npm run sync:wasm` in this repository). diff --git a/docs/12.6.2-upgrade.md b/docs/12.6.2-upgrade.md new file mode 100644 index 0000000..6845453 --- /dev/null +++ b/docs/12.6.2-upgrade.md @@ -0,0 +1,51 @@ +# Docxodus 12.6.2 integration + +The browser engine and optional `@docxodus/export` companion are pinned to +12.6.2. Reinstall dependencies and copy the matching runtime with +`npx rdv-copy-runtime public/docxodus` (or `npm run sync:wasm` in this repository). +Runtime files are copied from npm and digest-verified without modification. + +## Formatted typing after leading tabs + +[Upstream #802](https://github.com/JSv4/Docxodus/issues/802) is resolved in +12.6.2 by [PR #803](https://github.com/JSv4/Docxodus/pull/803). The supported +`session.replaceMatch(match, text, format)` operation now accepts interior +insertion in a text run with optional leading tabs. The existing integration +already attempts this operation; the NVCA footnote case can now use its atomic +undo/version unit without the outer package transaction and receipt hash. + +The native split keeps leading tabs ahead of the original prefix text. Tabs +after text, other mixed run content, fields, inline containers, and positions +inside UTF-16 surrogate pairs remain excluded. The existing fallback remains +available when the native operation refuses a pure insertion without changing +the version. No native runtime or private API is patched. + +Browser regression cases cover one and two leading tabs, exact typed formatting, +surrounding runs, marker positions, and one-step undo/redo. The native NVCA +reproduction requires the leading-tab insertion to succeed and verifies text, +formatting, tab/reference positions, one version, and namespace-aware XML +restoration through undo. It fails if that case falls back to the expensive batch. + +## Rendering and API compatibility + +The live session, changed-block renderer, conservative metadata caches, and +cooperative pagination remain in use. Published upstream APIs remain exposed. +The pagination source is unchanged from 12.6.1 (SHA-256 +`2b67cf77f5383db0871647e8c40ca367e1c79cfb3f996120edbf6d7c707e31c0`), and the +native page-map contract is unchanged. The generated adapter is checked against +the installed source and compared with native pagination on the NVCA fixture. + +The isolated NVCA footnote insertion takes 29.5–32.7 ms, versus the previous +600.2–621.9 ms fallback. Its production interior-typing phase improves from +816 ms to 32 ms in the final run. Follow-up browser traces also identified +blocking incoming-document setup and full anchor scans during editing. Incoming +preparation now yields to input and uses observed layout readiness; canvas +anchors reuse native formatting reads with conservative alias invalidation. + +All five final production NVCA runs pass the 150 ms input-response gate across +all nine phases, with a 144 ms observed maximum. The earlier failed runs remain +in the record; the exact cause of two original 184 ms delays is unproven. +See [performance measurements](performance.md) for the complete history, +validation, and limits, including background layout and unmeasured workloads. +The previous [12.6.1 notes](12.6.1-upgrade.md) remain as historical context for +the leading-tab limitation. diff --git a/docs/API.md b/docs/API.md index 73474d7..d18714a 100644 --- a/docs/API.md +++ b/docs/API.md @@ -292,7 +292,7 @@ Render errors retain structured diagnostics and any failed render report. That callback is host-owned; the browser package never imports Node PDF tooling. ```ts -// Node ESM: install @docxodus/export@12.6.1 +// Node ESM: install @docxodus/export@12.6.2 import { checkExportEnvironment, convertDocxToPdf, renderDocxArtifacts, renderDocxFile } from 'react-docxodus-viewer/server'; const environment = await checkExportEnvironment(); diff --git a/docs/benchmarks/2026-09-13-latency.json b/docs/benchmarks/2026-09-13-latency.json deleted file mode 100644 index ac4c20d..0000000 --- a/docs/benchmarks/2026-09-13-latency.json +++ /dev/null @@ -1,1522 +0,0 @@ -{ - "date": "2026-09-13", - "machine": "Intel Core Ultra 7 258V; 8 logical CPUs; Linux x64", - "browser": "Chromium 143.0.7499.4", - "viewport": [ - 1480, - 1050 - ], - "cpuThrottling": false, - "runs": [ - { - "mode": "module", - "profile": true, - "build": "77d1441", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 8.650000005960464, - "p95": 15.605000004172325, - "max": 17.00499999523163 - }, - "eventTiming": { - "n": 84, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 158, - "lastEditToCurrentLayout": 1714.0600000023842 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 8.859999999403954, - "p95": 12.409999996423721, - "max": 16.21500000357628 - }, - "eventTiming": { - "n": 26, - "p50": 16, - "p95": 16, - "max": 24 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.600000008940697, - "p95": 16.66499999165535, - "max": 16.91500000655651 - }, - "eventTiming": { - "n": 55, - "p50": 16, - "p95": 40, - "max": 56 - }, - "longestTask": 85, - "lastEditToCurrentLayout": 513.9800000041723 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 66.92499999701977, - "p95": 66.92499999701977, - "max": 68.13500000536442 - }, - "eventTiming": { - "n": 3, - "p50": 72, - "p95": 72, - "max": 72 - }, - "longestTask": 65, - "lastEditToCurrentLayout": 183.87999999523163 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 7.8900000005960464, - "p95": 14.844999998807907, - "max": 15.530000001192093 - }, - "eventTiming": { - "n": 25, - "p50": 16, - "p95": 24, - "max": 32 - }, - "longestTask": 160, - "lastEditToCurrentLayout": 1548.9149999916553 - } - ] - }, - { - "mode": "studio", - "profile": true, - "build": "77d1441", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 9.009999990463257, - "p95": 16.41499999165535, - "max": 17.774999991059303 - }, - "eventTiming": { - "n": 103, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 110, - "lastEditToCurrentLayout": 1681.7900000065565 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 7.3900000005960464, - "p95": 13.465000003576279, - "max": 14.409999996423721 - }, - "eventTiming": { - "n": 23, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.075000002980232, - "p95": 15.515000000596046, - "max": 16.719999998807907 - }, - "eventTiming": { - "n": 52, - "p50": 16, - "p95": 48, - "max": 48 - }, - "longestTask": 141, - "lastEditToCurrentLayout": 493.1499999910593 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 54.125, - "p95": 54.125, - "max": 55.51500000059605 - }, - "eventTiming": { - "n": 4, - "p50": 32, - "p95": 56, - "max": 56 - }, - "longestTask": 53, - "lastEditToCurrentLayout": 148.40000000596046 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 9.17000000178814, - "p95": 17.400000005960464, - "max": 112.88499999046326 - }, - "eventTiming": { - "n": 29, - "p50": 16, - "p95": 24, - "max": 128 - }, - "longestTask": 128, - "lastEditToCurrentLayout": 1579.3650000095367 - } - ] - }, - { - "mode": "module", - "profile": false, - "build": "77d1441", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 8.099999994039536, - "p95": 15.305000007152557, - "max": 16.75499999523163 - }, - "eventTiming": { - "n": 81, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 142, - "lastEditToCurrentLayout": 1719.609999999404 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 7.489999994635582, - "p95": 13.644999995827675, - "max": 15.129999995231628 - }, - "eventTiming": { - "n": 18, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 9.075000002980232, - "p95": 17.105000004172325, - "max": 108.79999999701977 - }, - "eventTiming": { - "n": 61, - "p50": 16, - "p95": 80, - "max": 112 - }, - "longestTask": 101, - "lastEditToCurrentLayout": 1524.2549999952316 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 51.445000007748604, - "p95": 51.445000007748604, - "max": 52.46500000357628 - }, - "eventTiming": { - "n": 2, - "p50": 56, - "p95": 56, - "max": 56 - }, - "longestTask": 57, - "lastEditToCurrentLayout": 157.92000000178814 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 10.160000011324883, - "p95": 17.49500000476837, - "max": 108.79999999701977 - }, - "eventTiming": { - "n": 23, - "p50": 16, - "p95": 24, - "max": 128 - }, - "longestTask": 119, - "lastEditToCurrentLayout": 1546.0649999976158 - } - ] - }, - { - "mode": "studio", - "profile": false, - "build": "77d1441", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 9.160000011324883, - "p95": 15.760000005364418, - "max": 17.125 - }, - "eventTiming": { - "n": 91, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 111, - "lastEditToCurrentLayout": 1759.2549999952316 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 8.259999990463257, - "p95": 13.939999997615814, - "max": 16.12999999523163 - }, - "eventTiming": { - "n": 23, - "p50": 16, - "p95": 16, - "max": 24 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.185000002384186, - "p95": 13.915000006556511, - "max": 112.125 - }, - "eventTiming": { - "n": 61, - "p50": 16, - "p95": 64, - "max": 144 - }, - "longestTask": 115, - "lastEditToCurrentLayout": 1489.8699999898672 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 70.98999999463558, - "p95": 70.98999999463558, - "max": 72.97499999403954 - }, - "eventTiming": { - "n": 4, - "p50": 32, - "p95": 80, - "max": 80 - }, - "longestTask": 70, - "lastEditToCurrentLayout": 201.8449999988079 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 7.4000000059604645, - "p95": 15.17000000178814, - "max": 15.774999991059303 - }, - "eventTiming": { - "n": 33, - "p50": 16, - "p95": 24, - "max": 40 - }, - "longestTask": 129, - "lastEditToCurrentLayout": 1480.405000001192 - } - ] - }, - { - "mode": "module", - "profile": true, - "extended": true, - "build": "8f31e4c", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 7.114999994635582, - "p95": 15.564999997615814, - "max": 17.070000007748604 - }, - "eventTiming": { - "n": 86, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 152, - "lastEditToCurrentLayout": 1786.0199999958277 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 8.149999991059303, - "p95": 14.445000007748604, - "max": 15.099999994039536 - }, - "eventTiming": { - "n": 21, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.730000004172325, - "p95": 15.599999994039536, - "max": 16.990000009536743 - }, - "eventTiming": { - "n": 44, - "p50": 16, - "p95": 40, - "max": 56 - }, - "longestTask": 107, - "lastEditToCurrentLayout": 561.6149999946356 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 64.2250000089407, - "p95": 64.2250000089407, - "max": 65.86999998986721 - }, - "eventTiming": { - "n": 2, - "p50": 72, - "p95": 72, - "max": 72 - }, - "longestTask": 62, - "lastEditToCurrentLayout": 172.61500000953674 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 9.92000000178814, - "p95": 16.359999999403954, - "max": 16.700000002980232 - }, - "eventTiming": { - "n": 32, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 106, - "lastEditToCurrentLayout": 1515.3649999946356 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 10.820000007748604, - "p95": 16.25500001013279, - "max": 17.185000002384186 - }, - "eventTiming": { - "n": 54, - "p50": 16, - "p95": 24, - "max": 1408 - }, - "longestTask": 1539, - "lastEditToCurrentLayout": 2554.4249999970198 - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 145.9350000023842, - "p95": 145.9350000023842, - "max": 145.9350000023842 - }, - "eventTiming": { - "n": 3, - "p50": 152, - "p95": 152, - "max": 152 - }, - "longestTask": 351, - "lastEditToCurrentLayout": 6932.490000009537 - } - ] - }, - { - "mode": "module", - "profile": true, - "extended": true, - "build": "0dad65d", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 9.534999996423721, - "p95": 17.32499998807907, - "max": 17.49500000476837 - }, - "eventTiming": { - "n": 86, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 133, - "lastEditToCurrentLayout": 1691.7450000047684 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 9.344999998807907, - "p95": 15.41499999165535, - "max": 15.830000013113022 - }, - "eventTiming": { - "n": 23, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 10.275000005960464, - "p95": 16.094999998807907, - "max": 16.890000015497208 - }, - "eventTiming": { - "n": 58, - "p50": 16, - "p95": 40, - "max": 56 - }, - "longestTask": 84, - "lastEditToCurrentLayout": 510.6399999856949 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 68.67500001192093, - "p95": 68.67500001192093, - "max": 70.64999997615814 - }, - "eventTiming": { - "n": 2, - "p50": 72, - "p95": 72, - "max": 72 - }, - "longestTask": 67, - "lastEditToCurrentLayout": 166.6550000011921 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 10.00500002503395, - "p95": 16.21000000834465, - "max": 17.145000010728836 - }, - "eventTiming": { - "n": 31, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 105, - "lastEditToCurrentLayout": 1470.5699999928474 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 7.865000009536743, - "p95": 14.049999982118607, - "max": 17.020000010728836 - }, - "eventTiming": { - "n": 49, - "p50": 16, - "p95": 24, - "max": 1416 - }, - "longestTask": 1547, - "lastEditToCurrentLayout": 2564.2000000178814 - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 130.49000000953674, - "p95": 130.49000000953674, - "max": 130.49000000953674 - }, - "eventTiming": { - "n": 3, - "p50": 136, - "p95": 136, - "max": 136 - }, - "longestTask": 343, - "lastEditToCurrentLayout": 6913.5250000059605 - } - ] - }, - { - "mode": "studio", - "profile": false, - "extended": true, - "build": "0dad65d", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 9.74499997496605, - "p95": 16.38500002026558, - "max": 17.209999978542328 - }, - "eventTiming": { - "n": 89, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 114, - "lastEditToCurrentLayout": 1768.155000001192 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 9.175000011920929, - "p95": 15.680000007152557, - "max": 16.299999982118607 - }, - "eventTiming": { - "n": 24, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 8.71000000834465, - "p95": 15.629999995231628, - "max": 16.615000009536743 - }, - "eventTiming": { - "n": 59, - "p50": 16, - "p95": 48, - "max": 48 - }, - "longestTask": 107, - "lastEditToCurrentLayout": 482.22499999403954 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 1.0149999856948853, - "p95": 1.0149999856948853, - "max": 53.525000005960464 - }, - "eventTiming": { - "n": 3, - "p50": 24, - "p95": 24, - "max": 56 - }, - "longestTask": 84, - "lastEditToCurrentLayout": 209.78499999642372 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 8.769999980926514, - "p95": 14.109999984502792, - "max": 16.939999997615814 - }, - "eventTiming": { - "n": 29, - "p50": 16, - "p95": 24, - "max": 40 - }, - "longestTask": 118, - "lastEditToCurrentLayout": 1514.5850000083447 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.450000017881393, - "p95": 14.0799999833107, - "max": 16.429999977350235 - }, - "eventTiming": { - "n": 50, - "p50": 16, - "p95": 24, - "max": 1384 - }, - "longestTask": 1508, - "lastEditToCurrentLayout": 2577.4749999940395 - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 308.47499999403954, - "p95": 308.47499999403954, - "max": 308.47499999403954 - }, - "eventTiming": { - "n": 3, - "p50": 320, - "p95": 320, - "max": 320 - }, - "longestTask": 341, - "lastEditToCurrentLayout": 7325.310000002384 - } - ] - }, - { - "mode": "studio", - "profile": true, - "extended": true, - "build": "0dad65d", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 8.965000003576279, - "p95": 15.629999995231628, - "max": 17.259999990463257 - }, - "eventTiming": { - "n": 100, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 112, - "lastEditToCurrentLayout": 1725.7349999845028 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 8.5, - "p95": 14.560000002384186, - "max": 15.75 - }, - "eventTiming": { - "n": 23, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 9.764999985694885, - "p95": 96.10499998927116, - "max": 117.39499998092651 - }, - "eventTiming": { - "n": 60, - "p50": 16, - "p95": 128, - "max": 128 - }, - "longestTask": 109, - "lastEditToCurrentLayout": 1544.9099999964237 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 53.50500002503395, - "p95": 53.50500002503395, - "max": 55.28000000119209 - }, - "eventTiming": { - "n": 4, - "p50": 32, - "p95": 56, - "max": 56 - }, - "longestTask": 52, - "lastEditToCurrentLayout": 155.48500001430511 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 6.75, - "p95": 12.299999982118607, - "max": 17.080000013113022 - }, - "eventTiming": { - "n": 36, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 133, - "lastEditToCurrentLayout": 1523.9099999964237 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 9.245000004768372, - "p95": 16.455000013113022, - "max": 17.185000002384186 - }, - "eventTiming": { - "n": 45, - "p50": 16, - "p95": 24, - "max": 1456 - }, - "longestTask": 1578, - "lastEditToCurrentLayout": 2721.1700000166893 - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 271.75999999046326, - "p95": 271.75999999046326, - "max": 271.75999999046326 - }, - "eventTiming": { - "n": 3, - "p50": 280, - "p95": 280, - "max": 280 - }, - "longestTask": 343, - "lastEditToCurrentLayout": 7428.049999982119 - } - ] - }, - { - "mode": "studio", - "profile": false, - "extended": true, - "build": "8fd41f7", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 8.71000000834465, - "p95": 15.424999982118607, - "max": 17.87000000476837 - }, - "eventTiming": { - "n": 90, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 144, - "lastEditToCurrentLayout": 1755.080000013113 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 9.004999995231628, - "p95": 12.474999994039536, - "max": 15.78999999165535 - }, - "eventTiming": { - "n": 24, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 8.485000014305115, - "p95": 15.194999992847443, - "max": 16.40999999642372 - }, - "eventTiming": { - "n": 59, - "p50": 16, - "p95": 48, - "max": 56 - }, - "longestTask": 96, - "lastEditToCurrentLayout": 485.75500002503395 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 0.45499998331069946, - "p95": 0.45499998331069946, - "max": 70.56499999761581 - }, - "eventTiming": { - "n": 2, - "p50": 24, - "p95": 24, - "max": 72 - }, - "longestTask": 69, - "lastEditToCurrentLayout": 192.7650000154972 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 7.180000007152557, - "p95": 14.780000001192093, - "max": 16.520000010728836 - }, - "eventTiming": { - "n": 28, - "p50": 16, - "p95": 24, - "max": 32 - }, - "longestTask": 125, - "lastEditToCurrentLayout": 1537.630000025034 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.615000009536743, - "p95": 15.950000017881393, - "max": 17.00499999523163 - }, - "eventTiming": { - "n": 53, - "p50": 16, - "p95": 24, - "max": 1416 - }, - "longestTask": 1534, - "lastEditToCurrentLayout": 2633.399999976158 - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 141.96500000357628, - "p95": 141.96500000357628, - "max": 141.96500000357628 - }, - "eventTiming": { - "n": 3, - "p50": 152, - "p95": 152, - "max": 152 - }, - "longestTask": 336, - "lastEditToCurrentLayout": 7292.475000023842 - } - ] - }, - { - "mode": "studio", - "profile": true, - "extended": true, - "build": "8fd41f7", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 9.935000002384186, - "p95": 15.909999996423721, - "max": 18.49500000476837 - }, - "eventTiming": { - "n": 96, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 116, - "lastEditToCurrentLayout": 1736.969999998808 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 8.990000009536743, - "p95": 15.599999994039536, - "max": 15.71000000834465 - }, - "eventTiming": { - "n": 28, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.640000015497208, - "p95": 17.16499999165535, - "max": 108.15000000596046 - }, - "eventTiming": { - "n": 62, - "p50": 16, - "p95": 56, - "max": 128 - }, - "longestTask": 115, - "lastEditToCurrentLayout": 1491.844999998808 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 81.52500000596046, - "p95": 81.52500000596046, - "max": 83.09999999403954 - }, - "eventTiming": { - "n": 4, - "p50": 24, - "p95": 88, - "max": 88 - }, - "longestTask": 80, - "lastEditToCurrentLayout": 216.0150000154972 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 9.319999992847443, - "p95": 15.765000015497208, - "max": 17.319999992847443 - }, - "eventTiming": { - "n": 28, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 122, - "lastEditToCurrentLayout": 1527.4599999785423 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.799999982118607, - "p95": 16.594999998807907, - "max": 17.520000010728836 - }, - "eventTiming": { - "n": 47, - "p50": 16, - "p95": 24, - "max": 1432 - }, - "longestTask": 1559, - "lastEditToCurrentLayout": 2610.2950000166893 - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 151.13000002503395, - "p95": 151.13000002503395, - "max": 151.13000002503395 - }, - "eventTiming": { - "n": 3, - "p50": 160, - "p95": 160, - "max": 160 - }, - "longestTask": 372, - "lastEditToCurrentLayout": 7672.189999997616 - } - ] - }, - { - "mode": "module", - "profile": false, - "extended": true, - "build": "8fd41f7", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 11.689999997615814, - "p95": 15.840000003576279, - "max": 21.96000000834465 - }, - "eventTiming": { - "n": 94, - "p50": 16, - "p95": 32, - "max": 40 - }, - "longestTask": 372, - "lastEditToCurrentLayout": 2926.735000014305 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 9.0799999833107, - "p95": 13.655000001192093, - "max": 15.5 - }, - "eventTiming": { - "n": 27, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.694999992847443, - "p95": 16.195000022649765, - "max": 135.9350000023842 - }, - "eventTiming": { - "n": 56, - "p50": 16, - "p95": 128, - "max": 144 - }, - "longestTask": 128, - "lastEditToCurrentLayout": 1571.9149999916553 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 64.83000001311302, - "p95": 64.83000001311302, - "max": 65.80500000715256 - }, - "eventTiming": { - "n": 2, - "p50": 72, - "p95": 72, - "max": 72 - }, - "longestTask": 69, - "lastEditToCurrentLayout": 190.21500000357628 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 7.240000009536743, - "p95": 14.310000002384186, - "max": 14.610000014305115 - }, - "eventTiming": { - "n": 29, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 149, - "lastEditToCurrentLayout": 1586.1050000190735 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.974999994039536, - "p95": 16.36499997973442, - "max": 16.96500000357628 - }, - "eventTiming": { - "n": 51, - "p50": 16, - "p95": 24, - "max": 1496 - }, - "longestTask": 1628, - "lastEditToCurrentLayout": 2664.940000027418 - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 103.22999998927116, - "p95": 103.22999998927116, - "max": 103.22999998927116 - }, - "eventTiming": { - "n": 2, - "p50": 112, - "p95": 112, - "max": 112 - }, - "longestTask": 362, - "lastEditToCurrentLayout": 7071.8499999940395 - } - ] - } - ], - "limits": [ - "Chrome Event Timing is quantized and only events reaching the 16 ms threshold are reported; percentiles are not population INP.", - "Full pagination can outlast input responses; these runs do not establish an editor-wide 150 ms maximum.", - "Explicitly formatted typing still uses native atomic transactions and reached 1400 ms in the extended profile at 83263f0; collapsed Enter reached 200 ms." - ], - "additionalRuns": [ - { - "mode": "module", - "profile": true, - "extended": true, - "build": "83263f0", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 8.160000011324883, - "p95": 16.890000000596046, - "max": 17.035000011324883 - }, - "eventTiming": { - "n": 79, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 151, - "lastEditToCurrentLayout": 1712.6950000077486 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 9.390000000596046, - "p95": 12.734999999403954, - "max": 16.29500000178814 - }, - "eventTiming": { - "n": 28, - "p50": 16, - "p95": 16, - "max": 24 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.870000004768372, - "p95": 14.605000004172325, - "max": 17.035000011324883 - }, - "eventTiming": { - "n": 61, - "p50": 16, - "p95": 24, - "max": 40 - }, - "longestTask": 118, - "lastEditToCurrentLayout": 570.9749999940395 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 50.34000000357628, - "p95": 50.34000000357628, - "max": 52.310000002384186 - }, - "eventTiming": { - "n": 3, - "p50": 56, - "p95": 56, - "max": 56 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 142.96500000357628 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 5.969999998807907, - "p95": 14.42000000178814, - "max": 15.04500000178814 - }, - "eventTiming": { - "n": 34, - "p50": 16, - "p95": 24, - "max": 32 - }, - "longestTask": 140, - "lastEditToCurrentLayout": 1534.440000012517 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 9.92000000178814, - "p95": 16.814999997615814, - "max": 17.5 - }, - "eventTiming": { - "n": 56, - "p50": 16, - "p95": 24, - "max": 1400 - }, - "longestTask": 1528, - "lastEditToCurrentLayout": 2536.545000001788 - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 193.46500000357628, - "p95": 193.46500000357628, - "max": 193.46500000357628 - }, - "eventTiming": { - "n": 3, - "p50": 200, - "p95": 200, - "max": 200 - }, - "longestTask": 340, - "lastEditToCurrentLayout": 6895.335000008345 - } - ] - }, - { - "mode": "studio", - "profile": false, - "extended": false, - "build": "83263f0", - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "errors": [], - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 8.435000002384186, - "p95": 15.474999994039536, - "max": 17.530000001192093 - }, - "eventTiming": { - "n": 96, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 112, - "lastEditToCurrentLayout": 1725.7699999958277 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 7.894999995827675, - "p95": 13.609999999403954, - "max": 14.909999996423721 - }, - "eventTiming": { - "n": 20, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0 - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 9.009999990463257, - "p95": 16.54000000655651, - "max": 17.469999998807907 - }, - "eventTiming": { - "n": 63, - "p50": 16, - "p95": 40, - "max": 48 - }, - "longestTask": 97, - "lastEditToCurrentLayout": 481.52000001072884 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 80.98000000417233, - "p95": 80.98000000417233, - "max": 83.24500000476837 - }, - "eventTiming": { - "n": 4, - "p50": 24, - "p95": 88, - "max": 88 - }, - "longestTask": 80, - "lastEditToCurrentLayout": 206.54500000178814 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 11.17000000178814, - "p95": 17.265000000596046, - "max": 17.719999998807907 - }, - "eventTiming": { - "n": 27, - "p50": 24, - "p95": 24, - "max": 24 - }, - "longestTask": 113, - "lastEditToCurrentLayout": 1519.515000000596 - } - ] - } - ] -} diff --git a/docs/benchmarks/2026-09-13-native-transactions.json b/docs/benchmarks/2026-09-13-native-transactions.json deleted file mode 100644 index 2b33470..0000000 --- a/docs/benchmarks/2026-09-13-native-transactions.json +++ /dev/null @@ -1,515 +0,0 @@ -{ - "startedAt": "2026-09-14T03:32:56.965Z", - "sha256": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "packages": { - "installed": { - "version": "12.4.1", - "sessionHash": "eadd52d6ff49628efe41d00435493045a5e659c0c65024c1f786ada9b204d95f", - "runtimeHash": "b2437a7703b107365de3885468269369dd113c0995b352b721b12781d67035da" - }, - "candidate": { - "version": "12.5.0", - "sessionHash": "74bf3d6e9390e3a15c0e97726d9005d3d041b37f8e3601b65e97227387dcb114", - "runtimeHash": "f0bb0fbec335eb27fa9e57673aaf319b71d682911771f579350e8df845c2902a" - } - }, - "browser": "143.0.7499.4", - "machine": { - "cpu": "Intel(R) Core(TM) Ultra 7 258V", - "logicalCpus": 8, - "platform": "linux", - "arch": "x64" - }, - "workload": "One text-plus-Bold atomic batch; first attempt and two repeats after undo/redo, in fresh ABBA browser contexts.", - "cpuThrottling": false, - "runs": [ - { - "label": "installed", - "version": "12.4.1", - "attempts": [ - { - "iteration": 0, - "ms": 1161.324999988079, - "calls": [ - { - "name": "ListRevisions", - "ms": 73.14500001072884 - }, - { - "name": "BeginTransaction", - "ms": 500.27500000596046 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 38.09499999880791 - }, - { - "name": "ApplyFormat", - "ms": 39.06999999284744 - }, - { - "name": "ListRevisions", - "ms": 37.41499999165535 - }, - { - "name": "GetPackageContentHash", - "ms": 460.10499998927116 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 1017.5300000011921, - "calls": [ - { - "name": "ListRevisions", - "ms": 32.70000001788139 - }, - { - "name": "BeginTransaction", - "ms": 401.6749999821186 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 18.724999994039536 - }, - { - "name": "ApplyFormat", - "ms": 29.37999999523163 - }, - { - "name": "ListRevisions", - "ms": 37.23499998450279 - }, - { - "name": "GetPackageContentHash", - "ms": 495.6050000190735 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 992.2900000214577, - "calls": [ - { - "name": "ListRevisions", - "ms": 32.889999985694885 - }, - { - "name": "BeginTransaction", - "ms": 396.5799999833107 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 18.57499998807907 - }, - { - "name": "ApplyFormat", - "ms": 27.46500000357628 - }, - { - "name": "ListRevisions", - "ms": 35.65500000119209 - }, - { - "name": "GetPackageContentHash", - "ms": 479.08500000834465 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "candidate", - "version": "12.5.0", - "attempts": [ - { - "iteration": 0, - "ms": 1202.3049999773502, - "calls": [ - { - "name": "ListRevisions", - "ms": 99.04499998688698 - }, - { - "name": "BeginTransaction", - "ms": 496.5849999785423 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 38.42499998211861 - }, - { - "name": "ApplyFormat", - "ms": 40.34000000357628 - }, - { - "name": "ListRevisions", - "ms": 45.61500000953674 - }, - { - "name": "GetPackageContentHash", - "ms": 460.169999986887 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 1000.7400000095367, - "calls": [ - { - "name": "ListRevisions", - "ms": 41.21500000357628 - }, - { - "name": "BeginTransaction", - "ms": 404.8599999845028 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 18.275000005960464 - }, - { - "name": "ApplyFormat", - "ms": 27.349999994039536 - }, - { - "name": "ListRevisions", - "ms": 43.56999999284744 - }, - { - "name": "GetPackageContentHash", - "ms": 461.88499999046326 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 984.3799999952316, - "calls": [ - { - "name": "ListRevisions", - "ms": 41.41499999165535 - }, - { - "name": "BeginTransaction", - "ms": 379.330000013113 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 30.430000007152557 - }, - { - "name": "ApplyFormat", - "ms": 29.019999980926514 - }, - { - "name": "ListRevisions", - "ms": 43.7950000166893 - }, - { - "name": "GetPackageContentHash", - "ms": 457.89500001072884 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "candidate", - "version": "12.5.0", - "attempts": [ - { - "iteration": 0, - "ms": 1199.4599999785423, - "calls": [ - { - "name": "ListRevisions", - "ms": 97.11500000953674 - }, - { - "name": "BeginTransaction", - "ms": 492.4950000047684 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 39.06999999284744 - }, - { - "name": "ApplyFormat", - "ms": 39.33000001311302 - }, - { - "name": "ListRevisions", - "ms": 45.650000005960464 - }, - { - "name": "GetPackageContentHash", - "ms": 463.375 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 1010.2299999892712, - "calls": [ - { - "name": "ListRevisions", - "ms": 42.36499997973442 - }, - { - "name": "BeginTransaction", - "ms": 403.5499999821186 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 18.25499999523163 - }, - { - "name": "ApplyFormat", - "ms": 28.58500000834465 - }, - { - "name": "ListRevisions", - "ms": 44.73499998450279 - }, - { - "name": "GetPackageContentHash", - "ms": 469 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 999.6399999856949, - "calls": [ - { - "name": "ListRevisions", - "ms": 41.01000002026558 - }, - { - "name": "BeginTransaction", - "ms": 385.875 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 31.25499999523163 - }, - { - "name": "ApplyFormat", - "ms": 30.065000027418137 - }, - { - "name": "ListRevisions", - "ms": 44.229999989271164 - }, - { - "name": "GetPackageContentHash", - "ms": 464.7300000190735 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "installed", - "version": "12.4.1", - "attempts": [ - { - "iteration": 0, - "ms": 1168.1800000071526, - "calls": [ - { - "name": "ListRevisions", - "ms": 74.06000000238419 - }, - { - "name": "BeginTransaction", - "ms": 501.47999998927116 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 38.4200000166893 - }, - { - "name": "ApplyFormat", - "ms": 37 - }, - { - "name": "ListRevisions", - "ms": 36.645000010728836 - }, - { - "name": "GetPackageContentHash", - "ms": 467.10499998927116 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 1003.3650000095367, - "calls": [ - { - "name": "ListRevisions", - "ms": 33.849999994039536 - }, - { - "name": "BeginTransaction", - "ms": 399.07000002264977 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 18.910000026226044 - }, - { - "name": "ApplyFormat", - "ms": 28.389999985694885 - }, - { - "name": "ListRevisions", - "ms": 35.84000000357628 - }, - { - "name": "GetPackageContentHash", - "ms": 484.9899999797344 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 990.6899999976158, - "calls": [ - { - "name": "ListRevisions", - "ms": 33.94999998807907 - }, - { - "name": "BeginTransaction", - "ms": 388.0149999856949 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 19.08500000834465 - }, - { - "name": "ApplyFormat", - "ms": 27.899999976158142 - }, - { - "name": "ListRevisions", - "ms": 34.88499999046326 - }, - { - "name": "GetPackageContentHash", - "ms": 484.9699999988079 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - } - ] -} diff --git a/docs/benchmarks/2026-09-13-nvca-integrity.json b/docs/benchmarks/2026-09-13-nvca-integrity.json deleted file mode 100644 index f8584b5..0000000 --- a/docs/benchmarks/2026-09-13-nvca-integrity.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "applicationRevision": "8fd41f7053e44bc45492c4e0c1531955aefa4064", - "workload": "Source-harness NVCA integrity test, native default Markdown patches; timings include typing, debounce and layout and are not input-to-paint latency.", - "result": "passed", - "report": { - "fixture": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pageCount": 65, - "bodyParagraphs": 234, - "footnoteParagraphs": 110, - "loadMs": 33215, - "timings": [ - { - "id": "h:body:3c7febe8565d200c894a4f2d964412b6", - "commitMs": 1116, - "layoutMs": 2177 - }, - { - "id": "p:body:1ef8f6933054e4feca6a87faff1ea462", - "commitMs": 1106, - "layoutMs": 2023 - }, - { - "id": "p:body:256139579825824ada5ca0771f6f4c50", - "commitMs": 3273, - "layoutMs": 10405 - }, - { - "id": "h:body:0d11ade95e3163f93766a9df86fd877f", - "commitMs": 1885, - "layoutMs": 3701 - }, - { - "id": "p:body:33eab5a76953e018050c4229ff7eea41", - "commitMs": 1117, - "layoutMs": 2999 - }, - { - "id": "h:body:46649e27ec54936020588d7037db9938", - "commitMs": 1083, - "layoutMs": 1918 - }, - { - "id": "p:body:8a1aabf3b3f0e5935244b196f36efdbf", - "commitMs": 1109, - "layoutMs": 1973 - }, - { - "id": "h:body:1ad843a6f253e5b1f4af942b1c6a9c08", - "commitMs": 1139, - "layoutMs": 1978 - }, - { - "id": "p:body:86ad5c34e28fe5137e7913ad02ab7c00", - "commitMs": 970, - "layoutMs": 1817 - }, - { - "id": "p:fn:1e74d934ae84a7483f06cb093bce7c16", - "commitMs": 1061, - "layoutMs": 2985 - }, - { - "id": "p:fn:c4dc0f76adfbbb22afab2af3c6b9eae1", - "commitMs": 1010, - "layoutMs": 2881 - }, - { - "id": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea", - "commitMs": 1080, - "layoutMs": 3056 - } - ], - "modifiedParagraphs": 13, - "addedParagraphs": 1, - "nativeCommits": 31, - "assertions": [ - "all body and footnote text editable", - "stable pagination at 50%, 100%, 200%", - "typing at 12 locations", - "undo/redo", - "typing through repeated background conversions", - "selected formatting", - "split/paste/merge", - "final keystroke saved", - "reopened native DOCX valid", - "all original text preserved outside intentional edits", - "unchanged paragraph XML preserved", - "fields/bookmarks/notes/sections preserved", - "other package parts unchanged" - ] - } -} diff --git a/docs/benchmarks/2026-09-15-latency.json b/docs/benchmarks/2026-09-15-latency.json deleted file mode 100644 index 89efb8a..0000000 --- a/docs/benchmarks/2026-09-15-latency.json +++ /dev/null @@ -1,936 +0,0 @@ -{ - "date": "2026-09-15", - "engine": "12.6.0", - "machine": "Intel Core Ultra 7 258V; 8 logical CPUs; Linux x64", - "browser": "Chromium 143.0.7499.4", - "viewport": [ - 1480, - 1050 - ], - "cpuThrottling": false, - "latencyLimitMs": 150, - "runs": [ - { - "mode": "module", - "profile": false, - "extended": true, - "build": "7a2bac5", - "workspaceCommit": "7a2bac58e732a97cbb81ccaac65bb1bd3dd8b8fd", - "workspaceDirty": false, - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "errors": [], - "gatePassed": false, - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 9.915000021457672, - "p95": 16.645000010728836, - "max": 16.770000010728836 - }, - "eventTiming": { - "n": 86, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 62, - "lastEditToCurrentLayout": 815.5049999952316 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 8.819999992847443, - "p95": 14.229999989271164, - "max": 16.519999980926514 - }, - "eventTiming": { - "n": 20, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0, - "lastEditToCurrentLayout": null - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 8.594999998807907, - "p95": 16.390000015497208, - "max": 17.290000021457672 - }, - "eventTiming": { - "n": 48, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 420.67500001192093 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 42.53499999642372, - "p95": 42.53499999642372, - "max": 42.875 - }, - "eventTiming": { - "n": 2, - "p50": 48, - "p95": 48, - "max": 48 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 111.59000000357628 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 7.215000003576279, - "p95": 14.16499999165535, - "max": 16.974999994039536 - }, - "eventTiming": { - "n": 23, - "p50": 16, - "p95": 16, - "max": 24 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 744 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.099999994039536, - "p95": 15.63000002503395, - "max": 15.939999997615814 - }, - "eventTiming": { - "n": 39, - "p50": 16, - "p95": 16, - "max": 1184 - }, - "longestTask": 1315, - "lastEditToCurrentLayout": 1805.8400000035763, - "setup": { - "offset": 900, - "runBoundary": false - } - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 79.12000000476837, - "p95": 79.12000000476837, - "max": 79.12000000476837 - }, - "eventTiming": { - "n": 3, - "p50": 80, - "p95": 80, - "max": 80 - }, - "longestTask": 114, - "lastEditToCurrentLayout": 2218.859999984503 - }, - { - "name": "styled_boundary_pause_resume", - "keyToFrame": { - "n": 30, - "p50": 8.659999996423721, - "p95": 15.50500002503395, - "max": 17.224999994039536 - }, - "eventTiming": { - "n": 58, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 85, - "lastEditToCurrentLayout": 444.6550000011921, - "setup": { - "offset": 1019, - "runBoundary": true, - "boldBefore": false - } - }, - { - "name": "styled_interior_pause_resume", - "keyToFrame": { - "n": 28, - "p50": 7.734999984502792, - "p95": 16.53999999165535, - "max": 17.605000019073486 - }, - "eventTiming": { - "n": 39, - "p50": 16, - "p95": 24, - "max": 400 - }, - "longestTask": 530, - "lastEditToCurrentLayout": 432.5600000023842, - "setup": { - "offset": 59, - "runBoundary": false, - "boldBefore": false - } - } - ] - }, - { - "mode": "studio", - "profile": false, - "extended": true, - "build": "7a2bac5", - "workspaceCommit": "7a2bac58e732a97cbb81ccaac65bb1bd3dd8b8fd", - "workspaceDirty": true, - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "errors": [], - "gatePassed": false, - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 8.48999997973442, - "p95": 16.275000005960464, - "max": 17.145000010728836 - }, - "eventTiming": { - "n": 64, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 54, - "lastEditToCurrentLayout": 794.0900000035763 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 13.724999994039536, - "p95": 16.310000002384186, - "max": 16.4549999833107 - }, - "eventTiming": { - "n": 31, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0, - "lastEditToCurrentLayout": null - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 11.075000017881393, - "p95": 15.655000001192093, - "max": 16.46000000834465 - }, - "eventTiming": { - "n": 67, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 61, - "lastEditToCurrentLayout": 437.8299999833107 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 28.90999999642372, - "p95": 28.90999999642372, - "max": 29.24500000476837 - }, - "eventTiming": { - "n": 2, - "p50": 32, - "p95": 32, - "max": 32 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 75.08500000834465 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 7.519999980926514, - "p95": 14.365000009536743, - "max": 15.225000023841858 - }, - "eventTiming": { - "n": 34, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 726.3050000071526 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.159999996423721, - "p95": 15.33500000834465, - "max": 16.980000019073486 - }, - "eventTiming": { - "n": 42, - "p50": 16, - "p95": 24, - "max": 376 - }, - "longestTask": 509, - "lastEditToCurrentLayout": 744.1949999928474, - "setup": { - "offset": 900, - "runBoundary": false - } - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 49.79499998688698, - "p95": 49.79499998688698, - "max": 49.79499998688698 - }, - "eventTiming": { - "n": 3, - "p50": 56, - "p95": 56, - "max": 56 - }, - "longestTask": 101, - "lastEditToCurrentLayout": 2115.7399999797344 - }, - { - "name": "styled_boundary_pause_resume", - "keyToFrame": { - "n": 30, - "p50": 8.58500000834465, - "p95": 16.810000002384186, - "max": 17.645000010728836 - }, - "eventTiming": { - "n": 57, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 66, - "lastEditToCurrentLayout": 444.72999998927116, - "setup": { - "offset": 1019, - "runBoundary": true, - "boldBefore": false - } - }, - { - "name": "styled_interior_pause_resume", - "keyToFrame": { - "n": 28, - "p50": 7.824999988079071, - "p95": 15.004999995231628, - "max": 15.935000002384186 - }, - "eventTiming": { - "n": 55, - "p50": 16, - "p95": 24, - "max": 384 - }, - "longestTask": 505, - "lastEditToCurrentLayout": 439.78999999165535, - "setup": { - "offset": 59, - "runBoundary": false, - "boldBefore": false - } - } - ] - }, - { - "mode": "module", - "profile": true, - "extended": true, - "build": "7a2bac5", - "workspaceCommit": "7a2bac58e732a97cbb81ccaac65bb1bd3dd8b8fd", - "workspaceDirty": true, - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "errors": [], - "gatePassed": false, - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 7.659999996423721, - "p95": 15.650000005960464, - "max": 17.055000007152557 - }, - "eventTiming": { - "n": 76, - "p50": 16, - "p95": 16, - "max": 24 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 795.7100000083447, - "nativeCalls": { - "native.GetFormatting": { - "count": 3, - "totalMs": 15.769999980926514, - "maxMs": 5.854999989271164 - }, - "native.ReplaceTextAtSpan": { - "count": 1, - "totalMs": 25.474999994039536, - "maxMs": 25.474999994039536 - }, - "native.GetPageMapStatus": { - "count": 1, - "totalMs": 0.27000001072883606, - "maxMs": 0.27000001072883606 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 0.5349999964237213, - "maxMs": 0.5349999964237213 - }, - "native.GetListMembership": { - "count": 1, - "totalMs": 0.05500000715255737, - "maxMs": 0.05500000715255737 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 41.810000002384186, - "maxMs": 41.810000002384186 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.0800000131130219, - "maxMs": 0.49000000953674316 - } - } - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 8.120000004768372, - "p95": 14.219999998807907, - "max": 15.129999995231628 - }, - "eventTiming": { - "n": 20, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0, - "lastEditToCurrentLayout": null, - "nativeCalls": {} - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.489999979734421, - "p95": 15.950000017881393, - "max": 16.685000002384186 - }, - "eventTiming": { - "n": 47, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 59, - "lastEditToCurrentLayout": 457.5949999988079, - "nativeCalls": { - "native.GetFormatting": { - "count": 18, - "totalMs": 128.36499997973442, - "maxMs": 20.485000014305115 - }, - "native.ReplaceTextAtSpan": { - "count": 6, - "totalMs": 67.19499999284744, - "maxMs": 31.895000010728836 - }, - "native.ListAnchors": { - "count": 6, - "totalMs": 10.375000029802322, - "maxMs": 4.625 - }, - "native.GetListMembership": { - "count": 6, - "totalMs": 0.8649999797344208, - "maxMs": 0.20500001311302185 - }, - "native.RenderEditorBlocksHtml": { - "count": 6, - "totalMs": 41.185000002384186, - "maxMs": 9.800000011920929 - } - } - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 30.594999998807907, - "p95": 30.594999998807907, - "max": 30.974999994039536 - }, - "eventTiming": { - "n": 2, - "p50": 32, - "p95": 32, - "max": 32 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 61.19499999284744, - "nativeCalls": { - "native.ApplyFormat": { - "count": 1, - "totalMs": 8.46000000834465, - "maxMs": 8.46000000834465 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 10.685000002384186, - "maxMs": 10.685000002384186 - }, - "native.GetFormatting": { - "count": 1, - "totalMs": 3.1600000262260437, - "maxMs": 3.1600000262260437 - }, - "native.GetListMembership": { - "count": 1, - "totalMs": 0.19499999284744263, - "maxMs": 0.19499999284744263 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 7.129999995231628, - "maxMs": 7.129999995231628 - } - } - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 10.379999995231628, - "p95": 14.430000007152557, - "max": 16.105000019073486 - }, - "eventTiming": { - "n": 34, - "p50": 16, - "p95": 24, - "max": 56 - }, - "longestTask": 54, - "lastEditToCurrentLayout": 747.9950000047684, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 51.88999995589256, - "maxMs": 13.104999989271164 - }, - "native.ReplaceTextAtSpan": { - "count": 2, - "totalMs": 30.974999994039536, - "maxMs": 25.75 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 1.350000023841858, - "maxMs": 0.675000011920929 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 0.25999999046325684, - "maxMs": 0.12999999523162842 - }, - "native.RenderEditorBlocksHtml": { - "count": 2, - "totalMs": 14.440000027418137, - "maxMs": 7.540000021457672 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.155000001192093, - "maxMs": 0.5300000011920929 - } - } - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.275000005960464, - "p95": 16.37999999523163, - "max": 16.674999982118607 - }, - "eventTiming": { - "n": 51, - "p50": 16, - "p95": 24, - "max": 376 - }, - "longestTask": 512, - "lastEditToCurrentLayout": 775.8500000238419, - "setup": { - "offset": 900, - "runBoundary": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 40.639999985694885, - "maxMs": 12.705000013113022 - }, - "native.RegisterPageMap": { - "count": 1, - "totalMs": 95.04000002145767, - "maxMs": 95.04000002145767 - }, - "native.BeginDeliveryEvidence": { - "count": 1, - "totalMs": 0.7950000166893005, - "maxMs": 0.7950000166893005 - }, - "native.ListRevisions": { - "count": 2, - "totalMs": 22.09000000357628, - "maxMs": 13.645000010728836 - }, - "native.ListComments": { - "count": 2, - "totalMs": 0.9050000011920929, - "maxMs": 0.875 - }, - "native.ListAnnotations": { - "count": 2, - "totalMs": 0.8349999785423279, - "maxMs": 0.8149999976158142 - }, - "native.BeginTransaction": { - "count": 1, - "totalMs": 171.19500002264977, - "maxMs": 171.19500002264977 - }, - "native.ReplaceTextAtSpan": { - "count": 1, - "totalMs": 27.12999999523163, - "maxMs": 27.12999999523163 - }, - "native.ApplyFormat": { - "count": 1, - "totalMs": 5.625, - "maxMs": 5.625 - }, - "native.CommitTransaction": { - "count": 1, - "totalMs": 1.3650000095367432, - "maxMs": 1.3650000095367432 - }, - "native.GetPackageContentHash": { - "count": 1, - "totalMs": 168.76000002026558, - "maxMs": 168.76000002026558 - }, - "native.GetPageMapStatus": { - "count": 2, - "totalMs": 0.125, - "maxMs": 0.09000000357627869 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 1.1350000202655792, - "maxMs": 0.7350000143051147 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 0.23000001907348633, - "maxMs": 0.18000000715255737 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 1, - "totalMs": 27.780000001192093, - "maxMs": 27.780000001192093 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 7.074999988079071, - "maxMs": 7.074999988079071 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.1649999618530273, - "maxMs": 0.5049999952316284 - } - } - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 57.62000000476837, - "p95": 57.62000000476837, - "max": 57.62000000476837 - }, - "eventTiming": { - "n": 2, - "p50": 64, - "p95": 64, - "max": 64 - }, - "longestTask": 117, - "lastEditToCurrentLayout": 2069.140000015497, - "nativeCalls": { - "native.SplitParagraph": { - "count": 1, - "totalMs": 4.3450000286102295, - "maxMs": 4.3450000286102295 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 27.474999994039536, - "maxMs": 27.474999994039536 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 17.015000015497208, - "maxMs": 17.015000015497208 - }, - "native.GetFormatting": { - "count": 355, - "totalMs": 689.4000003933907, - "maxMs": 14.28999999165535 - }, - "native.GetListMembership": { - "count": 1, - "totalMs": 0.05500000715255737, - "maxMs": 0.05500000715255737 - }, - "native.Save": { - "count": 1, - "totalMs": 52.81999999284744, - "maxMs": 52.81999999284744 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 0.9049999713897705, - "maxMs": 0.4050000011920929 - }, - "native.RegisterPageMap": { - "count": 1, - "totalMs": 88.125, - "maxMs": 88.125 - }, - "native.GetPageMapStatus": { - "count": 2, - "totalMs": 0.07499998807907104, - "maxMs": 0.03999999165534973 - } - } - }, - { - "name": "styled_boundary_pause_resume", - "keyToFrame": { - "n": 30, - "p50": 8.375, - "p95": 14.895000010728836, - "max": 16.24500000476837 - }, - "eventTiming": { - "n": 40, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 77, - "lastEditToCurrentLayout": 410.43000000715256, - "setup": { - "offset": 1019, - "runBoundary": true, - "boldBefore": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 25.224999964237213, - "maxMs": 7.055000007152557 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 78.41499999165535, - "maxMs": 61.78000000119209 - }, - "native.GetPageMapStatus": { - "count": 1, - "totalMs": 0.02499997615814209, - "maxMs": 0.02499997615814209 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 0.9000000059604645, - "maxMs": 0.48500001430511475 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 0.11499997973442078, - "maxMs": 0.06499999761581421 - }, - "native.RenderEditorBlocksHtml": { - "count": 2, - "totalMs": 31.96500000357628, - "maxMs": 28.064999997615814 - } - } - }, - { - "name": "styled_interior_pause_resume", - "keyToFrame": { - "n": 28, - "p50": 8.235000014305115, - "p95": 15.660000026226044, - "max": 16.185000002384186 - }, - "eventTiming": { - "n": 41, - "p50": 16, - "p95": 16, - "max": 384 - }, - "longestTask": 522, - "lastEditToCurrentLayout": 436.5499999821186, - "setup": { - "offset": 59, - "runBoundary": false, - "boldBefore": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 30.290000021457672, - "maxMs": 10.1700000166893 - }, - "native.RegisterPageMap": { - "count": 1, - "totalMs": 115.1550000011921, - "maxMs": 115.1550000011921 - }, - "native.BeginDeliveryEvidence": { - "count": 1, - "totalMs": 0.09999999403953552, - "maxMs": 0.09999999403953552 - }, - "native.ListRevisions": { - "count": 2, - "totalMs": 21.359999984502792, - "maxMs": 13.805000007152557 - }, - "native.ListComments": { - "count": 2, - "totalMs": 0.05500000715255737, - "maxMs": 0.034999996423721313 - }, - "native.ListAnnotations": { - "count": 2, - "totalMs": 0.034999996423721313, - "maxMs": 0.02000001072883606 - }, - "native.BeginTransaction": { - "count": 1, - "totalMs": 163.84000000357628, - "maxMs": 163.84000000357628 - }, - "native.ReplaceTextAtSpan": { - "count": 1, - "totalMs": 30.435000002384186, - "maxMs": 30.435000002384186 - }, - "native.ApplyFormat": { - "count": 1, - "totalMs": 5.765000015497208, - "maxMs": 5.765000015497208 - }, - "native.CommitTransaction": { - "count": 1, - "totalMs": 0.07499998807907104, - "maxMs": 0.07499998807907104 - }, - "native.GetPackageContentHash": { - "count": 1, - "totalMs": 170.13999998569489, - "maxMs": 170.13999998569489 - }, - "native.GetPageMapStatus": { - "count": 2, - "totalMs": 0.1250000298023224, - "maxMs": 0.07500001788139343 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 1.3349999785423279, - "maxMs": 0.8999999761581421 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 0.16499999165534973, - "maxMs": 0.11500000953674316 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 1, - "totalMs": 26.229999989271164, - "maxMs": 26.229999989271164 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 8.940000027418137, - "maxMs": 8.940000027418137 - } - } - } - ] - } - ], - "limits": [ - "Serial production measurements; small diagnostic samples, not a cross-device latency guarantee.", - "Event Timing is quantized and reports only events reaching its 16 ms threshold.", - "All correctness checks passed, but every full 150 ms gate failed on styled interior insertions.", - "The first original styled phase was inside an existing run in every run; explicit boundary and interior phases remove ambiguity.", - "The 1184 ms unprofiled outlier was not individually profiled; the profiled interior cases attribute most synchronous time to map registration and full-package batch work." - ] -} diff --git a/docs/benchmarks/2026-09-15-native-insertion-contract.json b/docs/benchmarks/2026-09-15-native-insertion-contract.json deleted file mode 100644 index 4af86e7..0000000 --- a/docs/benchmarks/2026-09-15-native-insertion-contract.json +++ /dev/null @@ -1,414 +0,0 @@ -{ - "startedAt": "2026-09-15T05:18:36.178Z", - "sha256": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "packages": { - "installed": { - "version": "12.6.0", - "sessionHash": "ab8ed26c11cd76a5a306fe7dd49545aca5af81c7f8ee1aed1048fb6610e4964d", - "runtimeHash": "086d315ffd021e094757fc9c2ce2d321e3024654098e8f6d7d274b7bbb4c1e03" - } - }, - "browser": "143.0.7499.4", - "machine": { - "cpu": "Intel(R) Core(TM) Ultra 7 258V", - "logicalCpus": 8, - "platform": "linux", - "arch": "x64" - }, - "workload": "The same text-plus-Bold edit via executeBatch and replaceMatch(match, text, format); first attempt and two repeats after undo/redo, in fresh batch/formatted/formatted/batch browser contexts.", - "cpuThrottling": false, - "runs": [ - { - "label": "batch", - "root": "installed", - "version": "12.6.0", - "attempts": [ - { - "iteration": 0, - "ms": 395.794999986887, - "calls": [ - { - "name": "ListRevisions", - "ms": 24 - }, - { - "name": "BeginTransaction", - "ms": 168.4350000023842 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 13.384999990463257 - }, - { - "name": "ApplyFormat", - "ms": 11.560000002384186 - }, - { - "name": "ListRevisions", - "ms": 12.53999999165535 - }, - { - "name": "GetPackageContentHash", - "ms": 159.2000000178814 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 330.49000000953674, - "calls": [ - { - "name": "ListRevisions", - "ms": 10.71000000834465 - }, - { - "name": "BeginTransaction", - "ms": 137.68499997258186 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 6.425000011920929 - }, - { - "name": "ApplyFormat", - "ms": 9.155000001192093 - }, - { - "name": "ListRevisions", - "ms": 11.66499999165535 - }, - { - "name": "GetPackageContentHash", - "ms": 153.84999999403954 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 336.3899999856949, - "calls": [ - { - "name": "ListRevisions", - "ms": 10.979999989271164 - }, - { - "name": "BeginTransaction", - "ms": 138.50500002503395 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 3.405000001192093 - }, - { - "name": "ApplyFormat", - "ms": 8.604999989271164 - }, - { - "name": "ListRevisions", - "ms": 11.609999984502792 - }, - { - "name": "GetPackageContentHash", - "ms": 162.5 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "formatted", - "root": "installed", - "version": "12.6.0", - "attempts": [ - { - "iteration": 0, - "ms": 35.54499998688698, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 35.480000019073486 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 18.025000005960464, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 18.014999985694885 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 17.375, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 17.365000009536743 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "interiorInsertion": { - "offset": 46, - "supported": false, - "error": { - "code": "offset_out_of_range", - "message": "a zero-length span must sit on a run boundary", - "anchorId": "p:body:4710ebe8b1d02e1d73fe75c7a85af48f" - }, - "unchanged": true - }, - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "formatted", - "root": "installed", - "version": "12.6.0", - "attempts": [ - { - "iteration": 0, - "ms": 35.275000005960464, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 35.19999998807907 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 17.560000002384186, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 17.55000001192093 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 16.91499999165535, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 16.900000005960464 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "interiorInsertion": { - "offset": 46, - "supported": false, - "error": { - "code": "offset_out_of_range", - "message": "a zero-length span must sit on a run boundary", - "anchorId": "p:body:4710ebe8b1d02e1d73fe75c7a85af48f" - }, - "unchanged": true - }, - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "batch", - "root": "installed", - "version": "12.6.0", - "attempts": [ - { - "iteration": 0, - "ms": 390.2600000202656, - "calls": [ - { - "name": "ListRevisions", - "ms": 24.62000000476837 - }, - { - "name": "BeginTransaction", - "ms": 164.43499997258186 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 13.254999995231628 - }, - { - "name": "ApplyFormat", - "ms": 12.254999995231628 - }, - { - "name": "ListRevisions", - "ms": 12.615000009536743 - }, - { - "name": "GetPackageContentHash", - "ms": 156.3149999976158 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 333.0349999964237, - "calls": [ - { - "name": "ListRevisions", - "ms": 10.945000022649765 - }, - { - "name": "BeginTransaction", - "ms": 136.43499997258186 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 6.284999996423721 - }, - { - "name": "ApplyFormat", - "ms": 8.979999989271164 - }, - { - "name": "ListRevisions", - "ms": 11.409999996423721 - }, - { - "name": "GetPackageContentHash", - "ms": 158.02000001072884 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 337.2549999952316, - "calls": [ - { - "name": "ListRevisions", - "ms": 11.780000001192093 - }, - { - "name": "BeginTransaction", - "ms": 137.58500000834465 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 3.520000010728836 - }, - { - "name": "ApplyFormat", - "ms": 8.675000011920929 - }, - { - "name": "ListRevisions", - "ms": 11.969999998807907 - }, - { - "name": "GetPackageContentHash", - "ms": 162.77500000596046 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - } - ] -} diff --git a/docs/benchmarks/2026-09-15-native-transactions.json b/docs/benchmarks/2026-09-15-native-transactions.json deleted file mode 100644 index 0e4f5e0..0000000 --- a/docs/benchmarks/2026-09-15-native-transactions.json +++ /dev/null @@ -1,394 +0,0 @@ -{ - "startedAt": "2026-09-15T05:06:47.654Z", - "sha256": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "packages": { - "installed": { - "version": "12.6.0", - "sessionHash": "ab8ed26c11cd76a5a306fe7dd49545aca5af81c7f8ee1aed1048fb6610e4964d", - "runtimeHash": "086d315ffd021e094757fc9c2ce2d321e3024654098e8f6d7d274b7bbb4c1e03" - } - }, - "browser": "143.0.7499.4", - "machine": { - "cpu": "Intel(R) Core(TM) Ultra 7 258V", - "logicalCpus": 8, - "platform": "linux", - "arch": "x64" - }, - "workload": "The same text-plus-Bold edit via executeBatch and replaceMatch(match, text, format); first attempt and two repeats after undo/redo, in fresh batch/formatted/formatted/batch browser contexts.", - "cpuThrottling": false, - "runs": [ - { - "label": "batch", - "root": "installed", - "version": "12.6.0", - "attempts": [ - { - "iteration": 0, - "ms": 673.1999999880791, - "calls": [ - { - "name": "ListRevisions", - "ms": 41.354999989271164 - }, - { - "name": "BeginTransaction", - "ms": 269.6850000023842 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 20.74500000476837 - }, - { - "name": "ApplyFormat", - "ms": 18.689999997615814 - }, - { - "name": "ListRevisions", - "ms": 25.99500000476837 - }, - { - "name": "GetPackageContentHash", - "ms": 285.90000000596046 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 565.005000025034, - "calls": [ - { - "name": "ListRevisions", - "ms": 18.514999985694885 - }, - { - "name": "BeginTransaction", - "ms": 223.25499999523163 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 9.689999997615814 - }, - { - "name": "ApplyFormat", - "ms": 15.275000005960464 - }, - { - "name": "ListRevisions", - "ms": 20.290000021457672 - }, - { - "name": "GetPackageContentHash", - "ms": 276.44499999284744 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 564.9449999928474, - "calls": [ - { - "name": "ListRevisions", - "ms": 18.945000022649765 - }, - { - "name": "BeginTransaction", - "ms": 229.01499998569489 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 5.405000001192093 - }, - { - "name": "ApplyFormat", - "ms": 15.26000002026558 - }, - { - "name": "ListRevisions", - "ms": 20.594999998807907 - }, - { - "name": "GetPackageContentHash", - "ms": 274.4399999976158 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "formatted", - "root": "installed", - "version": "12.6.0", - "attempts": [ - { - "iteration": 0, - "ms": 52.90500000119209, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 52.80000001192093 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 27.990000009536743, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 27.974999994039536 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 24.275000005960464, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 24.264999985694885 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "formatted", - "root": "installed", - "version": "12.6.0", - "attempts": [ - { - "iteration": 0, - "ms": 53.00499999523163, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 52.91499999165535 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 26.855000019073486, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 26.834999978542328 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 24.354999989271164, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 24.344999998807907 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "batch", - "root": "installed", - "version": "12.6.0", - "attempts": [ - { - "iteration": 0, - "ms": 560.8050000071526, - "calls": [ - { - "name": "ListRevisions", - "ms": 37.10999998450279 - }, - { - "name": "BeginTransaction", - "ms": 238.62000000476837 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 18.63000002503395 - }, - { - "name": "ApplyFormat", - "ms": 17.87999999523163 - }, - { - "name": "ListRevisions", - "ms": 19.355000019073486 - }, - { - "name": "GetPackageContentHash", - "ms": 219.58500000834465 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 410.30500000715256, - "calls": [ - { - "name": "ListRevisions", - "ms": 14.550000011920929 - }, - { - "name": "BeginTransaction", - "ms": 170.00999999046326 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 7.300000011920929 - }, - { - "name": "ApplyFormat", - "ms": 11.379999995231628 - }, - { - "name": "ListRevisions", - "ms": 15.23999997973442 - }, - { - "name": "GetPackageContentHash", - "ms": 190.56999999284744 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 410.99000000953674, - "calls": [ - { - "name": "ListRevisions", - "ms": 14.659999996423721 - }, - { - "name": "BeginTransaction", - "ms": 166.03500002622604 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 4.0799999833106995 - }, - { - "name": "ApplyFormat", - "ms": 10.519999980926514 - }, - { - "name": "ListRevisions", - "ms": 15.099999994039536 - }, - { - "name": "GetPackageContentHash", - "ms": 199.6449999809265 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - } - ] -} diff --git a/docs/benchmarks/2026-09-15-nvca-integrity.json b/docs/benchmarks/2026-09-15-nvca-integrity.json deleted file mode 100644 index 7c4a92c..0000000 --- a/docs/benchmarks/2026-09-15-nvca-integrity.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "applicationRevision": "7a2bac58e732a97cbb81ccaac65bb1bd3dd8b8fd", - "engineVersion": "12.6.0", - "workload": "Source-harness NVCA integrity test; native default Markdown patches. Timings include typing, debounce and layout and are not input-to-paint latency.", - "result": "passed", - "nativePaginationDifferential": "passed on the same NVCA fixture; pages, HTML and fragment maps match native pagination", - "report": { - "fixture": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pageCount": 65, - "bodyParagraphs": 234, - "footnoteParagraphs": 110, - "loadMs": 4871, - "timings": [ - { - "id": "h:body:3c7febe8565d200c894a4f2d964412b6", - "commitMs": 784, - "layoutMs": 996 - }, - { - "id": "p:body:1ef8f6933054e4feca6a87faff1ea462", - "commitMs": 796, - "layoutMs": 1018 - }, - { - "id": "p:body:256139579825824ada5ca0771f6f4c50", - "commitMs": 891, - "layoutMs": 1407 - }, - { - "id": "h:body:0d11ade95e3163f93766a9df86fd877f", - "commitMs": 813, - "layoutMs": 1036 - }, - { - "id": "p:body:33eab5a76953e018050c4229ff7eea41", - "commitMs": 850, - "layoutMs": 1406 - }, - { - "id": "h:body:46649e27ec54936020588d7037db9938", - "commitMs": 778, - "layoutMs": 999 - }, - { - "id": "p:body:8a1aabf3b3f0e5935244b196f36efdbf", - "commitMs": 833, - "layoutMs": 1112 - }, - { - "id": "h:body:1ad843a6f253e5b1f4af942b1c6a9c08", - "commitMs": 837, - "layoutMs": 1079 - }, - { - "id": "p:body:86ad5c34e28fe5137e7913ad02ab7c00", - "commitMs": 807, - "layoutMs": 1036 - }, - { - "id": "p:fn:1e74d934ae84a7483f06cb093bce7c16", - "commitMs": 905, - "layoutMs": 1403 - }, - { - "id": "p:fn:c4dc0f76adfbbb22afab2af3c6b9eae1", - "commitMs": 843, - "layoutMs": 1372 - }, - { - "id": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea", - "commitMs": 910, - "layoutMs": 1436 - } - ], - "modifiedParagraphs": 13, - "addedParagraphs": 1, - "nativeCommits": 31, - "assertions": [ - "all body and footnote text editable", - "stable pagination at 50%, 100%, 200%", - "typing at 12 locations", - "undo/redo", - "typing through repeated background conversions", - "selected formatting", - "split/paste/merge", - "final keystroke saved", - "reopened native DOCX valid", - "all original text preserved outside intentional edits", - "unchanged paragraph XML preserved", - "fields/bookmarks/notes/sections preserved", - "other package parts unchanged" - ] - } -} diff --git a/docs/benchmarks/2026-09-16-latency.json b/docs/benchmarks/2026-09-16-latency.json deleted file mode 100644 index d4fe6e0..0000000 --- a/docs/benchmarks/2026-09-16-latency.json +++ /dev/null @@ -1,2159 +0,0 @@ -{ - "date": "2026-09-16", - "engine": "12.6.1", - "machine": "Intel Core Ultra 7 258V; 8 logical CPUs; Linux x64", - "browser": "Chromium 143.0.7499.4", - "viewport": [ - 1480, - 1050 - ], - "cpuThrottling": false, - "latencyLimitMs": 150, - "runs": [ - { - "mode": "module", - "profile": false, - "extended": true, - "build": "4273011", - "workspaceCommit": "42730114ee3fccfe12a4ec82d1997fd79ebc9ebb", - "workspaceDirty": false, - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "target": "p:body:4710ebe8b1d02e1d73fe75c7a85af48f", - "targetRegion": "default", - "nativeText": "The Certificate of Incorporation is a key document produced in connection with a venture capital portfolio investment. Among other things, the Corporation\u2019s Certificate of Incorporation establishes the powers, preferences and special rights of each class and series of the Corporation\u2019s stock.", - "errors": [], - "gatePassed": true, - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 9.495000004768372, - "p95": 14.800000011920929, - "max": 16.990000009536743 - }, - "eventTiming": { - "n": 98, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 134, - "lastEditToCurrentLayout": 1199.905000001192 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 8.580000013113022, - "p95": 15.115000009536743, - "max": 16.189999997615814 - }, - "eventTiming": { - "n": 25, - "p50": 16, - "p95": 16, - "max": 24 - }, - "longestTask": 0, - "lastEditToCurrentLayout": null - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.645000010728836, - "p95": 14.909999996423721, - "max": 16.205000013113022 - }, - "eventTiming": { - "n": 51, - "p50": 16, - "p95": 24, - "max": 40 - }, - "longestTask": 102, - "lastEditToCurrentLayout": 544.8999999761581 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 50.0450000166893, - "p95": 50.0450000166893, - "max": 52.09000000357628 - }, - "eventTiming": { - "n": 2, - "p50": 56, - "p95": 56, - "max": 56 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 122.05000001192093 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 7.879999995231628, - "p95": 14.53999999165535, - "max": 16.564999997615814 - }, - "eventTiming": { - "n": 24, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 89, - "lastEditToCurrentLayout": 990.3150000274181 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.649999976158142, - "p95": 15.490000009536743, - "max": 16.62000000476837 - }, - "eventTiming": { - "n": 56, - "p50": 16, - "p95": 24, - "max": 40 - }, - "longestTask": 142, - "lastEditToCurrentLayout": 1052.6949999928474, - "setup": { - "offset": 900, - "runBoundary": false - } - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 61.729999989271164, - "p95": 61.729999989271164, - "max": 61.729999989271164 - }, - "eventTiming": { - "n": 2, - "p50": 64, - "p95": 64, - "max": 64 - }, - "longestTask": 171, - "lastEditToCurrentLayout": 3298.7249999940395 - }, - { - "name": "styled_boundary_pause_resume", - "keyToFrame": { - "n": 30, - "p50": 9.889999985694885, - "p95": 15.925000011920929, - "max": 17.16499999165535 - }, - "eventTiming": { - "n": 65, - "p50": 16, - "p95": 24, - "max": 48 - }, - "longestTask": 115, - "lastEditToCurrentLayout": 588.8650000095367, - "setup": { - "offset": 1019, - "runBoundary": true, - "boldBefore": false - } - }, - { - "name": "styled_interior_pause_resume", - "keyToFrame": { - "n": 28, - "p50": 10.125, - "p95": 17.035000026226044, - "max": 17.774999976158142 - }, - "eventTiming": { - "n": 64, - "p50": 16, - "p95": 24, - "max": 48 - }, - "longestTask": 108, - "lastEditToCurrentLayout": 529.5499999821186, - "setup": { - "offset": 59, - "runBoundary": false, - "boldBefore": false - } - } - ] - }, - { - "mode": "studio", - "profile": false, - "extended": true, - "build": "4273011", - "workspaceCommit": "42730114ee3fccfe12a4ec82d1997fd79ebc9ebb", - "workspaceDirty": false, - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "target": "p:body:4710ebe8b1d02e1d73fe75c7a85af48f", - "targetRegion": "default", - "nativeText": "The Certificate of Incorporation is a key document produced in connection with a venture capital portfolio investment. Among other things, the Corporation\u2019s Certificate of Incorporation establishes the powers, preferences and special rights of each class and series of the Corporation\u2019s stock.", - "errors": [], - "gatePassed": false, - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 10.705000013113022, - "p95": 16.479999989271164, - "max": 17.28499999642372 - }, - "eventTiming": { - "n": 98, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 71, - "lastEditToCurrentLayout": 1123.8700000047684 - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 7.764999985694885, - "p95": 12.745000004768372, - "max": 14.634999990463257 - }, - "eventTiming": { - "n": 20, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0, - "lastEditToCurrentLayout": null - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.814999997615814, - "p95": 15.324999988079071, - "max": 16.514999985694885 - }, - "eventTiming": { - "n": 58, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 130, - "lastEditToCurrentLayout": 460.9950000047684 - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 70.56000000238419, - "p95": 70.56000000238419, - "max": 71.39499998092651 - }, - "eventTiming": { - "n": 3, - "p50": 72, - "p95": 72, - "max": 72 - }, - "longestTask": 70, - "lastEditToCurrentLayout": 175.57000002264977 - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 8.134999990463257, - "p95": 16.115000009536743, - "max": 17.075000017881393 - }, - "eventTiming": { - "n": 26, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 114, - "lastEditToCurrentLayout": 1064.1950000226498 - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 9.21000000834465, - "p95": 16.78499999642372, - "max": 17.104999989271164 - }, - "eventTiming": { - "n": 65, - "p50": 16, - "p95": 24, - "max": 56 - }, - "longestTask": 180, - "lastEditToCurrentLayout": 1093.8900000154972, - "setup": { - "offset": 900, - "runBoundary": false - } - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 139.59000000357628, - "p95": 139.59000000357628, - "max": 139.59000000357628 - }, - "eventTiming": { - "n": 3, - "p50": 152, - "p95": 152, - "max": 152 - }, - "longestTask": 172, - "lastEditToCurrentLayout": 3566.5, - "slowestInteraction": { - "type": "keydown", - "id": 5013, - "at": 1.75, - "duration": 152, - "delay": 3.574999988079071, - "processing": 0.22499999403953552 - }, - "overlappingNativeCalls": [] - }, - { - "name": "styled_boundary_pause_resume", - "keyToFrame": { - "n": 30, - "p50": 9.049999982118607, - "p95": 17.035000026226044, - "max": 17.65999999642372 - }, - "eventTiming": { - "n": 68, - "p50": 16, - "p95": 24, - "max": 32 - }, - "longestTask": 123, - "lastEditToCurrentLayout": 472.8600000143051, - "setup": { - "offset": 1019, - "runBoundary": true, - "boldBefore": false - } - }, - { - "name": "styled_interior_pause_resume", - "keyToFrame": { - "n": 28, - "p50": 10.150000005960464, - "p95": 16.689999997615814, - "max": 16.764999985694885 - }, - "eventTiming": { - "n": 63, - "p50": 16, - "p95": 24, - "max": 40 - }, - "longestTask": 139, - "lastEditToCurrentLayout": 581.0499999821186, - "setup": { - "offset": 59, - "runBoundary": false, - "boldBefore": false - } - } - ] - }, - { - "mode": "studio", - "profile": true, - "extended": true, - "build": "4273011", - "workspaceCommit": "42730114ee3fccfe12a4ec82d1997fd79ebc9ebb", - "workspaceDirty": false, - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 52, - "target": "p:body:4710ebe8b1d02e1d73fe75c7a85af48f", - "targetRegion": "default", - "nativeText": "The Certificate of Incorporation is a key document produced in connection with a venture capital portfolio investment. Among other things, the Corporation\u2019s Certificate of Incorporation establishes the powers, preferences and special rights of each class and series of the Corporation\u2019s stock.", - "errors": [], - "gatePassed": false, - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 9.379999995231628, - "p95": 16.025000005960464, - "max": 16.99500000476837 - }, - "eventTiming": { - "n": 85, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 108, - "lastEditToCurrentLayout": 1265.2750000059605, - "nativeCalls": { - "native.GetFormatting": { - "count": 3, - "totalMs": 34.900000005960464, - "maxMs": 21.020000010728836 - }, - "native.ReplaceTextAtSpan": { - "count": 1, - "totalMs": 52.34499999880791, - "maxMs": 52.34499999880791 - }, - "native.GetPageMapStatus": { - "count": 1, - "totalMs": 1.7750000059604645, - "maxMs": 1.7750000059604645 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 1.320000022649765, - "maxMs": 1.320000022649765 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 0.39000001549720764, - "maxMs": 0.20000001788139343 - }, - "native.ListComments": { - "count": 1, - "totalMs": 0.06000000238418579, - "maxMs": 0.06000000238418579 - }, - "native.ListImages": { - "count": 2, - "totalMs": 2.0150000154972076, - "maxMs": 1.1349999904632568 - }, - "native.ListContentControls": { - "count": 2, - "totalMs": 1.4149999916553497, - "maxMs": 0.8649999797344208 - }, - "native.RawGetXml": { - "count": 6, - "totalMs": 2.409999966621399, - "maxMs": 0.7450000047683716 - }, - "native.ListAnnotations": { - "count": 1, - "totalMs": 2.5, - "maxMs": 2.5 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 94.9699999988079, - "maxMs": 94.9699999988079 - } - } - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 8.25, - "p95": 11.4200000166893, - "max": 12.430000007152557 - }, - "eventTiming": { - "n": 24, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0, - "lastEditToCurrentLayout": null - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.745000004768372, - "p95": 14.115000009536743, - "max": 15.514999985694885 - }, - "eventTiming": { - "n": 51, - "p50": 16, - "p95": 24, - "max": 40 - }, - "longestTask": 160, - "lastEditToCurrentLayout": 460.94999998807907, - "nativeCalls": { - "native.GetFormatting": { - "count": 18, - "totalMs": 197.9399999976158, - "maxMs": 24.979999989271164 - }, - "native.ReplaceTextAtSpan": { - "count": 6, - "totalMs": 113.24999997019768, - "maxMs": 62.09499999880791 - }, - "native.ListAnchors": { - "count": 6, - "totalMs": 9.405000060796738, - "maxMs": 1.9000000059604645 - }, - "native.GetListMembership": { - "count": 12, - "totalMs": 2.4950000643730164, - "maxMs": 0.39000001549720764 - }, - "native.ListComments": { - "count": 6, - "totalMs": 0.32499998807907104, - "maxMs": 0.08000001311302185 - }, - "native.ListImages": { - "count": 11, - "totalMs": 14.814999997615814, - "maxMs": 2.119999974966049 - }, - "native.ListContentControls": { - "count": 11, - "totalMs": 11.71000000834465, - "maxMs": 2.1500000059604645 - }, - "native.RawGetXml": { - "count": 6, - "totalMs": 50.76500004529953, - "maxMs": 40.064999997615814 - }, - "native.ListAnnotations": { - "count": 5, - "totalMs": 0.7899999916553497, - "maxMs": 0.1899999976158142 - }, - "native.RenderEditorBlocksHtml": { - "count": 5, - "totalMs": 64.91499999165535, - "maxMs": 19.83500000834465 - } - } - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 49.764999985694885, - "p95": 49.764999985694885, - "max": 50.53000000119209 - }, - "eventTiming": { - "n": 4, - "p50": 24, - "p95": 56, - "max": 56 - }, - "longestTask": 0, - "lastEditToCurrentLayout": 165.18000000715256, - "nativeCalls": { - "native.ApplyFormat": { - "count": 1, - "totalMs": 13.519999980926514, - "maxMs": 13.519999980926514 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 12.514999985694885, - "maxMs": 12.514999985694885 - }, - "native.GetFormatting": { - "count": 1, - "totalMs": 11.234999984502792, - "maxMs": 11.234999984502792 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 0.3400000035762787, - "maxMs": 0.19499999284744263 - }, - "native.ListComments": { - "count": 1, - "totalMs": 0.04499998688697815, - "maxMs": 0.04499998688697815 - }, - "native.ListImages": { - "count": 2, - "totalMs": 2.060000032186508, - "maxMs": 1.1100000143051147 - }, - "native.ListContentControls": { - "count": 2, - "totalMs": 1.5900000035762787, - "maxMs": 0.9650000035762787 - }, - "native.RawGetXml": { - "count": 1, - "totalMs": 0.3700000047683716, - "maxMs": 0.3700000047683716 - }, - "native.ListAnnotations": { - "count": 1, - "totalMs": 0.4099999964237213, - "maxMs": 0.4099999964237213 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 17.71000000834465, - "maxMs": 17.71000000834465 - } - } - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 8.944999992847443, - "p95": 14.379999995231628, - "max": 16.569999992847443 - }, - "eventTiming": { - "n": 34, - "p50": 16, - "p95": 24, - "max": 48 - }, - "longestTask": 103, - "lastEditToCurrentLayout": 1124.8900000154972, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 81.02000001072884, - "maxMs": 30.060000002384186 - }, - "native.ReplaceTextAtSpan": { - "count": 2, - "totalMs": 27.33500000834465, - "maxMs": 15.88500002026558 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 4.229999989271164, - "maxMs": 2.6749999821186066 - }, - "native.GetListMembership": { - "count": 4, - "totalMs": 1.2849999964237213, - "maxMs": 0.39499998092651367 - }, - "native.ListComments": { - "count": 2, - "totalMs": 0.14000001549720764, - "maxMs": 0.07000002264976501 - }, - "native.ListImages": { - "count": 3, - "totalMs": 5.034999996423721, - "maxMs": 1.7400000095367432 - }, - "native.ListContentControls": { - "count": 3, - "totalMs": 3.5300000309944153, - "maxMs": 1.2650000154972076 - }, - "native.RawGetXml": { - "count": 7, - "totalMs": 2.975000023841858, - "maxMs": 0.7399999797344208 - }, - "native.ListAnnotations": { - "count": 1, - "totalMs": 0.28999999165534973, - "maxMs": 0.28999999165534973 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 21.569999992847443, - "maxMs": 21.569999992847443 - } - } - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 10.504999995231628, - "p95": 18.064999997615814, - "max": 54.51500001549721 - }, - "eventTiming": { - "n": 61, - "p50": 16, - "p95": 24, - "max": 64 - }, - "longestTask": 125, - "lastEditToCurrentLayout": 1063.9200000166893, - "setup": { - "offset": 900, - "runBoundary": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 50.415000051259995, - "maxMs": 14.685000002384186 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 148.0199999809265, - "maxMs": 95.9549999833107 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 1.5350000262260437, - "maxMs": 0.945000022649765 - }, - "native.GetListMembership": { - "count": 4, - "totalMs": 0.4350000023841858, - "maxMs": 0.1850000023841858 - }, - "native.ListComments": { - "count": 2, - "totalMs": 0.05500000715255737, - "maxMs": 0.030000001192092896 - }, - "native.ListImages": { - "count": 3, - "totalMs": 6.804999977350235, - "maxMs": 5.229999989271164 - }, - "native.ListContentControls": { - "count": 3, - "totalMs": 2.280000001192093, - "maxMs": 1.1100000143051147 - }, - "native.RawGetXml": { - "count": 7, - "totalMs": 2.0699999928474426, - "maxMs": 0.7950000166893005 - }, - "native.ListAnnotations": { - "count": 2, - "totalMs": 0.2150000035762787, - "maxMs": 0.12999999523162842 - }, - "native.RenderEditorBlocksHtml": { - "count": 2, - "totalMs": 13.559999972581863, - "maxMs": 7.069999992847443 - } - } - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 97.84999999403954, - "p95": 97.84999999403954, - "max": 97.84999999403954 - }, - "eventTiming": { - "n": 3, - "p50": 104, - "p95": 104, - "max": 104 - }, - "longestTask": 182, - "lastEditToCurrentLayout": 3606.9899999797344, - "nativeCalls": { - "native.SplitParagraph": { - "count": 1, - "totalMs": 13.284999996423721, - "maxMs": 13.284999996423721 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 10.120000004768372, - "maxMs": 10.120000004768372 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 37.2950000166893, - "maxMs": 37.2950000166893 - }, - "native.GetFormatting": { - "count": 355, - "totalMs": 1131.684999704361, - "maxMs": 22.884999990463257 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 0.25, - "maxMs": 0.16999998688697815 - }, - "native.ListComments": { - "count": 1, - "totalMs": 0.025000005960464478, - "maxMs": 0.025000005960464478 - }, - "native.ListImages": { - "count": 2, - "totalMs": 1.5049999952316284, - "maxMs": 0.7700000107288361 - }, - "native.ListContentControls": { - "count": 2, - "totalMs": 1.104999989271164, - "maxMs": 0.6099999845027924 - }, - "native.RawGetXml": { - "count": 6, - "totalMs": 1.5600000321865082, - "maxMs": 0.5949999988079071 - }, - "native.Project": { - "count": 1, - "totalMs": 38.685000002384186, - "maxMs": 38.685000002384186 - }, - "native.Save": { - "count": 1, - "totalMs": 127.56000000238419, - "maxMs": 127.56000000238419 - }, - "native.RegisterPageMap": { - "count": 1, - "totalMs": 152.52499997615814, - "maxMs": 152.52499997615814 - }, - "native.GetPageMapStatus": { - "count": 2, - "totalMs": 0.20499998331069946, - "maxMs": 0.16499999165534973 - } - } - }, - { - "name": "styled_boundary_pause_resume", - "keyToFrame": { - "n": 30, - "p50": 6.965000003576279, - "p95": 15.514999985694885, - "max": 16.594999998807907 - }, - "eventTiming": { - "n": 62, - "p50": 16, - "p95": 24, - "max": 56 - }, - "longestTask": 182, - "lastEditToCurrentLayout": 580.1949999928474, - "setup": { - "offset": 1019, - "runBoundary": true, - "boldBefore": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 85.63499999046326, - "maxMs": 19.90999999642372 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 191.87999999523163, - "maxMs": 125.62999999523163 - }, - "native.GetPageMapStatus": { - "count": 2, - "totalMs": 0.24500000476837158, - "maxMs": 0.1550000011920929 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 2.560000002384186, - "maxMs": 1.3799999952316284 - }, - "native.GetListMembership": { - "count": 4, - "totalMs": 0.8350000083446503, - "maxMs": 0.3449999988079071 - }, - "native.ListComments": { - "count": 2, - "totalMs": 0.11499997973442078, - "maxMs": 0.07499998807907104 - }, - "native.ListImages": { - "count": 3, - "totalMs": 5.18000003695488, - "maxMs": 2.645000010728836 - }, - "native.ListContentControls": { - "count": 3, - "totalMs": 4.325000017881393, - "maxMs": 2.7600000202655792 - }, - "native.RawGetXml": { - "count": 2, - "totalMs": 1.1800000071525574, - "maxMs": 0.7599999904632568 - }, - "native.ListAnnotations": { - "count": 1, - "totalMs": 0.0949999988079071, - "maxMs": 0.0949999988079071 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 34.125, - "maxMs": 34.125 - } - } - }, - { - "name": "styled_interior_pause_resume", - "keyToFrame": { - "n": 28, - "p50": 8.014999985694885, - "p95": 14.8299999833107, - "max": 16.62000000476837 - }, - "eventTiming": { - "n": 66, - "p50": 16, - "p95": 24, - "max": 152 - }, - "longestTask": 246, - "lastEditToCurrentLayout": 607.994999974966, - "setup": { - "offset": 59, - "runBoundary": false, - "boldBefore": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 93.8299999833107, - "maxMs": 22.62999999523163 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 248.2800000011921, - "maxMs": 189.1850000023842 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 2.1400000154972076, - "maxMs": 1.0800000131130219 - }, - "native.GetListMembership": { - "count": 4, - "totalMs": 0.9199999868869781, - "maxMs": 0.35999998450279236 - }, - "native.ListComments": { - "count": 2, - "totalMs": 0.09999999403953552, - "maxMs": 0.06000000238418579 - }, - "native.ListImages": { - "count": 3, - "totalMs": 4.750000029802322, - "maxMs": 1.895000010728836 - }, - "native.ListContentControls": { - "count": 3, - "totalMs": 3.2150000035762787, - "maxMs": 1.4650000035762787 - }, - "native.RawGetXml": { - "count": 2, - "totalMs": 1.2249999940395355, - "maxMs": 0.7100000083446503 - }, - "native.ListAnnotations": { - "count": 1, - "totalMs": 0.16499999165534973, - "maxMs": 0.16499999165534973 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 17.109999984502792, - "maxMs": 17.109999984502792 - } - }, - "slowestInteraction": { - "type": "keydown", - "id": 5661, - "at": 1547.6399999856949, - "duration": 152, - "delay": 137.32499998807907, - "processing": 0.2600000202655792 - }, - "overlappingNativeCalls": [ - { - "name": "native.ReplaceTextAtSpanWithFormat", - "ms": 189.1850000023842, - "at": 1435.1099999845028 - }, - { - "name": "native.GetFormatting", - "ms": 17.740000009536743, - "at": 1624.574999988079 - }, - { - "name": "native.ListAnchors", - "ms": 1.0600000023841858, - "at": 1642.5 - }, - { - "name": "native.GetListMembership", - "ms": 0.1599999964237213, - "at": 1644.7849999964237 - }, - { - "name": "native.ListComments", - "ms": 0.03999999165534973, - "at": 1645.0149999856949 - }, - { - "name": "native.ListImages", - "ms": 1.6400000154972076, - "at": 1645.6499999761581 - }, - { - "name": "native.ListContentControls", - "ms": 1.125, - "at": 1647.3199999928474 - }, - { - "name": "native.RawGetXml", - "ms": 0.5149999856948853, - "at": 1648.8849999904633 - }, - { - "name": "native.GetListMembership", - "ms": 0.10999998450279236, - "at": 1650.2599999904633 - } - ] - } - ] - }, - { - "mode": "module", - "profile": true, - "extended": true, - "build": "4273011", - "workspaceCommit": "42730114ee3fccfe12a4ec82d1997fd79ebc9ebb", - "workspaceDirty": false, - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "target": "li:body:b7c300ea7e2ace0785b708e947cf9c6f", - "targetRegion": "late-body", - "nativeText": "Amendment or Repeal. Any repeal or modification of the foregoing provisions of this Article Tenth shall not adversely affect any right or protection hereunder of any person in respect of any act or omission occurring prior to the time of such repeal or modification. The rights provided hereunder shall inure to the benefit of any Indemnified Person and such person\u2019s heirs, executors and administrators.", - "errors": [], - "gatePassed": true, - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 8.199999988079071, - "p95": 15.305000007152557, - "max": 17.365000009536743 - }, - "eventTiming": { - "n": 94, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 96, - "lastEditToCurrentLayout": 575.2549999952316, - "nativeCalls": { - "native.GetFormatting": { - "count": 3, - "totalMs": 35.20500001311302, - "maxMs": 18.08500000834465 - }, - "native.ReplaceTextAtSpan": { - "count": 1, - "totalMs": 50.18000000715256, - "maxMs": 50.18000000715256 - }, - "native.GetPageMapStatus": { - "count": 1, - "totalMs": 0.6550000011920929, - "maxMs": 0.6550000011920929 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 1.3199999928474426, - "maxMs": 1.3199999928474426 - }, - "native.GetListMembership": { - "count": 1, - "totalMs": 1.6200000047683716, - "maxMs": 1.6200000047683716 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 82.72499999403954, - "maxMs": 82.72499999403954 - } - } - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 7.969999998807907, - "p95": 11.449999988079071, - "max": 16.09000000357628 - }, - "eventTiming": { - "n": 15, - "p50": 16, - "p95": 16, - "max": 24 - }, - "longestTask": 0, - "lastEditToCurrentLayout": null - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 9.055000007152557, - "p95": 16.87000000476837, - "max": 71.75499999523163 - }, - "eventTiming": { - "n": 53, - "p50": 16, - "p95": 56, - "max": 88 - }, - "longestTask": 108, - "lastEditToCurrentLayout": 1062.455000013113, - "nativeCalls": { - "native.GetFormatting": { - "count": 18, - "totalMs": 345.39999997615814, - "maxMs": 62.014999985694885 - }, - "native.ReplaceTextAtSpan": { - "count": 6, - "totalMs": 117.33500000834465, - "maxMs": 32.889999985694885 - }, - "native.ListAnchors": { - "count": 6, - "totalMs": 7.989999949932098, - "maxMs": 1.604999989271164 - }, - "native.GetListMembership": { - "count": 6, - "totalMs": 16.264999955892563, - "maxMs": 3.1649999916553497 - }, - "native.RenderEditorBlocksHtml": { - "count": 6, - "totalMs": 164.59499996900558, - "maxMs": 38.310000002384186 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 2.1299999952316284, - "maxMs": 1.3349999785423279 - } - } - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 73.23500001430511, - "p95": 73.23500001430511, - "max": 74.23500001430511 - }, - "eventTiming": { - "n": 2, - "p50": 80, - "p95": 80, - "max": 80 - }, - "longestTask": 72, - "lastEditToCurrentLayout": 173.17500001192093, - "nativeCalls": { - "native.ApplyFormat": { - "count": 1, - "totalMs": 19.524999976158142, - "maxMs": 19.524999976158142 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 27.360000014305115, - "maxMs": 27.360000014305115 - }, - "native.GetFormatting": { - "count": 1, - "totalMs": 9.465000003576279, - "maxMs": 9.465000003576279 - }, - "native.GetListMembership": { - "count": 1, - "totalMs": 2.375, - "maxMs": 2.375 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 27.37000000476837, - "maxMs": 27.37000000476837 - } - } - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 5.9000000059604645, - "p95": 16.939999997615814, - "max": 17.25 - }, - "eventTiming": { - "n": 27, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 119, - "lastEditToCurrentLayout": 1071.0200000107288, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 120.16999998688698, - "maxMs": 41.75999999046326 - }, - "native.ReplaceTextAtSpan": { - "count": 2, - "totalMs": 25.67500001192093, - "maxMs": 14.575000017881393 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 2.3049999475479126, - "maxMs": 1.1849999725818634 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 3.6500000059604645, - "maxMs": 1.9950000047683716 - }, - "native.RenderEditorBlocksHtml": { - "count": 2, - "totalMs": 41.3299999833107, - "maxMs": 27.555000007152557 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.5799999833106995, - "maxMs": 0.7150000035762787 - } - } - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.590000003576279, - "p95": 15.599999994039536, - "max": 17.61999997496605 - }, - "eventTiming": { - "n": 51, - "p50": 16, - "p95": 24, - "max": 80 - }, - "longestTask": 214, - "lastEditToCurrentLayout": 587.8299999833107, - "setup": { - "offset": 989, - "runBoundary": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 103.24499997496605, - "maxMs": 24.640000015497208 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 243.62499997019768, - "maxMs": 151.78999999165535 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 2.494999974966049, - "maxMs": 1.5399999916553497 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 3.9850000143051147, - "maxMs": 2.330000013113022 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 21.814999997615814, - "maxMs": 21.814999997615814 - } - } - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 93.96000000834465, - "p95": 93.96000000834465, - "max": 93.96000000834465 - }, - "eventTiming": { - "n": 3, - "p50": 104, - "p95": 104, - "max": 104 - }, - "longestTask": 173, - "lastEditToCurrentLayout": 3426.5750000178814, - "nativeCalls": { - "native.SplitParagraph": { - "count": 1, - "totalMs": 15.830000013113022, - "maxMs": 15.830000013113022 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 10.699999988079071, - "maxMs": 10.699999988079071 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 46.39000001549721, - "maxMs": 46.39000001549721 - }, - "native.GetFormatting": { - "count": 355, - "totalMs": 1070.3550000190735, - "maxMs": 23.00499999523163 - }, - "native.GetListMembership": { - "count": 1, - "totalMs": 1.1150000095367432, - "maxMs": 1.1150000095367432 - }, - "native.Save": { - "count": 1, - "totalMs": 149.81500002741814, - "maxMs": 149.81500002741814 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.295000046491623, - "maxMs": 0.5800000131130219 - }, - "native.RegisterPageMap": { - "count": 1, - "totalMs": 143.0499999821186, - "maxMs": 143.0499999821186 - }, - "native.GetPageMapStatus": { - "count": 2, - "totalMs": 0.19499999284744263, - "maxMs": 0.16499999165534973 - } - } - }, - { - "name": "styled_boundary_pause_resume", - "keyToFrame": { - "n": 30, - "p50": 9.474999994039536, - "p95": 15.549999982118607, - "max": 16.75 - }, - "eventTiming": { - "n": 65, - "p50": 16, - "p95": 24, - "max": 64 - }, - "longestTask": 118, - "lastEditToCurrentLayout": 551.5100000202656, - "setup": { - "offset": 1130, - "runBoundary": true, - "boldBefore": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 95.05000001192093, - "maxMs": 19.705000013113022 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 117.61499997973442, - "maxMs": 58.91499999165535 - }, - "native.GetPageMapStatus": { - "count": 2, - "totalMs": 0.1499999761581421, - "maxMs": 0.07499998807907104 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 1.9550000131130219, - "maxMs": 1.0450000166893005 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 4.66499999165535, - "maxMs": 2.8350000083446503 - }, - "native.RenderEditorBlocksHtml": { - "count": 2, - "totalMs": 95.8400000333786, - "maxMs": 76.6700000166893 - } - } - }, - { - "name": "styled_interior_pause_resume", - "keyToFrame": { - "n": 28, - "p50": 9.069999992847443, - "p95": 16.725000023841858, - "max": 17.055000007152557 - }, - "eventTiming": { - "n": 59, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 259, - "lastEditToCurrentLayout": 1270.5900000035763, - "setup": { - "offset": 9, - "runBoundary": false, - "boldBefore": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 92.34999996423721, - "maxMs": 22.280000001192093 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 247.25500002503395, - "maxMs": 188.7650000154972 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 1.8450000286102295, - "maxMs": 1.0800000131130219 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 2.9849999845027924, - "maxMs": 1.8649999797344208 - }, - "native.RenderEditorBlocksHtml": { - "count": 2, - "totalMs": 32.01500001549721, - "maxMs": 17.314999997615814 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.5849999487400055, - "maxMs": 0.7150000035762787 - } - } - } - ] - }, - { - "mode": "module", - "profile": true, - "extended": true, - "build": "4273011", - "workspaceCommit": "42730114ee3fccfe12a4ec82d1997fd79ebc9ebb", - "workspaceDirty": false, - "hash": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pages": 65, - "target": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea", - "targetRegion": "footnote", - "nativeText": "Consider adding other exceptions as provided in Section 9 of the model Indemnification Agreement. Recent provisions may also include exceptions for conduct found to be in violation of the Corporation\u2019s Code of Conduct.", - "errors": [], - "gatePassed": false, - "phases": [ - { - "name": "continuous", - "keyToFrame": { - "n": 49, - "p50": 7.879999995231628, - "p95": 14.769999980926514, - "max": 16.905000001192093 - }, - "eventTiming": { - "n": 93, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 95, - "lastEditToCurrentLayout": 1096.6649999916553, - "nativeCalls": { - "native.GetFormatting": { - "count": 3, - "totalMs": 26.90999999642372, - "maxMs": 16.599999994039536 - }, - "native.ReplaceTextAtSpan": { - "count": 1, - "totalMs": 58.69499999284744, - "maxMs": 58.69499999284744 - }, - "native.GetPageMapStatus": { - "count": 1, - "totalMs": 0.47999998927116394, - "maxMs": 0.47999998927116394 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 1.5199999809265137, - "maxMs": 1.5199999809265137 - }, - "native.GetListMembership": { - "count": 1, - "totalMs": 0.675000011920929, - "maxMs": 0.675000011920929 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 76.68000000715256, - "maxMs": 76.68000000715256 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.4949999749660492, - "maxMs": 0.7049999833106995 - } - } - }, - { - "name": "caret", - "keyToFrame": { - "n": 24, - "p50": 6.604999989271164, - "p95": 13.770000010728836, - "max": 16.719999998807907 - }, - "eventTiming": { - "n": 18, - "p50": 16, - "p95": 16, - "max": 16 - }, - "longestTask": 0, - "lastEditToCurrentLayout": null - }, - { - "name": "pause_resume", - "keyToFrame": { - "n": 30, - "p50": 6.990000009536743, - "p95": 17.2049999833107, - "max": 79.09000000357628 - }, - "eventTiming": { - "n": 52, - "p50": 16, - "p95": 88, - "max": 96 - }, - "longestTask": 110, - "lastEditToCurrentLayout": 1044.8049999773502, - "nativeCalls": { - "native.GetFormatting": { - "count": 18, - "totalMs": 209.2600000500679, - "maxMs": 37.34000000357628 - }, - "native.ReplaceTextAtSpan": { - "count": 6, - "totalMs": 132.7199999988079, - "maxMs": 56.10999998450279 - }, - "native.ListAnchors": { - "count": 6, - "totalMs": 9.375, - "maxMs": 2.2249999940395355 - }, - "native.GetListMembership": { - "count": 6, - "totalMs": 5.5, - "maxMs": 1.2649999856948853 - }, - "native.RenderEditorBlocksHtml": { - "count": 6, - "totalMs": 50.47000002861023, - "maxMs": 17.9200000166893 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.629999965429306, - "maxMs": 0.7849999964237213 - } - } - }, - { - "name": "bold", - "keyToFrame": { - "n": 2, - "p50": 51.53000000119209, - "p95": 51.53000000119209, - "max": 52.99500000476837 - }, - "eventTiming": { - "n": 3, - "p50": 56, - "p95": 56, - "max": 56 - }, - "longestTask": 54, - "lastEditToCurrentLayout": 614.0399999916553, - "nativeCalls": { - "native.ApplyFormat": { - "count": 1, - "totalMs": 14.390000015497208, - "maxMs": 14.390000015497208 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 11.5, - "maxMs": 11.5 - }, - "native.GetFormatting": { - "count": 1, - "totalMs": 15.3299999833107, - "maxMs": 15.3299999833107 - }, - "native.GetListMembership": { - "count": 1, - "totalMs": 0.7149999737739563, - "maxMs": 0.7149999737739563 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 9.069999992847443, - "maxMs": 9.069999992847443 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.6149999797344208, - "maxMs": 0.7599999904632568 - } - } - }, - { - "name": "wrap_resume", - "keyToFrame": { - "n": 14, - "p50": 8.430000007152557, - "p95": 13.275000005960464, - "max": 14.405000001192093 - }, - "eventTiming": { - "n": 36, - "p50": 16, - "p95": 24, - "max": 24 - }, - "longestTask": 90, - "lastEditToCurrentLayout": 1015.3650000095367, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 102.13999998569489, - "maxMs": 60.895000010728836 - }, - "native.ReplaceTextAtSpan": { - "count": 2, - "totalMs": 24.34000000357628, - "maxMs": 16.025000005960464 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 2.8299999833106995, - "maxMs": 1.4199999868869781 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 1.6050000190734863, - "maxMs": 0.8250000178813934 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 8.770000010728836, - "maxMs": 8.770000010728836 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.594999998807907, - "maxMs": 0.7800000011920929 - } - } - }, - { - "name": "styled_pause_resume", - "keyToFrame": { - "n": 25, - "p50": 8.450000017881393, - "p95": 12.564999997615814, - "max": 16.2950000166893 - }, - "eventTiming": { - "n": 56, - "p50": 16, - "p95": 24, - "max": 40 - }, - "longestTask": 181, - "lastEditToCurrentLayout": 1094.375, - "setup": { - "offset": 807, - "runBoundary": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 52.94999998807907, - "maxMs": 16.82499998807907 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 197.69500002264977, - "maxMs": 142.19500002264977 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 1.479999989271164, - "maxMs": 0.9149999916553497 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 0.8300000131130219, - "maxMs": 0.4650000035762787 - }, - "native.RenderEditorBlocksHtml": { - "count": 2, - "totalMs": 9.659999966621399, - "maxMs": 4.924999982118607 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.5950000286102295, - "maxMs": 0.7700000107288361 - } - } - }, - { - "name": "enter", - "keyToFrame": { - "n": 1, - "p50": 35.605000019073486, - "p95": 35.605000019073486, - "max": 35.605000019073486 - }, - "eventTiming": { - "n": 2, - "p50": 40, - "p95": 40, - "max": 40 - }, - "longestTask": 172, - "lastEditToCurrentLayout": 3267.8499999940395, - "nativeCalls": { - "native.SplitParagraph": { - "count": 1, - "totalMs": 6.109999984502792, - "maxMs": 6.109999984502792 - }, - "native.ListAnchors": { - "count": 1, - "totalMs": 9.459999978542328, - "maxMs": 9.459999978542328 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 5.46000000834465, - "maxMs": 5.46000000834465 - }, - "native.GetFormatting": { - "count": 355, - "totalMs": 1124.6599996089935, - "maxMs": 23.070000022649765 - }, - "native.GetListMembership": { - "count": 1, - "totalMs": 0.4399999976158142, - "maxMs": 0.4399999976158142 - }, - "native.Save": { - "count": 1, - "totalMs": 91.125, - "maxMs": 91.125 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.2900000214576721, - "maxMs": 0.5649999976158142 - }, - "native.RegisterPageMap": { - "count": 1, - "totalMs": 142.3449999988079, - "maxMs": 142.3449999988079 - }, - "native.GetPageMapStatus": { - "count": 2, - "totalMs": 0.21000003814697266, - "maxMs": 0.17000001668930054 - } - } - }, - { - "name": "styled_boundary_pause_resume", - "keyToFrame": { - "n": 30, - "p50": 7.930000007152557, - "p95": 16.290000021457672, - "max": 17.21500000357628 - }, - "eventTiming": { - "n": 62, - "p50": 16, - "p95": 24, - "max": 40 - }, - "longestTask": 170, - "lastEditToCurrentLayout": 1032.8850000202656, - "setup": { - "offset": 944, - "runBoundary": true, - "boldBefore": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 6, - "totalMs": 81.78000003099442, - "maxMs": 18.705000013113022 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 191.63500002026558, - "maxMs": 124.88000002503395 - }, - "native.GetPageMapStatus": { - "count": 2, - "totalMs": 0.20500001311302185, - "maxMs": 0.11000001430511475 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 2.030000001192093, - "maxMs": 1.1299999952316284 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 1.3499999940395355, - "maxMs": 0.6949999928474426 - }, - "native.RenderEditorBlocksHtml": { - "count": 1, - "totalMs": 59.90500000119209, - "maxMs": 59.90500000119209 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.6249999701976776, - "maxMs": 0.8449999988079071 - } - } - }, - { - "name": "styled_interior_pause_resume", - "keyToFrame": { - "n": 28, - "p50": 8.259999990463257, - "p95": 15.530000001192093, - "max": 16.544999986886978 - }, - "eventTiming": { - "n": 70, - "p50": 16, - "p95": 24, - "max": 816 - }, - "longestTask": 952, - "lastEditToCurrentLayout": 3682, - "setup": { - "offset": 24, - "runBoundary": false, - "boldBefore": false - }, - "nativeCalls": { - "native.GetFormatting": { - "count": 361, - "totalMs": 1196.1949999034405, - "maxMs": 50.08000001311302 - }, - "native.ReplaceTextAtSpanWithFormat": { - "count": 2, - "totalMs": 52.554999977350235, - "maxMs": 45.57499998807907 - }, - "native.RegisterPageMap": { - "count": 2, - "totalMs": 335.82499998807907, - "maxMs": 199.625 - }, - "native.BeginDeliveryEvidence": { - "count": 1, - "totalMs": 1.3800000250339508, - "maxMs": 1.3800000250339508 - }, - "native.ListRevisions": { - "count": 3, - "totalMs": 47.639999985694885, - "maxMs": 21.469999998807907 - }, - "native.ListComments": { - "count": 2, - "totalMs": 1.3750000298023224, - "maxMs": 1.2950000166893005 - }, - "native.ListAnnotations": { - "count": 2, - "totalMs": 1.0799999833106995, - "maxMs": 1.0349999964237213 - }, - "native.BeginTransaction": { - "count": 1, - "totalMs": 274.3599999845028, - "maxMs": 274.3599999845028 - }, - "native.ReplaceTextAtSpan": { - "count": 1, - "totalMs": 48.64999997615814, - "maxMs": 48.64999997615814 - }, - "native.ApplyFormat": { - "count": 1, - "totalMs": 9.294999986886978, - "maxMs": 9.294999986886978 - }, - "native.CommitTransaction": { - "count": 1, - "totalMs": 1.104999989271164, - "maxMs": 1.104999989271164 - }, - "native.GetPackageContentHash": { - "count": 1, - "totalMs": 284.6599999964237, - "maxMs": 284.6599999964237 - }, - "native.GetPageMapStatus": { - "count": 89, - "totalMs": 3.8799998462200165, - "maxMs": 0.10499998927116394 - }, - "native.ListAnchors": { - "count": 2, - "totalMs": 1.4950000047683716, - "maxMs": 0.9000000059604645 - }, - "native.ListStyles": { - "count": 1, - "totalMs": 19.770000010728836, - "maxMs": 19.770000010728836 - }, - "native.GetListMembership": { - "count": 2, - "totalMs": 0.9000000059604645, - "maxMs": 0.4699999988079071 - }, - "native.Save": { - "count": 1, - "totalMs": 82.70999997854233, - "maxMs": 82.70999997854233 - }, - "native.RawGetXml": { - "count": 5, - "totalMs": 1.3299999833106995, - "maxMs": 0.5949999988079071 - } - }, - "slowestInteraction": { - "type": "keydown", - "id": 8745, - "at": 1568.1950000226498, - "duration": 816, - "delay": 808.8949999809265, - "processing": 0.11000001430511475 - }, - "overlappingNativeCalls": [ - { - "name": "native.RegisterPageMap", - "ms": 199.625, - "at": 1473.7650000154972 - }, - { - "name": "native.BeginDeliveryEvidence", - "ms": 1.3800000250339508, - "at": 1673.719999998808 - }, - { - "name": "native.ListRevisions", - "ms": 13.439999997615814, - "at": 1675.4800000190735 - }, - { - "name": "native.ListComments", - "ms": 1.2950000166893005, - "at": 1688.9900000095367 - }, - { - "name": "native.ListAnnotations", - "ms": 1.0349999964237213, - "at": 1690.3150000274181 - }, - { - "name": "native.BeginTransaction", - "ms": 274.3599999845028, - "at": 1691.3900000154972 - }, - { - "name": "native.GetFormatting", - "ms": 4.370000004768372, - "at": 1965.9850000143051 - }, - { - "name": "native.ReplaceTextAtSpan", - "ms": 48.64999997615814, - "at": 1970.4400000274181 - }, - { - "name": "native.ApplyFormat", - "ms": 9.294999986886978, - "at": 2019.2950000166893 - }, - { - "name": "native.CommitTransaction", - "ms": 1.104999989271164, - "at": 2028.6700000166893 - }, - { - "name": "native.ListRevisions", - "ms": 21.469999998807907, - "at": 2029.9400000274181 - }, - { - "name": "native.ListComments", - "ms": 0.08000001311302185, - "at": 2051.7100000083447 - }, - { - "name": "native.ListAnnotations", - "ms": 0.04499998688697815, - "at": 2051.800000011921 - }, - { - "name": "native.GetPackageContentHash", - "ms": 284.6599999964237, - "at": 2051.9150000214577 - }, - { - "name": "native.GetPageMapStatus", - "ms": 0.04499998688697815, - "at": 2336.7300000190735 - }, - { - "name": "native.GetFormatting", - "ms": 4.659999996423721, - "at": 2336.815000027418 - }, - { - "name": "native.ListAnchors", - "ms": 0.5949999988079071, - "at": 2341.5700000226498 - }, - { - "name": "native.ListStyles", - "ms": 19.770000010728836, - "at": 2342.8050000071526 - }, - { - "name": "native.GetListMembership", - "ms": 0.4300000071525574, - "at": 2363.020000010729 - }, - { - "name": "native.ListRevisions", - "ms": 12.729999989271164, - "at": 2363.675000011921 - } - ] - } - ] - } - ], - "limits": [ - "Serial production runs on one machine, not population INP or an editor-wide latency guarantee.", - "Chrome Event Timing is quantized and collected with a 16 ms threshold; key-to-rAF excludes prior event queuing.", - "All nine historical extended phases are retained at each target. Late-body and footnote samples use the last rendered paragraph with more than 180 visible characters in that story.", - "Two of five runs passed the full 150 ms gate. The original studio measured Enter at 152 ms; the profiled studio measured interior styled typing at 152 ms. Neither result is discarded.", - "The profiled footnote measured 816 ms interior styled typing because its run contains a leading w:tab and w:t; the native operation refuses this mixed-content run and the public atomic batch fallback remains necessary.", - "Full structural layout after Enter is background work and may take seconds. Cold opening, export, multi-paragraph operations, and slower devices are not covered by a 150 ms claim." - ] -} diff --git a/docs/benchmarks/2026-09-16-native-insertion-contract.json b/docs/benchmarks/2026-09-16-native-insertion-contract.json deleted file mode 100644 index 9440467..0000000 --- a/docs/benchmarks/2026-09-16-native-insertion-contract.json +++ /dev/null @@ -1,229 +0,0 @@ -{ - "startedAt": "2026-09-16T03:59:31.375Z", - "sha256": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "packages": { - "installed": { - "version": "12.6.1", - "sessionHash": "ab8ed26c11cd76a5a306fe7dd49545aca5af81c7f8ee1aed1048fb6610e4964d", - "runtimeHash": "f9e82ed508f63a18c0fe1f30bd10a8f46b9173e11266c9c0dfbbe66f5b02d51f", - "engineRuntimeHash": "91cc7688e1a45faf3b265242298b531da39ab1d6833127df256a9f0c2adb69f7" - } - }, - "browser": "143.0.7499.4", - "machine": { - "cpu": "Intel(R) Core(TM) Ultra 7 258V", - "logicalCpus": 8, - "platform": "linux", - "arch": "x64" - }, - "workload": "Two fresh formatted contexts: ordinary body interior insertion, then insertion inside a footnote run with a leading tab and its atomic batch fallback.", - "cpuThrottling": false, - "runs": [ - { - "label": "formatted", - "root": "installed", - "version": "12.6.1", - "attempts": [], - "interiorInsertion": { - "anchorId": "p:body:4710ebe8b1d02e1d73fe75c7a85af48f", - "offset": 46, - "sourceRun": { - "text": "The Certificate of Incorporation is a key document produced in connection with a venture capital portfolio investment.", - "start": 0, - "children": [ - "rPr", - "t" - ] - }, - "supported": true, - "unchanged": false, - "ms": 68.51500001549721, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 68.4200000166893 - } - ], - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "oneVersion": true, - "undo": true, - "redo": true, - "undoXml": true - } - }, - "mixedRunInsertion": { - "anchorId": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea", - "offset": 24, - "sourceRun": { - "text": "Consider adding other exceptions as provided in ", - "start": 0, - "children": [ - "tab", - "t" - ] - }, - "supported": false, - "error": { - "code": "offset_out_of_range", - "message": "interior insertion requires an ordinary character boundary in a plain text run outside fields and inline containers", - "anchorId": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea" - }, - "unchanged": true, - "ms": 6.944999992847443, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 6.9200000166893005 - } - ], - "batchFallback": { - "ms": 621.9250000119209, - "calls": [ - { - "name": "ListRevisions", - "ms": 37.7950000166893 - }, - { - "name": "BeginTransaction", - "ms": 265.0100000202656 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 10.769999980926514 - }, - { - "name": "ApplyFormat", - "ms": 32.375 - }, - { - "name": "ListRevisions", - "ms": 20.49500000476837 - }, - { - "name": "GetPackageContentHash", - "ms": 247.71000000834465 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "oneVersion": true, - "undo": true, - "redo": true, - "undoXml": true - } - } - }, - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "formatted", - "root": "installed", - "version": "12.6.1", - "attempts": [], - "interiorInsertion": { - "anchorId": "p:body:4710ebe8b1d02e1d73fe75c7a85af48f", - "offset": 46, - "sourceRun": { - "text": "The Certificate of Incorporation is a key document produced in connection with a venture capital portfolio investment.", - "start": 0, - "children": [ - "rPr", - "t" - ] - }, - "supported": true, - "unchanged": false, - "ms": 64.61500000953674, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 64.5300000011921 - } - ], - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "oneVersion": true, - "undo": true, - "redo": true, - "undoXml": true - } - }, - "mixedRunInsertion": { - "anchorId": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea", - "offset": 24, - "sourceRun": { - "text": "Consider adding other exceptions as provided in ", - "start": 0, - "children": [ - "tab", - "t" - ] - }, - "supported": false, - "error": { - "code": "offset_out_of_range", - "message": "interior insertion requires an ordinary character boundary in a plain text run outside fields and inline containers", - "anchorId": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea" - }, - "unchanged": true, - "ms": 6.844999998807907, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 6.834999978542328 - } - ], - "batchFallback": { - "ms": 600.1650000214577, - "calls": [ - { - "name": "ListRevisions", - "ms": 39.73499998450279 - }, - { - "name": "BeginTransaction", - "ms": 248.71000000834465 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 6.140000015497208 - }, - { - "name": "ApplyFormat", - "ms": 27.895000010728836 - }, - { - "name": "ListRevisions", - "ms": 20.349999994039536 - }, - { - "name": "GetPackageContentHash", - "ms": 249.79499998688698 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "oneVersion": true, - "undo": true, - "redo": true, - "undoXml": true - } - } - }, - "crossOriginIsolated": true, - "errors": [] - } - ] -} diff --git a/docs/benchmarks/2026-09-16-native-marker-integrity.json b/docs/benchmarks/2026-09-16-native-marker-integrity.json deleted file mode 100644 index 9d28b94..0000000 --- a/docs/benchmarks/2026-09-16-native-marker-integrity.json +++ /dev/null @@ -1,233 +0,0 @@ -{ - "startedAt": "2026-09-16T04:06:25.546Z", - "sha256": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "packages": { - "installed": { - "version": "12.6.1", - "sessionHash": "ab8ed26c11cd76a5a306fe7dd49545aca5af81c7f8ee1aed1048fb6610e4964d", - "runtimeHash": "f9e82ed508f63a18c0fe1f30bd10a8f46b9173e11266c9c0dfbbe66f5b02d51f", - "engineRuntimeHash": "91cc7688e1a45faf3b265242298b531da39ab1d6833127df256a9f0c2adb69f7" - } - }, - "browser": "143.0.7499.4", - "machine": { - "cpu": "Intel(R) Core(TM) Ultra 7 258V", - "logicalCpus": 8, - "platform": "linux", - "arch": "x64" - }, - "workload": "Two fresh formatted contexts: ordinary body interior insertion, then insertion inside a footnote run with a leading tab and its atomic batch fallback.", - "cpuThrottling": false, - "runs": [ - { - "label": "formatted", - "root": "installed", - "version": "12.6.1", - "attempts": [], - "interiorInsertion": { - "anchorId": "p:body:4710ebe8b1d02e1d73fe75c7a85af48f", - "offset": 46, - "sourceRun": { - "text": "The Certificate of Incorporation is a key document produced in connection with a venture capital portfolio investment.", - "start": 0, - "children": [ - "rPr", - "t" - ] - }, - "supported": true, - "unchanged": false, - "ms": 71.68999999761581, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 71.61000001430511 - } - ], - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "nonTextMarkers": true, - "oneVersion": true, - "undo": true, - "redo": true, - "undoXml": true - } - }, - "mixedRunInsertion": { - "anchorId": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea", - "offset": 24, - "sourceRun": { - "text": "Consider adding other exceptions as provided in ", - "start": 0, - "children": [ - "tab", - "t" - ] - }, - "supported": false, - "error": { - "code": "offset_out_of_range", - "message": "interior insertion requires an ordinary character boundary in a plain text run outside fields and inline containers", - "anchorId": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea" - }, - "unchanged": true, - "ms": 7.219999969005585, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 7.2049999833106995 - } - ], - "batchFallback": { - "ms": 610.535000026226, - "calls": [ - { - "name": "ListRevisions", - "ms": 38.825000047683716 - }, - { - "name": "BeginTransaction", - "ms": 263.55500000715256 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 6.2799999713897705 - }, - { - "name": "ApplyFormat", - "ms": 16.264999985694885 - }, - { - "name": "ListRevisions", - "ms": 30.509999990463257 - }, - { - "name": "GetPackageContentHash", - "ms": 247.82500004768372 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "nonTextMarkers": true, - "oneVersion": true, - "undo": true, - "redo": true, - "undoXml": true - } - } - }, - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "formatted", - "root": "installed", - "version": "12.6.1", - "attempts": [], - "interiorInsertion": { - "anchorId": "p:body:4710ebe8b1d02e1d73fe75c7a85af48f", - "offset": 46, - "sourceRun": { - "text": "The Certificate of Incorporation is a key document produced in connection with a venture capital portfolio investment.", - "start": 0, - "children": [ - "rPr", - "t" - ] - }, - "supported": true, - "unchanged": false, - "ms": 64.9899999499321, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 64.90499997138977 - } - ], - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "nonTextMarkers": true, - "oneVersion": true, - "undo": true, - "redo": true, - "undoXml": true - } - }, - "mixedRunInsertion": { - "anchorId": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea", - "offset": 24, - "sourceRun": { - "text": "Consider adding other exceptions as provided in ", - "start": 0, - "children": [ - "tab", - "t" - ] - }, - "supported": false, - "error": { - "code": "offset_out_of_range", - "message": "interior insertion requires an ordinary character boundary in a plain text run outside fields and inline containers", - "anchorId": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea" - }, - "unchanged": true, - "ms": 7.074999988079071, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 7.055000007152557 - } - ], - "batchFallback": { - "ms": 618.1999999880791, - "calls": [ - { - "name": "ListRevisions", - "ms": 38.00999999046326 - }, - { - "name": "BeginTransaction", - "ms": 250.08999997377396 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 6.3299999833106995 - }, - { - "name": "ApplyFormat", - "ms": 16.125 - }, - { - "name": "ListRevisions", - "ms": 30.660000026226044 - }, - { - "name": "GetPackageContentHash", - "ms": 269.4950000047684 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "nonTextMarkers": true, - "oneVersion": true, - "undo": true, - "redo": true, - "undoXml": true - } - } - }, - "crossOriginIsolated": true, - "errors": [] - } - ] -} diff --git a/docs/benchmarks/2026-09-16-native-transactions.json b/docs/benchmarks/2026-09-16-native-transactions.json deleted file mode 100644 index 841c6cb..0000000 --- a/docs/benchmarks/2026-09-16-native-transactions.json +++ /dev/null @@ -1,435 +0,0 @@ -{ - "startedAt": "2026-09-16T03:48:36.653Z", - "sha256": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "packages": { - "installed": { - "version": "12.6.1", - "sessionHash": "ab8ed26c11cd76a5a306fe7dd49545aca5af81c7f8ee1aed1048fb6610e4964d", - "runtimeHash": "f9e82ed508f63a18c0fe1f30bd10a8f46b9173e11266c9c0dfbbe66f5b02d51f", - "engineRuntimeHash": "91cc7688e1a45faf3b265242298b531da39ab1d6833127df256a9f0c2adb69f7" - } - }, - "browser": "143.0.7499.4", - "machine": { - "cpu": "Intel(R) Core(TM) Ultra 7 258V", - "logicalCpus": 8, - "platform": "linux", - "arch": "x64" - }, - "workload": "The same text-plus-Bold edit via executeBatch and replaceMatch(match, text, format); first attempt and two repeats after undo/redo, in fresh batch/formatted/formatted/batch browser contexts. Each formatted context then measures a warm interior insertion and verifies neighboring formatting and undo/redo.", - "cpuThrottling": false, - "runs": [ - { - "label": "batch", - "root": "installed", - "version": "12.6.1", - "attempts": [ - { - "iteration": 0, - "ms": 625.7900000214577, - "calls": [ - { - "name": "ListRevisions", - "ms": 40.0799999833107 - }, - { - "name": "BeginTransaction", - "ms": 263.03999999165535 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 20.24500000476837 - }, - { - "name": "ApplyFormat", - "ms": 20.524999976158142 - }, - { - "name": "ListRevisions", - "ms": 19.634999990463257 - }, - { - "name": "GetPackageContentHash", - "ms": 251.66999998688698 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 523.7399999797344, - "calls": [ - { - "name": "ListRevisions", - "ms": 17.4200000166893 - }, - { - "name": "BeginTransaction", - "ms": 216.6700000166893 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 9.094999998807907 - }, - { - "name": "ApplyFormat", - "ms": 14.150000005960464 - }, - { - "name": "ListRevisions", - "ms": 19 - }, - { - "name": "GetPackageContentHash", - "ms": 246.0600000023842 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 525.625, - "calls": [ - { - "name": "ListRevisions", - "ms": 17.080000013113022 - }, - { - "name": "BeginTransaction", - "ms": 212.65000000596046 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 5.370000004768372 - }, - { - "name": "ApplyFormat", - "ms": 13.290000021457672 - }, - { - "name": "ListRevisions", - "ms": 18.714999973773956 - }, - { - "name": "GetPackageContentHash", - "ms": 257.3400000035763 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "formatted", - "root": "installed", - "version": "12.6.1", - "attempts": [ - { - "iteration": 0, - "ms": 56.00999999046326, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 55.90999999642372 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 29.80000001192093, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 29.780000001192093 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 26.655000001192093, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 26.645000010728836 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "interiorInsertion": { - "offset": 46, - "supported": true, - "unchanged": false, - "ms": 29.08500000834465, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 29.060000002384186 - } - ], - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "formatted", - "root": "installed", - "version": "12.6.1", - "attempts": [ - { - "iteration": 0, - "ms": 56.38500002026558, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 56.28999999165535 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 29.094999998807907, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 29.0799999833107 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 26.634999990463257, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 26.625 - } - ], - "hashPresent": false, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "interiorInsertion": { - "offset": 46, - "supported": true, - "unchanged": false, - "ms": 28.66499999165535, - "calls": [ - { - "name": "ReplaceTextAtSpanWithFormat", - "ms": 28.645000010728836 - } - ], - "checks": { - "text": true, - "bold": true, - "surroundingFormatting": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - "crossOriginIsolated": true, - "errors": [] - }, - { - "label": "batch", - "root": "installed", - "version": "12.6.1", - "attempts": [ - { - "iteration": 0, - "ms": 624.3150000274181, - "calls": [ - { - "name": "ListRevisions", - "ms": 39.125 - }, - { - "name": "BeginTransaction", - "ms": 262.5049999952316 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 20.349999994039536 - }, - { - "name": "ApplyFormat", - "ms": 18.389999985694885 - }, - { - "name": "ListRevisions", - "ms": 19.575000017881393 - }, - { - "name": "GetPackageContentHash", - "ms": 253.91499999165535 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 1, - "ms": 526.8199999928474, - "calls": [ - { - "name": "ListRevisions", - "ms": 17.53999999165535 - }, - { - "name": "BeginTransaction", - "ms": 218.18000000715256 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 9.049999982118607 - }, - { - "name": "ApplyFormat", - "ms": 14.254999995231628 - }, - { - "name": "ListRevisions", - "ms": 19.070000022649765 - }, - { - "name": "GetPackageContentHash", - "ms": 247.34999999403954 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - }, - { - "iteration": 2, - "ms": 526.8950000107288, - "calls": [ - { - "name": "ListRevisions", - "ms": 16.919999986886978 - }, - { - "name": "BeginTransaction", - "ms": 212.6850000023842 - }, - { - "name": "ReplaceTextAtSpan", - "ms": 5.475000023841858 - }, - { - "name": "ApplyFormat", - "ms": 13.534999996423721 - }, - { - "name": "ListRevisions", - "ms": 18.435000002384186 - }, - { - "name": "GetPackageContentHash", - "ms": 258.75 - } - ], - "hashPresent": true, - "checks": { - "text": true, - "bold": true, - "oneVersion": true, - "undo": true, - "redo": true - } - } - ], - "crossOriginIsolated": true, - "errors": [] - } - ] -} diff --git a/docs/benchmarks/2026-09-16-nvca-integrity.json b/docs/benchmarks/2026-09-16-nvca-integrity.json deleted file mode 100644 index c0394e1..0000000 --- a/docs/benchmarks/2026-09-16-nvca-integrity.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "applicationRevision": "42730114ee3fccfe12a4ec82d1997fd79ebc9ebb", - "engineVersion": "12.6.1", - "workload": "Source-harness NVCA integrity test; native default Markdown patches. Timings include typing, debounce and layout and are not input-to-paint latency.", - "result": "passed", - "nativePaginationDifferential": "passed on the same NVCA fixture; pages, HTML and fragment maps match native pagination", - "report": { - "fixture": "d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29", - "pageCount": 65, - "bodyParagraphs": 234, - "footnoteParagraphs": 110, - "loadMs": 8271, - "timings": [ - { - "id": "h:body:3c7febe8565d200c894a4f2d964412b6", - "commitMs": 915, - "layoutMs": 1449 - }, - { - "id": "p:body:1ef8f6933054e4feca6a87faff1ea462", - "commitMs": 933, - "layoutMs": 1385 - }, - { - "id": "p:body:256139579825824ada5ca0771f6f4c50", - "commitMs": 937, - "layoutMs": 2029 - }, - { - "id": "h:body:0d11ade95e3163f93766a9df86fd877f", - "commitMs": 940, - "layoutMs": 1520 - }, - { - "id": "p:body:33eab5a76953e018050c4229ff7eea41", - "commitMs": 958, - "layoutMs": 2020 - }, - { - "id": "h:body:46649e27ec54936020588d7037db9938", - "commitMs": 832, - "layoutMs": 1240 - }, - { - "id": "p:body:8a1aabf3b3f0e5935244b196f36efdbf", - "commitMs": 1034, - "layoutMs": 1462 - }, - { - "id": "h:body:1ad843a6f253e5b1f4af942b1c6a9c08", - "commitMs": 1230, - "layoutMs": 1720 - }, - { - "id": "p:body:86ad5c34e28fe5137e7913ad02ab7c00", - "commitMs": 886, - "layoutMs": 1412 - }, - { - "id": "p:fn:1e74d934ae84a7483f06cb093bce7c16", - "commitMs": 1131, - "layoutMs": 2182 - }, - { - "id": "p:fn:c4dc0f76adfbbb22afab2af3c6b9eae1", - "commitMs": 1100, - "layoutMs": 2035 - }, - { - "id": "p:fn:2e91e2d2f3939557a9ffd809fd7c8cea", - "commitMs": 1321, - "layoutMs": 2222 - } - ], - "modifiedParagraphs": 13, - "addedParagraphs": 1, - "nativeCommits": 31, - "assertions": [ - "all body and footnote text editable", - "stable pagination at 50%, 100%, 200%", - "typing at 12 locations", - "undo/redo", - "typing through repeated background conversions", - "selected formatting", - "split/paste/merge", - "final keystroke saved", - "reopened native DOCX valid", - "all original text preserved outside intentional edits", - "unchanged paragraph XML preserved", - "fields/bookmarks/notes/sections preserved", - "other package parts unchanged" - ] - } -} diff --git a/docs/embedding.md b/docs/embedding.md index 5dd4d35..c3016b4 100644 --- a/docs/embedding.md +++ b/docs/embedding.md @@ -9,7 +9,7 @@ Explore all three layouts in the demo at `?example=modules`. ## Runtime setup ```sh -npm install react-docxodus-viewer docxodus@12.6.1 +npm install react-docxodus-viewer docxodus@12.6.2 npx rdv-copy-runtime public/docxodus ``` diff --git a/docs/performance.md b/docs/performance.md index cb4f719..e8c9af3 100644 --- a/docs/performance.md +++ b/docs/performance.md @@ -1,8 +1,178 @@ # Editor performance campaign -## Published 12.6.1 integration +Generated benchmark JSON and trace files stay outside version control. The +scripts below write to ignored `test-results/` paths by default; local archives +use the ignored `benchmark-results/` directory. This document retains the +measurement summaries, including failed runs, and reproduction commands. -The integration now pins the unmodified `docxodus@12.6.1` and matching export +## Current 12.6.2 results + +All five final production NVCA runs at application revision `af634f9` pass the +strict **150 ms input-response gate across all nine phases**. The largest +observed response is **144 ms**. The module, studio, profiled studio, late-body, +and footnote workloads retain their original targets and editing assertions. +Runs were serial, with other local work paused and no application changes within +the five-run matrix. + +| Maximum observed input response | Module | Studio | Studio, profiled | Late body, profiled | Footnote, profiled | +| --- | ---: | ---: | ---: | ---: | ---: | +| Five ordinary interaction phases | 96 ms | 72 ms | 64 ms | 96 ms | 144 ms | +| Collapsed Enter | 104 ms | 120 ms | 136 ms | 96 ms | 80 ms | +| Original styled pause/resume phase | 24 ms | 48 ms | 24 ms | 40 ms | 32 ms | +| Explicit run-boundary styled typing | 24 ms | 48 ms | 48 ms | 48 ms | 32 ms | +| Explicit interior styled typing | 24 ms | 104 ms | 48 ms | 24 ms | 32 ms | +| Full 150 ms gate | Pass | Pass | Pass | Pass | Pass | + +The unmodified `docxodus@12.6.2` and matching export companion resolve the +leading-tab formatted-insertion exclusion through the supported atomic API. +The previously blocked footnote interior phase falls from **816 ms on 12.6.1 to +32 ms in the final run**. Two React-side changes address additional blocking +work found after the upgrade: + +- Incoming document parsing and sanitization wait for idle input, yield during + traversal, and discard superseded preparation. Width readiness uses a delivered + ResizeObserver measurement, avoiding a forced full-document layout inside the + setup task. Pagination resumes in a separate browser task. In the traced + footnote pause/resume comparison, all incoming setup tasks shrink from + **55.5–80.9 ms to 15.5–20.5 ms**, with no style/layout events inside the new + setup tasks. Layout still occurs separately. +- Canvas anchor resolution reuses the native formatting read instead of scanning + every document anchor after a version change. Canonical formatting aliases + share cached results and invalidate together; story identity and native + transaction guards remain enforced. A preceding 152 ms Enter trace included + 13.3 ms scanning anchors and 86.2 ms rendering changed blocks. The minimal + canvas contract now performs zero full anchor scans before Enter's first + frame; the final profiled module Enter windows also contain none. Other + studio controls still use the inventory where needed. + +The follow-up included fourteen runs: four diagnostic traces, five runs after +the preparation change, and five final runs after the anchor lookup change. +Both intermediate 152 ms Enter failures remain part of these results. Local +setup trace excerpts include verified source callsites, task CPU/wall time, +layout events, and trace digests. +The two original 184 ms events below were not captured again, and their exact +causes remain unproven. These later findings do not retroactively attribute them. + +### Current validation and limits + +Lint, types, library/demo builds, the complete API identity audit, and generated +pagination checks pass. All **82 unit tests and 55 browser contracts** pass, +with two opt-in browser skips; the final application revision's +[CI is green](https://github.com/JSv4/react-docxodus-viewer/actions/runs/35067742366). +Regression coverage includes leading tabs, formatting alias invalidation, and +incoming-layout cancellation during real IME composition, preserving text, +caret, native versions, and undo behavior. + +The full NVCA integrity test and native/cooperative pagination differential both +pass: 65 pages, 234 body paragraphs, 110 footnote paragraphs, 13 intentionally +modified paragraphs, one added paragraph, and 31 native commits. Save/reopen +preserves unrelated paragraph XML, fields, bookmarks, notes, sections, and +package parts. +Production studio/module smoke tests pass (seven tests, one source-only skip). +Packed consumer imports, types, runtime-copy verification, and the Node export +API pass. PDF rendering is skipped because this host denies the unprivileged +user namespaces required by Chromium's process sandbox. + +These are quantized Chrome Event Timing samples on one Intel Core Ultra 7 258V, +Linux x64, Chromium 143.0.7499.4, at 1480×1050 without CPU throttling, collected +with a 16 ms reporting threshold. They do not establish population INP or an +editor-wide maximum. A native call intersecting the rounded event window may +begin after the actual paint; an overlap alone does not establish causality. +Individual native calls and background layout can exceed 150 ms when no sampled +input overlaps them. Structural layout after Enter still takes seconds. +Excluded native structures, compound edits, opening, export, and slower devices +remain outside the measured 150 ms result. + +## Initial 12.6.2 upgrade results + +The initial upgrade pinned the unmodified `docxodus@12.6.2` and matching export +companion. [Upstream #802](https://github.com/JSv4/Docxodus/issues/802) extends the +supported atomic formatted operation to runs with leading tabs, including the +NVCA footnote that caused the remaining 816 ms stall. The full historical +workloads remain the comparison; other excluded structures retain the public +atomic batch. See the [12.6.2 upgrade notes](12.6.2-upgrade.md). + +Five serial production runs at application revision `357c8b6` retained all nine +extended phases and the same NVCA targets used for 12.6.1. Every run passed its +text, formatting, surrounding-text, key-count, and Enter-undo checks. + +| Maximum observed input response | Module | Studio | Studio, profiled | Late body, profiled | Footnote, profiled | +| --- | ---: | ---: | ---: | ---: | ---: | +| Five ordinary interaction phases | 88 ms | 56 ms | 48 ms | 56 ms | 184 ms | +| Collapsed Enter | 64 ms | 80 ms | 120 ms | 96 ms | 72 ms | +| Original styled pause/resume phase | 24 ms | 24 ms | 24 ms | 64 ms | 56 ms | +| Explicit run-boundary styled typing | 48 ms | 24 ms | 24 ms | 88 ms | 56 ms | +| Explicit interior styled typing | 72 ms | 40 ms | 24 ms | 184 ms | 64 ms | +| Full 150 ms gate | Pass | Pass | Pass | Fail | Fail | + +The previously blocked footnote interior phase improved from **816 ms to 64 ms**. +Its two formatted native calls took 53.8 and 41.6 ms, with no transaction setup, +package hash, or native page-map registration in that phase. The supported +operation preserves the tab and original text formatting. + +**The strict 150 ms gate failed in two of the five original runs.** Both +184 ms observations are primarily time queued before the key handler. The late +body keyup waited 172.2 ms before the first native commit in that phase; no +instrumented native call or recorded Long Task overlaps its delay. The footnote +pause/resume keydown waited 163.3 ms during an unattributed 168 ms Long Task, +also without an overlapping native call. A later 289.1 ms native formatted call +in the late-body phase is outside the failed event's time window and does not +explain that delay. + +Two diagnostic repeats added CPU profiles and paused other tool work during +measurement. No application code changed: + +| Maximum observed input response | Late body, CPU profile | Footnote, CPU profile | +| --- | ---: | ---: | +| Entire nine-phase workload | 96 ms | 80 ms | +| Explicit interior styled typing | 24 ms | 16 ms | +| Full 150 ms gate | Pass | Pass | + +The outliers did not reproduce in these repeats, so their internal cause remains +unproven. The repeats do not replace the failures: **five of all seven runs +pass**. An after-run observation of other host CPU activity is insufficient to +attribute either delay to contention. Local diagnostic records retain every +phase, both failed event windows, native call summaries, and source/profile +digests. These are quantized Chrome Event Timing samples on one Intel Core Ultra +7 258V, Linux x64, Chromium 143.0.7499.4, at 1480×1050 without CPU throttling; +they do not establish population INP or an editor-wide maximum. Individual native +calls and background layout can exceed 150 ms even when no sampled key overlaps +them. Structural layout after Enter still takes seconds. Excluded native +structures, compound edits, opening, export, and slower devices remain limits. + +### Native operation checks + +Two fresh native contexts isolated the original NVCA footnote run containing +`w:tab` followed by `w:t`, inserting at offset 24. The atomic formatted operation +now succeeds in **29.5–32.7 ms**, compared with the 600.2–621.9 ms fallback on +12.6.1. Only `ReplaceTextAtSpanWithFormat` executes for the edit. Both contexts +also pass ordinary body insertion (67.9–69.9 ms), exact typed formatting, +surrounding formatting, tab/reference count/order/attributes/text positions, +one-version atomicity, and one-step undo/redo. Undo restores XML after equivalent +namespace prefixes are normalized. + +### Validation + +Lint, types, library/demo builds, the complete API identity audit, and generated +pagination checks pass. All **82 unit tests and 53 browser contracts** pass, with +two opt-in browser skips; the application revision's +[CI is green](https://github.com/JSv4/react-docxodus-viewer/actions/runs/35061889302). +The new browser cases cover one and two leading tabs; the excluded hyperlink +case still verifies the atomic fallback. + +The full NVCA integrity test passes with 65 pages, 234 body paragraphs, 110 +footnote paragraphs, 13 intentionally modified paragraphs, one added paragraph, +and 31 native commits. Save/reopen preserves unrelated paragraph XML, fields, +bookmarks, notes, sections, and package parts. Native and cooperative pagination +match for pages, HTML, and fragment maps on the same fixture. +The production studio and module pages pass seven smoke tests with one +source-only skip. Packed consumer imports, types, runtime-copy verification, +and the Node export API pass. PDF rendering is skipped because this host denies +the unprivileged user namespaces required by Chromium's process sandbox. + +## Historical 12.6.1 results + +The preceding integration pinned the unmodified `docxodus@12.6.1` and matching export companion. The supported atomic text-plus-format operation now handles interior insertion in ordinary text runs, resolving [Docxodus #799](https://github.com/JSv4/Docxodus/issues/799). Excluded structures @@ -25,7 +195,7 @@ Enter-undo checks. | Full 150 ms gate | Pass | Fail | Fail | Pass | Fail | The original unprofiled interior typing cases improved from 384–400 ms on 12.6.0 -to 40–48 ms. **The broader 150 ms goal is still unmet.** Both 152 ms observations +to 40–48 ms. **The broader 150 ms goal was unmet at that revision.** Both 152 ms observations remain in the results; the profiled studio outlier overlapped a 189.2 ms native formatted operation. That measurement does not isolate the native internal cause of its variability. @@ -38,8 +208,8 @@ preserves editing semantics and incurs 199.6 ms for native page-map registration The resumed key waited about 809 ms. Follow-up: [Docxodus #802](https://github.com/JSv4/Docxodus/issues/802). -The [compact latency record](benchmarks/2026-09-16-latency.json) retains all five -runs, actual target anchors/text, native call summaries, and the overlapping +Local diagnostic records retain all five runs, actual target anchors/text, +native call summaries, and the overlapping calls for failed gates. These are quantized Chrome Event Timing observations on one Intel Core Ultra 7 258V, Linux x64, Chromium 143.0.7499.4, at 1480×1050 with no CPU throttling. Full structural layout after Enter still takes seconds, @@ -53,8 +223,7 @@ A serial batch/formatted/formatted/batch comparison measured the supported formatted replacement at 56.0–56.4 ms for the first edit and 26.6–29.8 ms on repeats. Ordinary warm interior insertion took 28.7–29.1 ms. The legacy batch took 624.3–625.8 ms initially and 523.7–526.9 ms on repeats. All twelve replacement -checks and both insertion checks passed, including one-step undo/redo. See the -[native comparison](benchmarks/2026-09-16-native-transactions.json). +checks and both insertion checks passed, including one-step undo/redo. Two additional fresh native contexts isolated the real footnote structure. Ordinary interior insertion succeeded in 64.6–68.5 ms. Insertion into the @@ -62,8 +231,7 @@ tab/text run was refused in 6.8–6.9 ms without changing its version, XML, or formatting. Its atomic fallback took 600.2–621.9 ms even without React, rendering, or a page map. Text, surrounding formatting, one-version atomicity, and undo/redo passed; undo restored the XML with equivalent namespace-prefix spellings -normalized. See the [insertion contract record](benchmarks/2026-09-16-native-insertion-contract.json). -A subsequent [marker integrity check](benchmarks/2026-09-16-native-marker-integrity.json) +normalized. A subsequent marker integrity check also verified that the edited XML retains the tab and footnote-reference count, order, attributes, and positions relative to the text in both fresh contexts. @@ -77,8 +245,7 @@ The full NVCA integrity test passed with 65 pages, 234 body paragraphs, 110 footnote paragraphs, 13 intentionally modified paragraphs, one added paragraph, and 31 native commits. Save/reopen checks preserved unrelated paragraph XML, fields, bookmarks, notes, sections, and package parts. Native and cooperative -pages, HTML, and fragment maps matched on the same fixture. See the -[integrity record](benchmarks/2026-09-16-nvca-integrity.json). +pages, HTML, and fragment maps matched on the same fixture. The built production studio and module pages passed seven smoke tests, with one source-only skip. Packed consumer imports, types, runtime-copy verification, and the Node export @@ -106,7 +273,7 @@ standalone module, full studio, and a module run with native-call profiling: | Explicit middle-of-run styled typing | 400 ms | 384 ms | 384 ms | All text, formatting, surrounding-text, key-count, and Enter-undo checks passed. -**The full 150 ms gate still fails in every run.** The native API accepts a +**The full 150 ms gate failed in every run at that revision.** The native API accepts a zero-length insertion only at a run boundary. For an interior insertion, the editor must borrow a neighboring character for the text operation and apply formatting only to the new text. Those two operations retain the public atomic @@ -117,12 +284,12 @@ page-map registration, 164–171 ms for `BeginTransaction`, and 169–170 ms for `GetPackageContentHash`. The next burst, now at a run boundary created by the first edit, used `ReplaceTextAtSpanWithFormat` in 26–28 ms. The unprofiled 1,184 ms outlier was not individually profiled; it remains in the reported -maximum. See the [compact 12.6.0 record](benchmarks/2026-09-15-latency.json). +maximum. A direct probe against the published runtime confirms that an interior insertion returns `offset_out_of_range` without changing the native version, text, or run -formatting. The [probe record](benchmarks/2026-09-15-native-insertion-contract.json) -includes two fresh contexts and another native batch/formatted comparison. +formatting. The probe used two fresh contexts and another native +batch/formatted comparison. The supported-API follow-up is [Docxodus #799](https://github.com/JSv4/Docxodus/issues/799). These are quantized Chrome Event Timing samples on an Intel Core Ultra 7 258V, @@ -137,7 +304,7 @@ tests passed in CI (two opt-in skips). The full NVCA integrity test passed with paragraphs, one added paragraph, and 31 native commits. It independently checked unrelated paragraph XML, fields, bookmarks, notes, sections, and package parts after save/reopen. Native/cooperative pagination also matched on the same NVCA -fixture. See the [integrity report](benchmarks/2026-09-15-nvca-integrity.json). +fixture. The built production pages also passed seven smoke tests (one source-only skip). Packed entry points, consumer types, runtime-copy verification, and the Node export API check passed. The PDF render test was skipped because this host denies @@ -240,14 +407,12 @@ The full NVCA integrity test also passed on `8fd41f7`: 65 pages, 234 body and 110 footnote paragraphs editable, 13 intentionally modified paragraphs, one added paragraph, and 31 native commits. Independent package inspection confirmed unchanged paragraph XML, fields, bookmarks, notes, sections, and unrelated parts. -The [integrity record](benchmarks/2026-09-13-nvca-integrity.json) includes the -revision and assertions. Its source-harness timings use native default Markdown +The source-harness timings use native default Markdown patches and are not the production input-response metric. The machine was an Intel Core Ultra 7 258V with eight logical CPUs, Chromium 143.0.7499.4, a 1480×1050 viewport, and no CPU throttling. The module rendered -65 pages; the studio's different profile rendered 52. Compact results are in -[the benchmark record](benchmarks/2026-09-13-latency.json). +65 pages; the studio's different profile rendered 52. ## Native transaction reproduction @@ -279,8 +444,7 @@ All twelve text, formatting, version, undo and redo checks passed, with no brows errors. The formatted path called `ReplaceTextAtSpanWithFormat` without `BeginTransaction` or `GetPackageContentHash` bridge calls; batches retained their receipt hashes. These are native-call timings, not browser input response -times. See the [12.6.0 native record](benchmarks/2026-09-15-native-transactions.json) -for exact measurements and fingerprints. Both paths in this comparison use the +times. Both paths in this comparison use the same 12.6.0 package; the older measurements below are historical context. Before 12.6.0, twelve serial batch attempts on the published packages reproduced @@ -299,9 +463,9 @@ begin and again when producing the package equivalence hash. The dependency upgrade alone did not eliminate this workload's stall; these measurements do not assess other 12.5.0 improvements or unreleased upstream builds. All twelve text, formatting, version, undo and redo checks passed, with no browser errors. -The [native benchmark record](benchmarks/2026-09-13-native-transactions.json) -contains the unrounded measurements and package fingerprints. This is a small -diagnostic sample, not a percentile or cross-device latency guarantee. +The local native benchmark reports contain the unrounded measurements and +package fingerprints. This is a small diagnostic sample, not a percentile or +cross-device latency guarantee. ```sh # From this repository, after npm ci and installing Playwright Chromium: @@ -324,17 +488,19 @@ After the timed replacement attempts, each formatted context measures a warm interior insertion. Successful insertions must preserve surrounding formatting, advance the version once, and restore text and runs through one undo and redo. Rejected insertions must leave the native version and formatting unchanged. -Each formatted context also probes the NVCA footnote's tab/text run and verifies -its atomic fallback. `RDV_NATIVE_INSERTIONS_ONLY=1` skips the replacement workload +Each formatted context also probes the NVCA footnote's leading-tab/text run and +requires the pinned engine to accept the atomic insertion. A refusal fails the +check. `RDV_NATIVE_INSERTIONS_ONLY=1` skips the replacement workload and runs only ordinary/mixed-run insertion probes in two fresh contexts. XML undo checks compare expanded namespace names, attribute values, and ordered children because the package snapshot can rename equivalent namespace prefixes. [Docxodus #788](https://github.com/JSv4/Docxodus/issues/788) was resolved in the -published 12.6.0 release, and [#799](https://github.com/JSv4/Docxodus/issues/799) -extends that operation to ordinary interior insertions in 12.6.1. Excluded -structures and disjoint drafts retain the public atomic batch to preserve -neighboring formatting and one-step undo. See the [upgrade notes](12.6.1-upgrade.md). No native runtime +published 12.6.0 release. [#799](https://github.com/JSv4/Docxodus/issues/799) +extends that operation to ordinary interior insertions in 12.6.1, and +[#802](https://github.com/JSv4/Docxodus/issues/802) adds leading-tab runs in 12.6.2. +Other excluded structures and disjoint drafts retain the public atomic batch to +preserve neighboring formatting and one-step undo. See the [upgrade notes](12.6.2-upgrade.md). No native runtime patch or private editing primitive is integrated here. ## Cooperative layout and reproducible interaction measurements @@ -346,7 +512,7 @@ updates run ahead of background layout tasks; owner/version checks discard superseded layouts before handoff. Zoom changes during preparation trigger fresh measurements at the final scale. -The adapter is generated from the pinned 12.4.1 pagination implementation by +The adapter is generated from the pinned 12.6.2 pagination implementation by `node scripts/generate-cooperative-pagination.mjs`. It uses the same engine instance and native helpers, with asynchronous traversal calls and checkpoints. The generator verifies the upstream file's SHA-256; `npm run check:api` also @@ -382,7 +548,13 @@ untouched surrounding text and browser errors are checked. Reports and a screenshot go to `test-results/latency` (override with `RDV_BENCH_OUTPUT`). `RDV_BENCH_PROFILE=1` adds native/canvas call timings; -`RDV_BENCH_CPU=1` independently adds CPU profiles. Use separate output directories +`RDV_BENCH_CPU=1` independently adds CPU profiles. `RDV_BENCH_TRACE=1` records +compressed Chrome traces per phase, including browser tasks, layout, GC, script +samples and a clock-alignment marker. It also records Long Animation Frame +attribution when supported. Traced runs are diagnostic: their instrumentation +and between-phase trace export can affect timings. The report records trace +filenames and data-loss status; lost trace data fails diagnostic validation. +Use separate output directories for repeated runs. `RDV_BENCH_DOC=sample` selects the small sample, and `RDV_BENCH_URL` selects a deployed production build. Run browser benchmarks serially without concurrent builds or other CPU-heavy work. diff --git a/docs/third-party-notices.md b/docs/third-party-notices.md index cabbbad..69dde07 100644 --- a/docs/third-party-notices.md +++ b/docs/third-party-notices.md @@ -1,7 +1,7 @@ # Docxodus The portable page-map checks and generated cooperative pagination adapter are -derived from Docxodus 12.6.1, under the following license. +derived from Docxodus 12.6.2, under the following license. The MIT License (MIT) diff --git a/package-lock.json b/package-lock.json index 11c1cc0..ade1e30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "rdv-copy-runtime": "scripts/copy-runtime-cli.mjs" }, "devDependencies": { - "@docxodus/export": "12.6.1", + "@docxodus/export": "12.6.2", "@eslint/js": "^10.0.1", "@playwright/test": "1.57.0", "@testing-library/jest-dom": "^6.9.1", @@ -23,7 +23,7 @@ "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.2", "@vitest/coverage-v8": "^4.0.14", - "docxodus": "12.6.1", + "docxodus": "12.6.2", "eslint": "^10.4.1", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.5.2", @@ -37,8 +37,8 @@ "vitest": "^4.0.14" }, "peerDependencies": { - "@docxodus/export": "12.6.1", - "docxodus": "12.6.1", + "@docxodus/export": "12.6.2", + "docxodus": "12.6.2", "react": ">=18" }, "peerDependenciesMeta": { @@ -554,9 +554,9 @@ } }, "node_modules/@docxodus/export": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/@docxodus/export/-/export-12.6.1.tgz", - "integrity": "sha512-br7AsYigjKlU4WPFPokJqJJly10ylSeV3XvJsmv9fhhud5K9PkCKgOF1OLOPclQwyUhcbbU7R5t/GxOn9s5Pgw==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@docxodus/export/-/export-12.6.2.tgz", + "integrity": "sha512-Q+WhmpA+/Q2C16kLE8XqJBs5EMxxo8+ejjde+DL4hraiY1CD8B4BZR5/87aHjahkPV+KefHrPHJKgYOysxeb3g==", "dev": true, "license": "MIT", "dependencies": { @@ -573,7 +573,7 @@ "node": ">=22.13.0" }, "peerDependencies": { - "docxodus": "12.6.1" + "docxodus": "12.6.2" } }, "node_modules/@emnapi/core": { @@ -2210,9 +2210,9 @@ "license": "MIT" }, "node_modules/docxodus": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/docxodus/-/docxodus-12.6.1.tgz", - "integrity": "sha512-lLNh6I45wxAGvWlfREsHpgK7llKoup3RpK7bAXVaea4POGbvdZhQUEqdjs5Ons7PBBtGVP7gsade8cg51HeHKQ==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/docxodus/-/docxodus-12.6.2.tgz", + "integrity": "sha512-siYwg1RNtjWsQFefhY0L7Yhj7F/kviHjY/78MNfkc8ZA2FOKnIpXakqsfbNHfqPBpCa4VvV6rsLMexgROTyKdg==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 8de3df1..003612a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "react-docxodus-viewer", "version": "0.8.0", - "description": "React DOCX viewing, review, comparison, editing sessions, history and export powered by Docxodus 12.6.1", + "description": "React DOCX viewing, review, comparison, editing sessions, history and export powered by Docxodus 12.6.2", "type": "module", "main": "./dist/react-docxodus-viewer.es.js", "module": "./dist/react-docxodus-viewer.es.js", @@ -94,12 +94,12 @@ "author": "", "license": "MIT", "peerDependencies": { - "docxodus": "12.6.1", + "docxodus": "12.6.2", "react": ">=18", - "@docxodus/export": "12.6.1" + "@docxodus/export": "12.6.2" }, "devDependencies": { - "@docxodus/export": "12.6.1", + "@docxodus/export": "12.6.2", "@eslint/js": "^10.0.1", "@playwright/test": "1.57.0", "@testing-library/jest-dom": "^6.9.1", @@ -110,7 +110,7 @@ "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.2", "@vitest/coverage-v8": "^4.0.14", - "docxodus": "12.6.1", + "docxodus": "12.6.2", "eslint": "^10.4.1", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.5.2", diff --git a/public/export-assets.json b/public/export-assets.json index e8c5994..127ead5 100644 --- a/public/export-assets.json +++ b/public/export-assets.json @@ -1,7 +1,7 @@ { "schema": "https://docxodus.dev/schemas/export/export-assets/v1", "schemaVersion": 1, - "packageVersion": "12.6.1", + "packageVersion": "12.6.2", "assets": [ { "path": "./docxodus.worker.js", @@ -48,14 +48,14 @@ { "path": "./wasm/_framework/Docxodus.wasm", "mediaType": "application/wasm", - "byteLength": 4631833, - "sha256": "91cc7688e1a45faf3b265242298b531da39ab1d6833127df256a9f0c2adb69f7" + "byteLength": 4632345, + "sha256": "aca15421ba9b1a5d0f8a88702d3cc44ad51374f2b8f8c6d3d60a2ddee68fa185" }, { "path": "./wasm/_framework/DocxodusWasm.wasm", "mediaType": "application/wasm", "byteLength": 522517, - "sha256": "f9e82ed508f63a18c0fe1f30bd10a8f46b9173e11266c9c0dfbbe66f5b02d51f" + "sha256": "787d41885c8866d6f268e2c538a2369668362ee9da3f56b176955fbef7052274" }, { "path": "./wasm/_framework/System.Collections.Concurrent.wasm", @@ -247,7 +247,7 @@ "path": "./wasm/_framework/dotnet.boot.js", "mediaType": "text/javascript", "byteLength": 9374, - "sha256": "e9a546938f1d4bb4382e094660fe106e99fc55cd9f3230e96e2dfebed2e8b8bf" + "sha256": "99ed4c4572d9472922829affe15cfd4ed711eae5000a31d96d186b9424b30c7c" }, { "path": "./wasm/_framework/dotnet.js", @@ -264,8 +264,8 @@ { "path": "./wasm/_framework/dotnet.native.wasm", "mediaType": "application/wasm", - "byteLength": 10303358, - "sha256": "2dfbb9db9c3beff32b92979c77307c19239b176b81f7f117d5b5db46557495c1" + "byteLength": 10303378, + "sha256": "6c2c1c39a2f253a7a3b38aa881fa92f3f4de6db9c8af3ae3124bbcdf94bba2a6" }, { "path": "./wasm/_framework/dotnet.runtime.js", diff --git a/public/wasm/_framework/Docxodus.wasm b/public/wasm/_framework/Docxodus.wasm index 942bccd..807a87e 100644 Binary files a/public/wasm/_framework/Docxodus.wasm and b/public/wasm/_framework/Docxodus.wasm differ diff --git a/public/wasm/_framework/Docxodus.wasm.br b/public/wasm/_framework/Docxodus.wasm.br index 9ef4cdb..2531c56 100644 Binary files a/public/wasm/_framework/Docxodus.wasm.br and b/public/wasm/_framework/Docxodus.wasm.br differ diff --git a/public/wasm/_framework/DocxodusWasm.wasm b/public/wasm/_framework/DocxodusWasm.wasm index c2dbedd..f6df6a5 100644 Binary files a/public/wasm/_framework/DocxodusWasm.wasm and b/public/wasm/_framework/DocxodusWasm.wasm differ diff --git a/public/wasm/_framework/DocxodusWasm.wasm.br b/public/wasm/_framework/DocxodusWasm.wasm.br index 497d999..ee3c263 100644 Binary files a/public/wasm/_framework/DocxodusWasm.wasm.br and b/public/wasm/_framework/DocxodusWasm.wasm.br differ diff --git a/public/wasm/_framework/dotnet.boot.js b/public/wasm/_framework/dotnet.boot.js index 12ecff3..d32f59e 100644 --- a/public/wasm/_framework/dotnet.boot.js +++ b/public/wasm/_framework/dotnet.boot.js @@ -1,7 +1,7 @@ export const config = /*json-start*/{ "mainAssemblyName": "DocxodusWasm.dll", "resources": { - "hash": "sha256-TveNFCgwYY9A9avm8YUPXalgu4dVMxR0DM/Iy5y36Vc=", + "hash": "sha256-Bqbp3Qq9G+yuz4UCPcqrP41ae2uxbsyRfyAQN8Kn2xk=", "jsModuleNative": [ { "name": "dotnet.native.js" @@ -15,7 +15,7 @@ export const config = /*json-start*/{ "wasmNative": [ { "name": "dotnet.native.wasm", - "hash": "sha256-Lfu525w77/MrkpecdzB8GSObF2uB9/EX1bXbRlV0lcE=" + "hash": "sha256-bCwcOaLyU6ejs4qogfqS8/TebbnIrzrjEku835S7oqY=" } ], "coreAssembly": [ @@ -32,12 +32,12 @@ export const config = /*json-start*/{ { "virtualPath": "Docxodus.wasm", "name": "Docxodus.wasm", - "hash": "sha256-kcx2iOGkX687JlJCKYtTHaOasdaDMSffJWqfDCrbafc=" + "hash": "sha256-rKFUIbqbGl0PiohwLTzEStUTdPK4+MbT1got3uaPoYU=" }, { "virtualPath": "DocxodusWasm.wasm", "name": "DocxodusWasm.wasm", - "hash": "sha256-+egu1Qj2OhjA/h8wvRCo9GuRc+ESZsnA37vmb1sC1R8=" + "hash": "sha256-eH1BiFyIZtbyaOLFOKI2lmg2LunaP1axdpVfvvcFInQ=" }, { "virtualPath": "System.Collections.Concurrent.wasm", diff --git a/public/wasm/_framework/dotnet.boot.js.br b/public/wasm/_framework/dotnet.boot.js.br index 1bedb45..abd7f86 100644 Binary files a/public/wasm/_framework/dotnet.boot.js.br and b/public/wasm/_framework/dotnet.boot.js.br differ diff --git a/public/wasm/_framework/dotnet.native.wasm b/public/wasm/_framework/dotnet.native.wasm index 77be77d..dba38f9 100755 Binary files a/public/wasm/_framework/dotnet.native.wasm and b/public/wasm/_framework/dotnet.native.wasm differ diff --git a/public/wasm/_framework/dotnet.native.wasm.br b/public/wasm/_framework/dotnet.native.wasm.br index 18da5c4..87b13e4 100644 Binary files a/public/wasm/_framework/dotnet.native.wasm.br and b/public/wasm/_framework/dotnet.native.wasm.br differ diff --git a/scripts/benchmark-latency.mjs b/scripts/benchmark-latency.mjs index 882353e..14206da 100644 --- a/scripts/benchmark-latency.mjs +++ b/scripts/benchmark-latency.mjs @@ -28,6 +28,7 @@ if (doc === 'nvca') { } const instrument = process.env.RDV_BENCH_PROFILE === '1'; const cpu = process.env.RDV_BENCH_CPU === '1'; +const trace = process.env.RDV_BENCH_TRACE === '1'; const formatting = process.env.RDV_BENCH_FORMAT !== '0'; const wrapping = process.env.RDV_BENCH_WRAP !== '0'; const extended = process.env.RDV_BENCH_EXTENDED === '1'; @@ -65,7 +66,7 @@ try { snapshot.session.getPageMapStatus().availability === 'available' && !canvas.getSnapshot().suspended; }); await page.waitForTimeout(200); - const info = await page.evaluate(async ({instrument, targetRegion}) => { + const info = await page.evaluate(async ({instrument, targetRegion, trace}) => { const toolbar = document.querySelector('.rdv-format-toolbar'); let fiber = toolbar[Object.keys(toolbar).find(k=>k.startsWith('__reactFiber'))]; while (fiber && !fiber.memoizedProps?.editor) fiber = fiber.return; @@ -75,9 +76,9 @@ try { const canvas = editor.canvasEditor; const native = controller.read(s=>s); const root = canvas.root; - window.latency = { editor, controller, native, canvas, root, active: false, events: [], frames: [], longTasks: [], interactions: [], calls: [], versions: [] }; + window.latency = { editor, controller, native, canvas, root, active: false, events: [], frames: [], longTasks: [], longAnimationFrames: [], interactions: [], calls: [], versions: [] }; const state = window.latency; - state.reset = name => { state.name = name; state.start = performance.now(); state.events = []; state.frames = []; state.longTasks = []; state.interactions = []; state.calls = []; state.versions = []; state.active = true; }; + state.reset = name => { state.name = name; state.start = performance.now(); state.events = []; state.frames = []; state.longTasks = []; state.longAnimationFrames = []; state.interactions = []; state.calls = []; state.versions = []; state.active = true; }; for (const type of ['keydown', 'keyup', 'beforeinput', 'input']) { document.addEventListener(type, event => { if (!state.active) return; @@ -91,6 +92,11 @@ try { requestAnimationFrame(frame); new PerformanceObserver(list=>{ if (state.active) state.longTasks.push(...list.getEntries().filter(e=>e.startTime>=state.start).map(e=>({ at:e.startTime, ms:e.duration }))); }).observe({ type:'longtask' }); new PerformanceObserver(list=>{ if (state.active) state.interactions.push(...list.getEntries().filter(e=>e.startTime>=state.start).map(e=>({ type:e.name, id:e.interactionId, at:e.startTime, duration:e.duration, delay:e.processingStart-e.startTime, processing:e.processingEnd-e.processingStart }))); }).observe({ type:'event', durationThreshold:16 }); + if (trace && PerformanceObserver.supportedEntryTypes.includes('long-animation-frame')) { + new PerformanceObserver(list => { + if (state.active) state.longAnimationFrames.push(...list.getEntries().filter(e => e.startTime >= state.start).map(e => e.toJSON())); + }).observe({ type: 'long-animation-frame' }); + } controller.subscribe(()=>{ if(state.active) state.versions.push({at:performance.now(), version:controller.getSnapshot().version, change:controller.getSnapshot().change, map:controller.read(session=>session.getPageMapStatus())}); }); if (instrument) { let depth=0; @@ -117,15 +123,23 @@ try { state.target = target.dataset.sourceAnchorId; const hash=Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',controller.originalBytes))).map(x=>x.toString(16).padStart(2,'0')).join(''); return {target:state.target,targetRegion,text:target.textContent.slice(0,100), nativeText:native.getFormatting(state.target).runs.map(run=>run.text).join(''), hash, pages:root.querySelectorAll('.page-box').length, version:controller.getSnapshot().version, crossOriginIsolated, userAgent:navigator.userAgent, hardwareConcurrency:navigator.hardwareConcurrency}; - }, {instrument, targetRegion}); + }, {instrument, targetRegion, trace}); if(doc==='nvca' && info.hash!=='d75600769c12724990de48149d7a2bb161f3522daa54b1783672f93697d87d29') throw new Error(`Wrong NVCA document: ${info.hash}`); const block = () => page.locator(`#pagination-container [data-source-anchor-id="${info.target}"][data-rdv-editable="true"]`).last(); await block().click(); await page.keyboard.press('End'); await page.waitForTimeout(700); - const cdp = cpu ? await page.context().newCDPSession(page) : null; + const cdp = cpu || trace ? await page.context().newCDPSession(page) : null; const phases=[]; const runPhase = async (name, action) => { - await page.evaluate(name=>window.latency.reset(name), name); - if (cdp) {await cdp.send('Profiler.enable'); await cdp.send('Profiler.start');} + if (trace) await cdp.send('Tracing.start', { + categories: '-*,toplevel,devtools.timeline,v8,blink.user_timing,input,latencyInfo,disabled-by-default-devtools.timeline,disabled-by-default-devtools.timeline.stack,disabled-by-default-v8.cpu_profiler', + options: 'record-as-much-as-possible', + transferMode: 'ReturnAsStream', streamFormat: 'json', streamCompression: 'gzip', + }); + await page.evaluate(({name, trace}) => { + window.latency.reset(name); + if (trace) performance.mark(`rdv-latency:${name}`, { startTime: window.latency.start }); + }, {name, trace}); + if (cpu) {await cdp.send('Profiler.enable'); await cdp.send('Profiler.start');} const start=performance.now(); await action(); const actionMs=performance.now()-start; await page.waitForTimeout(2000); await page.waitForFunction(()=>{ @@ -140,9 +154,27 @@ try { const phase = await page.evaluate(()=>{ const s=window.latency; s.active=false; const after = s.native.getFormatting(s.target)?.runs.map(r=>r.text).join(''); - return { name:s.name,start:s.start,events:s.events,frames:s.frames,longTasks:s.longTasks,interactions:s.interactions,calls:s.calls,versions:s.versions,after,canvasState:s.canvas.getSnapshot() }; + return { name:s.name,start:s.start,events:s.events,frames:s.frames,longTasks:s.longTasks,longAnimationFrames:s.longAnimationFrames,interactions:s.interactions,calls:s.calls,versions:s.versions,after,canvasState:s.canvas.getSnapshot() }; }); - if(cdp) {const profile=await cdp.send('Profiler.stop'); await writeFile(`${directory}/${label}-${name}.cpuprofile`,JSON.stringify(profile.profile));} + if(cpu) {const profile=await cdp.send('Profiler.stop'); await writeFile(`${directory}/${label}-${name}.cpuprofile`,JSON.stringify(profile.profile));} + if (trace) { + const complete = new Promise(resolve => cdp.once('Tracing.tracingComplete', resolve)); + await cdp.send('Tracing.end'); + const {stream, dataLossOccurred} = await complete; + if (!stream) throw new Error('Chrome did not return a trace stream'); + const chunks = []; + try { + for (;;) { + const chunk = await cdp.send('IO.read', {handle: stream}); + chunks.push(Buffer.from(chunk.data, chunk.base64Encoded ? 'base64' : 'utf8')); + if (chunk.eof) break; + } + } finally { await cdp.send('IO.close', {handle: stream}); } + const file = `${label}-${name}.trace.json.gz`; + await writeFile(`${directory}/${file}`, Buffer.concat(chunks)); + phase.trace = {file, marker: `rdv-latency:${name}`, dataLossOccurred}; + if (dataLossOccurred) errors.push(`Trace data lost in ${name}`); + } const keys=phase.events.filter(e=>e.type==='keydown'); const inputs=phase.events.filter(e=>e.type==='input'); const lastInput=inputs.at(-1)?.at; @@ -260,7 +292,7 @@ try { } if(await page.getByRole('alert').count()) errors.push('Visible editor alert'); await page.screenshot({path:`${directory}/${label}.png`}); - const result={label,base,mode,doc,instrument,extended,buildRevision:process.env.RDV_BENCH_REVISION || null,workspaceCommit:execFileSync('git', ['rev-parse', 'HEAD'], { encoding:'utf8' }).trim(),workspaceDirty:!!execFileSync('git', ['status', '--porcelain'], { encoding:'utf8' }).trim(),browser:browser.version(),info,errors,phases}; + const result={label,base,mode,doc,instrument,cpu,trace,extended,buildRevision:process.env.RDV_BENCH_REVISION || null,workspaceCommit:execFileSync('git', ['rev-parse', 'HEAD'], { encoding:'utf8' }).trim(),workspaceDirty:!!execFileSync('git', ['status', '--porcelain'], { encoding:'utf8' }).trim(),browser:browser.version(),info,errors,phases}; await writeFile(`${directory}/${label}.json`,JSON.stringify(result,null,2)); console.log(JSON.stringify({label,info,errors,output:`${directory}/${label}.json`})); if (errors.length) throw new Error(errors.join('; ')); diff --git a/scripts/benchmark-native-transactions.mjs b/scripts/benchmark-native-transactions.mjs index a6f5b4c..5c1ef19 100644 --- a/scripts/benchmark-native-transactions.mjs +++ b/scripts/benchmark-native-transactions.mjs @@ -197,6 +197,7 @@ try { const note = Object.entries(s.project().anchorIndex).find(([id,item]) => /^(p|h|li):fn:/.test(id) && item.textPreview.startsWith('Consider adding other exceptions'))?.[0]; if (!note) throw new Error('Missing NVCA footnote fixture'); mixedRunInsertion = probeInsertion(note, 24, true); + if (!mixedRunInsertion.supported) throw new Error('The pinned engine must support interior insertion after leading tabs'); } s.close(); return {version,attempts,interiorInsertion,mixedRunInsertion,crossOriginIsolated}; @@ -208,6 +209,6 @@ try { await mkdir(dirname(output), {recursive:true}); await writeFile(output,JSON.stringify({startedAt,sha256,packages,browser:browser.version(), machine:{cpu:cpus()[0]?.model, logicalCpus:cpus().length, platform:platform(), arch:arch()}, - workload:insertionOnly ? 'Two fresh formatted contexts: ordinary body interior insertion, then insertion inside a footnote run with a leading tab and its atomic batch fallback.' : 'The same text-plus-Bold edit via executeBatch and replaceMatch(match, text, format); first attempt and two repeats after undo/redo, in fresh batch/formatted/formatted/batch browser contexts. Each formatted context then measures warm ordinary and mixed-run interior insertions and verifies neighboring formatting and undo/redo.', + workload:insertionOnly ? 'Two fresh formatted contexts: ordinary body interior insertion, then atomic insertion inside a footnote run with a leading tab.' : 'The same text-plus-Bold edit via executeBatch and replaceMatch(match, text, format); first attempt and two repeats after undo/redo, in fresh batch/formatted/formatted/batch browser contexts. Each formatted context then measures warm ordinary and leading-tab interior insertions and verifies neighboring formatting and undo/redo.', cpuThrottling:false,runs},null,2)+'\n'); } finally {await browser.close();await new Promise(resolve=>server.close(resolve));} diff --git a/scripts/check-api.mjs b/scripts/check-api.mjs index 98480be..65eb079 100644 --- a/scripts/check-api.mjs +++ b/scripts/check-api.mjs @@ -29,7 +29,7 @@ for (const [entry, upstream] of surfaces) { const entry = await readFile('dist/react-docxodus-viewer.es.js', 'utf8'); assert(!entry.includes('docxodus/react') && !entry.includes('docxodus/editor') && !entry.includes('@docxodus/export'), 'Browser root must not load editor or Node export dependencies'); const metadata = JSON.parse(await readFile('node_modules/docxodus/package.json', 'utf8')); -assert.equal(metadata.version, '12.6.1'); +assert.equal(metadata.version, '12.6.2'); const built = await import('../dist/react-docxodus-viewer.es.js'); const core = await import('docxodus/core'); for (const [name, value] of Object.entries(core)) assert.equal(built[name], value, `Runtime export ${name} changed`); diff --git a/scripts/check-package.mjs b/scripts/check-package.mjs index 7665f00..8cdf22f 100644 --- a/scripts/check-package.mjs +++ b/scripts/check-package.mjs @@ -45,7 +45,7 @@ assert.equal(typeof worker.createWorkerDocxodus, 'function'); assert.equal(typeof browser.convertDocxToPaginatedHtml, 'function'); assert.equal(typeof server.convertDocxToPdf, 'function'); const copied = await copyDocxodusRuntime('./runtime'); -assert.equal(copied.version, '12.6.1'); +assert.equal(copied.version, '12.6.2'); console.log('Packed ESM entry points and runtime-copy helper passed.'); `); process.stdout.write(run(process.execPath, [join(temp, 'consumer.mjs')], temp)); @@ -74,6 +74,6 @@ export function Consumer() { `); run(process.execPath, [resolve(root, 'node_modules/typescript/bin/tsc'), '--noEmit', '--strict', '--skipLibCheck', '--jsx', 'react-jsx', '--target', 'ES2022', '--module', 'ESNext', '--moduleResolution', 'bundler', '--types', 'react,node', 'consumer.tsx'], temp); const metadata = JSON.parse(await readFile(join(temp, 'package/package.json'), 'utf8')); -assert.equal(metadata.peerDependencies.docxodus, '12.6.1'); +assert.equal(metadata.peerDependencies.docxodus, '12.6.2'); assert.equal(metadata.peerDependenciesMeta['@docxodus/export'].optional, true); console.log(`Packed consumer types passed. ${pack.entryCount} files, ${pack.size} compressed bytes. Artifacts: ${temp}`); diff --git a/scripts/copy-runtime-cli.mjs b/scripts/copy-runtime-cli.mjs index b332402..e639549 100755 --- a/scripts/copy-runtime-cli.mjs +++ b/scripts/copy-runtime-cli.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node import { copyDocxodusRuntime } from './copy-runtime.mjs'; -if (process.argv.includes('--help')) console.log('Usage: rdv-copy-runtime [public/docxodus]\nCopies the verified Docxodus 12.6.1 runtime to a static asset directory.'); +if (process.argv.includes('--help')) console.log('Usage: rdv-copy-runtime [public/docxodus]\nCopies the verified Docxodus 12.6.2 runtime to a static asset directory.'); else { const result = await copyDocxodusRuntime(process.argv[2] ?? 'public/docxodus'); console.log(`Copied Docxodus ${result.version} (${result.verifiedAssets} verified assets) to ${result.directory}`); diff --git a/scripts/copy-runtime.mjs b/scripts/copy-runtime.mjs index d4e45e3..9744f5d 100644 --- a/scripts/copy-runtime.mjs +++ b/scripts/copy-runtime.mjs @@ -7,7 +7,7 @@ import { dirname, resolve } from 'node:path'; export async function copyDocxodusRuntime(destination) { const dist = dirname(fileURLToPath(import.meta.resolve('docxodus/core'))); const { version } = JSON.parse(await readFile(resolve(dist, '../package.json'), 'utf8')); - if (version !== '12.6.1') throw new Error(`Expected Docxodus 12.6.1, found ${version}`); + if (version !== '12.6.2') throw new Error(`Expected Docxodus 12.6.2, found ${version}`); const manifest = JSON.parse(await readFile(resolve(dist, 'export-assets.json'), 'utf8')); if (manifest.packageVersion !== version) throw new Error('Export assets do not match the engine version.'); for (const asset of manifest.assets) { diff --git a/scripts/generate-cooperative-pagination.mjs b/scripts/generate-cooperative-pagination.mjs index aadad87..22a8008 100644 --- a/scripts/generate-cooperative-pagination.mjs +++ b/scripts/generate-cooperative-pagination.mjs @@ -44,7 +44,7 @@ const print = node => ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }).pri const helpers = source.statements.filter(node => (ts.isFunctionDeclaration(node) && node.name.text === 'samePageBox') || (ts.isVariableStatement(node) && node.declarationList.declarations.some(decl => ['MAX_FOOTNOTE_AREA_RATIO', 'FOOTNOTE_MEASUREMENT_GUARD_PT'].includes(decl.name.getText(source))))).map(print).join('\n'); const license = await readFile(new URL('node_modules/docxodus/LICENSE', root), 'utf8'); -const output = `/*!\n${license.trim()}\n*/\n// Generated by scripts/generate-cooperative-pagination.mjs. Do not edit.\n// Docxodus 12.6.1 pagination.js SHA-256: ${expectedHash}\n// Only async calls and cooperative loop checkpoints differ from upstream.\nimport { parseSectionDimensions, pxToPt } from 'docxodus/core';\n${helpers}\nexport function createCooperativePagination(engine, checkpoint) {\nconst cooperative = ${print(adapted.transformed[0])};\nfor (const name of Object.keys(cooperative)) cooperative[name] = cooperative[name].bind(engine);\nreturn cooperative;\n}\n`; +const output = `/*!\n${license.trim()}\n*/\n// Generated by scripts/generate-cooperative-pagination.mjs. Do not edit.\n// Docxodus 12.6.2 pagination.js SHA-256: ${expectedHash}\n// Only async calls and cooperative loop checkpoints differ from upstream.\nimport { parseSectionDimensions, pxToPt } from 'docxodus/core';\n${helpers}\nexport function createCooperativePagination(engine, checkpoint) {\nconst cooperative = ${print(adapted.transformed[0])};\nfor (const name of Object.keys(cooperative)) cooperative[name] = cooperative[name].bind(engine);\nreturn cooperative;\n}\n`; adapted.dispose(); const target = new URL('src/rendering/cooperativePagination.generated.js', root); if (process.argv.includes('--check')) { diff --git a/src/components/ComparisonPanel.tsx b/src/components/ComparisonPanel.tsx index e1d6b5c..70f5a8b 100644 --- a/src/components/ComparisonPanel.tsx +++ b/src/components/ComparisonPanel.tsx @@ -53,7 +53,7 @@ export function ComparisonPanel({ wasmBasePath, settings = {} }: ComparisonPanel
{mode !== 'consolidate' &&
Comparison products{ALL_COMPARISON_PRODUCTS.map(product => )}
} -
Advanced comparison options