docs/plans/2026-05-10-slate-v2-prosemirror-runtime-proof-slices-ralplan.md
status: done
score: 0.94
date: 2026-05-10
skill: slate-ralplan
target repo: /Users/zbeyens/git/slate-v2
current pass: final-revalidation
next pass: none
completion: .tmp/completion-checks/slate-v2-prosemirror-runtime-proof-slices-ralplan.md
This is a narrowed revalidation plan for the remaining raw ProseMirror-derived runtime proof slices:
The broad ProseMirror harvest is already complete. The all-editor and
remaining-harvest plans already closed the first execution wave, and the live
.tmp/slate-v2 owner scan confirms that several rows are now covered directly.
So the next move is not "add all five again." The next move is a focused
ClawSweeper and live-source revalidation pass that classifies each row as:
already sufficient, needs one hardening row, or explicitly no-claim/defer.
This plan is done. The related issue pass, exact live-source row reads, and focused Slate v2 owner tests all completed. No implementation row remains from this ralplan, and no issue claim was promoted.
Intent: convert the ProseMirror runtime/browser pressure rows into a precise Slate v2 revalidation queue without duplicating already-landed proof.
Outcome: one executable plan that says which of the five PM rows still needs work, which ones are already covered, and what issue claims must remain out of the PR narrative.
In scope:
.tmp/slate-v2 owner tests for input routing, editing kernel,
collaboration, projection, widgets, annotations, and browser selection.Non-goals:
Fixes #... claim without exact repro/root-cause/proof.Decision boundaries:
Principles:
Drivers:
docs/editor-test-harvester/prosemirror/report.md marks PM-08/09/10/12/13 as
the highest-value raw runtime/browser rows.Chosen path:
.tmp/slate-v2.Rejected paths:
Consequences:
Live-source probe:
rg -n "describe\(|it\(|test\(" .tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.ts .tmp/slate-v2/packages/slate-react/test/editing-kernel-contract.ts .tmp/slate-v2/packages/slate-react/test/selection-reconciler-contract.ts .tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts .tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsx .tmp/slate-v2/packages/slate-react/test/annotation-store-contract.tsx .tmp/slate-v2/packages/slate-react/test/widget-layer-contract.tsx .tmp/slate-v2/packages/slate-browser/test/browser/selection.browser.test.ts .tmp/slate-v2/playwright/integration/examples/dom-coverage-boundaries.test.ts .tmp/slate-v2/playwright/stress/generated-editing.test.ts
| PM row | Current owner evidence | Initial classification |
|---|---|---|
| PM-10 composition | model-input-strategy-contract.test.ts:23-449, editing-kernel-contract.ts:276-314, selection-reconciler-contract.ts:27-98, dom-coverage-boundaries.test.ts:291, richtext.test.ts, rendering-strategy-runtime.test.ts | Covered. Existing package and browser rows include replacement ranges, Android-style newline/backspace, expanded CJK composition, composition ownership, hidden-boundary IME, formatted/rich-text IME, overlap cancellation, rapid follow-up composition, and cross-paragraph replacement. |
| PM-09 DOM-change | model-input-strategy-contract.test.ts:24-449, editing-kernel-contract.ts:138-419, generated-editing.test.ts:1261, richtext.test.ts:1159 | Covered. Ambiguous replacement, native repair target ranges, beforeinput command ownership, backspace, Enter split, DOM-selection refresh, and generated/browser stress ownership are represented. |
| PM-08 collab convergence | collab-history-runtime-contract.ts:62-578, especially three-peer convergence at 233, range-delete replay at 352, history rebase at 452, bookmark rebase at 496, and remote move/remove runtime target rows at 530 | Covered for raw Slate package convergence. Exact collaboration issue closure remains unclaimed where the issue needs high-QPS selection or first-party collaboration protocol proof. |
| PM-12 projection/widget mapping | projections-and-selection-contract.tsx:105-1084, annotation-store-contract.tsx:126-824, widget-layer-contract.tsx:88-275 | Covered for raw projection, annotation, and widget mapping. Plate-owned NodeView/MarkView/PluginView lifecycle APIs stay out. |
| PM-13 geometry/RTL | selection.browser.test.ts:8-128 has simple snapshots, FEFF normalization, RTL geometry direction, and wrapped-line rectangles | Covered for this ralplan's browser geometry/RTL slice. Atom arrow-motion and block-boundary rectangles can be future browser rows, but they are not a current hardening requirement. |
| Source | Mechanism to steal | Shape to reject | Slate target |
|---|---|---|---|
| ProseMirror composition | Real DOM composition lifecycle pressure, especially mutations inside marked text and ambiguous browser-owned ranges | PM view abstraction and numeric positions | Input strategy, editing kernel, selection reconciler, browser composition rows |
| ProseMirror DOM-change | Ambiguous native mutations must route once to model command, repair, or DOM import | One-off DOM diff policy as public API | Model input strategy, editing-kernel traces, generated browser stress |
| ProseMirror collab | Peer convergence under delayed local/remote edits and rebased history | PM Step JSON and collab plugin API | Commit replay, remote metadata, history rebase, slate-yjs future browser proof |
| ProseMirror decorations | Projection/widget mapping through structural edits with local subscriber wakeups | NodeView/MarkView/PluginView lifecycle APIs in raw Slate | Projection store, annotation store, widget layer, Plate plugin backlog |
| ProseMirror selection geometry | Browser proof for RTL, wrapped lines, coordinates, and native selection import/export | PM coordinate helpers as Slate API | slate-browser selection snapshots and example/stress browser proof |
PM-10 composition:
cd .tmp/slate-v2 && bun test ./packages/slate-react/test/model-input-strategy-contract.test.ts ./packages/slate-react/test/selection-reconciler-contract.tscd .tmp/slate-v2 && bun playwright test playwright/integration/examples/dom-coverage-boundaries.test.ts --project=chromiumPM-09 DOM-change:
cd .tmp/slate-v2 && bun test ./packages/slate-react/test/model-input-strategy-contract.test.ts ./packages/slate-react/test/editing-kernel-contract.tsPM-08 collaboration convergence:
collab-history-runtime-contract.ts.cd .tmp/slate-v2 && bun test ./packages/slate/test/collab-history-runtime-contract.tsPM-12 projection/widget mapping:
cd .tmp/slate-v2/packages/slate-react && bun test:vitest -- projections-and-selection-contract annotation-store-contract widget-layer-contractPM-13 geometry/RTL:
cd .tmp/slate-v2 && bun --filter slate-browser test:selectionClawSweeper related-issue revalidation completed on 2026-05-10. No issue claim changes were made.
Candidate buckets reviewed:
Decision:
docs/slate-issues/gitcrawl-v2-sync-ledger.md and
docs/slate-v2/ledgers/issue-coverage-matrix.md.docs/slate-v2/references/pr-description.md; no PR-facing
claim counts or proof references changed.Final row classification:
| PM row | Final classification | Issue policy |
|---|---|---|
| PM-10 | covered | Input/runtime issues stay related or proof-needed; no mobile/device promotion. |
| PM-09 | covered | DOM-change and beforeinput issues stay related unless exact native-event proof exists. |
| PM-08 | covered for raw package convergence | Collaboration issues stay related or unchanged improves; no slate-yjs/OT/browser closure. |
| PM-12 | covered for raw projection/widget mapping | Projection/comment issues keep existing improves/related statuses; Plate-owned lifecycle rows stay out. |
| PM-13 | covered for RTL/wrapped-line geometry | Browser-selection issues stay related; no atom/table/mobile closure. |
| Objection | Answer |
|---|---|
| "Didn't we already process ProseMirror?" | Yes. This is not a new harvest; it is a narrow revalidation of five runtime proof rows against current Slate v2 and issue claims. |
| "Why keep the plan pending if tests already exist?" | Because coverage proof and issue-claim proof are different. The ClawSweeper pass is still required before closure. |
| "Why not copy ProseMirror APIs for plugin/view lifecycle?" | Raw Slate should expose primitive behavior. Plate owns opinionated authoring/lifecycle ergonomics. |
| "Why not close mobile/IME from these rows?" | Desktop browser/package rows are not raw-device proof. Mobile/device claims need real Appium/Android/iOS artifacts. |
| Skill/lens | Status | Reason |
|---|---|---|
tdd | applied as acceptance criteria | Any remaining row should be a focused test in the existing owner before implementation. |
performance-oracle | applied as review lens | PM-12 must not broaden projection or widget invalidation; local subscriber wakeups matter. |
vercel-react-best-practices | applied as review lens | Projection and widget React rows must avoid broad rerender pressure. |
shadcn | skipped | No UI component or registry surface changes. |
react-useeffect | skipped | No hook/effect implementation edits in this planning pass. |
Read:
docs/editor-test-harvester/prosemirror/report.mddocs/editor-test-harvester/prosemirror/inventory.mddocs/plans/2026-05-10-slate-v2-all-editor-harvest-test-processing-ralplan.mddocs/plans/2026-05-10-slate-v2-remaining-harvest-test-lanes-ralplan.mddocs/solutions/developer-experience/2026-05-07-slate-browser-ime-proof-rows-need-honest-dom-composition.mddocs/solutions/ui-bugs/2026-05-07-slate-react-ime-formatted-selection-needs-native-owned-cleanup.mdLearning applied:
The generic docs/solutions/patterns/critical-patterns.md file was requested
by the learnings skill but does not exist in this repo.
| Dimension | Weight | Score | Reason |
|---|---|---|---|
| React 19.2 runtime performance | 0.20 | 0.87 | PM-12 has projection/widget owner rows, but issue/perf revalidation is pending. |
| Slate-close unopinionated DX | 0.15 | 0.91 | PM API cloning is rejected; Plate-owned rows are separated. |
| Plate/slate-yjs migration backbone | 0.15 | 0.86 | Collab substrate rows exist; browser/yjs adapter proof remains out of scope. |
| Regression-proof testing | 0.20 | 0.90 | Current live owner tests are strong, but exact row-by-row reads are pending. |
| Research evidence completeness | 0.15 | 0.89 | Harvest, prior plans, live source probes, and IME learnings are recorded. |
| Issue claim discipline | 0.15 | 0.94 | ClawSweeper revalidation completed and no claim promotion was made. |
Weighted score: 0.94.
Fresh same-turn checks:
cd /Users/zbeyens/git/slate-v2
bun test ./packages/slate-react/test/model-input-strategy-contract.test.ts ./packages/slate-react/test/selection-reconciler-contract.ts ./packages/slate-react/test/editing-kernel-contract.ts
# 20 pass, 0 fail
bun test ./packages/slate/test/collab-history-runtime-contract.ts
# 9 pass, 0 fail
cd /Users/zbeyens/git/slate-v2/packages/slate-react
bun test:vitest -- projections-and-selection-contract annotation-store-contract widget-layer-contract
# 3 files passed, 28 tests passed
cd /Users/zbeyens/git/slate-v2
bun --filter slate-browser test:selection
# 1 file passed, 4 tests passed
| Pass | Status | Evidence | Next owner |
|---|---|---|---|
| Skill reload | complete | Loaded slate-ralplan, editor-test-harvester, clawsweeper, ralph, goal workflow, and learnings-researcher. | n/a |
| Current-state read and initial score | complete | Read ProseMirror harvest, current done plans, focused live .tmp/slate-v2 owner probes, and IME learnings. | n/a |
| Related issue revalidation | complete | Existing ledgers already preserve conservative statuses; fork dossier audit section appended. | n/a |
| Exact live-source row reads | complete | Read package/browser owner rows for all five PM slices. | n/a |
| Hardening/no-op decision | complete | All five rows are covered or explicitly future-owned; no current hardening row remains. | n/a |
| Implementation prompt | complete | No implementation prompt needed. | n/a |
No autonomous pass remains in this ralplan. Future work, if reopened, should be a new owner-specific plan: raw mobile/device, decorated-text browser selection, collaboration/browser adapter proof, atom arrow-motion, or Plate plugin/view authoring.