docs/plans/2026-05-03-slate-v2-dom-present-large-doc-phase-6-plan.md
Move large-document DOM-present staging toward the same DOMCoverageBoundary
substrate proven by hidden/collapsed content, without making virtualization,
shell mode, or stable public boundary slots the default story.
The first executable slice is Phase 6a only: read-only coverage registration and trace visibility for large-doc mounted/pending/shell regions. No staged mounting migration, no behavior change, no virtualization.
mounted, pending-mount, and shell/aggressive reasons.interactiveReady and nativeSurfaceComplete stay separate.slots.Boundary.Current source facts from the live sibling checkout:
LargeDocumentMode is auto | dom-present | off | shell.
Source: .tmp/slate-v2/packages/slate-react/src/large-document/create-island-plan.ts.createIslandPlan marks active islands and leaves far islands with no mounted
runtime ids..tmp/slate-v2/packages/slate-react/src/components/editable-text-blocks.tsx.
Root groups use ROOT_GROUP_SIZE = 50, ROOT_GROUP_THRESHOLD = 1000,
background initial delay 250ms, interval 16ms, and batch size 8.EditableRootGroupPlaceholder outputs data-slate-root-group-state="pending-mount"
and display: none.EditableDOMRoot already receives largeDocument mounted top-level runtime
ids/ranges for shell and DOM-present modes.DOMCoverageBoundary already supports reasons including
large-document-staged, viewport-virtualization, and shell-aggressive.
The registry is root-key indexed and exposes boundary-aware point/range APIs.interactiveReadyAt,
nativeSurfaceCompleteAt, mounted/pending group counts, stale group count,
and surface-weight counters.<Editable> without the
largeDocument option; performance/product proof should use the dedicated
benchmark and large-document runtime tests, not that example alone.Chosen path:
Rejected paths:
nativeSurfaceComplete must be bounded and
measured.Status: complete for this activation.
Evidence:
.tmp/slate-v2/packages/slate-react/src/large-document/create-island-plan.ts.tmp/slate-v2/packages/slate-react/src/components/editable-text-blocks.tsx.tmp/slate-v2/packages/slate-react/src/large-document/large-document-commands.ts.tmp/slate-v2/packages/slate-dom/src/plugin/dom-coverage.ts.tmp/slate-v2/scripts/benchmarks/browser/react/huge-document-legacy-compare.mjsStatus: complete for DOM-present pending root groups.
Scope:
DOMCoverageReason values:
large-document-staged for DOM-present pending groups.shell-aggressive for shell placeholders.Hard gates:
DOMCoverage.getBoundaries(editor).DOMCoverage.getBoundaries(editor) shows one coalesced large-doc staged
boundary for pending DOM-present root groups in tests.Driver tests:
bun test ./packages/slate-react/test/large-doc-and-scroll.tsx
bun test ./packages/slate-dom/test/dom-coverage.ts
Benchmark smoke:
REACT_HUGE_COMPARE_BLOCKS=5000 REACT_HUGE_COMPARE_ITERATIONS=1 REACT_HUGE_COMPARE_TYPE_OPS=3 bun run bench:react:huge-document:legacy-compare:local
Evidence:
bun test ./packages/slate-react/test/large-doc-and-scroll.tsx
bun test ./packages/slate-dom/test/dom-coverage.ts
bun check
REACT_HUGE_COMPARE_BLOCKS=5000 REACT_HUGE_COMPARE_ITERATIONS=1 REACT_HUGE_COMPARE_TYPE_OPS=3 bun run bench:react:huge-document:legacy-compare:local
v2DomPresent.readyMs.mean: 51.73v2DomPresent.nativeSurfaceCompleteAt: 3274.59v2DomPresent.startBlockTypeMs.mean: 8.65v2DomPresent.middleBlockSelectThenTypeMs.mean: 137.29Status: complete.
Scope:
Hard gates:
nativeSurfaceComplete.Evidence:
DOMCoverage before raw DOM
lookup.DOMCoverage
clipboard path for non-excluded covered ranges.Status: complete.
Scope:
Hard gates:
nativeSurfaceComplete is bounded.Evidence:
nativeSurfaceComplete remains measured separately from interactiveReady.
One-iteration 5000-block smoke: v2DomPresent.interactiveReadyAt 22.81 ms,
nativeSurfaceCompleteAt 1141.99 ms, pendingGroupCountAtReady 99,
staleGroupCount 0.Status: deferred; research only, outside this completion target.
Scope:
Required before even considering a product mode:
js-set-map-lookups, js-index-maps,
client-event-listeners, rerender-derived-state,
rerender-defer-reads, js-request-idle-callback only with max-latency
fallbackinteractiveReady, nativeSurfaceComplete, DOM nodes, editable descendants,
root groups, shell count, heap where available| Time | Pass | Status | Evidence | Next |
|---|---|---|---|---|
| 2026-05-03 | phase-6-current-state-map | complete | Live large-doc and DOM coverage owners read; prior Phase 6 gates carried forward; solution note applied | Phase 6a read-only registration |
| 2026-05-03 | phase-6a-read-only-registration | complete | Added root-owned DOM coverage support and DOM-present pending group registration; package tests, bun check, and one-iteration huge-doc benchmark smoke passed | Phase 6b shared bridge |
| 2026-05-03 | phase-6b-shared-bridge | complete | Added mode-specific large-document policy so shell-backed selection is shell-only; DOM-present staged selection export consults DOM coverage before raw DOM lookup; full-document model-backed guard now uses model root count as well as DOM child count; package tests, browser row, and bun check passed | Phase 6c staged mounting convergence |
| 2026-05-03 | phase-6c-staged-mounting-convergence | complete | Added root document epoch and stronger stale-DOM replacement proof; narrowed selection materialization to target root groups; bun check, focused large-doc/DOM coverage tests, Chromium DOM-present native typing row, and 5000-block benchmark smoke passed | Lane complete; virtualization research deferred |
| 2026-05-03 | ce-compound | complete | Captured reusable lesson in docs/solutions/performance-issues/2026-05-03-slate-dom-present-staging-needs-document-epoch-and-range-materialization.md | Completion-check |
.tmp/slate-v2/packages/slate-dom/src/plugin/dom-coverage.ts.tmp/slate-v2/packages/slate-react/src/components/editable-text-blocks.tsx.tmp/slate-v2/packages/slate-react/src/components/editable.tsx.tmp/slate-v2/packages/slate-react/src/editable/keyboard-input-strategy.ts.tmp/slate-v2/packages/slate-react/src/editable/root-selector-sources.ts.tmp/slate-v2/packages/slate-react/src/editable/runtime-event-engine.ts.tmp/slate-v2/packages/slate-react/src/editable/runtime-keyboard-events.ts.tmp/slate-v2/packages/slate-react/src/editable/runtime-root-engine.ts.tmp/slate-v2/packages/slate-react/src/editable/selection-controller.ts.tmp/slate-v2/packages/slate-react/test/kernel-authority-audit-contract.ts.tmp/slate-v2/packages/slate-react/test/large-doc-and-scroll.tsx.tmp/slate-v2/packages/slate-react/test/surface-contract.tsxdocs/plans/2026-05-03-slate-v2-dom-present-large-doc-phase-6-plan.mddocs/solutions/performance-issues/2026-05-03-slate-dom-present-staging-needs-document-epoch-and-range-materialization.mdactive goal stateactive goal stateThis lane is done. Completion criteria met:
interactiveReady and nativeSurfaceComplete are measured and bounded;done.Phase 6d virtualization research is explicitly deferred and is not part of this completion target.