docs/slate-v2/ledgers/fork-issue-dossier.md
This is the fork-local replacement for upstream GitHub issue comments.
OpenClaw-style triage writes public issue comments after maintainer curation.
Slate v2 should not comment on ianstormtaylor/slate issues from this fork.
Instead, every reviewed issue gets one self-contained section here. The PR
description can quote short claim text from this file, but this file owns the
full evidence and decision text.
Rules:
Fixes #... unless the exact original repro is proven end to end.Related #... or Improves #... when the architecture absorbs the issue
pressure but exact closure is not proven.Status: implementation-sync
Source plan:
docs/plans/2026-05-25-slate-v2-void-roots-and-editable-islands.md
Reviewed surface:
The first execution slice implements the public API/lifecycle baseline for the
closed void roots / editable islands plan. .tmp/slate-v2 now exposes
EditorElementSpec.contentRoot, tx.roots.create/replace/delete, and
useSlateContentRoot; the editable-voids example uses tx.roots.create for
child-root creation.
Decision:
This is API substrate progress, not a fixed/improved issue claim. Default voids
remain atomic, editable-island remains the mixed native/app-control surface,
and editor-only rooted-flow keyboard/navigation is still unclaimed until
targeted core/browser proof exists.
Issue decisions:
| Issue | Decision text |
|---|---|
| #5212 | Related/planned example and DX candidate. Root creation DX improved, but the example is not fixed until the full accepted route teaches editor-only rooted-flow behavior with browser proof. |
| #2072 | Related architecture target strengthened. The content-root API baseline exists; no closure until keyboard/navigation and browser proof land. |
| #3482, #3367 | Related model-shape pressure. Default voids stay atomic; the implementation does not make normal void descendants traversable. |
| #3435, #3884, #4301 | Related navigation guardrails. No new arrow/Enter claim; existing #4301 fixed floor remains exact. |
| #3991, #3868, #5582, #5477, #4896, #4350, #4328, #5630 | Delete/selection guardrails. Root lifecycle helpers landed, but delete/select/remap closure still needs targeted proof. |
| #4984, #4842, #3909 | Nested/contenteditable guardrails. Same-runtime roots remain the answer; only existing #4984 fixed floor is preserved. |
| #4806, #4802, #4104, #3926, #4888, #4623 | Clipboard/drop/move guardrails. Root payload serialization and remap policy remain future proof gates. |
PR-description text: No new fixed or improved issue claim. The PR reference should describe the public API/lifecycle slice as implemented and keep keyboard/browser behavior claims gated.
Status: planning-sync
Source plan:
docs/plans/2026-05-25-slate-v2-void-roots-and-editable-islands.md
Reviewed surface:
The target is no longer "editable island solves everything." The long-term
shape is three surfaces: default voids remain atomic; editable-island handles
mixed native/app controls with optional same-runtime child roots; editor-only
rooted flow is a separate planned target expressed as object-only
contentRoot: { slot: string } schema metadata for elements whose only content
is a child editor/root and whose keyboard navigation should feel like sibling
document blocks.
Current live-source correction: The 2026-05-24 dossier text says the canonical editable-voids example still embedded an independent nested editor. That is stale for the current checkout: the example now uses same-runtime child roots. The unresolved gaps are public root creation DX and editor-only rooted-flow navigation proof.
Decision:
This is architecture and issue-accounting pressure, not a fixed/improved issue
claim. Do not make default voids traversable. Do not store rich content under
normal void element children. Do not overload mixed-control islands with the
pure editor-flow contract unless later passes prove one policy can handle both
without native-focus and keyboard-navigation footguns.
Issue decisions:
| Issue | Decision text |
|---|---|
| #5212 | Related/planned example and DX candidate. The example row remains in scope because same-runtime child roots exist but root creation is still noisy and editor-only rooted flow is not taught. No fixed or improved claim yet. |
| #2072 | Related architecture target strengthened. The old <Island> pressure should split into mixed island and planned object-only contentRoot: { slot: string } rooted-flow primitives; no closure until final API and navigation proof exist. |
| #3482, #3367 | Related model-shape pressure. Void children/arbitrary void text requests are answered by atomic default voids plus child roots/rooted elements, not by making normal void descendants navigable. |
| #3435, #3884, #4301 | Related arrow/Enter/void-selection guardrails. Editor-only rooted flow needs explicit cross-root arrow/Enter behavior while preserving selected-void behavior. |
| #3991, #3868, #5582, #5477, #4896, #4350, #4328, #5630 | Related delete/selection guardrails. Root-backed surfaces must preserve void delete, range delete, select-all paste/delete, and root restore semantics before any related status changes. |
| #4984, #4842, #3909 | Nested/contenteditable ownership guardrails. Same-runtime child roots preserve the direction for nested-editor split-brain, but only the existing #4984 fixed claim is preserved. Exact offset or CodeMirror/void-node closure is not claimed. |
| #4806, #4802, #4104, #3926, #4888, #4623 | Clipboard/drop/move guardrails. Root payload serialization and root remap policy are future proof gates; no clipboard, paste, or drag/drop closure is added here. |
| #5183, #5391, #5559, #4839, #5087, #5411, #3611 | Inline/mobile/spacer/cursor guardrails. Editor-only rooted flow must not widen mobile inline-void, shift-click, cursor, spacer, highlighting, or IME claims. |
| #1769, #3893 | External/native focus pressure. Mixed islands keep native-control focus ownership; editor-only rooted flow must not steal/import external selections. No exact focus issue closure. |
PR-description text:
No new fixed or improved issue claim. The PR reference may name
contentRoot: { slot: string } only as planned architecture until execution
proof changes claim scope.
Status: planning-sync
Source plan:
docs/plans/2026-05-24-slate-v2-editable-islands-multi-root-ralplan.md
Reviewed surface:
The canonical editable-voids example still embeds an independent nested Slate
editor for rich content. With multi-root support, that is no longer the right
teaching architecture. The accepted target is editable-island for native/app
controls and same-runtime child roots for rich editable content inside the
island.
Decision: This is public API/example architecture pressure, not a new fixed/improved issue claim. Existing native-control and nested-editor crash rows stay useful regression proof. New closure requires package-owned child-root lifecycle, selection, history, clipboard, delete/undo, move, and browser proof.
Issue decisions:
| Issue | Decision text |
|---|---|
| #5212 | Related/planned example candidate. The current canonical editable-voids example still embeds an independent nested editor for rich content, so the issue is directly in scope for the example rewrite. No fixed or improved claim is allowed until a same-runtime child-root example and proof exist. |
| #2072 | Related architecture target strengthened. The <Island> request should become a library-owned island boundary plus optional same-runtime child roots; no closure claim until the example and proof exist. |
| #4984 | Preserve existing fixed claim. The child-root architecture must keep parent-selection-across-nested-editor DOM point crash proof green, but adds no broader claim. |
| #4842 | Preserve related status. Child roots reduce split-brain nested-editor offset pressure, but exact historical toSlatePoint offset closure is not claimed. |
| #3909 | Related target ownership pressure. Nested contenteditable should route through same-runtime root ownership, but exact CodeMirror/void-node closure is not claimed. |
| #4110 | Related native-control/browser-selection pressure. Inputs inside islands must keep Firefox caret/selection stable; no closure without browser proof. |
| #4623 | Related void drag/drop pressure. Island move/drop semantics need proof, but this planning pass does not claim the drag-to-start duplicate bug fixed. |
| #3858 | Related stale-descendant pressure. Child-root deletion/undo proof is required before changing this status. |
| #3482, #3367 | Related model-shape pressure. Void children and arbitrary void text requests are answered by atomic parent islands plus same-runtime child roots, not by putting rich content directly under void element children. |
| #5183, #5391 | Mobile inline-void pressure only. Child roots inside editable islands do not close Android/iOS inline-void keyboard or cursor-placement reports; keep raw device/browser proof as the gate. |
| #4806, #4802, #4104, #3926 | Clipboard/copy/paste guardrails. Child-root serialization policy must be explicit, but this planning sync does not broaden existing inline-void copy/paste/cut or Safari paste claims. |
| #4888, #4623 | Drop/drag lifecycle guardrails. Same-runtime child roots make wrong drop ownership more dangerous, so future implementation needs drop/move proof before any closure claim. |
| #5582, #5477, #4896, #4350, #4328, #3991, #4301, #3868 | Void delete/selection guardrails. Existing fixed claims stay fixed floors; child-root delete/undo proof is a new regression gate, not a new issue claim. |
| #5087, #5411, #3611, #3435, #3449, #4839 | Spacer/cursor/insert-break guardrails. The plan must not rely on spacer text hacks or widen inline-void cursor claims while introducing child roots. |
| #1769, #3893 | External/non-editable focus pressure. Islands and native controls need coherent focus ownership, but this plan makes no exact external-focus closure claim. |
PR-description text: No new fixed or improved issue claim. The plan changes the canonical editable void architecture target from nested independent editors to same-runtime child roots.
Status: planning-sync
Source plan:
docs/plans/2026-05-23-slate-v2-library-owned-multi-root-history-dx-ralplan.md
Reviewed surface:
The canonical multi-root example still carried app-owned getHistoryShortcut,
getHistoryBatchCount, updateHistory, applyDocumentHistory, and
requestAnimationFrame focus repair. The accepted target is package-owned
useSlateHistory and useSlateRootChrome.
Decision: This is public API and browser-proof pressure, not a new fixed/improved issue claim. The hook work should preserve existing history-selection fixes while adding no broad Undo/Redo All, multi-editor focus, placeholder, or HTML button closure claim.
Issue decisions:
| Issue | Decision text |
|---|---|
| #6016 | Keep triage-closed/non-fix. One editor/runtime with root-bound editable surfaces is the supported answer; shared node graphs across independent editors stay unsupported. |
| #5537 | Related focus/input pressure. Root chrome/focus proof helps the owner, but exact multi-editor programmatic focus closure is not claimed. |
| #5117 | Related example/browser pressure. Root-local DOM state remains required; placeholder measurement closure is not claimed. |
| #5515 | Related history-scope pressure. useSlateHistory is active-root history, not Undo/Redo All. |
| #3893 | Related external-control focus pressure. Exact HTML button focus closure is not claimed. |
| #3634, #4961 | Related programmatic focus pressure. Exact focus-after-programmatic-change closure still needs browser proof. |
| #3705, #3756, #3921 | Preserve existing history-selection/refocus classifications. No broader partial set_selection or refocus claim. |
| #3534, #3551, #4559, #3499 | Preserve existing fixed claims. Hook-level UI must keep these history guarantees green. |
| #3460 | API pressure only for toolbar/command access outside the editor subtree. No issue closure claim. |
PR-description text:
No new fixed or improved issue claim. The plan targets package-owned
useSlateHistory and useSlateRootChrome so examples do not teach app-owned
history/focus plumbing.
Status: fork-local synced
Source plan:
docs/plans/2026-05-10-slate-v2-udecode-open-issues-reproduction-ralplan.md
| Issue | Status | Evidence | Decision text |
|---|---|---|---|
udecode/slate#5 | fixes-claimed | Local browser row reproduced the images Cmd+A bug as correct editor text model selection plus wrong selected-image chrome; final focused Chromium proof passed after image chrome became direct-selection-only. | udecode/slate#5 is fork-lane fixed: editor text select-all no longer renders selected image chrome for broad text ranges. |
udecode/slate#8 | fixes-claimed | Local browser row reproduced editable-void undo leaving two inputs; final focused Chromium proof passed after internal-control beforeinput historyUndo routed through Slate history before native input undo. | udecode/slate#8 is fork-lane fixed: undo from a newly inserted editable void input removes the owning void block. |
udecode/slate#15 | already-accounted | Exact iframe parent-toolbar browser row is green on current code. | udecode/slate#15 is already accounted: parent toolbar formatting does not incorrectly mutate selected iframe text in the current proof row. |
No upstream PR-facing matrix or PR description claim was changed here. These are
fork-local udecode/slate issue IDs, not upstream ianstormtaylor/slate issue
IDs.
Status: improves-claimed Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: The image example copied a selected block image on Ctrl+X but did not remove it from the editor unless the user expanded the selection.
Evidence:
.tmp/slate-v2/packages/slate-react/test/dom-coverage-native-bridge-contract.test.ts..tmp/slate-v2/packages/slate-react/src/editable/clipboard-input-strategy.ts..tmp/completion-checks/slate-v2-clawsweeper-v2-clipboard-structural-cut-delete-execution.md.Decision:
Keep this as improves-claimed, not fixes-claimed. Package proof shows a
selected block void cut writes the model fragment, removes the void block, and
requests model-owned DOM repair. Exact browser closure still needs the images
example replay.
PR-description text: Improves #3857: selected block void cut writes model-backed clipboard data, removes the void block, and repairs the caret from model state; no browser auto-close claim.
Status: improves-claimed Bucket: v2-clipboard-serialization Confidence: medium
Issue summary:
Cutting a selection containing a list could leave the remaining block as a
list-item instead of a paragraph in the richtext example.
Evidence:
.tmp/slate-v2/packages/slate/test/clipboard-contract.ts..tmp/completion-checks/slate-v2-clawsweeper-v2-clipboard-structural-cut-delete-execution.md.Decision:
Keep this as improves-claimed. Core deletion across a list between text blocks
does not leave an orphan list-item. Exact richtext browser cut and product
list-normalization behavior are not claimed.
PR-description text:
Improves #3801: core structural delete across a list removes the list structure
without leaving an orphan list-item; exact browser closure is not claimed.
Status: improves-claimed Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: Select-all copy of a list omitted the wrapping list element in external HTML, and deleting a whole-list document left list structure behind.
Evidence:
.tmp/slate-v2/packages/slate/test/clipboard-contract.ts..tmp/completion-checks/slate-v2-clawsweeper-v2-clipboard-structural-cut-delete-execution.md.Decision:
Keep this as improves-claimed. The model fragment for a selected whole list
keeps the wrapping list element. External HTML list serialization and the exact
whole-list browser delete policy remain outside this raw Slate proof.
PR-description text: Improves #3469: model fragment extraction keeps the wrapping list element for a whole selected list; external HTML and whole-list browser delete closure are not claimed.
Status: fixes-claimed Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: A table copy/paste case exposed confusion between Slate fragments and expected HTML table/span payloads.
Evidence:
docs/plans/2026-05-04-slate-v2-clawsweeper-v2-clipboard-serialization-ralplan.md.Decision:
Keep this as related. Table HTML serialization is app schema policy, not a raw
Slate default serializer. The v2 clipboard boundary is relevant, but exact table
closure is not claimed.
PR-description text: Related #4716: table copy belongs to clipboard strategy and app schema serialization; no table-specific auto-close claim.
Status: not-claimed Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: On Windows/Linux, Shift+Delete deleted selected text but did not copy it to the clipboard like Ctrl+X.
Evidence:
cut event handling once a clipboard event
with clipboardData reaches Slate..tmp/slate-v2/packages/slate-react/src/editable/clipboard-input-strategy.ts.Decision:
Keep this as not-claimed. Shift+Delete needs OS/browser shortcut dispatch and
clipboard transfer proof. The current slice does not synthesize system clipboard
cut semantics from a keydown event.
PR-description text: Not claimed #2694: Shift+Delete clipboard transfer needs OS/browser shortcut proof; this slice only hardens actual cut events with clipboard data.
Status: improves-claimed Bucket: already-accounted Confidence: high
Issue summary: This is a performance issue about repeated exact-path tree updates needing a batch-aware apply engine. The live issue is open, references PR #6039, and asks for a benchmark-backed architecture improvement rather than a single UI bug fix.
Evidence:
transactionality-and-batch-engine, valid,
improves-claimed..tmp/slate-v2/scripts/benchmarks/core/current/transaction-execution.mjs;
docs/slate-v2/slate-tranche-3-execution.md;
docs/slate-v2/ledgers/issue-coverage-matrix.md.Decision:
Keep this as improves-claimed, not fixes-claimed. Slate v2 has
transaction/applyOperations benchmark coverage for mixed structural snapshots,
but the current ledger does not define an accepted performance threshold that
would prove the full upstream benchmark claim.
PR-description text: Improves #6038: Slate v2 adds transaction/applyOperations benchmark coverage for batch-style repeated tree updates, but this PR does not auto-close the issue because no accepted performance threshold proves the full upstream benchmark claim.
Status: improves-claimed Bucket: v2-dom-selection Confidence: medium
Issue summary: This is a DOM selection/navigation bug at a table boundary when the table is the last node in the editor. The live issue is open and gives official table-example repro steps for arrow-key movement at the end of the document.
Evidence:
dom-selection-synchronization, likely-valid, cluster-synced.bug label..tmp/slate-v2/packages/slate-dom/test/bridge.ts;
.tmp/slate-v2/packages/slate-dom/test/dom-coverage.ts;
.tmp/slate-v2/playwright/integration/examples/tables.test.ts;
docs/plans/2026-05-04-slate-v2-full-issue-ledger-architecture-ralplan.md;
docs/plans/2026-05-04-slate-v2-full-issue-ledger-architecture-ralplan-issue-matrix.md.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/tables.test.ts --project=chromium --grep "ArrowDown at the table end".Decision:
Claim Fixes #6034. The exact table-edge browser reproduction is covered:
remove the trailing paragraph, place the caret at the last table cell, press
ArrowDown, type, and verify text lands only in the last cell with model
selection still on [1,2,3,0].
PR-description text: Fixes #6034: the tables example keeps the caret in the final table cell when the table is the last node and ArrowDown is pressed before typing.
Status: related Bucket: v2-input-runtime Confidence: high
Issue summary: This is an Android input/composition bug where toggling a mark on a collapsed selection causes keyboard dismissal and selection jumps while typing.
Evidence:
android-mark-toggle-keyboard-dismissal..tmp/gitcrawl/2026-05-04T145301Z-threads-6022-6027.json..tmp/slate-v2/packages/slate-react/src/hooks/android-input-manager/android-input-manager.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts,
.tmp/slate-v2/packages/slate-react/test/android-input-manager-contract.test.ts,
.tmp/slate-v2/packages/slate-react/test/with-react-contract.tsx, and
.tmp/slate-v2/packages/slate-browser/test/core/release-proof.test.ts.[0,0]@2; after the fix, selection normalizes to the inserted marked
leaf at [0,1]@1.Decision:
Keep as related, not fixes-claimed. The current fork fixes the stale
selection owner for marked collapsed Android input, matching the #6027 root
cause class. The exact user-visible keyboard dismissal still needs Android
Chrome/WebView device proof before closure.
PR-description text: Related #6022: Slate v2 input/composition runtime targets the Android mark-toggle selection/keyboard class and now has package proof for the stale selection sub-bug, but this PR does not auto-close without matching device proof.
Status: fixes-claimed Bucket: v2-react-runtime Confidence: high
Issue summary: An async decoration callback update can restructure rendered text DOM and move the caret to the wrong position.
Evidence:
async-decoration-and-projection-stability..tmp/gitcrawl/2026-05-04T145301Z-cluster-10-detail.json..tmp/slate-v2/packages/slate-react/src/components/editable-text-blocks.tsx,
.tmp/slate-v2/site/examples/ts/decorations-async.tsx,
.tmp/slate-v2/playwright/integration/examples/decorations-async.test.ts,
and
docs/plans/2026-05-23-slate-v2-async-decoration-caret-cluster-proof.md.Decision:
Promote to fixes-claimed. The browser proof mirrors the upstream repro: a
delayed async Editable.decorate callback identity change adds a highlight
after typing matching text at the document end, and both Slate selection and
the browser DOM caret stay at the typed end after the DOM is restructured.
PR-description text:
Fixes #5987: async Editable.decorate updates can restructure text DOM without
moving the browser caret away from the current Slate selection.
Status: related Bucket: v2-input-runtime Confidence: medium
Issue summary: Android voice input can duplicate the first insertion when the editor starts from an empty content state.
Evidence:
android-empty-voice-input..tmp/gitcrawl/2026-05-04T145301Z-threads-batch1-9-14.json..tmp/slate-v2/packages/slate-react/src/hooks/android-input-manager/android-input-manager.ts,
.tmp/slate-v2/packages/slate-react/src/editable/composition-state.ts, and
.tmp/slate-v2/packages/slate-browser/test/core/release-proof.test.ts.Decision:
Keep as cluster-synced. The owner is Android empty-node IME insertion, but
voice-input device proof is required before closure.
PR-description text: Related #5983: Android empty-node IME input family; no exact voice-input closure.
Status: related Bucket: v2-dom-selection Confidence: medium
Issue summary: Selecting an inline void on Android fails to open the soft keyboard.
Evidence:
android-inline-void-keyboard..tmp/gitcrawl/2026-05-04T145301Z-cluster-12-detail.json..tmp/slate-v2/packages/slate-browser/test/core/scenario.test.ts,
.tmp/slate-v2/packages/slate-browser/src/playwright/index.ts, and
.tmp/slate-v2/packages/slate-react/src/rendering-strategy/segment-shell.tsx.Decision:
Keep as cluster-synced. Inline void boundary navigation is represented, but
Android keyboard activation needs device proof.
PR-description text: Related #5183: inline void/mobile selection boundary family; no exact Android keyboard closure.
Status: not-claimed Bucket: ecosystem-boundary Confidence: high
Issue summary: iOS selection handles and cursor movement are unstable around inline void elements.
Evidence:
android-inline-void-keyboard..tmp/gitcrawl/2026-05-04T145301Z-cluster-12-detail.json..tmp/slate-v2/packages/slate-browser/test/core/scenario.test.ts,
.tmp/slate-v2/packages/slate-browser/src/playwright/index.ts, and
.tmp/slate-v2/packages/slate-react/src/rendering-strategy/segment-shell.tsx.Decision:
Keep as cluster-synced. It strengthens the mobile inline-void boundary owner,
but iOS device proof is required before closure.
PR-description text: Related #5391: inline void/mobile selection boundary family; no exact iOS closure.
AndroidEditable interfering with IMEStatus: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Android Chrome IME composition can be interrupted by Slate's Android editing path.
Evidence:
android-ime-empty-node-composition..tmp/gitcrawl/2026-05-04T145301Z-cluster-13-detail.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts,
.tmp/slate-v2/packages/slate-react/src/editable/composition-state.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts,
and .tmp/slate-v2/packages/slate-react/test/editing-kernel-contract.ts.Decision:
Keep as cluster-synced. Composition ownership exists, but Android Chrome IME
device proof is required before closure.
PR-description text: Related #4400: Android IME/composition runtime family; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Android IME composition ends early when typing in empty leaves or empty text nodes.
Evidence:
android-ime-empty-node-composition..tmp/gitcrawl/2026-05-04T145301Z-cluster-13-detail.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts,
.tmp/slate-v2/packages/slate-react/src/editable/composition-state.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts,
and .tmp/slate-v2/packages/slate-browser/test/core/release-proof.test.ts.Decision:
Keep as cluster-synced. It is the right input-runtime family, but exact empty
Android IME proof is not present.
PR-description text: Related #5883: Android empty-node IME composition family; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Refocusing a long editor can scroll unexpectedly to the previous selection.
Evidence:
refocus-autoscroll..tmp/gitcrawl/2026-05-04T145301Z-threads-batch1-9-14.json..tmp/slate-v2/playwright/integration/examples/huge-document.test.ts,
.tmp/slate-v2/packages/slate-react/test/app-owned-customization.tsx,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts, and
.tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Claim Fixes #5826. The huge-document browser row follows the reported flow:
click the top block, blur, scroll to the final block, click back into the
editor, and keep the clicked final-block selection visible instead of restoring
the stale top selection.
PR-description text: Fixes #5826: long-editor refocus keeps the clicked final-block selection visible instead of restoring the stale top selection.
Status: triage-closed Bucket: skip-invalid Confidence: high
Issue summary: This reports two Slate editors rendering the same value object reference and breaking DOM/path resolution. The live issue is open, but maintainer discussion clarifies that sharing the same Slate node objects across editor instances is not a supported contract because editor DOM/path maps are keyed by node identity.
Evidence:
shared-node-identity-across-editors, likely-invalid,
triage-closed.bug label.docs/plans/2026-05-04-slate-v2-full-issue-ledger-architecture-ralplan.md;
docs/plans/2026-05-04-slate-v2-full-issue-ledger-architecture-ralplan-issue-matrix.md.Decision: Do not claim this as a v2 fix. Raw Slate should not support the same node object identity mounted in multiple editor runtimes as a normal contract. Reopen only if a current minimal repro shows a supported usage failing.
PR-description text: None; detailed ledger only. #6016 is classified as likely-invalid shared-node identity misuse, not a Slate v2 closure claim.
Status: fixes-claimed Bucket: already-accounted Confidence: high
Issue summary:
This is an API ergonomics issue asking React providers to accept an already
initialized editor without requiring a separate provider-level initialValue.
The live issue is open, and the current Slate v2 coverage matrix already carries
the exact fix claim.
Evidence:
react-initialization-api-ergonomics, valid, fixes-claimed.improvement label.docs/slate-v2/ledgers/issue-coverage-matrix.md;
docs/slate-v2/references/pr-description.md;
.tmp/slate-v2/packages/slate/test/state-tx-public-api-contract.ts.Decision:
Keep the exact Fixes #6013 claim. Slate v2 makes editor initialization own
the initial value, so the React provider can accept a pre-initialized editor
without requiring another initialValue prop.
PR-description text: Fixes #6013: React providers accept pre-initialized editor instances without a provider-level initialValue; editor state is seeded during editor creation.
Status: cluster-synced Bucket: v2-input-runtime Confidence: high
Issue summary:
Firefox for Android with Samsung Keyboard fails to insert the second character
on a new line. The reported runtime error is can't access property "hasAttribute", s is null; the reporter points to Android handleDOMBeforeInput
and toSlateRange / toSlatePoint receiving DOM containers whose parentNode
is null.
Evidence:
android-firefox-samsung-ime, valid,
cluster-synced.0.124.1 plus the
public Rich Text example..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts;
.tmp/slate-v2/packages/slate-react/src/hooks/android-input-manager/android-input-manager.ts;
.tmp/slate-v2/packages/slate-dom/src/plugin/dom-editor.ts.Decision:
Route to the input runtime. Do not claim a fix without device proof. This is not
just a generic DOM point crash; the null-parent beforeinput shape makes it a
mobile input-runtime gate.
PR-description text: None; detailed ledger only.
Status: fixes-claimed Bucket: v2-react-runtime Confidence: high
Issue summary:
useSlate kept returning the old editor object after <Slate editor> received
a newly created editor instance.
Evidence:
gitcrawl threads --numbers 5709,4680,4165,5404,5131,3656,4141,4210,2051,3430 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision: Keep the existing exact claim. This is the one issue in the pass-2 surface where the current matrix already has a focused provider replacement proof.
PR-description text:
Fixes #5709: React provider hook consumers receive the replacement editor when
<Slate editor> changes.
Status: related Bucket: v2-react-runtime Confidence: medium
Issue summary:
The report observes useSlate() returning the same editor object after editor
changes, but it is framed around legacy context value semantics rather than the
new editor-replacement repro in #5709.
Evidence:
gitcrawl threads --numbers 5709,4680,4165,5404,5131,3656,4141,4210,2051,3430 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision:
Keep as related. The #6053 pass confirms this is editor identity pressure
owned by the provider replacement lane, not selected-element self-removal.
PR-description text:
Related #4680: editor identity and hook update pressure is covered by provider
replacement contracts, but exact legacy useSlate state-change closure is not
separately claimed.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: The issue asks for clearer hook naming so editor identity access and stateful subscription behavior are not confused.
Evidence:
gitcrawl threads --numbers 5709,4680,4165,5404,5131,3656,4141,4210,2051,3430 --include-closed --json ianstormtaylor/slate.react-hook-surface-and-subscriptions..tmp/slate-v2/packages/slate-react/src/hooks/use-editor.tsx,
.tmp/slate-v2/packages/slate-react/src/hooks/use-editor-selector.tsx, and
.tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision: Keep as cluster-synced. Hook naming and broad-vs-narrow subscription law are real v2 API pressure, but this pass does not promote a naming issue to an exact fix claim.
PR-description text: Related #4165: hook naming and subscription-surface clarity belong to the v2 React hook contract; no exact legacy rename closure.
Status: not-claimed Bucket: v2-react-runtime Confidence: high
Issue summary:
The issue asks whether useSlate should avoid rerendering on selection changes
and whether a non-rerendering editor hook should exist.
Evidence:
gitcrawl threads --numbers 5709,4680,4165,5404,5131,3656,4141,4210,2051,3430 --include-closed --json ianstormtaylor/slate.gitcrawl search ianstormtaylor/slate --query "useSlate selection rerender" --mode hybrid --limit 20 --json..tmp/slate-v2/scripts/benchmarks/browser/react/rerender-breadth.tsx.Decision: Keep the existing non-claim. Broad editor hooks may rerender by contract; the v2 answer is narrower selector/block-slice subscriptions unless a later API pass changes that law explicitly.
PR-description text: Not claimed #5131: broad editor hooks remain broad by contract; v2 proves narrow selector locality instead.
Status: improves-claimed Bucket: v2-performance-benchmark Confidence: high
Issue summary: Editing one leaf in a block should not rerender every sibling leaf and the parent block.
Evidence:
gitcrawl threads --numbers 5709,4680,4165,5404,5131,3656,4141,4210,2051,3430 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/scripts/benchmarks/browser/react/rerender-breadth.tsx.Decision: Keep as improves-claimed. The benchmark represents the leaf breadth pressure, but exact app/browser closure remains benchmark-gated.
PR-description text: Improves #3656: rerender-breadth proof keeps sibling leaves and the parent block local during one leaf edit; no exact app closure.
Status: improves-claimed Bucket: v2-performance-benchmark Confidence: high
Issue summary: Editing a deeply nested text node can rerender ancestors up to the editor root.
Evidence:
gitcrawl threads --numbers 5709,4680,4165,5404,5131,3656,4141,4210,2051,3430 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/scripts/benchmarks/browser/react/rerender-breadth.tsx.Decision: Keep as improves-claimed. Nested-block rerender breadth is benchmark-owned; no browser closure claim is added here.
PR-description text: Improves #4141: nested rerender-breadth proof keeps unaffected ancestors and sibling branches local; no exact browser closure.
Status: cluster-synced Bucket: v2-performance-benchmark Confidence: medium
Issue summary: Typing, Enter, and selection changes light up too much of the rendered tree in React DevTools.
Evidence:
gitcrawl threads --numbers 5709,4680,4165,5404,5131,3656,4141,4210,2051,3430 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/scripts/benchmarks/browser/react/rerender-breadth.tsx.Decision:
Keep as cluster-synced until pass 3/6 defines the exact benchmark threshold and
whether this issue moves to Improves.
PR-description text: Related #4210: whole-document render breadth belongs to benchmark-gated React runtime proof; no exact closure yet.
Status: not-claimed Bucket: v2-performance-benchmark Confidence: medium
Issue summary: Typing and deleting inside a single paragraph with many inline nodes becomes unresponsive.
Evidence:
gitcrawl threads --numbers 5709,4680,4165,5404,5131,3656,4141,4210,2051,3430 --include-closed --json ianstormtaylor/slate.docs/slate-v2/references/architecture-contract.md and future benchmark
rows.Decision: Keep as not claimed. Rerender breadth is related, but the many-inline normalization/freeze repro needs its own benchmark or browser proof.
PR-description text: Not claimed #3430: rerender-breadth pressure is represented, but single-paragraph many-inline freeze is not proven.
Status: related Bucket: v2-input-runtime Confidence: medium
Issue summary: IME input inside decorated text can leave the browser DOM and Slate decoration projection out of sync.
Evidence:
gitcrawl threads --numbers 4483,5987,4993,4997,4392,3382,3352,3383,3309,3162 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts
and decoration projection tests.Decision: Keep as related to this plan but owned by the Mobile/IME lane for exact closure. Decoration stores help, but IME proof must be device/browser-facing.
PR-description text: Related #3162: decorated IME input belongs to composition/runtime plus decoration projection proof; no exact IME closure.
Status: related Bucket: v2-react-runtime Confidence: medium
Issue summary:
A decoration range carrying a replacement text field can visually change text
length and shift the insertion point.
Evidence:
gitcrawl threads --numbers 4712,4581,5398,5433,4750,4298,4225,2465,2564,4477,3478,3497,5509 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate-react/src/components/editable-text.tsx and
.tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsx.Decision: Keep as related. Projection slices must not lie about model text length unless a future replacement-text API owns DOM point mapping explicitly.
PR-description text: Related #4712: replacement-like decoration text belongs to projection and DOM point mapping policy; no exact closure.
Status: related Bucket: v2-input-runtime Confidence: high
Issue summary: External state updates while composing Chinese move the cursor backward.
Evidence:
gitcrawl threads --numbers 4712,4581,5398,5433,4750,4298,4225,2465,2564,4477,3478,3497,5509 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts
and Mobile/IME browser/device proof rows.Decision: Keep as related to React/decorations but owned by Mobile/IME for exact closure. This cannot be fixed-claimed from desktop selector/projection tests.
PR-description text: Related #5398: external rerender during Chinese composition belongs to the input/composition runtime; no exact device/browser closure.
Status: related Bucket: v2-input-runtime Confidence: high
Issue summary: Decorate-triggered editable rerender moves the cursor during composition.
Evidence:
gitcrawl threads --numbers 4712,4581,5398,5433,4750,4298,4225,2465,2564,4477,3478,3497,5509 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts
and decoration projection tests.Decision: Keep as related. It informs the combined architecture plan, but exact closure is composition/browser proof, not a package-only React runtime claim.
PR-description text: Related #5433: decorate rerender during composition belongs to input runtime and decoration projection proof; no exact closure.
Status: cluster-synced Bucket: v2-core-engine Confidence: medium
Issue summary:
Editor.marks(editor) over a multi-leaf selection returns first-leaf marks
instead of reduced/common mark state.
Evidence:
gitcrawl threads --numbers 4712,4581,5398,5433,4750,4298,4225,2465,2564,4477,3478,3497,5509 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate/src mark query semantics and React selection
proof rows.Decision: Keep as cluster-synced. This is core mark-query semantics plus browser selection behavior; projection stores alone do not close it.
PR-description text: Related #4750: multi-leaf active mark reduction belongs to core mark semantics and selection proof; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Overlapping rendered marks split into repeated component islands, making interactive wrappers such as links harder to express cleanly.
Evidence:
gitcrawl threads --numbers 4712,4581,5398,5433,4750,4298,4225,2465,2564,4477,3478,3497,5509 --include-closed --json ianstormtaylor/slate.gitcrawl search ianstormtaylor/slate --query "render marks overlapping decorations" --mode hybrid --limit 20 --json..tmp/slate-v2/packages/slate-react/src/components/editable-text.tsx.Decision: Keep as cluster-synced. This is real render-DX pressure, but the plan must decide whether v2 solves it with render policy, projection payloads, or docs.
PR-description text: Related #2465: overlapping mark rendering belongs to render-leaf/text DX proof; no accepted render API closure yet.
Status: cluster-synced Bucket: v2-api-dx Confidence: medium
Issue summary: The issue asks for a clearer conceptual boundary between editable text marks, inline nodes, and decorations.
Evidence:
gitcrawl threads --numbers 4712,4581,5398,5433,4750,4298,4225,2465,2564,4477,3478,3497,5509 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate-react render
and projection contracts.Decision: Keep as cluster-synced. The combined lane must state clear mark/inline/ decoration boundaries, but no issue closure is justified from planning alone.
PR-description text: Related #2564: mark, inline, and decoration boundary clarity belongs to the v2 API law; no exact closure.
This is the focused ClawSweeper gap pass for
docs/plans/2026-05-08-slate-v2-dom-selection-focus-bridge-ralplan.md after
the full issue-ledger scan. It adds no fixed issue claims.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Windows/Chrome double-click selection before an inline element followed by Backspace crashes with native DOM range offset drift.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 5690 --include-closed --json..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-keyboard-events.ts,
and .tmp/slate-v2/playwright/integration/examples/inlines.test.ts.Decision:
Keep as cluster-synced. The row belongs to inline-boundary DOM selection
repair, but exact Windows/Chrome browser closure is not claimed.
PR-description text: Related #5690: inline-boundary double-click/delete selection belongs to DOM selection repair; no exact Windows/Chrome closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Triple-click plus upward selection loses the browser/editor selection in Chrome or Safari.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 5689 --include-closed --json..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts,
.tmp/slate-v2/packages/slate-dom/src/plugin/dom-editor.ts, and
.tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Keep as cluster-synced. Browser gesture-selection direction needs a focused
browser row before any exact claim.
PR-description text: Related #5689: triple-click/upward gesture selection belongs to browser selection import/export; no exact Chrome/Safari closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary:
The app-provided scrollSelectionIntoView callback is not invoked for enough
cursor movement cases, so apps duplicate selection scrolling logic.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 4995 --include-closed --json..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts,
.tmp/slate-v2/packages/slate-react/test/rendering-strategy-and-scroll.tsx,
and .tmp/slate-v2/packages/slate-react/test/app-owned-customization.tsx.Decision:
Keep as cluster-synced. React selection-scroll policy owns the contract, but
the exact arrow/sticky-header repro is not proven.
PR-description text: Related #4995: scroll selection customization belongs to React selection-scroll policy; no exact arrow/sticky-header closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Deleting adjacent inline badges leaves the caret visually invalid and stops predictable continued deletion.
Evidence:
docs/slate-issues/test-candidate-map/5655-5559.md marks
adjacent inline badge delete caret as ready-now.gitcrawl threads ianstormtaylor/slate --numbers 5632 --include-closed --json..tmp/slate-v2/playwright/integration/examples/inlines.test.ts,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts, and
.tmp/slate-v2/packages/slate/src/transforms-text/delete-text.ts.Decision:
Keep as cluster-synced. Inline/void delete-caret ownership is in scope, but
the exact badge repro is not closed.
PR-description text: Related #5632: adjacent inline badge delete caret belongs to inline/void selection ownership; no exact badge-browser closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Shift-click selection through a void element resets selection or highlights inside the void incorrectly.
Evidence:
docs/slate-issues/test-candidate-map/5655-5559.md marks
Shift-click through void selection as ready-now.gitcrawl threads ianstormtaylor/slate --numbers 5559 --include-closed --json..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts,
.tmp/slate-v2/packages/slate-react/test/selection-controller-contract.ts,
and .tmp/slate-v2/playwright/integration/examples/mentions.test.ts.Decision:
Keep as cluster-synced. Void selection import/export is the right owner, but
exact multi-browser shift-click closure is not claimed.
PR-description text: Related #5559: Shift-click through void selection belongs to DOM selection reconciliation; no exact multi-browser closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary:
Nested contenteditable controls inside Slate are treated as Slate-owned
editable targets, so Slate hijacks events that should remain native/app-owned.
Evidence:
docs/slate-issues/open-issues-dossiers/3948-3881.md keeps it as
valid runtime-boundary debt.contenteditable target-ownership issue.gitcrawl threads ianstormtaylor/slate --numbers 3909 --include-closed --json..tmp/slate-v2/packages/slate-dom/src/plugin/dom-editor.ts,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts, and
.tmp/slate-v2/playwright/integration/examples/editable-voids.test.ts.Decision:
Keep as cluster-synced. Nested target ownership is in scope, but exact
CodeMirror/void-node closure is not claimed.
PR-description text: Related #3909: nested contenteditable target ownership belongs to the DOM target bridge; no exact CodeMirror/void-node closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Clicking a normal HTML button can leave Slate's focused state stale.
Evidence:
docs/slate-issues/open-issues-dossiers/3948-3881.md keeps it as
valid runtime-boundary debt.gitcrawl threads ianstormtaylor/slate --numbers 3893 --include-closed --json..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts,
.tmp/slate-v2/playwright/integration/examples/check-lists.test.ts, and
.tmp/slate-v2/packages/slate-react/test/selection-runtime-contract.test.ts.Decision:
Keep as cluster-synced. React focus timing owns the state update, but exact
HTML button closure is not claimed.
PR-description text: Related #3893: HTML button focus state belongs to React focus timing; no exact button-focus closure.
Status: not-claimed Bucket: ecosystem-boundary Confidence: medium
Issue summary: Dragging selection from inside a Web Component cannot extend out of the encapsulated component.
Evidence:
docs/slate-issues/test-candidate-map/5558-5480.md marks it
not-a-test-candidate.gitcrawl threads ianstormtaylor/slate --numbers 5550 --include-closed --json.Decision: Do not claim #5550. Web Component encapsulation changes the DOM ownership model itself; Slate v2 should not promise arbitrary encapsulated selection drag unless a supported boundary model is designed.
PR-description text: None; detailed ledger only.
Status: not-claimed Bucket: ecosystem-boundary Confidence: medium
Issue summary:
Firefox returns unexpected table selection anchor/focus nodes for a custom
table plugin using rowspan.
Evidence:
docs/slate-issues/test-candidate-map/5558-5480.md marks it
not-a-test-candidate.gitcrawl threads ianstormtaylor/slate --numbers 5551 --include-closed --json.Decision: Do not claim #5551. It depends on custom table plugin semantics and Firefox native table selection; raw DOM bridge containment does not close table-range selection modeling.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-core-engine Confidence: medium
Issue summary: ArrowDown across soft breaks visually moves the caret, but the model selection does not match the cursor's new visual line.
Evidence:
docs/slate-issues/test-candidate-map/5558-5480.md marks
vertical navigation across soft breaks as ready-with-minor-setup.gitcrawl threads ianstormtaylor/slate --numbers 5524 --include-closed --json..tmp/slate-v2/packages/slate/src/editor/positions.ts.Decision: Route to core caret/navigation first. It is related to selection correctness, but this DOM bridge plan should not claim it without proof that the failure is DOM import/export rather than logical caret navigation.
PR-description text: Related #5524: vertical navigation across soft breaks is selection pressure, but exact closure belongs to core caret/navigation proof.
Status: not-claimed Bucket: ecosystem-boundary Confidence: medium
Issue summary: Advanced layout containers need structural DOM that should not receive cursor placement while their children remain editable.
Evidence:
docs/slate-issues/test-candidate-map/5994-5918.md marks it
not-a-test-candidate because the reporter could not isolate a clean repro.gitcrawl threads ianstormtaylor/slate --numbers 5924 --include-closed --json.Decision: Do not claim #5924. No public ignore-cursor API is added by this lane, and no isolated repro exists for exact closure.
PR-description text: None; detailed ledger only.
Status: improves-claimed Bucket: v2-react-runtime Confidence: medium
Issue summary:
A component calls useSelected() and removes itself from the editor when it is
not selected. During that lifecycle, the hook can read a stale path and call
Editor.range, throwing Cannot find a descendant at path [0,1] in node.
Evidence:
stale-element-selection-hook,
likely-valid, improves-claimed.Cannot find a descendant hook wording
return only #6053. Neighbors split into stale path/tree validity, DOM
selection bridge, React identity/subscription, input/IME false neighbors,
stale IE11 support, maintainer-noise cleanup, and API typing rows..tmp/slate-v2/packages/slate-react/test/use-element-selected.test.tsx
covers a selected rendered element that removes itself and unmounts cleanly,
plus an explicit useElementSelected(path) watcher that returns false
after the watched path is removed. Existing path-shift coverage remains in
the same file and .tmp/slate-v2/packages/slate-react/test/surface-contract.tsx.
.tmp/slate-v2/packages/slate-react/src/hooks/use-element-selected.ts guards
path validity before calling Editor.range.Decision:
Claim Fixes #6053. The exact self-removal lifecycle is covered, explicit
stale watched paths fail closed to false, and related issue discovery found
no broader duplicate that should absorb the claim. Active plan:
docs/plans/2026-05-08-slate-v2-use-element-selected-self-removal-ralplan.md.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-react-runtime Confidence: medium
Issue summary: External value reset after a deeply nested selection can leave stale descendant paths in selection or weak-map reads.
Evidence:
#6053 neighbor discovery.#6053.#6053 self-removal proof exists in
.tmp/slate-v2/packages/slate-react/test/use-element-selected.test.tsx.Decision:
Related only. The #6053 hook closure is proved, but broader external value
reset belongs to React value and provider lifecycle lanes.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-react-runtime Confidence: low
Issue summary: CRA live reload can leave stale editor/path state and throw a descendant-path error.
Evidence:
#6053.Decision:
Related, not claimed. Keep out of #6053 unless a current fast-refresh repro
shows the same hook path owner.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-dom-selection Confidence: medium
Issue summary: External history or value replacement can ask the DOM bridge to resolve stale or unmapped Slate points.
Evidence:
#6053 neighbor discovery.useElementSelected Editor.range self-removal.Decision: Related only. Do not claim closure from the hook plan.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-react-runtime Confidence: medium
Issue summary:
Replacing editor and onChange can leave stale callback/editor state in
React provider consumers.
Evidence:
#6053.#5709 and #4680 React provider identity
pressure.#5709.Decision: Related only. Exact closure would need provider callback replacement proof.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-core-engine Confidence: high
Issue summary: High-frequency collaboration operations can preempt anchor/selection state and make selection ownership unstable.
Evidence:
#6053.Decision: Improves only. Slate v2 now proves the core collaboration-selection substrate, but exact provider/browser closure remains unclaimed until a real adapter repro passes.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-dom-selection Confidence: medium
Issue summary: Clicking non-editable content can leave Slate focus/selection state stuck.
Evidence:
#6053.Decision:
Related only. No #6053 hook claim.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-dom-selection Confidence: medium
Issue summary: Click handlers can observe a previous selection during pointer/click timing.
Evidence:
#6053.Decision:
Related only. Keep for DOM selection timing, not useElementSelected closure.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-dom-selection Confidence: medium
Issue summary: Toolbar/focus-out interactions can null or preserve selection in ways that make formatting controls unreliable.
Evidence:
#6053.Decision:
Related only. Route to focus/selection bridge, not #6053.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-react-runtime Confidence: medium
Issue summary: Changing render callback identity can trigger selection events unnecessarily.
Evidence:
#6053.Decision: Related only. Keep as React runtime / event churn pressure.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-input-runtime Confidence: medium
Issue summary: Japanese IME confirmation in an empty editor can produce a DOM point error.
Evidence:
#6053 because both mention stale DOM
or point errors.Decision: Related false neighbor for this lane. Do not claim closure.
PR-description text: None; detailed ledger only.
Status: issue-reviewed Bucket: v2-input-runtime Confidence: medium
Issue summary: Android readOnly state changes can clear or corrupt selection state.
Evidence:
#6053.Decision: Related false neighbor for this lane. Keep under Mobile/IME.
PR-description text: None; detailed ledger only.
Status: triage-closed Bucket: skip-stale Confidence: high
Issue summary: IE11/polyfill selection behavior is stale browser-support debt.
Evidence:
#6053.#6053.Decision: Not claimed. Needs current supported-target repro before v2 work.
PR-description text: None; detailed ledger only.
Status: not-claimed Bucket: skip-maintainer-noise Confidence: high
Issue summary: The issue requests cleanup of an unused variable in the React provider code.
Evidence:
#6053.Decision: Not claimed. No selected-element hook behavior.
PR-description text: None; detailed ledger only.
Status: improves-claimed Bucket: v2-api-dx Confidence: high
Issue summary: The report is TypeScript formatting-key ergonomics around custom mark checks.
Evidence:
#6053..tmp/slate-v2/packages/slate/src/interfaces/text.ts;
.tmp/slate-v2/packages/slate/test/generic-value-contract.ts;
.tmp/slate-v2/site/examples/ts/custom-types.d.ts;
.tmp/slate-v2/site/examples/ts/mark-utils.ts;
docs/plans/2026-05-16-slate-v2-boolean-mark-key-type-helper-ralplan.md.Decision:
Improves. Slate v2 exposes type-only boolean mark key/object helpers and the
examples no longer copy local formatting-key mapped types. This is not a
Fixes claim until the exact original TypeScript repro is replayed.
PR-description text: Improves #5075: Slate v2 exposes type-only boolean mark key/object helpers and examples no longer copy local formatting-key mapped types. Exact closure still needs original repro proof.
Status: cluster-synced Bucket: v2-react-runtime Confidence: high
Issue summary: Feeding editor changes through Redux or another external store can crash or freeze the editor under ordinary typing speed. The thread broadens this beyond Redux: users hit the same class with GraphQL cache and delayed external state loops.
Evidence:
react-controlled-value-and-external-updates, valid,
cluster-synced.0.57.1; gitcrawl neighbors include #4001,
#3834, #3497, #4081, #4495, #3777, #3656, and #3921.useSlateEditor({ initialValue }), selector hooks, and
the snapshot-driven provider tests in
.tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision:
Keep as cluster-synced under v2-react-runtime. The owner is React runtime,
snapshot identity, and external-store update boundaries.
PR-description text: None; already represented by React runtime plan.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Firefox can crash the editor when an accented character is inserted as the first letter on a new line.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-threads-batch2.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts,
and .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts.Decision:
Keep as cluster-synced. It belongs to input/composition and DOM point repair,
but exact Firefox accented-character proof is not claimed.
PR-description text: Related #3777: Firefox first-character composition/input family; no exact closure.
Status: related Bucket: v2-dom-selection Confidence: high
Issue summary:
scrollSelectionIntoView can stop suppressing or controlling scroll after an
editor update.
Evidence:
scrollSelectionIntoView not firing when
deleting empty paragraphs..tmp/gitcrawl/2026-05-04T145301Z-cluster-19-detail.json..tmp/slate-v2/packages/slate-react/test/app-owned-customization.tsx and
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts.Decision:
Keep as cluster-synced. Scroll forwarding and selection reconciliation are
the owner, but the exact after-update browser repro is not closed.
PR-description text: Related #5088: scrollSelectionIntoView update family; no exact closure.
Status: fixes-claimed Bucket: v2-dom-selection Confidence: high
Issue summary:
Deleting empty paragraphs can move the cursor out of view without invoking
scrollSelectionIntoView.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-19-detail.json..tmp/slate-v2/packages/slate-react/test/app-owned-customization.tsx and
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts.Decision:
Keep as cluster-synced. Exact closure needs delete-empty-paragraph browser
proof.
PR-description text: Related #5473: scrollSelectionIntoView delete/update family; no exact closure.
Status: fixes-claimed Bucket: v2-dom-selection Confidence: high
Issue summary: Safari clears editor selection on blur where other browsers preserve it.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-20-detail.json..tmp/slate-v2/playwright/integration/examples/document-state.test.ts,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-selection-engine.ts,
and .tmp/slate-v2/packages/slate-react/test/selection-runtime-contract.test.ts.Decision:
Claim Fixes #4376. WebKit browser proof preserves the Slate model selection
when focus leaves the editor, keeps it through editor refocus, and inserts
follow-up text at the preserved point.
PR-description text: Fixes #4376: WebKit blur/refocus keeps the Slate model selection and follow-up typing lands at the preserved point.
Status: fixes-claimed Bucket: v2-dom-selection Confidence: high
Issue summary: Firefox can emit an invalid DOM selection update when editor content changes while the editor is not focused.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-20-detail.json..tmp/slate-v2/playwright/integration/examples/document-state.test.ts,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-selection-engine.ts,
and .tmp/slate-v2/packages/slate-react/test/selection-runtime-contract.test.ts.Decision:
Claim Fixes #5171. Firefox browser proof changes editor content while the
editor is unfocused and an external input selection is active, without importing
that external selection into the editor model.
PR-description text: Fixes #5171: Firefox unfocused editor updates preserve the inactive editor selection instead of importing an external input selection.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: iOS Safari spellcheck fails for most Cyrillic words after several words are entered.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-22-detail.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts,
.tmp/slate-v2/packages/slate-react/src/editable/model-input-strategy.ts, and
.tmp/slate-v2/packages/slate-browser/test/core/release-proof.test.ts.Decision:
Keep as cluster-synced. The owner is browser/native text input semantics, but
iOS Safari Cyrillic spellcheck proof is not claimed.
PR-description text: Related #5095: Safari spellcheck/native input family; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: macOS Safari spellcheck stops working after several Cyrillic words are entered.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-22-detail.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts,
.tmp/slate-v2/packages/slate-react/src/editable/model-input-strategy.ts, and
.tmp/slate-v2/packages/slate-browser/test/core/release-proof.test.ts.Decision:
Keep as cluster-synced. The owner is browser/native text input semantics, but
macOS Safari Cyrillic spellcheck proof is not claimed.
PR-description text: Related #5096: Safari spellcheck/native input family; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Triple-clicking a block can include part of the following block in the native selection.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-23-detail.json..tmp/slate-v2/playwright/integration/examples/richtext.test.ts,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts, and
.tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/richtext.test.ts --project=chromium --grep "selects the current block on browser triple click|removes the current block after browser triple click and Backspace".Decision:
Claim Fixes #3871. The richtext browser row triple-clicks the first paragraph
and proves the imported model selection is exactly the clicked block range, with
no leak into the following block.
PR-description text: Fixes #3871: the richtext example imports browser triple-click as the clicked block only, without leaking selection into the following block.
Status: fixes-claimed Bucket: v2-dom-selection Confidence: high
Issue summary: Triple-click can create a hanging native range where Backspace/Cut removes only the block contents instead of the whole block.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-23-detail.json..tmp/slate-v2/playwright/integration/examples/richtext.test.ts,
.tmp/slate-v2/packages/slate-react/src/editable/mutation-controller.ts,
.tmp/slate-v2/packages/slate-react/src/editable/editing-kernel.ts, and
.tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/richtext.test.ts --project=chromium --grep "removes the current block after browser triple click and Backspace".Decision:
Claim Fixes #5847. The browser proof reproduces triple-click plus Backspace
on the richtext paragraph and proves the selected block is removed, not left as
an empty paragraph. React command handling now recognizes full-block browser
selection ranges, including the hanging range that ends at the start of the next
block.
PR-description text: Fixes #5847: browser triple-click plus Backspace removes the selected block instead of emptying its contents.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary:
Native input can be missing when typing at the start of a contenteditable.
Evidence:
input for delete/number typing in
<Editable>..tmp/gitcrawl/2026-05-04T145301Z-cluster-16-detail.json..tmp/slate-v2/playwright/integration/examples/richtext.test.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-input-events.ts, and
.tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.ts.Decision:
Keep as cluster-synced. The owner is model-owned beforeinput/input handling,
and the browser row proves start-of-content typing through beforeinput, but
native input parity is not claimed.
PR-description text:
Related #5603: input/beforeinput boundary family; native input parity is not
claimed.
input event is not fired when deleting text or typing numbers in <Editable> componentStatus: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary:
input may not fire for delete or number typing paths.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-16-detail.json..tmp/slate-v2/playwright/integration/examples/richtext.test.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-input-events.ts, and
.tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.ts.Decision:
Keep as cluster-synced. Number typing is proven through beforeinput, and
Backspace is proven as a model-owned keydown delete command, but native
delete/number input parity is not claimed.
PR-description text:
Related #5669: input/beforeinput boundary family; native delete/number input
parity is not claimed.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Void node deletion behavior is inconsistent and needs stronger boundary policy.
Evidence:
[email protected]..tmp/gitcrawl/2026-05-04T145301Z-cluster-17-detail.json..tmp/slate-v2/playwright/integration/examples/images.test.ts and
.tmp/slate-v2/packages/slate-react/src/editable/mutation-controller.ts.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/images.test.ts --project=chromium --grep "removes an empty paragraph after an image before deleting the image|inserts a paragraph after a clicked selected image on Enter".Decision:
Claim Fixes #3991. The exact browser row proves Backspace from an empty
paragraph immediately after a block void removes that paragraph and selects the
void instead of deleting the void.
PR-description text: Fixes #3991: Backspace from an empty paragraph immediately after a selected block void removes the paragraph and selects the void instead of deleting the void.
Status: fixes-claimed Bucket: v2-dom-selection Confidence: high
Issue summary:
Void selection behavior regressed after [email protected].
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-17-detail.json..tmp/slate-v2/playwright/integration/examples/images.test.ts and
.tmp/slate-v2/packages/slate-react/src/editable/mutation-controller.ts.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/images.test.ts --project=chromium --grep "removes an empty paragraph after an image before deleting the image|inserts a paragraph after a clicked selected image on Enter".Decision:
Claim Fixes #4301. The exact browser row proves a clicked selected block void
handles Enter by inserting an editable paragraph after the void, matching the
keyboard-selected void behavior.
PR-description text: Fixes #4301: Enter on a clicked selected block void inserts an editable paragraph after the void.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary:
AndroidEditable can fail to respond when readOnly changes.
Evidence:
readOnly changes..tmp/gitcrawl/2026-05-04T145301Z-cluster-18-detail.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-event-engine.ts, and
.tmp/slate-v2/packages/slate-react/src/hooks/android-input-manager/android-input-manager.ts.Decision:
Keep as cluster-synced. The owner is Android input lifecycle and readOnly
state, but exact Android proof is not claimed.
PR-description text: Related #4994: Android readOnly/input lifecycle family; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary:
Android text insert/remove operations can be lost around readOnly changes.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-18-detail.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts,
.tmp/slate-v2/packages/slate-react/src/editable/runtime-event-engine.ts, and
.tmp/slate-v2/packages/slate-react/src/hooks/android-input-manager/android-input-manager.ts.Decision:
Keep as cluster-synced. Exact Android readOnly operation proof is not
claimed.
PR-description text: Related #5026: Android readOnly/input lifecycle family; no exact closure.
Status: cluster-synced Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: Copying text that contains an inline void from Slate into other editors produces bad clipboard output.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-21-detail.json..tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts no
longer assumes block-void data-slate-spacer DOM when exporting a selected
inline void; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts
proves the Slate fragment payload is preserved and external text output does
not leak FEFF or neighboring text. Browser proof in
.tmp/slate-v2/playwright/integration/examples/mentions.test.ts selects a
mention-shaped inline void, confirms deterministic native text/html and
text/plain, decodes the embedded Slate fragment, and pastes visible content
into an external contenteditable target.Decision:
Keep as improves-claimed. Selected inline void export is covered at the DOM
clipboard boundary and through a real browser clipboard payload. Exact named
other-editor app behavior is still not claimed.
PR-description text: Improves #4802: selected inline void export keeps deterministic browser clipboard payloads without FEFF or neighboring text leakage; no exact named other-editor closure.
Status: fixes-claimed Bucket: v2-clipboard-serialization Confidence: high
Issue summary: Inline void content cannot be copied/pasted correctly.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-21-detail.json..tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts exports a
selected inline void through a safe attach node when no block spacer exists;
.tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts proves copy,
paste round-trip, and cut ordering for a selected mention-shaped inline void.
.tmp/slate-v2/playwright/integration/examples/mentions.test.ts proves the
same path through Chromium's native clipboard: copy exposes the selected
inline void as deterministic HTML/text plus Slate fragment, paste inserts a
second mention, and cut removes one mention node with model-owned caret
repair.Decision:
Move to fixes-claimed. Focused DOM clipboard proof and browser clipboard
proof cover the selected inline void copy/paste/cut repro shape.
PR-description text: Fixes #4806: selected inline void copy/paste/cut works through the native browser clipboard path and keeps model-owned caret repair.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Chrome and Safari cannot place selection at the end of inline DOM elements.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-25-detail.json..tmp/slate-v2/playwright/integration/examples/inlines.test.ts.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/inlines.test.ts --project=chromium --grep "types inside an editable inline at its end|keeps the start of following text distinct from the end of an inline|places the caret outside a padded inline before typing".Decision:
Claim Fixes #3148. The browser rows prove both sides of the inline boundary:
typing at the inline end stays in the inline, while typing at the following
text start stays outside the inline.
PR-description text: Fixes #3148: inline edge selections keep the inline end and following text start distinct before text insertion in Chromium and WebKit.
Status: cluster-synced Bucket: v2-dom-selection Confidence: low
Issue summary: This is an upstream-known-issues tracker related to inline DOM end selection.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-cluster-25-detail.json..tmp/slate-v2/packages/slate-browser/test/core/scenario.test.ts and
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts.Decision:
Keep as cluster-synced but low confidence. Use #3148 for exact future proof,
not this tracker row.
PR-description text: Related #3150: inline DOM end-selection tracker; no exact closure.
Status: improves-claimed Bucket: v2-core-engine Confidence: medium
Issue summary: Undo can restore content while leaving selection in a broken state.
Evidence:
move_nodes..tmp/gitcrawl/2026-05-04T145301Z-cluster-27-detail.json..tmp/slate-v2/packages/slate/src/core/apply.ts,
.tmp/slate-v2/packages/slate/src/core/public-state.ts, and
.tmp/slate-v2/packages/slate/test/state-tx-public-api-contract.ts..tmp/slate-v2/packages/slate-history/test/history-contract.ts covers a
multi-block expanded selection, insertBreak, undo, and exact selection
restoration.Decision:
Promote to fixes-claimed. The package proof matches the reported Enter/undo
selection flow without adding public API.
PR-description text: Fixes #3534: undo after pressing Enter with a selection spanning multiple blocks restores the original expanded selection.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary:
Undoing move_nodes can produce incorrect document or selection state.
Evidence:
move_nodes undo is
the specific transform path..tmp/gitcrawl/2026-05-04T145301Z-cluster-27-detail.json..tmp/slate-v2/packages/slate/src/core/apply.ts,
.tmp/slate-v2/packages/slate/src/core/public-state.ts, and
.tmp/slate-v2/packages/slate/test/state-tx-public-api-contract.ts..tmp/slate-v2/packages/slate-history/test/history-contract.ts covers
moveNodes, undo, and exact original tree plus selection restoration.Decision:
Promote to fixes-claimed. The focused proof exercises the suspected
moveNodes undo path and restores both document and selection.
PR-description text:
Fixes #3551: undo after a moveNodes commit restores the original tree and
selection.
Status: fixes-claimed Bucket: v2-dom-selection Confidence: high
Issue summary: Programmatic content removal can leave Slate trying to resolve a model point against DOM that no longer represents the current document.
Evidence:
dom-point-resolution-crashes..tmp/slate-v2/packages/slate/test/state-tx-public-api-contract.ts,
docs/plans/2026-04-02-slate-dom-v2-bridge-proof-ralph.md, and
docs/slate-v2/ledgers/issue-coverage-matrix.md.Decision:
Keep as improves-claimed, not fixes-claimed. V2 materially improves the
replacement and DOM bridge ownership model, but this exact browser reproduction
has not been replayed as auto-close proof.
PR-description text: Improves #4564 through transaction-owned replacement and boundary-aware DOM bridge direction; not an exact closure claim.
Status: fixes-claimed Bucket: v2-dom-selection Confidence: high
Issue summary: Slate imports a browser DOM point that cannot be mapped back to the Slate model.
Evidence:
dom-point-resolution-crashes.docs/plans/2026-04-02-slate-dom-v2-bridge-proof-ralph.md.Decision:
Classify as cluster-synced. It belongs to the DOM bridge/import-export
architecture owner, but there is no exact current repro proof for closure.
PR-description text: Related #3723: DOM point resolution crash family, covered by DOM bridge architecture; no exact closure claim.
Status: improves-claimed Bucket: v2-dom-selection Confidence: medium
Issue summary: Dragging or extending selection from outside Slate into the editor can feed an outside-owned DOM point into Slate point import.
Evidence:
dom-point-resolution-crashes..tmp/slate-v2/playwright/integration/examples/richtext.test.ts,
.tmp/slate-v2/packages/slate-dom/test/bridge.ts,
docs/plans/2026-05-06-slate-v2-dom-selection-boundary-proof-ralplan.md,
and docs/slate-v2/ledgers/issue-coverage-matrix.md.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/richtext.test.ts --project=chromium --grep "ignores a native selection that starts outside the editor and ends inside it".Decision:
Claim Fixes #4789. The browser row creates a native selection that starts
outside Slate and ends inside the editor, verifies no DOM point crash, and
proves the editor remains usable after normal refocus.
PR-description text: Fixes #4789: a native selection that starts outside the editor and ends inside the editor is ignored without a DOM point crash, and the editor remains usable after refocus.
Status: fixes-claimed Bucket: v2-dom-selection Confidence: high
Issue summary: Another DOM point import failure in the same crash family as cluster 1.
Evidence:
dom-point-resolution-crashes.docs/plans/2026-04-02-slate-dom-v2-bridge-proof-ralph.md.Decision:
Classify as cluster-synced. It supports the DOM bridge owner but has no exact
standalone v2 closure proof.
PR-description text: Related #3836: DOM point resolution crash family, covered by DOM bridge architecture; no exact closure claim.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: iOS Safari typing can surface the same DOM point import crash family.
Evidence:
dom-point-resolution-crashes.docs/plans/2026-04-02-slate-dom-v2-bridge-proof-ralph.md.Decision:
Classify as cluster-synced. It belongs to DOM point import/export, but iOS
Safari closure needs matching browser proof.
PR-description text: Related #5711: DOM point resolution crash family, covered by DOM bridge architecture; no exact iOS closure claim.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Slate receives a text-node DOM point that cannot be converted to a Slate point.
Evidence:
dom-point-resolution-crashes.docs/plans/2026-04-02-slate-dom-v2-bridge-proof-ralph.md.Decision:
Classify as cluster-synced. It is evidence for central DOM point import
policy, not a standalone exact fix claim.
PR-description text: Related #3834: DOM point resolution crash family, covered by DOM bridge architecture; no exact closure claim.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Selection across nested editor boundaries can ask the wrong editor to resolve a DOM point.
Evidence:
dom-point-resolution-crashes..tmp/slate-v2/playwright/integration/examples/editable-voids.test.ts,
docs/plans/2026-05-06-slate-v2-dom-selection-boundary-proof-ralplan.md,
and docs/slate-v2/ledgers/issue-coverage-matrix.md.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/editable-voids.test.ts --project=chromium --grep "ignores a parent selection that crosses into a nested editor".Decision:
Claim Fixes #4984. The browser row creates a parent-editor native selection
that crosses into a nested editor, verifies no DOM point crash, and proves input
remains scoped to the editor that owns focus.
PR-description text: Fixes #4984: a parent-editor selection that crosses into a nested editor is ignored without a DOM point crash, and input remains owned by the parent or nested editor that actually has focus.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Cursor movement and text entry around inline elements can put the caret in an unexpected inline boundary position.
Evidence:
inline-boundary-cursor-movement..tmp/slate-v2/playwright/integration/examples/inlines.test.ts.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/inlines.test.ts --project=chromium --grep "types inside an editable inline at its end|keeps the start of following text distinct from the end of an inline|places the caret outside a padded inline before typing".Decision:
Claim Fixes #4074. The Chromium browser row proves text can be inserted at an
editable inline edge without being pushed outside the inline.
PR-description text: Fixes #4074: the inlines example can type inside an editable inline at the inline edge in Chromium.
Status: not-claimed Bucket: v2-dom-selection Confidence: high
Issue summary: The request asks for an extension point to normalize cursor movement around custom inline/boundary behavior.
Evidence:
inline-boundary-cursor-movement.docs/plans/2026-04-02-slate-dom-v2-bridge-proof-ralph.md.Decision:
Keep as not-claimed. The inline-boundary behavior is covered by internal
bridge/browser proof, but this slice intentionally rejects a public
normalizePoint API.
PR-description text:
Not claimed #4618: no public normalizePoint API; inline-boundary behavior is
owned by the internal DOM selection bridge.
Status: fixes-claimed Bucket: v2-dom-selection Confidence: high
Issue summary: Inline styling/padding can make the visual caret appear inside an inline node instead of at a deterministic boundary.
Evidence:
inline-boundary-cursor-movement..tmp/slate-v2/playwright/integration/examples/inlines.test.ts.PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/inlines.test.ts --project=chromium --grep "types inside an editable inline at its end|keeps the start of following text distinct from the end of an inline|places the caret outside a padded inline before typing".Decision:
Claim Fixes #3429. The browser row proves the caret target before the padded
editable inline stays anchored in the preceding text and outside the padded
inline.
PR-description text: Fixes #3429: the caret target before a padded inline stays outside the padded inline in Chromium.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary:
History replay can produce or apply an incomplete set_selection operation,
breaking undo/redo selection state.
Evidence:
history-set-selection-errors..tmp/slate-v2/packages/slate/test/operations-contract.ts,
.tmp/slate-v2/packages/slate-history/test/history-contract.ts, and
.tmp/slate-v2/packages/slate-history/test/integrity-contract.ts..tmp/slate-v2/packages/slate-history/test/history-contract.ts covers history
undo after a partial set_selection patch and a cleared selection.Decision:
Promote to improves-claimed. The model-level incomplete set_selection
family is covered, but the upstream issue is ignored-template/needs-info and
does not have a complete exact browser repro to auto-close.
PR-description text:
Improves #3705: partial set_selection history undo is covered; no exact
ignored-template closure.
Status: cluster-synced Bucket: v2-core-engine Confidence: medium
Issue summary: Selection movement can be saved or replayed incorrectly by the history stack.
Evidence:
history-set-selection-errors..tmp/slate-v2/packages/slate-history/test/history-contract.ts,
.tmp/slate-v2/packages/slate-history/test/integrity-contract.ts, and
.tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts.docs/plans/2026-05-07-slate-v2-marked-enter-undo-caret-ralplan.md.Decision:
Classify as cluster-synced. It belongs to transaction-aware history and
selection movement policy. It is a related guard for #3499, but exact closure
requires replaying the original multi-block delete/selection scenario.
PR-description text: Related #3756: history selection movement family; no exact closure claim.
Status: cluster-synced Bucket: v2-core-engine Confidence: medium
Issue summary:
Refocus plus history replay can surface an incomplete set_selection operation
error.
Evidence:
history-set-selection-errors..tmp/slate-v2/packages/slate/test/operations-contract.ts,
.tmp/slate-v2/packages/slate-history/test/history-contract.ts, and
.tmp/slate-v2/packages/slate-history/test/integrity-contract.ts..tmp/slate-v2/packages/slate-history/test/history-contract.ts covers the
cleared-selection model failure that makes partial selection replay risky.Decision:
Promote to improves-claimed. The core model failure family is covered, but
exact refocus closure still needs browser/focus proof.
PR-description text:
Improves #3921: partial set_selection history undo is covered; exact refocus
closure still needs browser proof.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary:
Programmatic ReactEditor.focus(editor) can report or request focus without
restoring a usable input path.
Evidence:
react-editor-focus-after-programmatic-change..tmp/slate-v2/packages/slate-react/src/components/slate.tsx,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts, and
.tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision:
Classify as cluster-synced. The issue belongs to focus/selection ownership
under React runtime pressure, but the exact focus reproduction is not
auto-closed.
PR-description text: Related #3634: React focus/input runtime family; no exact closure claim.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: When multiple editors exist, programmatic focus can leave the target editor visibly focused but unable to accept input.
Evidence:
react-editor-focus-after-programmatic-change..tmp/slate-v2/packages/slate-react/src/components/slate.tsx,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts, and
.tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision:
Classify as cluster-synced. It strengthens the multi-editor focus owner but
needs exact browser proof before closure.
PR-description text: Related #5537: multi-editor programmatic focus runtime family; no exact closure claim.
Status: related Bucket: v2-react-runtime Confidence: medium
Issue summary: Placeholder min-height from one editor leaks onto another when multiple editors are mounted, which implies placeholder measurement or DOM state is keyed too broadly.
Evidence:
docs/slate-issues/gitcrawl-live-open-ledger.md.docs/slate-issues/open-issues-dossiers/5129-5066.md.docs/plans/2026-05-20-slate-v2-non-node-editor-state-architecture-ralplan.md.Decision: Keep this as related/example pressure only. The accepted multi-root React provider must prove view-local DOM measurement and placeholder state, but no exact browser closure exists yet.
PR-description text: Related #5117: multi-editor placeholder measurement belongs to view-local React runtime proof; no exact closure claim.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary:
After inserting a node, calling ReactEditor.focus can fail to restore a
usable caret/input state.
Evidence:
react-editor-focus-after-programmatic-change..tmp/slate-v2/packages/slate-react/src/components/slate.tsx,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts, and
.tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision:
Classify as cluster-synced. It belongs to React focus and selection repair
after model changes; exact closure requires replaying the insert-and-focus
scenario.
PR-description text: Related #4961: React focus after programmatic node insertion; no exact closure claim.
Status: cluster-synced Bucket: v2-input-runtime Confidence: high
Issue summary:
With a German keyboard and an empty editor placeholder, the first backtick input
does not fire the expected change path; the next character desynchronizes Slate
and DOM points and throws Cannot resolve a Slate point from DOM point.
Evidence:
placeholder-and-ime-empty-editor, valid, cluster-synced..tmp/slate-v2/packages/slate-react/src/editable/root-selector-sources.ts;
.tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts;
composition tests.Decision:
Keep as cluster-synced under v2-input-runtime. It is a real placeholder +
input-method DOM bridge issue, not a React external-store bug.
PR-description text: None; already represented by input runtime plan.
Status: cluster-synced Bucket: v2-react-runtime Confidence: high
Issue summary:
An unrelated parent state update can steal focus immediately after
ReactEditor.focus(editor). Later comments broaden the issue to multiple
editors and rerendered sibling editors where ReactEditor.isFocused may still
return true even though the visible caret/input path is gone.
Evidence:
focus-state-and-external-dom-ownership, valid,
cluster-synced..tmp/slate-v2/packages/slate-react/src/components/slate.tsx;
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts;
provider hook tests.Decision:
Keep as cluster-synced under v2-react-runtime. The owner is focus/selection
state under React rerender pressure.
PR-description text: None; already represented by React runtime plan.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: [Chrome, Android] The Hangul composition breaks on the first character when the placeholder is visible.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-placeholder-composition.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Android Hangul placeholder composition belongs to first-character composition and placeholder input ownership. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5989: Android Hangul placeholder composition belongs to first-character composition and placeholder input ownership; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Android Chinese Input Issue: Backspace requires two presses to trigger one onChange event.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-samsung-firefox-android.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Android Chinese IME backspace belongs to Android IME deletion/input ownership. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5984: Android Chinese IME backspace belongs to Android IME deletion/input ownership; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Windows text suggestions append the accepted completion after the typed prefix instead of replacing the active word segment.
Evidence:
docs/slate-issues/gitcrawl-live-open-ledger.md.docs/slate-issues/open-issues-dossiers/5994-5918.md..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts;
.tmp/slate-v2/packages/slate-react/src/editable/native-input-strategy.ts.Decision:
Windows suggestion acceptance belongs to input/composition replacement-range
ownership. No exact Fixes #... claim is justified without a focused Windows
suggestion-bar repro matching this issue.
PR-description text: Related #5931: Windows text suggestion acceptance belongs to input/composition replacement-range ownership; no exact closure.
onBlur not called while composing (Japanese or Korean)Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Blur is not reported while Japanese or Korean composition is active.
Evidence:
docs/slate-issues/gitcrawl-live-open-ledger.md.docs/slate-issues/open-issues-dossiers/5912-5771.md..tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts;
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts.Decision:
Blur during Japanese/Korean composition belongs to composition and focus
lifecycle ownership. No exact Fixes #... claim is justified without a focused
composition-blur repro matching this issue.
PR-description text: Related #5830: Blur during Japanese/Korean composition belongs to composition and focus lifecycle ownership; no exact closure.
Status: not-claimed Bucket: ecosystem-boundary Confidence: medium
Issue summary: How can we use this library on browsers that don't support composition events?.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-placeholder-composition.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json.docs/slate-issues/gitcrawl-recluster-map.md; current app-specific repro still required.Decision:
Browser environments without composition events need capability policy; exact support depends on current target browser proof. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5912: Browser environments without composition events need capability policy; exact support depends on current target browser proof; no exact closure.
Status: triage-closed Bucket: skip-invalid Confidence: medium
Issue summary: Inserting the same node more than once causes strange desyncing behavior.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-node-dom-node.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json.docs/slate-issues/gitcrawl-recluster-map.md; raw Slate node identity contract.Decision:
Reusing the same Slate node object violates node identity ownership; future work should make the failure explicit, not support shared object reuse. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5874: Reusing the same Slate node object violates node identity ownership; future work should make the failure explicit, not support shared object reuse; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Shadow DOM - Drag-and-drop text throws error.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-node-dom-node.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Shadow DOM drag/drop DOM point import belongs to the shadow DOM bridge family. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5749: Shadow DOM drag/drop DOM point import belongs to the shadow DOM bridge family; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: On some android device with some keyboard autocomplete is broken.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-samsung-firefox-android.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Android autocomplete leftovers belong to mobile input and composition cleanup. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5643: Android autocomplete leftovers belong to mobile input and composition cleanup; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: use with mobx-react-lite error.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/components/slate.tsx; .tmp/slate-v2/packages/slate-react/src/decoration-source.ts; .tmp/slate-v2/packages/slate-react/test/app-owned-customization.tsx.Decision:
MobX observer pressure belongs to external reactive rendering and React runtime ownership. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5509: MobX observer pressure belongs to external reactive rendering and React runtime ownership; no exact closure.
Status: not-claimed Bucket: v2-dom-selection Confidence: medium
Issue summary: Slate crashes when arrowing into or out of table with colgroup/col nodes.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-node-dom-node.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json.docs/plans/2026-05-06-slate-v2-dom-selection-boundary-proof-ralplan.md.Decision:
Do not claim this as fixed by the DOM-selection slice. The exact repro relies
on app-rendered colgroup / col shapes that omit editable Slate descendants,
which the v2 plan intentionally does not support as raw missing DOM. A future
Slate-owned DOM coverage boundary can support intentional missing DOM, but
unregistered app omissions stay unsupported.
PR-description text:
Not claimed #5355: colgroup / col renderers that omit editable descendants
need a Slate-owned DOM coverage boundary; raw app-rendered missing DOM is not a
supported closure target.
Status: not-claimed Bucket: v2-api-dx Confidence: medium
Issue summary: make slate a controlled input.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate/test/state-tx-public-api-contract.ts; docs/plans/2026-05-04-slate-v2-react-editor-initialization-value-ralplan.md.Decision:
Controlled React value remains outside the v2 public contract; external replacement uses explicit editor APIs. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5281: Controlled React value remains outside the v2 public contract; external replacement uses explicit editor APIs; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Android Predictive typing broken - Firefox.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-placeholder-composition.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Firefox Android predictive typing belongs to mobile input runtime proof. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5130: Firefox Android predictive typing belongs to mobile input runtime proof; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: findEventRange in shadow-DOM: "Cannot resolve a Slate point from DOM point", in Chrome.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-point-dom-point.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Shadow DOM findEventRange belongs to event-to-range DOM bridge ownership. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5107: Shadow DOM findEventRange belongs to event-to-range DOM bridge ownership; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: data-slate-spacer span is visible when void inline-elements are selected.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-inline-void-selection-keyboard.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Visible inline void spacer belongs to inline void selection/rendering boundary policy. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5087: Visible inline void spacer belongs to inline void selection/rendering boundary policy; no exact closure.
beforeInsertText function to accept/reject text insertionStatus: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary:
a beforeInsertText function to accept/reject text insertion.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-android-composition-beforeinput.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Text insertion accept/reject belongs to beforeinput/input command policy, not a separate uncontrolled hook. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5050: Text insertion accept/reject belongs to beforeinput/input command policy, not a separate uncontrolled hook; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: CJK will output duplicated and crash on Firefox.(same on slatejs.org).
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Firefox CJK duplication/crash belongs to IME/composition runtime proof. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #5014: Firefox CJK duplication/crash belongs to IME/composition runtime proof; no exact closure.
Status: needs-repro Bucket: ecosystem-boundary Confidence: medium
Issue summary: Error thrown with Katex library: Cannot resolve a DOM point.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-point-dom-point.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json.docs/slate-issues/gitcrawl-recluster-map.md; current app-specific repro still required.Decision:
KaTeX DOM point crashes need app-rendered DOM bridge proof; external DOM is not automatically supported. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4851: KaTeX DOM point crashes need app-rendered DOM bridge proof; external DOM is not automatically supported; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: toSlatePoint has incorrect offset with nested editors.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-node-dom-node.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Nested editor toSlatePoint offset belongs to nested editor DOM containment. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4842: Nested editor toSlatePoint offset belongs to nested editor DOM containment; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Custom table node allows entering text outside the table which leaves slate in a broken state.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-node-dom-node.json, .tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-point-dom-point.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Custom table text outside table belongs to table boundary and invalid DOM import policy. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4658: Custom table text outside table belongs to table boundary and invalid DOM import policy; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Invalid selection leads to uncatchable error: "Cannot resolve a DOM point from Slate point".
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-point-dom-point.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Invalid selection throwing belongs to fail-closed DOM selection repair. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4643: Invalid selection throwing belongs to fail-closed DOM selection repair; no exact closure.
Status: improves-claimed Bucket: v2-api-dx Confidence: medium
Issue summary: Bug: Cannot update slate state externally.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-node-dom-node.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate/test/state-tx-public-api-contract.ts; docs/plans/2026-05-04-slate-v2-react-editor-initialization-value-ralplan.md.Decision:
External state updates route through explicit editor initialization/replacement APIs rather than controlled value. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4612: External state updates route through explicit editor initialization/replacement APIs rather than controlled value; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Deleting a void element or text decoration on FireFox and inserting text throws an error.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-node-dom-node.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Firefox void/decorated deletion then insert belongs to void/decorated DOM selection repair. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4581: Firefox void/decorated deletion then insert belongs to void/decorated DOM selection repair; no exact closure.
Status: cluster-synced Bucket: v2-core-engine Confidence: medium
Issue summary: deleteFragment undo should select re-inserted fragment.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-history-set-selection-undo.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate/src/core/apply.ts; .tmp/slate-v2/packages/slate/src/core/public-state.ts; .tmp/slate-v2/packages/slate/test/state-tx-public-api-contract.ts..tmp/slate-v2/packages/slate-history/test/history-contract.ts
deletes a selected text fragment, undoes, and reselects the restored fragment.Decision:
Promote to fixes-claimed. The package proof matches the reported
deleteFragment undo selection behavior.
PR-description text:
Fixes #4559: undo after deleteFragment reselects the restored fragment.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Backspace Key on Android.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-samsung-firefox-android.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Android backspace behavior belongs to mobile delete/input runtime proof. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4348: Android backspace behavior belongs to mobile delete/input runtime proof; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Image example in shadow dom: Cannot resolve a Slate point from DOM point.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Shadow DOM image drag/drop belongs to shadow DOM and media/void DOM bridge ownership. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4337: Shadow DOM image drag/drop belongs to shadow DOM and media/void DOM bridge ownership; no exact closure.
Status: not-claimed Bucket: v2-input-runtime Confidence: medium
Issue summary: Proposal: Alternate hook-based implementation of Android support.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-android-composition-beforeinput.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Alternate Android hook design is product/API direction evidence, not an issue closure. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4223: Alternate Android hook design is product/API direction evidence, not an issue closure; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Mention example range logic throws Cannot resolve a DOM point from Slate point.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-point-dom-point.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Mention range DOM point failure belongs to mention/inline DOM range bridge ownership. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4088: Mention range DOM point failure belongs to mention/inline DOM range bridge ownership; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Input composition characters, Error !.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-placeholder-composition.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Composition after select-all belongs to composition/input event runtime ownership. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #4067: Composition after select-all belongs to composition/input event runtime ownership; no exact closure.
Status: improves-claimed Bucket: v2-performance-benchmark Confidence: high
Issue summary: Copy pasting (really) large text no longer seems to work?.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-large-document-paste-cut-performance.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/scripts/benchmarks/core/current/clipboard-large-payload.mjs; .tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts; .tmp/slate-v2/packages/slate/src/transforms-text/insert-fragment.ts.Decision:
Current v2 improves the populated-editor large paste/copy workload with a dedicated issue-size benchmark. Exact Fixes #... closure is still not justified without the historical full-book/browser repro.
Slice 6 benchmark, refreshed 2026-05-23:
.tmp/slate-v2/tmp/slate-clipboard-large-payload-benchmark.json records a
populated-editor benchmark lane. The latest issue-size run reports
49.35ms for copying 10,000 populated blocks and 235.22ms for pasting
10,000 plaintext lines into a 10,000-block populated editor, with one
logical operation. The DOM plaintext fallback now builds a model
fragment for populated text-block paste, and core fits top-level multi
text-block fragments as one replacement while preserving surrounding target
text and selection. Exact full-book browser closure remains unclaimed.
PR-description text: Improves #4056: populated-editor large copy and large middle paste have issue-size benchmark proof; exact browser repro closure remains open.
Status: improves-claimed Bucket: v2-performance-benchmark Confidence: high
Issue summary: Pasting generated plain text with 10,000 newline-separated rows into the plaintext example reportedly takes about seven seconds in Slate versus about one second in Tiptap.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 4056,5945,5992 --include-closed --json.ready-now, large plaintext paste benchmark.docs/plans/2026-05-04-slate-v2-clawsweeper-v2-clipboard-serialization-ralplan.md;
source owner .tmp/slate-v2/scripts/benchmarks/core/current/clipboard-large-payload.mjs.Decision:
This is the primary Slice 6 benchmark target. Current v2 now improves the
issue-size plaintext paste workload by replacing the per-line
splitNodes + insertText path with one logical replace_fragment operation
for the high-pressure empty-editor paste case. Do not use Fixes #5945 until a
10,000-line browser artifact matches the reported plaintext example workflow.
Slice 6 benchmark:
The bounded baseline showed the old 2,000-line plain-text insert averaging
3545.36ms with 5998 operations, while split/encode/decode/copy were cheap.
The current issue-size command bun run bench:slate:5945:issue covers the
10,000-line plaintext workload and records one operation through
replace_fragment; the latest run reported 34.72ms for 10,000 inserted
blocks. Focused package proof also covers trusted Slate fragment insertion into
empty, compatible, marked, inline-child, and full-document text-block targets
plus whole top-level structural block replacement as one logical operation with
undoable history. Collaboration proof replays the resulting replace_fragment
operation through tx.operations.replay(...); CRDT/Yjs-style lowering remains
an adapter-boundary concern.
PR-description text:
Improves #5945: 10,000-line plaintext paste uses one logical
replace_fragment operation in the issue-size benchmark; exact browser repro
closure still needs a 10,000-line browser artifact.
Status: improves-claimed Bucket: v2-performance-benchmark Confidence: high
Issue summary: Cutting two selected nodes in a 50,000-block huge document reportedly spends too much time, with the issue specifically calling out expensive array destructuring.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 4056,5945,5992 --include-closed --json.ready-with-minor-setup, huge-document cut
benchmark.large-document-edit-performance and
v2-performance-benchmark.SLATE_CLIPBOARD_BENCH_HUGE_CUT_BLOCKS=50000 SLATE_CLIPBOARD_BENCH_ISSUE_TARGETS=1 bun ./scripts/benchmarks/slate/5945-large-plaintext-paste.mjs..tmp/slate-v2/packages/slate/src/interfaces/node.ts and
.tmp/slate-v2/packages/slate/test/clipboard-contract.ts.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md;
source owner .tmp/slate-v2/scripts/benchmarks/core/current/clipboard-large-payload.mjs.Decision:
Keep this as improves-claimed, not fixes-claimed. The issue-size benchmark
now meets the accepted warm interaction target through one replace_children
operation, and the cold snapshot row is reported separately instead of being
hidden inside the edit metric. Browser stress covers a 5,000-block huge-document
cut row. Exact closure still needs maintainer acceptance that the benchmark plus
browser stress matches the reported user path.
Slice 6 baseline:
The issue-size benchmark measures a 50,000-block two-node cut at warm edit p50
9.95ms, warm copy-plus-delete p50 8.62ms, and operation count 1. The
separate cold edit row remains p50 171.91ms, showing the remaining snapshot
allocation cost without blocking the warmed editor interaction target. The
previous slice measured 621.26ms copy-plus-delete and 511.47ms edit-only at
3 operations after bounded fragment extraction, and the prior local issue-size
run before bounded fragment extraction measured about 4002.02ms for
copy-plus-delete.
PR-description text:
Improves #5992: huge-document two-node cut lowers exact whole-child range delete
to one replace_children operation, meets the accepted warm benchmark target,
and has a browser huge-document cut stress row; exact auto-close remains a
maintainer acceptance decision.
data-slate-fragment textStatus: cluster-synced Bucket: v2-clipboard-serialization Confidence: high
Issue summary:
Pasted HTML that contains text matching data-slate-fragment="..." can be
mistaken for an internal Slate payload and block paste.
Evidence:
v2-clipboard-serialization, clipboard-and-external-html-parsing.gitcrawl --json threads ianstormtaylor/slate --numbers 5328 --include-closed..tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts owns
fragment import; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts
owns the focused DOM clipboard contract.Decision:
Keep as improves-claimed. Malformed MIME payloads, malformed embedded HTML
data-slate-fragment, invalid JSON, URI-decode failures, and non-array JSON
now fail closed in the focused DOM clipboard contract. Exact browser repro
closure is still not claimed.
PR-description text: Improves #5328: clipboard fragment trust-boundary family; no exact closure yet.
Status: improves-claimed Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: Selecting all in Slate and pasting foreign HTML can throw while still partially inserting content.
Evidence:
v2-clipboard-serialization, paste-html-fragment-boundary-errors.gitcrawl --json threads ianstormtaylor/slate --numbers 4857 --include-closed..tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts and
.tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts.Decision:
Keep as improves-claimed. The fail-closed internal fragment import family is
covered by focused DOM clipboard tests. Exact NYTimes/richtext browser repro
closure is not claimed.
PR-description text: Improves #4857: foreign HTML clipboard import boundary; no exact closure.
Status: cluster-synced Bucket: v2-clipboard-serialization Confidence: high
Issue summary:
Slate editors with different schemas can collide on
application/x-slate-fragment; the receiving editor needs a configurable
fragment MIME key.
Evidence:
v2-clipboard-serialization, clipboard-schema-isolation.setData id capability.gitcrawl --json threads ianstormtaylor/slate --numbers 5233 --include-closed..tmp/slate-v2/packages/slate-react/src/plugin/with-react.ts and
.tmp/slate-v2/packages/slate-dom/src/plugin/with-dom.ts accept
{ clipboardFormatKey }; .tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts
writes keyed MIME payloads and keyed embedded HTML fallback fragments; and
.tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts proves custom-key
editors accept matching embedded HTML while default-key editors reject
custom-key embedded HTML and fall back to plain text.Decision:
Move to fixes-claimed. The exact cross-schema isolation request is covered by
options-object custom keys, keyed MIME payloads, keyed embedded HTML fallback,
and mismatched fallback rejection proof.
PR-description text: Fixes #5233: custom fragment format keys isolate MIME payloads and embedded HTML fallback fragments.
Status: fixes-claimed Bucket: v2-clipboard-serialization Confidence: high
Issue summary:
The clipboard setData id should be customizable so two Slate schemas do not
blindly import each other's internal fragments.
Evidence:
v2-clipboard-serialization, clipboard-and-transferdata-customization.gitcrawl --json threads ianstormtaylor/slate --numbers 3486 --include-closed..tmp/slate-v2/packages/slate-react/src/plugin/with-react.ts and
.tmp/slate-v2/packages/slate-dom/src/plugin/with-dom.ts expose
{ clipboardFormatKey }; .tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts
writes and reads the configured internal key; and
.tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts proves matching
custom-key HTML import plus default-key rejection of custom-key embedded HTML.Decision:
Move to fixes-claimed with #5233. The older custom setData id request is
the same schema-isolation requirement and now has focused proof.
PR-description text: Fixes #3486: custom clipboard format keys isolate internal fragment transport.
Status: improves-claimed Bucket: v2-clipboard-serialization Confidence: high
Issue summary: Slate fragments need an identity marker so editors with incompatible schemas do not blindly import each other's internal JSON.
Evidence:
v2-clipboard-serialization, clipboard-schema-isolation.gitcrawl threads ianstormtaylor/slate --numbers 1024 --include-closed --json..tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts, with
focused acceptance/rejection proof in
.tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts.Decision:
Move to improves-claimed. Fragment identity is stronger, but no full document
MIME system is claimed.
PR-description text: Improves #1024: fragment MIME identity family; no full document MIME system.
Status: improves-claimed Bucket: v2-clipboard-serialization Confidence: high
Issue summary:
Apps need to reuse Slate clipboard behavior while adding custom paste handling
instead of copying internal insertData logic.
Evidence:
v2-clipboard-serialization, clipboard-extension-surface.gitcrawl threads ianstormtaylor/slate --numbers 4613 --include-closed --json..tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts runs
dom.clipboard.insertData capability handlers before default fragment/text
fallback, .tmp/slate-v2/packages/slate-dom/src/plugin/dom-editor.ts exports
DOMClipboardInsertDataHandler, and the images, paste-html, and
rendering-strategy-runtime examples use the public handler type.Decision:
Move to improves-claimed. The extension hook is public and typed, but the
broader legacy "reuse insertData internals" request remains broader than this
clipboard slice.
PR-description text: Improves #4613: extensible insertData capability with public handler typing.
Status: fixes-claimed Bucket: v2-clipboard-serialization Confidence: high
Issue summary:
Docs should describe how insertData works.
Evidence:
v2-clipboard-serialization, clipboard-extension-surface.gitcrawl threads ianstormtaylor/slate --numbers 4569 --include-closed --json..tmp/slate-v2/docs/libraries/slate-react/react-editor.md documents
editor.dom.clipboard.insertData, capability order, handler return
semantics, internal fragment fallback, and extension-owned rich HTML policy.
.tmp/slate-v2/docs/libraries/slate-react/with-react.md documents
clipboardFormatKey.Decision:
Move to fixes-claimed. The requested insertData behavior docs exist in the
v2 docs surface.
PR-description text:
Fixes #4569: insertData docs state capability order, return semantics, and
fallback behavior.
Status: cluster-synced Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: Apps want custom outgoing plain-text/HTML clipboard serialization without rewriting all of Slate's copy/cut internals.
Evidence:
v2-clipboard-serialization, clipboard-output-customization.gitcrawl threads ianstormtaylor/slate --numbers 4440 --include-closed --json.Decision:
Keep as Related, not fixed. A later output serializer capability may address
this cleanly. Do not cram it into the insertData input path.
PR-description text: Related #4440: output clipboard customization; not claimed by Slice 5.
Status: cluster-synced Bucket: v2-api-dx Confidence: medium
Issue summary: Apps expect extension points around insert operations instead of brittle direct method replacement.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 3557 --include-closed --json.dom.clipboard.insertData.Decision:
Keep as Related, not fixed. Do not claim a broad method override issue from a
clipboard-specific capability pass.
PR-description text: Related #3557: broader extension-method override pressure; not fixed by this clipboard slice.
Status: cluster-synced Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: Pasting selected text from nested content into an empty block imports unwanted wrapper context instead of the selected content shape.
Evidence:
v2-clipboard-serialization, clipboard-strategy-and-fragment-semantics.gitcrawl --json threads ianstormtaylor/slate --numbers 4542 --include-closed..tmp/slate-v2/packages/slate/test/clipboard-contract.ts and
.tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts.Decision:
Keep as cluster-synced. The fixed #5089 proof covers middle-paragraph
multi-block insertion, but #4542 is broader: selected nested content pasted
into an empty block must drop unwanted wrapper context. That exact behavior
still needs DOM/browser paste proof.
PR-description text: Related #4542: fragment insertion shape family; no exact closure.
Status: related Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: Fragment insertion should avoid blindly merging structural blocks at both ends, especially for lists, tables, and fragments whose copied range spans multiple block contexts.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 3155 --include-closed --json.docs/slate-issues/test-candidate-map/3313-2733.md.docs/slate-issues/open-issues-dossiers/3313-2733.md.docs/plans/2026-05-07-slate-v2-multiblock-fragment-middle-insert-ralplan.md..tmp/slate-v2/packages/slate/src/transforms-text/insert-fragment.ts.Decision:
Keep as related, not fixes-claimed. The fixed #5089 proof targets one
exact middle-paragraph multi-block insertion bug. #3155 is a broader fragment
policy and API-shape request; closing it needs wider structural fragment proof
than this lane should claim.
PR-description text: Related #3155: fragment non-merging policy pressure; no broad policy closure.
Status: improves-claimed Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: Replacing a fully selected block with a copied fragment can change the target node type instead of preserving the receiving block policy.
Evidence:
v2-clipboard-serialization, paste-fragment-and-node-type-preservation.gitcrawl --json threads ianstormtaylor/slate --numbers 5151 --include-closed..tmp/slate-v2/packages/slate/src/transforms-text/insert-fragment.ts preserves
the target text-block wrapper when a single text-block fragment replaces
selected target text; .tmp/slate-v2/packages/slate/test/clipboard-contract.ts
proves the core transaction path; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts
proves the rich clipboard round-trip path.Decision:
Move to improves-claimed. Rich fragment target-block preservation is covered
for the selected single text-block case. Exact closure still needs browser
replay of the original issue shape.
PR-description text: Improves #5151: rich Slate fragment insertion preserves the receiving text-block type for the selected single-block replacement case; no exact closure.
Cannot resolve a DOM point from Slate point on letter insertStatus: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary:
Slate does not react on delete button on page refresh - it just moves cursor backwards or throws error Cannot resolve a DOM point from Slate point on letter insert.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-point-dom-point.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Page-refresh delete/insert DOM point crash belongs to DOM selection import/export repair. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #3918: Page-refresh delete/insert DOM point crash belongs to DOM selection import/export repair; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Slate throws exceptions too liberally in relation to selection failures.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-node-dom-node.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-dom/test/bridge.ts; .tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Selection failure error strictness belongs to fail-closed DOM bridge policy. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #3641: Selection failure error strictness belongs to fail-closed DOM bridge policy; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Calling addMark in onDOMBeforeInput crashes Slate when selection is not collapsed.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-node-dom-node.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
addMark during onDOMBeforeInput belongs to input command and selection synchronization. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #3568: addMark during onDOMBeforeInput belongs to input command and selection synchronization; no exact closure.
Status: cluster-synced Bucket: v2-input-runtime Confidence: medium
Issue summary: Selecting text and moving the cursor is completely broken on Android.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-android-composition-beforeinput.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-composition-events.ts; .tmp/slate-v2/packages/slate-react/src/editable/runtime-android-engine.ts.Decision:
Android text selection/cursor movement belongs to mobile selection/input runtime proof. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #3470: Android text selection/cursor movement belongs to mobile selection/input runtime proof; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: decorated text cannot be selected (#3118 re-open).
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-slate-point-dom-point.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/packages/slate-react/src/components/slate.tsx; .tmp/slate-v2/packages/slate-react/src/decoration-source.ts; .tmp/slate-v2/packages/slate-react/test/app-owned-customization.tsx.Decision:
Decorated text selection belongs to projection/decoration DOM stability. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #3309: Decorated text selection belongs to projection/decoration DOM stability; no exact closure.
Status: improves-claimed Bucket: v2-performance-benchmark Confidence: medium
Issue summary: try to prevent re-rendering at the Leaf level.
Evidence:
.tmp/gitcrawl/2026-05-04T145301Z-search-singleton-android-composition-beforeinput.json, .tmp/gitcrawl/2026-05-04T145301Z-search-singleton-history-set-selection-undo.json..tmp/gitcrawl/2026-05-04T145301Z-threads-batch3-singletons.json..tmp/slate-v2/scripts/benchmarks; docs/plans/2026-05-03-slate-v2-dom-present-large-doc-phase-6-plan.md.Decision:
Leaf rerender pressure is represented by v2 render/runtime performance gates. No exact Fixes #... claim is justified without a focused repro matching this issue.
PR-description text: Related #2051: Leaf rerender pressure is represented by v2 render/runtime performance gates; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Mouse/gesture selection over a custom inline element returns an empty selection where app code expects the selected inline element.
Evidence:
custom-inline-selection-behavior, likely-valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts;
.tmp/slate-v2/packages/slate-react/test/selection-controller-contract.ts;
.tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsx.Decision:
Keep as cluster-synced. The owner is React selection import/reconciliation
around custom inline boundaries, but the exact slide-selection browser repro is
not proven.
PR-description text: Related #5806: custom inline selection belongs to React selection reconciliation; no exact gesture-selection closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Windows/Chrome double-click selection before an inline element followed by Backspace crashes when the browser DOM range no longer matches Slate's expected inline boundary.
Evidence:
inline-boundary-selection, likely-valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts;
.tmp/slate-v2/packages/slate-react/src/editable/runtime-keyboard-events.ts;
.tmp/slate-v2/packages/slate-react/test/selection-controller-contract.ts.Decision:
Keep as cluster-synced. This needs a Windows/Chrome inline-boundary browser
repro before an exact fix claim.
PR-description text: Related #5690: inline-boundary double-click/delete selection belongs to React selection reconciliation; no exact Windows/Chrome closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Triple-click and upward drag selection can lose the selection in Chrome/Safari.
Evidence:
selection-gesture-directionality, likely-valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/editable/runtime-selection-engine.ts;
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts;
.tmp/slate-v2/packages/slate-browser/src/playwright/index.ts.Decision:
Keep as cluster-synced. This is a browser gesture-selection proof target, not
a pure hook/runtime unit claim.
PR-description text: Related #5689: triple-click/upward selection belongs to browser selection gesture proof; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary:
Legacy docs and code disagreed on whether useSlateStatic returns Editor or
ReactEditor.
Evidence:
react-hook-return-types, valid, v2-react-runtime,
cluster-synced..tmp/slate-v2/packages/slate-react/src/hooks/use-editor.tsx;
.tmp/slate-v2/packages/slate-react/src/hooks/use-slate-editor.ts;
.tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision:
Keep as cluster-synced. V2 hook naming and typing are cleaner, but the legacy
useSlateStatic API is not an exact closure claim.
PR-description text:
Related #5404: React hook return typing is covered by v2 hook contracts; no
legacy useSlateStatic auto-close.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Overlapping mark/decoration payloads with the same semantic key but different metadata are hard to represent through the legacy merged-leaf data model.
Evidence:
marks-and-decorations-data-model, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsx;
.tmp/slate-v2/packages/slate-react/src/projection-store.ts.Decision:
Keep as cluster-synced. V2 projection slices can carry overlapping payloads,
but full mark/decoration semantic policy is not auto-closed by this planning
pass.
PR-description text: Related #3383: overlapping mark/decoration metadata belongs to projection data model proof; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary:
The scrollSelectionIntoView callback is not called for enough selection
movement cases, so app custom scrolling logic cannot fully replace Slate's
default behavior.
Evidence:
scroll-selection-customization-regressions, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts;
.tmp/slate-v2/packages/slate-react/test/rendering-strategy-and-scroll.tsx;
.tmp/slate-v2/packages/slate-react/test/app-owned-customization.tsx.Decision:
Keep as cluster-synced. The React runtime owns the scroll/selection callback
policy, but the exact arrow/sticky-header repro is not proven.
PR-description text: Related #4995: scroll selection customization belongs to React selection-scroll policy; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Apps need control over the scroll boundary when the scrolling container sits above the editor.
Evidence:
scroll-selection-customization-regressions, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts;
.tmp/slate-v2/packages/slate-react/test/rendering-strategy-and-scroll.tsx.Decision:
Keep as cluster-synced. This is valid API pressure, but no public scroll
boundary shape is accepted by this pass.
PR-description text: Related #4590: scroll boundary customization belongs to React selection-scroll policy; no accepted API or exact closure yet.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: The main React component typing is too broad for accurate app usage.
Evidence:
react-component-typing-surface, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/components/slate.tsx;
.tmp/slate-v2/packages/slate-react/test/generic-react-editor-contract.tsx;
.tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision:
Keep as cluster-synced. V2 generic React editor contracts address the
pressure, but the exact legacy type complaint is not auto-closed.
PR-description text: Related #4366: React component typing belongs to v2 generic React editor contracts; no exact legacy type closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: low
Issue summary: Placeholder customization depended on internal exported symbols.
Evidence:
placeholder-customization-internals, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/components/slate-placeholder.tsx;
.tmp/slate-v2/packages/slate-react/test/rendered-dom-shape-contract.tsx.Decision:
Keep as cluster-synced, not a closure claim. Placeholder API shape still
needs a focused API/docs proof pass before exact issue accounting changes.
PR-description text: Related #4315: placeholder internals belong to React placeholder API proof; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Readonly rendering should avoid unnecessary editable DOM and runtime weight.
Evidence:
readonly-static-renderer, valid, v2-react-runtime,
cluster-synced..tmp/slate-v2/packages/slate-react/src/components/editable.tsx;
.tmp/slate-v2/packages/slate-react/test/rendered-dom-shape-contract.tsx;
.tmp/slate-v2/packages/slate-react/test/render-profiler-contract.test.tsx.Decision:
Keep as cluster-synced. Readonly/static rendering is a valid React runtime
surface, but no exact DOM-shape closure is claimed by this pass.
PR-description text: Related #4311: readonly DOM weight belongs to static/readOnly render proof; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Firefox selection can make active mark queries disagree with user-visible selection state.
Evidence:
marks-query-and-browser-selection-drift, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts;
.tmp/slate-v2/packages/slate-react/test/selection-runtime-contract.test.ts.Decision:
Keep as cluster-synced. This needs Firefox mark-query browser proof before
claim promotion.
PR-description text: Related #4298: Firefox mark query drift belongs to selection/mark proof; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: low
Issue summary: Apps want editor mark state exposed through rendering.
Evidence:
react-hook-surface-and-rendered-editor-state, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/hooks/use-editor-selector.tsx;
.tmp/slate-v2/packages/slate-react/test/provider-hooks-contract.tsx.Decision:
Keep as cluster-synced. V2 selectors can expose editor state, but no special
render-editor-mark API is accepted here.
PR-description text: Related #4225: rendered editor mark state belongs to selector/hook proof; no accepted API or exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Firefox can visually select the placeholder on select-all in an empty editor.
Evidence:
placeholder-and-empty-editor-selection, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/components/slate-placeholder.tsx;
.tmp/slate-v2/packages/slate-react/test/rendering-strategy-and-scroll.tsx;
.tmp/slate-v2/playwright/integration/examples/placeholder.test.ts.Decision:
Keep as cluster-synced. Placeholder selection rendering needs exact Firefox
select-all proof before closure.
PR-description text: Related #4221: Firefox placeholder select-all belongs to placeholder/selection browser proof; no exact closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Apps want a read-only/static renderer with less editing runtime weight.
Evidence:
read-only-and-static-rendering, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/components/editable.tsx;
.tmp/slate-v2/packages/slate-react/test/rendered-dom-shape-contract.tsx;
.tmp/slate-v2/packages/slate-react/test/render-profiler-contract.test.tsx.Decision:
Keep as cluster-synced. Static rendering is valid architecture pressure, but
no static-renderer public API is claimed here.
PR-description text: Related #4025: static renderer pressure belongs to readonly/static render proof; no accepted public static renderer closure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Readonly should preserve focus/click semantics closer to browser readonly controls instead of behaving like disabled content.
Evidence:
read-only-and-static-rendering, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/components/editable.tsx;
.tmp/slate-v2/packages/slate-react/src/editable/runtime-focus-mouse-events.ts;
.tmp/slate-v2/packages/slate-react/test/editable-behavior.tsx.Decision:
Keep as cluster-synced. Readonly focus/click semantics need their own browser
proof before exact closure.
PR-description text: Related #3924: readonly focus/click semantics belong to React readonly runtime proof; no exact closure.
Status: not-claimed Bucket: v2-react-runtime Confidence: medium
Issue summary: This asks whether Slate React can support a custom rendering/layout engine that replaces normal contenteditable behavior.
Evidence:
custom-surface-and-layout-engine-pressure, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/components/editable.tsx;
.tmp/slate-v2/packages/slate-react/src/rendering-strategy.Decision: Do not claim this as fixed. Slate v2 can expose clearer rendering strategy and DOM coverage primitives, but a full custom layout engine is product/ecosystem territory unless a specific raw Slate primitive gap is proven.
PR-description text: Not claimed #3892: custom layout engine support is ecosystem/product territory; v2 only addresses substrate rendering strategy pressure.
Status: cluster-synced Bucket: v2-react-runtime Confidence: medium
Issue summary: Placeholder rendering does not follow centered or right-aligned text layout.
Evidence:
placeholder-rendering-internals, valid,
v2-react-runtime, cluster-synced..tmp/slate-v2/packages/slate-react/src/components/slate-placeholder.tsx;
.tmp/slate-v2/packages/slate-react/test/rendered-dom-shape-contract.tsx;
.tmp/slate-v2/playwright/integration/examples/placeholder.test.ts.Decision:
Keep as cluster-synced. Placeholder layout has a clear owner, but centered
and right-aligned placeholder rendering need exact visual/browser proof.
PR-description text: Related #2608: placeholder alignment belongs to placeholder rendering proof; no exact visual closure.
Status: improves-claimed Bucket: already-accounted Confidence: high
Issue summary:
Global decorate recomputation makes dynamic decorations expensive; the issue
asks for a more local decoration API.
Evidence:
react-decoration-subscription-performance,
already-accounted, improves-claimed..tmp/slate-v2/scripts/benchmarks/browser/react/rerender-breadth.tsx;
.tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsx.Decision:
Keep as improves-claimed. V2 projection stores and local subscriptions reduce
dynamic decoration pressure, but the exact legacy renderChildren proposal is
not the accepted public API.
PR-description text: Improves #4483: projection stores and local subscriptions address dynamic decoration pressure; no exact legacy API closure.
Status: improves-claimed Bucket: already-accounted Confidence: medium
Issue summary: The issue asks for collaborative comments anchored to text selections.
Evidence:
collaboration-annotations-and-comments,
already-accounted, improves-claimed..tmp/slate-v2/packages/slate-react/test/annotation-store-contract.tsx;
.tmp/slate-v2/packages/slate-react/test/widget-layer-contract.tsx.Decision:
Keep as improves-claimed. Annotation and widget lanes cover the substrate for
selection-anchored overlays; product collaborative comments are not raw Slate.
PR-description text: Improves #4477: annotation and widget lanes support selection-anchored overlay substrates; product comments are not auto-closed.
Status: improves-claimed Bucket: already-accounted Confidence: high
Issue summary: Decorations should work across node boundaries rather than being constrained to the current text node.
Evidence:
decoration-cross-node-and-void-access,
already-accounted, improves-claimed..tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsx.Decision:
Keep as improves-claimed. Runtime range projection represents cross-node
decoration pressure, but full legacy decorator API parity is not claimed.
PR-description text: Improves #4392: runtime range projection represents cross-node decoration pressure; no full legacy decorator API closure.
Status: improves-claimed Bucket: already-accounted Confidence: high
Issue summary: Legacy decoration cutting applies ranges relative to the current text node even when ranges point elsewhere.
Evidence:
react-decoration-and-selection-stability,
already-accounted, improves-claimed..tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsx.Decision:
Keep as improves-claimed. Projection slices are keyed by runtime text ranges;
the exact legacy Text.decorations API is not the v2 public contract.
PR-description text:
Improves #3382: projection slices are keyed by runtime text ranges; no legacy
Text.decorations API closure.
Status: improves-claimed Bucket: already-accounted Confidence: high
Issue summary: Decorators cannot return ranges spanning sibling text nodes cleanly.
Evidence:
react-decoration-and-selection-stability,
already-accounted, improves-claimed..tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsx.Decision:
Keep as improves-claimed. Cross-node projection is represented by
range-to-text-slice projection; decorator callback API parity is not claimed.
PR-description text: Improves #3352: range-to-text-slice projection represents sibling decoration pressure; no legacy decorator callback closure.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary:
Slate's single-node operation model can explode into many operations for
large-range changes such as selectAll + delete, making the operation stream
harder to follow and more expensive to replay.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 2288 --include-closed --json.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md.replace_children operation in
.tmp/slate-v2/packages/slate/src/transforms-text/delete-text.ts..tmp/slate-v2/packages/slate/test/operations-contract.ts and
.tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts.Decision:
Keep as improves-claimed, not fixes-claimed. replace_children is exactly
the range-operation primitive this issue asked for, but public operation
exposure and arbitrary range-operation API closure are separate decisions.
PR-description text:
Improves #2288: replace_children adds a range-capable child-window operation
with core apply/inverse/ref/history/collab proof; no public range-operation API
closure yet.
Status: fixed Bucket: v2-core-engine Confidence: high
Issue summary: Sequential low-level operations create collaboration/server overhead; the issue asks for operation composition or merging utilities.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 1770 --include-closed --json.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md.Decision:
Keep as related. replace_children reduces one important class of operation
chatter, but it is not a general operation-merging utility.
PR-description text: Related #1770: range replacement reduces op chatter; no general op-composition closure.
Status: fixes-claimed Bucket: v2-core-engine Confidence: medium
Issue summary:
move_node operations do not carry the moved node payload, which makes some
operational-transform and undo/redo integrations harder to reason about.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 3741 --include-closed --json.docs/plans/2026-05-06-slate-v2-core-history-selection-undo-ralplan.md..tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts.Decision:
Keep as related. The next history slice should test move_node undo state,
but that does not imply a serialized operation payload redesign. Exact OT
closure would need a collaboration transport proof and a public operation-shape
decision.
PR-description text:
Related #3741: move_node collaboration metadata pressure; no moved-node
payload closure.
Status: improves-claimed Bucket: v2-performance-benchmark Confidence: high
Issue summary:
slate-history can retain old editor objects or DOM-related state strongly
enough to create memory leaks.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 3752 --include-closed --json.docs/plans/2026-05-06-slate-v2-core-history-selection-undo-ralplan.md..tmp/slate-v2/scripts/benchmarks/core/current/history-retained-memory.mjs..tmp/slate-v2/tmp/slate-history-retained-memory.json.Decision:
Keep as improves-claimed, not fixes-claimed. Slate v2 now has a
current-only retained-memory benchmark for history payload pressure, including
history entry count, operation count, retained payload tags, retained JSON
bytes, and heap samples. Exact closure still needs an accepted leak threshold or
detached DOM/node retention proof that matches the original report.
PR-description text: Improves #3752: Slate v2 adds retained-memory benchmark coverage for history payload pressure, but exact memory-leak closure still needs accepted heap/detached-retention proof.
Status: related Bucket: v2-core-engine Confidence: medium
Issue summary: Selecting all in the rich text example and pressing delete can leave behind an empty list wrapper/list-item instead of clearing the editor content.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 2500 --include-closed --json.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md..tmp/slate-v2/packages/slate/test/delete-contract.ts..tmp/completion-checks/slate-v2-core-structural-delete-normalization-execution.md.Decision:
Claim Fixes #2500. The core package proof deletes a full-document selection
spanning list-heavy content and leaves one empty editable paragraph, not an
orphan list shell.
PR-description text: Fixes #2500: Core full-document delete over list-heavy content resets to one empty editable paragraph instead of preserving an orphan list shell.
Status: related Bucket: v2-performance-benchmark Confidence: medium
Issue summary: Dirty tracking should avoid marking text nodes that cannot be normalized, because that work adds performance cost without useful normalization output.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 2195 --include-closed --json.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md.Decision:
Keep as related. The replace_children plan explicitly requires dirty-window
metadata so #5992 is not fixed by moving cost into dirty tracking. It does not
close the broader dirty-text-node issue.
PR-description text: Related #2195: dirty-window proof gate; no dirty-tracking closure.
Status: related Bucket: v2-performance-benchmark Confidence: medium
Issue summary: Schema/normalization rules should not all run for every command when many rules cannot be invalidated by a given edit.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 2405 --include-closed --json.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md.Decision:
Keep as related. replace_children must carry enough dirty-window metadata
for bounded normalization, but one operation does not solve the full
command-scoped normalization policy.
PR-description text: Related #2405: bounded normalization pressure; no schema-rule closure.
Status: related Bucket: v2-core-engine Confidence: medium
Issue summary: Slate lacks a first-class selection normalization boundary equivalent to node normalization, causing valid selection ownership to be handled indirectly.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 2355 --include-closed --json.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md.Decision:
Keep as related. replace_children must own newSelection and ref mapping
for its own edit, but it should not introduce a broad public selection
normalizer.
PR-description text: Related #2355: selection mapping proof for range replacement; no selection normalizer closure.
Status: related Bucket: v2-dom-selection Confidence: medium
Issue summary:
Selecting an inline void alone can fail to trigger copy/cut because of
contentEditable={false} and DOM event ownership around void content.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 4104 --include-closed --json.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md.Decision:
Keep as related. Inline-void cut belongs to DOM/void selection handling. The
range-delete implementation must not regress it, but replace_children is not
the direct fix.
PR-description text: Related #4104: inline-void cut regression row; no exact closure.
Status: fixes-claimed Bucket: v2-clipboard-serialization Confidence: high
Issue summary: Pasting a multi-block fragment into the middle of a paragraph can flatten the fragment into the current paragraph instead of preserving block separation.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 5089 --include-closed --json.docs/slate-issues/test-candidate-map/5129-5066.md.docs/slate-issues/open-issues-dossiers/5129-5066.md.docs/plans/2026-05-07-slate-v2-multiblock-fragment-middle-insert-ralplan.md..tmp/slate-v2/packages/slate/src/transforms-text/insert-fragment.ts;
.tmp/slate-v2/packages/slate/test/clipboard-contract.ts;
.tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts..tmp/completion-checks/slate-v2-multiblock-fragment-middle-insert-execution.md.Decision:
Claim Fixes #5089. Core package proof and DOM clipboard boundary proof show
a rich multi-block fragment inserted at a collapsed middle text position keeps
block separation: the first fragment block merges with the destination prefix,
the final fragment block merges with the destination suffix, and the fragment
does not flatten into one paragraph.
PR-description text: Fixes #5089: Rich multi-block fragment paste into the middle of a paragraph preserves block separation instead of flattening into the current paragraph.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary:
insertFragment(..., { at }) can ignore the explicit target and route through
current editor selection instead.
Evidence:
docs/slate-issues/open-issues-dossiers/5479-5403.md.docs/slate-issues/test-candidate-map/5479-5403.md.docs/plans/2026-05-07-slate-v2-insert-fragment-at-location-ralplan.md..tmp/slate-v2/packages/slate/test/clipboard-contract.ts..tmp/completion-checks/slate-v2-insert-fragment-at-location-execution.md..tmp/slate-v2/packages/slate/src/transforms-text/insert-fragment.ts;
.tmp/slate-v2/packages/slate/src/core/public-state.ts.Decision:
Claim Fixes #5412. Package proof shows insertFragment(..., { at }) writes
at the supplied target even when the editor selection points elsewhere.
PR-description text:
Fixes #5412: insertFragment(..., { at }) writes at the supplied target instead
of ambient selection.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary: Inserting a fragment into an empty node can leave the caret before inserted content instead of after it.
Evidence:
docs/slate-issues/open-issues-dossiers/5479-5403.md.docs/slate-issues/test-candidate-map/5479-5403.md.docs/plans/2026-05-07-slate-v2-insert-fragment-at-location-ralplan.md..tmp/slate-v2/packages/slate/test/clipboard-contract.ts..tmp/completion-checks/slate-v2-insert-fragment-at-location-execution.md..tmp/slate-v2/packages/slate/src/transforms-text/insert-fragment.ts.Decision:
Claim Fixes #5429. Package proof shows insertFragment into an empty text
block leaves selection after the inserted content.
PR-description text:
Fixes #5429: insertFragment into an empty text block leaves selection after
the inserted content.
Status: related Bucket: v2-clipboard-serialization Confidence: medium
Issue summary: Select-all paste/delete around a trailing image or block element can fail to delete the block because unhang/delete range ownership misses the void tail.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 5630 --include-closed --json.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md.Decision:
Keep as related. This is delete-range pressure and should be a regression row
if range deletion changes. Exact unhang/void-tail browser closure needs its own
focused proof.
PR-description text: Related #5630: select-all paste/delete void-tail pressure; no exact closure.
Status: fixed Bucket: v2-core-engine Confidence: high
Issue summary: An expanded selection that starts before one formatted leaf and ends exactly at the start of another formatted leaf can delete text before the selected window.
Evidence:
gitcrawl threads --numbers 4121 --include-closed --json ianstormtaylor/slate.gitcrawl neighbors --number 4121 --limit 20 --json ianstormtaylor/slate.docs/plans/2026-05-07-slate-v2-core-structural-delete-normalization-ralplan.md..tmp/slate-v2/packages/slate/test/delete-contract.ts..tmp/completion-checks/slate-v2-core-structural-delete-normalization-execution.md.Decision:
Claim Fixes #4121. The package proof deletes from plain text through a
formatted leaf and stops at the next formatted leaf boundary without removing
unselected prefix/suffix text.
PR-description text: Fixes #4121: Core expanded delete over a formatted leaf window removes only the selected content and collapses at the selection start.
Status: fixed Bucket: v2-core-engine Confidence: high
Issue summary: Deleting across an empty marked text node can remove both neighboring marked texts where the expected behavior is text merge.
Evidence:
gitcrawl threads --numbers 3965 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate/src/transforms-text/delete-text.ts.docs/plans/2026-05-07-slate-v2-core-structural-delete-normalization-ralplan.md..tmp/slate-v2/packages/slate/test/delete-contract.ts..tmp/completion-checks/slate-v2-core-structural-delete-normalization-execution.md.Decision:
Claim Fixes #3965. The package proof Backspaces from an empty same-mark text
at the start of the second block and merges the block boundary without deleting
both neighboring text runs.
PR-description text: Fixes #3965: Backspace across an empty marked block start merges same-mark text without deleting both sides.
Status: improved Bucket: v2-core-engine Confidence: high
Issue summary: Custom normalization can wrap while built-in normalization unwraps, causing an infinite loop or an unhelpful iteration-budget failure.
Evidence:
gitcrawl threads --numbers 5811 --include-closed --json ianstormtaylor/slate.gitcrawl neighbors --number 5811 --limit 20 --json ianstormtaylor/slate..tmp/slate-v2/packages/slate/src/editor/normalize.ts.docs/plans/2026-05-07-slate-v2-core-structural-delete-normalization-ralplan.md..tmp/slate-v2/packages/slate/test/normalization-contract.ts..tmp/completion-checks/slate-v2-core-structural-delete-normalization-execution.md.Decision:
Claim Improves #5811. The package proof detects a custom normalization
oscillation with the deterministic fixpoint error instead of exhausting a huge
iteration budget. Conflicting app normalizers still need app/schema correction.
PR-description text: Improves #5811: Custom normalization oscillation fails deterministically with a fixpoint diagnostic instead of an unbounded normalization budget.
Status: fixed Bucket: v2-core-engine Confidence: high
Issue summary: When normalization transforms a node, later normalizers can be skipped unless the changed entry is reconsidered.
Evidence:
gitcrawl threads --numbers 3950 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate/src/editor/normalize.ts.docs/plans/2026-05-07-slate-v2-core-structural-delete-normalization-ralplan.md..tmp/slate-v2/packages/slate/test/normalization-contract.ts..tmp/completion-checks/slate-v2-core-structural-delete-normalization-execution.md.Decision:
Claim Fixes #3950. The package proof transforms a node during custom
normalization, then rechecks it so a later normalizer can finish the normalized
state.
PR-description text: Fixes #3950: Custom normalization rechecks a transformed node until later normalizers reach fixpoint.
Status: improved Bucket: v2-core-engine Confidence: high
Issue summary: Tables, title blocks, and similar containers need a generic way to stop merge/split/delete from crossing a structural boundary.
Evidence:
gitcrawl threads --numbers 1654 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate/src/transforms-node/merge-nodes.ts.docs/plans/2026-05-07-slate-v2-core-structural-delete-normalization-ralplan.md..tmp/slate-v2/packages/slate/test/delete-contract.ts and
.tmp/slate-v2/packages/slate/test/transforms-contract.ts..tmp/slate-v2/packages/slate/src/transforms-text/delete-text.ts and
.tmp/slate-v2/packages/slate/src/transforms-node/merge-nodes.ts..tmp/completion-checks/slate-v2-core-structural-delete-normalization-execution.md.Decision:
Claim Improves #1654. Existing schema isIsolating is now honored by
collapsed Backspace and direct mergeNodes. Split-specific closure is still
unclaimed.
PR-description text:
Improves #1654: existing isIsolating policy blocks collapsed Backspace and
direct mergeNodes across protected containers; split-specific closure remains
unclaimed.
Status: related; not claimed Bucket: v2-core-engine Confidence: medium
Issue summary: The request asks for a way to reject schema-invalid edits before normalization changes the document.
Evidence:
gitcrawl threads --numbers 2643 --include-closed --json ianstormtaylor/slate.docs/plans/2026-05-07-slate-v2-core-structural-delete-normalization-ralplan.md.Decision: Do not add a public schema-veto API in this lane. First make core transforms and normalization deterministic. A validation hook can be evaluated later with transaction metadata and dry-run semantics.
PR-description text: Related #2643: transaction validation pressure; no schema-veto API claim.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary: Deleting an editable inline input can also delete the preceding character.
Evidence:
gitcrawl threads --numbers 5972 --include-closed --json ianstormtaylor/slate.docs/plans/2026-05-07-slate-v2-inline-delete-boundary-repro-ralplan.md..tmp/slate-v2/packages/slate/src/transforms-text/delete-text.ts..tmp/slate-v2/packages/slate/test/delete-contract.ts..tmp/slate-v2/playwright/integration/examples/inlines.test.ts.Decision:
Claim Fixes #5972. The red browser row reproduced the issue: after clearing
the editable inline, Backspace deleted the preceding space and left the empty
inline boundary wrong. The model selection before Backspace was already inside
the empty inline, so the owner was core delete target planning. The fix routes
Backspace at the start of an empty editable inline to a path delete of that
inline, with selection falling back to the adjacent text point.
PR-description text: Fixes #5972: Backspace from an empty editable inline in the inlines example removes the inline without deleting the preceding character.
Status: fixes-claimed Bucket: v2-api-dx Confidence: high
Issue summary: Custom operations can make editor validation fail when operation predicates only accept built-in operation shapes.
Evidence:
gitcrawl threads --numbers 5977 --include-closed --json ianstormtaylor/slate.docs/plans/2026-05-07-slate-v2-operation-extensibility-validation-ralplan.md..tmp/slate-v2/packages/slate/src/editor/is-editor.ts now checks internal
editor state rather than operation-list validity..tmp/slate-v2/packages/slate/src/core/public-state.ts rejects unknown replay
operation types before they enter the operation log..tmp/slate-v2/packages/slate/test/interfaces-contract.ts proves
Editor.isEditor and core path/string reads keep working when user code
attaches a custom operations property, and
.tmp/slate-v2/packages/slate/test/operations-contract.ts proves unknown
operation replay fails closed..tmp/slate-v2/packages/slate-dom/test/bridge.ts proves DOMEditor.findPath
still resolves a Slate node when user code attaches a custom operations
property to the editor.Decision:
Claim Fixes #5977. v2 editor detection is internal-state based, so user
operation-list shape cannot make a real editor stop being an editor. Replay now
rejects unknown operation records before they can pollute history, refs,
collaboration, or DOM repair. The fix deliberately does not accept arbitrary
custom operations; app metadata belongs in update tags/commit metadata.
PR-description text: Fixes #5977: Custom operation-like records no longer break editor detection or DOM path lookup, and unknown operation replay fails before the record enters the operation log.
Status: improves-claimed Bucket: v2-api-dx Confidence: high
Issue summary:
Slate users wanted concrete operation subtype guards instead of manually
switching on operation type or writing local casts.
Evidence:
gitcrawl threads --numbers 5558 --include-closed --json ianstormtaylor/slate..tmp/slate-v2/packages/slate/src/interfaces/operation.ts..tmp/slate-v2/packages/slate/test/interfaces-contract.ts..tmp/slate-v2/packages/slate/test/generic-operation-contract.ts.Decision:
Claim Improves #5558. v2 adds concrete built-in operation subtype guards for
all current operation kinds, including replace_children and
replace_fragment. This is not a custom-operation extension API and does not
make unknown operations valid.
PR-description text:
Improves #5558: Operation exposes concrete built-in operation subtype guards
with runtime and TypeScript narrowing proof.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary: Pressing Enter at the end of a marked segment can leave the caret on the original line instead of moving it to the new line.
Evidence:
gitcrawl threads --numbers 3964 --include-closed --json ianstormtaylor/slate.docs/plans/2026-05-07-slate-v2-core-caret-movement-word-insert-break-ralplan.md..tmp/slate-v2/packages/slate/test/snapshot-contract.ts adds
insertBreak after marked text moves selection into the new block.docs/slate-issues/test-candidate-map/4067-3949.md..tmp/slate-v2/packages/slate/src/editor/insert-break.ts;
.tmp/slate-v2/packages/slate/test/snapshot-contract.ts.Decision:
Claim Fixes #3964. The package proof splits at the end of marked text and
publishes selection in the created block.
PR-description text:
Fixes #3964: marked insertBreak creates the next block and places the
collapsed selection inside it.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary: Word-unit movement can fail when the document starts with multiple leaves and no preceding spaces.
Evidence:
gitcrawl threads --numbers 3973 --include-closed --json ianstormtaylor/slate.docs/plans/2026-05-07-slate-v2-core-caret-movement-word-insert-break-ralplan.md..tmp/slate-v2/packages/slate/test/transaction-contract.ts adds
moves word selection across initial sibling text leaves.docs/slate-issues/test-candidate-map/4067-3949.md..tmp/slate-v2/packages/slate/src/editor/positions.ts;
.tmp/slate-v2/packages/slate/src/transforms-selection/move.ts;
.tmp/slate-v2/packages/slate/test/transforms/move/both/unit-word.tsx.Decision:
Claim Fixes #3973. The package proof moves by word across sibling text leaves
when the first word has no preceding space.
PR-description text: Fixes #3973: word movement advances across initial sibling text leaves.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary: Moving marked text onto a new line and undoing must preserve mark and caret state. Package proof now covers both halves: Enter moves the bold word into the new paragraph with selection at the moved word start, and undo restores the original marked paragraph plus selection.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 3499 --include-closed --json.gitcrawl neighbors ianstormtaylor/slate --number 3499 --limit 20 --json.docs/slate-issues/test-candidate-map/3558-3435.md.docs/plans/2026-05-07-slate-v2-core-caret-movement-word-insert-break-ralplan.md.docs/plans/2026-05-07-slate-v2-marked-enter-undo-caret-ralplan.md..tmp/completion-checks/slate-v2-marked-enter-undo-caret-ralplan.md..tmp/slate-v2/packages/slate-history/test/history-contract.ts;
.tmp/slate-v2/packages/slate/src/transforms-node/split-nodes.ts;
.tmp/slate-v2/packages/slate/test/snapshot-contract.ts.bun test ./packages/slate-history/test/history-contract.ts -t "marked Enter undo";
bun test ./packages/slate-history/test/history-contract.ts;
bun test ./packages/slate/test/snapshot-contract.ts;
bun --filter slate-history typecheck;
bun --filter slate typecheck;
bun lint:fix.Decision:
Claim Fixes #3499. The exact package proof covers marked Enter caret
placement and undo mark restoration. #3756 remains only a broader related
history-selection guard.
PR-description text: Fixes #3499: marked Enter before a bold word moves the word to the new block and undo restores the marked paragraph and selection.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary: Pressing Enter at the end of marked text creates a block but fails to focus the created block.
Evidence:
#3964 neighbors:
gitcrawl neighbors ianstormtaylor/slate --number 3964 --limit 15 --json.docs/slate-issues/test-candidate-map/4390-4269.md.docs/plans/2026-05-07-slate-v2-core-caret-movement-word-insert-break-ralplan.md..tmp/slate-v2/packages/slate/test/snapshot-contract.ts adds
insertBreak after marked text moves selection into the new block.Decision:
Claim Fixes #4357. The exact marked-end Enter repro is proven by the same
package test as #3964.
PR-description text: Fixes #4357: Enter at the end of a marked leaf focuses the created block.
Status: related Bucket: v2-core-engine Confidence: medium
Issue summary: Return key near marked leaf edges can leave the caret in an inconsistent position.
Evidence:
#3964 neighbors:
gitcrawl neighbors ianstormtaylor/slate --number 3964 --limit 15 --json.docs/slate-issues/test-candidate-map/4268-4162.md.docs/plans/2026-05-07-slate-v2-core-caret-movement-word-insert-break-ralplan.md.Decision: Keep related. It belongs to the same return-key caret family, but exact closure depends on matching repro proof.
PR-description text: Related #4195: return-key caret placement pressure; no fixed claim without exact repro proof.
Status: related Bucket: v2-core-engine Confidence: medium
Issue summary:
A custom insertBreak override calls movement logic and fails to move forward
in Firefox.
Evidence:
#3973 and #3964 neighbors:
gitcrawl neighbors ianstormtaylor/slate --number 3973 --limit 15 --json;
gitcrawl neighbors ianstormtaylor/slate --number 3964 --limit 15 --json.docs/slate-issues/test-candidate-map/3878-3798.md..tmp/slate-v2/playwright/integration/examples/richtext.test.ts.Decision: Keep related. Package movement proof can improve the model path, but a Firefox-specific claim needs Firefox browser proof.
PR-description text:
Related #3841: custom insertBreak and word movement overlap; Firefox closure
is not claimed without browser proof.
Status: related Bucket: v2-core-engine Confidence: medium
Issue summary: Word navigation around punctuation and bracket-like text can move to surprising positions.
Evidence:
#3973 neighbors:
gitcrawl neighbors ianstormtaylor/slate --number 3973 --limit 15 --json.docs/slate-issues/test-candidate-map/5655-5559.md.docs/plans/2026-05-07-slate-v2-core-caret-movement-word-insert-break-ralplan.md.Decision:
Keep related. This is adjacent word-navigation pressure, but punctuation policy
is not the same as #3973 multi-leaf projection.
PR-description text: Related #5629: word navigation pressure; no punctuation-policy closure in the multi-leaf movement lane.
$ as a word characterStatus: not claimed Bucket: v2-core-engine Confidence: medium
Issue summary: Users expect different word-boundary behavior around punctuation.
Evidence:
#3973 neighbors:
gitcrawl neighbors ianstormtaylor/slate --number 3973 --limit 15 --json.docs/slate-issues/test-candidate-map/4741-4643.md.docs/plans/2026-05-07-slate-v2-core-caret-movement-word-insert-break-ralplan.md.Decision: Do not claim. The current lane fixes projection across leaves, not a new punctuation classifier policy.
PR-description text: Not claimed #4648: punctuation policy remains outside the multi-leaf word movement fix.
Status: related Bucket: v2-core-engine Confidence: medium
Issue summary: Users want to remove a range of top-level nodes without manually adjusting paths after every remove.
Evidence:
gitcrawl threads --numbers 3891 --include-closed --json ianstormtaylor/slate.docs/plans/2026-05-06-slate-v2-range-delete-replace-children-ralplan.md.docs/plans/2026-05-07-slate-v2-core-structural-delete-normalization-ralplan.md.Decision:
Keep related. replace_children is the right substrate, but public
remove-range helper semantics need their own proof and API decision.
PR-description text: Related #3891: multi-node remove-range pressure; no helper API claim.
Status: fixes-claimed Bucket: v2-core-engine Confidence: high
Issue summary:
Editor.nodes(..., { reverse: true }) returns a mixed traversal order when
nested matches are present. It reverses sibling order but still yields parents
before nested matched descendants.
Evidence:
gh issue view 5080 --repo ianstormtaylor/slate --comments --json number,title,state,body,comments,labels,url,updatedAt.gitcrawl threads ianstormtaylor/slate --numbers 5080 --include-closed --json..tmp/slate-v2/packages/slate/src/editor/nodes.ts;
.tmp/slate-v2/packages/slate/src/interfaces/node.ts;
.tmp/slate-v2/packages/slate/src/core/public-state.ts.docs/plans/2026-05-07-slate-v2-editor-nodes-reverse-order-ralplan.md.Decision:
Claim Fixes #5080. The current v2 read API now proves that
state.nodes.entries({ reverse: true }) returns the exact reverse of the forward
matched entry list for nested matching entries.
PR-description text:
Fixes #5080: state.nodes.entries({ reverse: true }) returns the exact reverse
of the forward matched entry order for nested matching entries.
Status: related Bucket: needs-repro Confidence: low
Issue summary:
The report gestures at SlateEditor.nodes and match traversal but does not give
a concrete document shape, match predicate, or expected yielded path.
Evidence:
gh issue view 5684 --repo ianstormtaylor/slate --comments --json number,title,state,body,comments,labels,url,updatedAt.gitcrawl threads ianstormtaylor/slate --numbers 5080,5684 --include-closed --json;
gitcrawl neighbors ianstormtaylor/slate --number 5684 --limit 20 --json.docs/slate-issues/open-issues-dossiers/5760-5666.md.blocked-on-repro:
docs/slate-issues/test-candidate-map/5760-5666.md.Decision:
Keep related, not fixed. It belongs to the same broad query traversal API
family, but #5080 has a precise reverse-order contract while #5684 still
needs a repro.
PR-description text:
Related #5684: SlateEditor.nodes match traversal ambiguity remains
repro-first; no fixed claim from the reverse-order lane.
Status: related Bucket: v2-api-dx Confidence: medium
Issue summary:
The issue asks for a pass predicate so callers can skip subtrees during node
traversal.
Evidence:
docs/slate-issues/open-issues-dossiers/5064-4971.md;
docs/slate-issues/test-candidate-map/5064-4971.md.pass on traversal options:
.tmp/slate-v2/packages/slate/src/interfaces/editor.ts;
.tmp/slate-v2/packages/slate/src/interfaces/node.ts;
.tmp/slate-v2/packages/slate/src/editor/nodes.ts.Decision:
Keep related. The current v2 shape already carries the pass predicate, but
the #5080 plan owns reverse traversal order only. Do not turn this lane into a
pass-filtering docs or API claim.
PR-description text:
Related #5028: traversal pass predicate pressure is represented in current
v2 options, but the #5080 lane only owns reverse traversal order.
Status: not-claimed Bucket: docs-examples Confidence: medium
Issue summary:
The issue asks docs to make Editor.nodes selection-relative behavior clearer.
Evidence:
docs/slate-issues/open-issues-dossiers/3948-3881.md.docs/slate-issues/test-candidate-map/3948-3881.md.docs/plans/2026-05-07-slate-v2-editor-nodes-reverse-order-ralplan.md.Decision: Do not claim. The reverse-order lane can use clear test names, but it is not a docs/examples fix for selection-relative API wording.
PR-description text:
Not claimed #3885: selection-relative Editor.nodes docs remain outside the
reverse traversal fix.
Status: macro-routed Bucket: v2-input-runtime Confidence: medium-high
Scope:
This section records the fork-local accounting sync for the Mobile/IME macro
Ralplan, not an upstream issue comment and not a closure claim. The active plan
is docs/plans/2026-05-07-slate-v2-mobile-ime-input-runtime-ralplan.md.
Issue summary:
The reviewed surface is the frozen R7 input/composition/IME runtime set:
149 rows, all already cluster-synced in the source issue corpus. The plan
routes that set through Slate v2's shared input runtime, slate-dom bridge,
composition state, Android manager, selection import/export, repair, and
browser/device proof gates.
Evidence:
docs/plans/2026-05-07-slate-v2-mobile-ime-input-runtime-ralplan.md.docs/slate-v2/ledgers/issue-coverage-matrix.md.docs/slate-issues/gitcrawl-live-open-ledger.md and
docs/slate-issues/gitcrawl-clusters.md.docs/slate-v2/references/pr-description.md.Decision:
Keep this as macro-routed. No new Fixes #... or Improves #... claim is
legal from this planning pass. The matrix backfills #5711, #3634, and
#4961 as related rows. The stale dossier statuses for #6022, #5983,
#5183, and #5088 are aligned down to related because the current Mobile
IME plan does not carry exact matching device/browser proof for those rows.
The 44 long-form rows remain proof-route backlog, not PR auto-close text:
#5891, #5836, #5805, #5680, #5666, #5653, #5493, #5375,
#5371, #5291, #5175, #5173, #5167, #3873, #3695, #3611,
#3587, #5099, #5083, #5078, #5034, #5023, #4959, #4861,
#4770, #4719, #4693, #4640, #4602, #4543, #4531, #4521,
#4372, #4354, #4353, #4269, #4232, #4136, #4085, #4031,
#4030, #3943, #3942, and #3882.
The remaining routed rows stay matrix-only until a later execution batch gives them exact repro mapping and proof. Device-specific closure still requires matching raw Android, iOS, Firefox Android, Samsung Keyboard, voice input, or Windows IME artifacts.
PR-description text:
Mobile/IME macro accounting: 149 frozen R7 input-runtime rows reviewed; no
new exact fixed or improved claim; exact mobile/IME closure remains gated on
matching browser or raw-device proof.
Status: macro-routed Bucket: v2-input-runtime Confidence: medium-high
Scope:
This is the ClawSweeper related-issue pass for the first ProseMirror rows in
docs/plans/2026-05-10-slate-v2-all-editor-harvest-test-processing-ralplan.md.
It covers PM-10 composition lifecycle and PM-09 DOM-change disambiguation. It
does not add an upstream issue comment, PR claim, fixed count, or improved
count.
Archive evidence:
gitcrawl doctor --json reported gitcrawl 0.2.1, local archive data
present, no GitHub token, and last sync at 2026-05-04T14:58:11.123944Z.#6051, #6022, #5989, #5984, #5983, #5931,
#5918, #5974, #4400, #5883, #4466, #3309, #4223, #3470,
and #2051.Decision:
Keep this pass as related issue accounting only. The PM-10 and PM-09 harvest
rows justify the next implementation owner, not issue promotion. Existing
related or non-claim statuses remain correct for #6051, #6022, #5989,
#5984, #5983, #5931, #5830, #5643, #5883, #4400, #5603,
#5669, #4223, #3470, and #2051.
#4466, #5493, #5974, and #5918 remain proof-needed or future-proof
pressure until a matching browser, keyboard-layout, or IME reproduction lands.
#3309 is not part of the PM-10/PM-09 closure path; route it to the PM-12/PM-13
projection and browser-selection slices.
The next legal execution move is PM-10 composition proof in current
.tmp/slate-v2 source. Exact Android, Firefox Android, Samsung Keyboard, voice
input, Windows suggestion, Hangul, Chinese, Vietnamese, or Japanese/Korean IME
closure still needs matching browser or raw-device artifacts.
PR-description text: All-harvest PM-10/PM-09 accounting: related input-runtime and DOM-change issues reviewed; no new exact fixed or improved claim; implementation starts with composition lifecycle proof.
This is ClawSweeper issue discovery for
docs/plans/2026-05-08-slate-v2-dom-selection-focus-bridge-ralplan.md. It adds
no fixed issue claims. It exists to stop the DOM selection lane from redoing the
closed #4789/#4984 proof and to route the remaining issue surface correctly.
No new Fixes #... or Improves #... PR claim is legal from the DOM
selection/focus revision pass. The concrete implementation phases in
docs/plans/2026-05-08-slate-v2-dom-selection-focus-bridge-ralplan.md keep the
same issue policy:
docs/slate-issues/gitcrawl-live-open-ledger.md is a generated live-field
mirror, so this pass does not edit it. docs/slate-v2/references/pr-description.md
also stays unchanged because the fixed issue count does not change.
DOMEditor.toSlatePoint could find a point in a parent editorStatus: improves-claimed Bucket: v2-dom-selection Confidence: medium
Issue summary:
Nested or read-only editor DOM can make DOMEditor.toSlatePoint walk into a
parent editor and resolve a point through global DOM/node maps.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 5947 --include-closed --json..tmp/slate-v2/packages/slate-dom/test/bridge.ts,
.tmp/slate-v2/packages/slate-dom/src/plugin/dom-editor.ts, and
docs/slate-v2/ledgers/issue-coverage-matrix.md.Decision:
Keep Improves #5947. Current v2 bridge ownership rejects foreign
path-tagged nodes and uses mounted path/runtime metadata, but this plan must add
an exact parent/child browser or unit repro before it can promote to
fixes-claimed.
PR-description text: Improves #5947: nested editor DOM ownership is represented by the DOM bridge, but exact parent-editor point bleed closure still needs focused proof.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary:
Calling DOMEditor.focus(editor) while a mention or other inline void is
selected can collapse selection back to the start.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 5867 --include-closed --json..tmp/slate-v2/packages/slate-dom/src/plugin/dom-editor.ts,
.tmp/slate-v2/playwright/integration/examples/mentions.test.ts, and
.tmp/slate-v2/packages/slate-react/src/editable/selection-controller.ts.Decision:
Keep as cluster-synced. It is a DOM focus/selection bridge issue with a clear
future proof route, but no exact selected-mention focus row is claimed yet.
PR-description text: Related #5867: selected inline mention focus restore belongs to the DOM focus/selection bridge; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Programmatic focus plus selecting the end of the editor can scroll an embedded or whiteboard-like editor unexpectedly.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 5538 --include-closed --json..tmp/slate-v2/packages/slate-dom/src/plugin/dom-editor.ts,
.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts, and
.tmp/slate-v2/packages/slate-react/test/app-owned-customization.tsx.Decision:
Keep as cluster-synced. Focus/scroll behavior is the right runtime owner, but
the whiteboard/readOnly toggle repro is not closed without a browser row.
PR-description text: Related #5538: focus scroll restoration belongs to DOM focus and scroll-selection ownership; no exact closure.
Status: issue-reviewed Bucket: v2-react-runtime Confidence: medium
Issue summary:
ReactEditor.focus(editor) after external value initialization can blank or
destabilize the editor in the historical React runtime path.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 5568 --include-closed --json..tmp/slate-v2/packages/slate-react/test/react-editor-contract.tsx and
docs/slate-v2/ledgers/issue-coverage-matrix.md.Decision:
Keep as issue-reviewed. It belongs more to React runtime initialization than
pure DOM selection. The DOM selection plan should keep it as adjacent pressure
unless the focus implementation changes the exact behavior.
PR-description text: Related #5568: React focus initialization has current contracts, but exact empty-initial-value focus closure is not claimed.
Status: not-claimed Bucket: v2-dom-selection Confidence: medium
Issue summary: The issue asks for multi-cell table selection behavior, not merely for DOM point containment or no-crash table selection imports.
Evidence:
gitcrawl threads ianstormtaylor/slate --numbers 2558 --include-closed --json..tmp/slate-v2/playwright/integration/examples/tables.test.ts and
docs/editor-test-harvester/lexical/report.md.Decision: Do not claim #2558 from this lane. Existing and planned DOM selection rows can prove containment and no-crash behavior, but multi-cell selection requires an explicit table selection model decision.
PR-description text: None; detailed ledger only.
Status: not-claimed Bucket: ecosystem-boundary Confidence: medium
Issue summary: The thread describes link exit behavior when pressing space inside nested block/link contexts. The frozen corpus routes it as plugin/presentation policy, not a current raw core regression.
Evidence:
docs/slate-issues/open-issues-ledger.md, stale-candidate,
triage-closed, ecosystem/current-API owner.docs/slate-issues/test-candidate-map/5912-5771.md
marks it not-a-test-candidate.docs/editor-test-harvester/lexical/slate-processing-ledger.md routes link
and autolink rows as source-drilling candidates for raw inline behavior only.Decision:
Keep as not-claimed. A later Lexical Links apply slice may add raw inline
boundary proof, but it must not smuggle product-level link-exit policy into raw
Slate.
PR-description text: None; detailed ledger only.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Select-all then Backspace in the images example with a trailing image should not leave invalid selection or deletion state.
Evidence:
docs/slate-issues/open-issues-ledger.md, likely-valid,
cluster-synced, selection/model owner.docs/slate-issues/test-candidate-map/4741-4643.md
marks it ready-now.docs/editor-test-harvester/lexical/slate-processing-ledger.md routes image
void, selection, and delete rows as refactor-existing candidates.Decision:
Keep as cluster-synced. The issue is adjacent to structural delete and
void-tail handling, but the exact images-example select-all repro is not
replayed here.
PR-description text: Related #4730: select-all delete around trailing image/void content is related selection and structural-delete pressure; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Triple-click paragraph selection followed by typing should replace the selected paragraph consistently across browsers.
Evidence:
docs/slate-issues/open-issues-ledger.md, likely-valid,
cluster-synced, browser-input/DOM bridge owner.docs/slate-issues/test-candidate-map/3433-3317.md
marks it ready-with-minor-setup.docs/editor-test-harvester/lexical/slate-processing-ledger.md routes
Selection rows as refactor-existing candidates.Decision:
Keep as cluster-synced. It is a real browser behavior row, but exact closure
needs a focused typing replacement proof, not only selection import proof.
PR-description text: Related #3387: triple-click selection followed by typing belongs to DOM selection/browser-input ownership; no exact closure.
Status: cluster-synced Bucket: v2-dom-selection Confidence: medium
Issue summary: Triple-clicking a paragraph with inline children should select the full paragraph rather than stopping at inline boundaries.
Evidence:
docs/slate-issues/open-issues-ledger.md, valid,
cluster-synced, DOM selection bridge owner.docs/slate-issues/test-candidate-map/3878-3798.md
marks it ready-with-minor-setup.docs/editor-test-harvester/lexical/slate-processing-ledger.md routes
selection and inline rows as refactor-existing candidates.Decision:
Keep as cluster-synced. It should become a browser proof row only if the
implementation slice explicitly targets triple-click inline-child selection.
PR-description text: Related #3872: triple-click selection with inline children belongs to DOM selection bridge proof; no exact closure.
This is planning/accounting sync for
docs/plans/2026-05-08-slate-v2-performance-scalability-slate-issues-ralplan.md.
It adds no fixed issue claims and no new improved issue claims. Exact
performance closure still needs the matching benchmark, browser, retained-memory,
or maintainer-equivalence proof named in the plan.
| Route | Count | Issues | Claim policy |
|---|---|---|---|
| Existing dossier and matrix rows | 13 | #6038, #3656, #4141, #5131, #3430, #5945, #4056, #5992, #3752, #2195, #2405, #4483, #2051 | Preserve current Improves, Related, and Not claimed statuses; no promotion from this planning pass. |
| Existing macro/future-proof rows | 7 | #5433, #5420, #5274, #4317, #3354, #3926, #5697 | Keep as future proof pressure or guard rows; no PR auto-close text. |
| Performance proof-route backlog | 10 | #2733, #2669, #790, #5216, #5592, #4202, #4210, #3748, #5349, #4025 | Related, proof-needed, or needs-repro until a later execution slice adds exact proof. |
| Policy/API/accessibility non-claims | 4 | #2465, #2564, #3892, #2572 | Keep out of fixed/improved performance language; these are DX, ecosystem, or release-guard pressure only. |
| PR prose sync | 3 | #5945, #4056, #5992 | Existing PR text remains exact. No new PR performance text is added by this planning pass. |
This is planning/accounting sync for
docs/plans/2026-05-10-slate-v2-all-editor-harvest-test-processing-ralplan.md.
It reviews the ProseMirror PM-08 collaboration pressure against current Slate v2
proof and adds no PR-facing fixed or improved issue claim.
Evidence:
docs/editor-test-harvester/prosemirror/report.md, PM-08..tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts now
includes three-peer replay convergence for text, mark, range-delete, and move
commits, with remote collaboration metadata skipping local undo history.cd /Users/zbeyens/git/slate-v2 && bun test ./packages/slate/test/collab-history-runtime-contract.ts.cd /Users/zbeyens/git/slate-v2 && bun turbo typecheck --filter=./packages/slate;
cd /Users/zbeyens/git/slate-v2 && bunx biome check packages/slate/test/collab-history-runtime-contract.ts --fix.| Issue | Status after PM-08 | Decision |
|---|---|---|
| #5771 | Related | The new PM-08 row proves core package replay convergence, but not the issue's high-QPS remote insert_text versus local selection repro. Keep exact closure for a later collaboration-selection proof. |
| #5533 | Related | Operation replay is a better primitive than a Yjs-only story, but Slate still does not ship a first-party OT/Yjs-free collaboration protocol. |
| #2288 | Improves, unchanged | Range-delete replay now has explicit three-peer package proof, but public range-operation exposure remains a separate API decision. |
| #1770 | Related | Replay convergence reduces operation-transport pressure, but it is not a general operation-composition utility. |
| #3741 | Related | Remote move_node replay convergence is covered, but Slate still does not add moved-node payloads to serialized move_node operations. |
Decision: Keep PM-08 as core package proof only. Do not claim slate-yjs browser behavior, OT transform closure, simultaneous typing rebasing, or high-QPS selection stability from this row.
PR-description text: None; no PR-facing claim count changes.
Status: planning-reviewed Bucket: v2-api-dx Confidence: medium
Issue summary: The issue is API and documentation pressure around object identity, node references, and why duplicating or reusing node objects can produce surprising behavior.
Evidence:
path-identity-and-node-reference-rules.docs/slate-issues/gitcrawl-v2-sync-ledger.md.docs/slate-v2/ledgers/issue-coverage-matrix.md.docs/slate-issues/requirements-from-issues.md#r11-tighten-the-public-api-and-type-surface.docs/plans/2026-05-16-slate-v2-unified-extension-composition-ralplan.md..tmp/slate-v2/packages/slate/test/public-surface-contract.ts.Decision:
Keep as Related, not fixed or improved. The unified extension composition
plan directly targets public API/type/extension DX by removing public wrapper
composition, withEditor, and public author-facing editor.extend from the
taught author path. That is the right architectural direction for #3802-style
DX pressure, but exact closure needs implementation proof: stale public wrapper
surfaces gone, creation-time extension types inferred, and public-surface
contracts passing.
PR-description text:
Synced during the issue/reference pass. The PR reference now points authors to
creation-time extensions, replayable state / tx, and installed
editor.api handles, with no new fixed or improved issue claim.
Plan:
docs/plans/2026-05-16-slate-v2-render-element-extension-dx-ralplan.mdTouched surface:
Editable raw render propseditableRenderers(...) extension capabilityRenderElementProps and example renderer typingEvidence:
.tmp/slate-v2/packages/slate-react/src/editable/editable-renderers.ts.tmp/slate-v2/packages/slate-react/src/components/editable-text-blocks.tsx.tmp/slate-v2/packages/slate-react/test/surface-contract.tsx.tmp/slate-v2/docs/libraries/slate-react/editable.md.tmp/slate-v2/docs/concepts/09-rendering.md.tmp/slate-v2/site/examples/ts/check-lists.tsx.tmp/slate-v2/site/examples/ts/images.tsx.tmp/slate-v2/site/examples/ts/embeds.tsx.tmp/slate-v2/site/examples/ts/inlines.tsx| Issue | Status after pass | Decision |
|---|---|---|
#3177 | Related, planning-reviewed | Registered renderers answer the plugin-layer composition direction, but current first-party examples still need cleanup before any closure or improvement claim. |
#5349 | Related, blocked-on-repro | Renderer consistency does not prove the empty-editor render churn report. Keep repro-first. |
#4317 | Related, unchanged | Registered renderers reduce callback identity pressure, but the exact onSelect render-callback repro still needs browser proof. |
Decision:
No new Fixes or Improves issue claims. Keep PR fixed and improved issue
counts unchanged.
Plan:
docs/plans/2026-05-14-slate-v2-callback-memoization-dx-ralplan.mdTouched surface:
Editable.onDOMBeforeInput raw native escape hatchEditable.onCommand semantic command handlerformat* beforeinput and format-hotkey command classificationEvidence:
.tmp/slate-v2/packages/slate-react/test/editing-kernel-contract.ts.tmp/slate-v2/packages/slate-react/test/editable-behavior.tsx.tmp/slate-v2/packages/slate-react/test/input-router-contract.test.tsx.tmp/slate-v2/packages/slate-react/test/surface-contract.tsx.tmp/slate-v2/playwright/integration/examples/hovering-toolbar.test.ts.tmp/slate-v2/docs/libraries/slate-react/editable.mdbun --filter slate-react typecheckbun --filter slate-react testbun check| Issue | Status after pass | Decision |
|---|---|---|
#3568 | Related, materially improved | App formatting still has a runtime-owned native-format path, but raw Slate no longer exposes public onCommand / EditableCommand*. No exact closure until the original crash repro is replayed. |
#3586 | Related, materially improved | Native format handling stays runtime-owned after the public onCommand cut. No exact DOMPoint crash closure until the original repro is replayed. |
#4681 | Related, unchanged | Raw onDOMBeforeInput remains an escape hatch, but paste-specific onDOMBeforeInput behavior is not claimed. |
#5181 | Related, materially improved | Native input listeners read latest handlers without reattaching on prop changes, but the exact stale onChange / editor replacement callback bug is not closed. |
#4317 | Related, unchanged | Render callback selection churn is adjacent callback identity pressure; this lane only proves native input listener stability. |
Decision:
No new Fixes issue claims. Keep PR fixed issue count unchanged.
Plan:
docs/plans/2026-05-14-slate-v2-example-memoization-hard-cut-ralplan.mdTouched surface:
Editable renderers through editableRenderers(...)editableKeyCommands(...)Evidence:
.tmp/slate-v2/packages/slate-react/test/surface-contract.test.tsx.tmp/slate-v2/packages/slate-react/test/keyboard-input-strategy-contract.test.ts.tmp/slate-v2/packages/slate-react/test/annotation-store-contract.test.tsx.tmp/slate-v2/packages/slate-react/test/widget-layer-contract.test.tsx.tmp/slate-v2/docs/libraries/slate-react/editable.md.tmp/slate-v2/docs/concepts/09-rendering.md.tmp/slate-v2/site/examples/ts/code-highlighting.tsx.tmp/slate-v2/site/examples/ts/iframe.tsx.tmp/slate-v2/site/examples/ts/images.tsx.tmp/slate-v2/site/examples/ts/markdown-shortcuts.tsx.tmp/slate-v2/site/examples/ts/richtext.tsx.tmp/slate-v2/site/examples/ts/tables.tsx| Issue | Status after pass | Decision |
|---|---|---|
#4317 | Related, improved pressure only | Registered renderers remove beginner render-callback identity pressure, but the exact onSelect render-callback repro still needs browser proof before any closure claim. |
#5181 | Related, unchanged | Projector overloads and key-command registration reduce memoization ceremony, but they do not replay the stale onChange / editor replacement callback bug. |
Decision:
No new Fixes or Improves issue claims. Keep PR fixed issue count and
improved issue count unchanged.
Date: 2026-05-13
Bucket: v2-dom-selection plus slate-history
Planning source:
docs/plans/2026-05-13-slate-v2-history-selection-precondition-ralplan.md.
Implemented finding:
set_selection(start -> middle) and then applies
insert_text stored the stale commit-wide selectionBefore; undo restored
[0,0]@0 instead of the edit point [0,0]@3.slate-history now builds each batch from the first saveable operation,
applies leading selection-only operations to batch.selectionBefore, and
trims those leading precondition operations from batch.operations.0.Decision:
Treat udecode/slate#9 as fork-local improves-implemented. The exact
mixed-commit history hole and the scroll-into-view caret replay are fixed in
Slate v2, but this stays out of upstream PR fixed-issue counts until a
maintainer accepts broader #9 claim wording.
Proof:
.tmp/slate-v2/packages/slate-history/test/history-contract.ts mixed
set_selection plus insert_text red/green: 26 pass..tmp/slate-v2/packages/slate/test/commit-metadata-contract.ts plus
.tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts:
14 pass.bun --filter slate-history typecheck, bun --filter slate typecheck, and
bun --filter slate-react typecheck: all exited 0.2 passed.http://localhost:3100:
1 passed.4 passed,
including the Mac keyboard undo repair row.bun --filter slate-react build: exited 0.bun --filter slate-react test:vitest -- selection-side-effect-policy-contract:
2 passed.bun lint:fix: exited 0.PR-description text: None. This is fork-local issue accounting and should not change upstream PR fixed-issue counts until a maintainer-facing claim is accepted.
This is execution/accounting sync for
docs/plans/2026-05-10-slate-v2-udecode-open-issues-reproduction-ralplan.md.
It processes the automated IME cancellation row for udecode/slate#6.
Evidence:
gh issue view 6 -R udecode/slate --json number,title,body,url,comments.tmp/slate-v2/playwright/integration/examples/rendering-strategy-runtime.test.tscd /Users/zbeyens/git/slate-v2 && PLAYWRIGHT_BASE_URL=http://localhost:3100 bun playwright test playwright/integration/examples/rendering-strategy-runtime.test.ts --project=chromium --grep "keeps canceled IME caret anchored for the next typed character";
cd /Users/zbeyens/git/slate-v2 && PLAYWRIGHT_BASE_URL=http://localhost:3100 bun playwright test playwright/integration/examples/rendering-strategy-runtime.test.ts --project=chromium --grep "does not push canceled IME composition onto history|keeps text stable after type-delete-cancel IME composition|keeps canceled IME caret anchored for the next typed character";
cd /Users/zbeyens/git/slate-v2 && bun lint:fix;
cd /Users/zbeyens/git/slate-v2 && bun check.| Issue | Status after Phase 3 | Decision |
|---|---|---|
udecode/slate#6 | already-accounted | Current Chromium CDP cancellation proof keeps text, selection, and the next typed character anchored at the original caret. No runtime code changed. Do not promote this to a manual Chinese IME Fixes claim without real OS/input-method proof. |
Decision: Record automated browser coverage for the cancellation/next-character oracle, but keep exact manual Chinese IME closure unclaimed.
PR-description text:
None; this is fork-local udecode/slate accounting and does not change upstream
ianstormtaylor/slate fixed/improved counts.
This is execution/accounting sync for
docs/plans/2026-05-10-slate-v2-udecode-open-issues-reproduction-ralplan.md.
It processes the clipboard/void cluster for udecode/slate#7, #10, and
#13.
Evidence:
gh issue view 7 -R udecode/slate --json number,title,body,url,comments;
gh issue view 10 -R udecode/slate --json number,title,body,url,comments;
gh issue view 13 -R udecode/slate --json number,title,body,url,comments#7 local red probe:
selected image copy from http://localhost:3100/examples/images produced
text/html without `` and plain text with only newlines.#7 live reference probe:
selected image copy from https://www.slatejs.org/examples/images produced
text/html containing ``..tmp/slate-v2/packages/slate-dom/src/plugin/dom-clipboard-runtime.ts.tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.ts.tmp/slate-v2/playwright/integration/examples/images.test.ts;
.tmp/slate-v2/playwright/integration/examples/mentions.test.ts;
.tmp/slate-v2/playwright/integration/examples/paste-html.test.tscd /Users/zbeyens/git/slate-v2 && bun test ./packages/slate-dom/test/clipboard-boundary.ts;
cd /Users/zbeyens/git/slate-v2 && PLAYWRIGHT_BASE_URL=http://localhost:3100 bun playwright test playwright/integration/examples/images.test.ts playwright/integration/examples/mentions.test.ts playwright/integration/examples/paste-html.test.ts --project=chromium --grep "copies selected image with visible external HTML payload|copies and pastes a selected mention without crashing|cuts a selected mention without crashing|pastes copied rendered Slate content as an internal fragment before HTML import";
cd /Users/zbeyens/git/slate-v2 && bun --filter slate-dom typecheck;
cd /Users/zbeyens/git/slate-v2 && bun --filter slate-browser typecheck;
cd /Users/zbeyens/git/slate-v2 && bun lint:fix| Issue | Status after Phase 2 | Decision |
|---|---|---|
udecode/slate#7 | fixes-claimed | Current local red showed selected block image copy omitted visible `` HTML. dom-clipboard-runtime now clones the full void DOM range for spacer-anchored void selections, and package plus Chromium proof are green. |
udecode/slate#10 | already-accounted | Exact selected mention copy/paste and cut browser rows are green. Prior inline-void clipboard export work owns the reported null-attach crash class, so this slice records proof rather than a new code fix claim. |
udecode/slate#13 | already-accounted | The attached video was translated into a rendered-content self-copy row in paste-html; current code preserves block structure and has no runtime error. |
Decision:
Only udecode/slate#7 becomes a new same-slice fork fix claim. #10 and
#13 are guarded as already accounted because their exact browser rows were
green on current code.
PR-description text:
None; these are fork-local udecode/slate accounting rows, not upstream
ianstormtaylor/slate auto-close claims.
This is execution/accounting sync for
docs/plans/2026-05-10-slate-v2-udecode-open-issues-reproduction-ralplan.md.
It covers Phase 1 only: udecode/slate#9, #11, #12, and #14.
Evidence:
gh issue view 9 -R udecode/slate --json number,title,body,url,
gh issue view 11 -R udecode/slate --json number,title,body,url,
gh issue view 12 -R udecode/slate --json number,title,body,url,
gh issue view 14 -R udecode/slate --json number,title,body,url..tmp/slate-v2/packages/slate/src/transforms-text/insert-text.ts..tmp/slate-v2/packages/slate-history/test/history-contract.ts..tmp/slate-v2/playwright/integration/examples/plaintext.test.ts,
.tmp/slate-v2/playwright/integration/examples/mentions.test.ts,
.tmp/slate-v2/playwright/integration/examples/hovering-toolbar.test.ts.cd /Users/zbeyens/git/slate-v2 && bun --filter slate typecheck;
cd /Users/zbeyens/git/slate-v2 && bun --filter slate-history typecheck;
cd /Users/zbeyens/git/slate-v2 && bun lint:fix;
cd /Users/zbeyens/git/slate-v2 && bun test ./packages/slate-history/test/history-contract.ts;
cd /Users/zbeyens/git/slate-v2 && PLAYWRIGHT_BASE_URL=http://localhost:3100 bun playwright test playwright/integration/examples/plaintext.test.ts playwright/integration/examples/mentions.test.ts playwright/integration/examples/hovering-toolbar.test.ts --project=chromium --grep "keyboard undo restores caret after middle-line typing|keyboard undo restores partial selected text replacement|keyboard undo restores select-all replacement content|typing English over selected formatted text does not crash".| Issue | Phase 1 status | Decision |
|---|---|---|
udecode/slate#9 | Already accounted | Plaintext middle-line typing undo restores the original text and caret at the edit point. Broader cross-example scope is not closed by this one row. |
udecode/slate#11 | Improves | Mentions select-all replacement undo restores the original document, and the package history contract records full-document replacement as one replace_children undo batch. Keep out of PR-facing Fixes wording until a clean pre-fix red artifact is preserved. |
udecode/slate#12 | Already accounted | Plaintext partial-selection replacement undo restores the original selected text/range. Inlines, styling, and code-highlighting scope remains unclaimed until matching rows run. |
udecode/slate#14 | Fixes in fork lane | Hovering-toolbar English replacement over the selected formatted word reproduced the crash locally and passes after the insert target fix. |
Decision:
Do not update the upstream PR fixed-issue matrix from these udecode fork issue
numbers. Keep the PR description unchanged. Continue with Phase 2 clipboard and
void serialization for udecode/slate#7, #10, and #13.
PR-description text: None; no PR-facing claim count changes.
This audits docs/plans/2026-05-10-slate-v2-prosemirror-runtime-proof-slices-ralplan.md.
It revalidates PM-08, PM-09, PM-10, PM-12, and PM-13 against current
.tmp/slate-v2 owner tests and keeps all existing issue claim statuses unchanged.
Evidence:
gitcrawl doctor --json reports gitcrawl 0.2.1, local archive data, no
GitHub token, and last sync at 2026-05-04T14:58:11.123944Z..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/playwright/integration/examples/richtext.test.ts, and
.tmp/slate-v2/playwright/integration/examples/rendering-strategy-runtime.test.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, and
.tmp/slate-v2/packages/slate-react/test/widget-layer-contract.tsx..tmp/slate-v2/packages/slate-browser/test/browser/selection.browser.test.ts.Fresh verification:
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
passed: 20 tests.cd /Users/zbeyens/git/slate-v2 && bun test ./packages/slate/test/collab-history-runtime-contract.ts
passed: 9 tests.cd /Users/zbeyens/git/slate-v2/packages/slate-react && bun test:vitest -- projections-and-selection-contract annotation-store-contract widget-layer-contract
passed: 3 files, 28 tests.cd /Users/zbeyens/git/slate-v2 && bun --filter slate-browser test:selection
passed: 1 file, 4 tests.| Row | Revalidation decision | Issue policy |
|---|---|---|
| PM-10 composition | Covered by current package and browser composition rows. | Keep input/runtime issues related or proof-needed; no Android/raw-device promotion. |
| PM-09 DOM-change | Covered by current beforeinput, repair-target, command-routing, and browser stress rows. | Keep DOM-change/native-event issues related until exact browser event proof exists. |
| PM-08 collaboration | Covered for raw package convergence and history rebase. | Keep #5771/#5533/#1770/#3741 related and #2288 improves unchanged; no OT/Yjs/browser collaboration closure. |
| PM-12 projection/widget | Covered for raw projection, annotation, and widget mapping. | Keep #4477 improves unchanged and #3309 related unchanged; no NodeView/MarkView/PluginView API parity claim. |
| PM-13 geometry/RTL | Covered for RTL geometry and wrapped-line rectangles. | Keep browser-selection rows related; no atom/table/mobile closure. |
PR-description text: None; no PR-facing claim count changes.
This is planning/accounting sync for
docs/plans/2026-05-10-slate-v2-all-editor-harvest-test-processing-ralplan.md.
It reviews the ProseMirror PM-13 selection geometry pressure against current
Slate v2 browser proof and adds no PR-facing fixed or improved issue claim.
Evidence:
docs/editor-test-harvester/prosemirror/report.md, PM-13.docs/editor-test-harvester/prosemirror/test-index.md, webtest-selection
RTL coordinate and wrapped-line coordinate rows..tmp/slate-v2/packages/slate-browser/test/browser/selection.browser.test.ts
now includes browser rows for RTL DOM selection offset mapping, RTL visual
geometry direction, and wrapped-line selection rectangles.cd /Users/zbeyens/git/slate-v2 && bun --filter slate-browser test:selection.cd /Users/zbeyens/git/slate-v2 && bun turbo typecheck --filter=./packages/slate-browser;
cd /Users/zbeyens/git/slate-v2 && bunx biome check packages/slate-browser/test/browser/selection.browser.test.ts --fix.| Issue | Status after PM-13 | Decision |
|---|---|---|
| #1498 | Related, unchanged | PM-13 proves browser RTL selection offset mapping and visual geometry direction, plus wrapped-line rectangles. It does not close the exact RTL Enter/new-line caret repro. |
Decision: Keep PM-13 as browser selection-geometry proof only. Do not claim full RTL input closure, mobile Persian scroll behavior, list-direction behavior, atom arrow motion, or decorated-selection closure from this row.
PR-description text: None; no PR-facing claim count changes.
This is planning/accounting sync for
docs/plans/2026-05-10-slate-v2-all-editor-harvest-test-processing-ralplan.md.
It reviews the ProseMirror PM-12 projection/widget pressure against current
Slate v2 package proof and adds no PR-facing fixed or improved issue claim.
Evidence:
docs/editor-test-harvester/prosemirror/report.md, PM-12..tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsx
now includes nested moved-node projection runtime-bucket mapping..tmp/slate-v2/packages/slate-react/test/widget-layer-contract.tsx now
includes runtime-id node-widget move/remove mapping.cd /Users/zbeyens/git/slate-v2/packages/slate-react && bun test:vitest -- projections-and-selection-contract annotation-store-contract widget-layer-contract.cd /Users/zbeyens/git/slate-v2 && bun turbo typecheck --filter=./packages/slate-react;
cd /Users/zbeyens/git/slate-v2 && bunx biome check packages/slate-react/test/projections-and-selection-contract.tsx packages/slate-react/test/widget-layer-contract.tsx --fix.| Issue | Status after PM-12 | Decision |
|---|---|---|
| #4483 | Improves, unchanged | PM-12 strengthens local projection runtime-bucket mapping, but the legacy dynamic-decoration API proposal remains unclaimed. |
| #4477 | Improves, unchanged | Runtime-id node widgets now have structural move/remove proof, but product collaborative comments remain outside raw Slate closure. |
| #5987 | Fixes, upgraded | Exact async Editable.decorate browser proof keeps Slate selection and the DOM caret at the typed end after delayed decoration restructuring. |
| #4392 | Improves, unchanged | Nested moved-node projection mapping strengthens cross-node decoration pressure, but full legacy decorate API parity is not claimed. |
| #3382 | Improves, unchanged | Projection slices stay keyed to runtime text ranges through structural moves; legacy Text.decorations API behavior remains outside the v2 contract. |
| #3352 | Improves, unchanged | Cross-node projection is still represented by range-to-text-slice projection; decorator callback API parity is not claimed. |
| #3309 | Related, unchanged | PM-12 is package mapping proof only. Exact decorated-text selection closure still needs matching browser proof, likely in PM-13. |
Decision: Keep PM-12 as package-level projection/widget mapping proof only. Do not claim NodeView/MarkView parity, PM widget side-position semantics, async decoration caret closure, product comment closure, or decorated-selection browser closure.
PR-description text: None; no PR-facing claim count changes.
This is the original planning/accounting intake snapshot for
docs/plans/2026-05-10-slate-v2-udecode-open-issues-reproduction-ralplan.md.
It reviewed all open issues from gh issue list -R udecode/slate --state open --limit 1000 before execution and added no fixed, improved, or PR-facing claim.
Use the newer Udecode sync sections above for current claim state.
Evidence:
gh issue list -R udecode/slate --state open --limit 1000 --json number,title,body,labels,url,updatedAt,createdAt,author11 open issueshttp://localhost:3100, served by cd /Users/zbeyens/git/slate-v2 && bun servedocs/plans/2026-05-10-slate-v2-udecode-open-issues-reproduction-ralplan.md| Issue | Bucket | Intake status | Decision |
|---|---|---|---|
udecode/slate#5 | v2-dom-selection | needs-repro | Images Cmd+A behavior needs local/live browser proof before changing select-all or void selection rendering. |
udecode/slate#6 | v2-input-runtime | needs-repro | Chinese IME cancellation needs real Chrome/dev-browser proof; synthetic composition rows are supporting evidence only. |
udecode/slate#7 | v2-clipboard-serialization | needs-repro | External image void paste requires actual clipboard payload proof. |
udecode/slate#8 | v2-react-runtime | needs-repro | Editable void native input undo needs local/live comparison before deciding whether Slate should intercept that undo. |
udecode/slate#9 | v2-dom-selection | needs-repro | Caret jump after text undo is likely history/selection restore, but needs exact cross-example repro rows. |
udecode/slate#10 | v2-clipboard-serialization | needs-repro | Selected mention copy/paste and cut crash needs local reproduction before fixing inline void clipboard paths. |
udecode/slate#11 | v2-core-engine | needs-repro | Full Cmd+A replacement undo needs package and browser proof before a history claim. |
udecode/slate#12 | v2-core-engine | needs-repro | Partial-selection replacement undo needs the listed examples reproduced before history batching changes. |
udecode/slate#13 | v2-clipboard-serialization | needs-repro | Paste-html issue body lacks exact steps; derive input from video before implementation. |
udecode/slate#14 | v2-input-runtime | needs-repro | Hovering-toolbar crash needs local runtime trace before beforeinput replacement changes. |
udecode/slate#15 | v2-dom-selection | needs-repro | Iframe toolbar behavior needs cross-window selection target proof before target bridge changes. |
Decision:
Keep all udecode/slate open issues out of PR closure claims until exact local
red proof exists. Group execution by shared runtime owner: history, clipboard,
composition, and target ownership.
Issue:
ianstormtaylor/slate#5400Decision:
Claim Fixes #5400. Public helper value namespaces now use *Api names such
as NodeApi, ElementApi, PathApi, and RangeApi, while model type names
stay Node, Element, Path, and Range. Public docs/examples no longer
import bare helper values that shadow DOM globals.
Proof:
.tmp/slate-v2/packages/slate/test/public-surface-contract.ts.tmp/slate-v2/packages/slate/test/interfaces-contract.tsdocs/plans/2026-05-13-slate-v2-api-helper-namespace-rename-ralplan.mddocs/slate-issues/open-issues-dossiers/5402-5250.mdPR-description text:
*Api, so importing Slate
helpers no longer shadows DOM globals such as Node.PR-description text: None; no PR-facing claim count changes.
Plan:
docs/plans/2026-05-17-slate-v2-editable-capabilities-dx-ralplan.mdTouched surface:
EditorExtension.capabilities as internal registry substrateeditableKeyCommands(...) public helper DXeditableRenderers(...) public helper DXclipboard.insertData public authoring shapeeditable and clipboardEvidence:
.tmp/slate-v2/packages/slate/src/interfaces/editor.ts.tmp/slate-v2/packages/slate/src/core/editor-extension.ts.tmp/slate-v2/packages/slate/src/core/extension-registry.ts.tmp/slate-v2/packages/slate/src/create-editor.ts.tmp/slate-v2/packages/slate-react/src/editable/editable-key-commands.ts.tmp/slate-v2/packages/slate-react/src/editable/editable-renderers.ts.tmp/slate-v2/site/examples/ts/iframe.tsx.tmp/slate-v2/site/examples/ts/richtext.tsxdocs/research/sources/editor-architecture/node-text-mark-render-dx-corpus-ledger.md| Issue | Status after pass | Decision |
|---|---|---|
#3177 | Related, planning-reviewed | Extension-owned rendering/behavior composition remains the right direction, but public capability helper spreads are no longer accepted final DX. No fix/improve claim until examples, docs, type contracts, and runtime proof land. |
#5961 | Related, not claimed | The plan reduces public raw key-callback authoring pressure, but the DevTools onKeyDown render-warning report remains stale and unreproduced. |
#4613 | Improves, unchanged | Existing clipboard capability improve claim stays scoped to typed insertData handlers. The proposed clipboard facet is an authoring-DX refinement and adds no new behavior claim. |
Decision:
No new Fixes or Improves issue claims. Keep PR fixed/improved issue counts
unchanged.
Plan:
docs/plans/2026-05-17-slate-v2-plate-fit-api-hard-cuts-ralplan.mdTouched surface:
EditorExtension.capabilities authoringEditable onCommand / EditableCommand*clipboard.insertData authoring vocabularyEvidence:
docs/slate-issues/gitcrawl-live-open-ledger.md:592docs/slate-issues/gitcrawl-v2-sync-ledger.md:594docs/slate-v2/ledgers/issue-coverage-matrix.md:208docs/slate-issues/open-issues-dossiers/3313-2733.md:757docs/slate-issues/test-candidate-map/3313-2733.md:181docs/slate-issues/gitcrawl-v2-sync-ledger.md:39docs/slate-issues/open-issues-dossiers/5994-5918.md:468docs/slate-v2/ledgers/fork-issue-dossier.md:3953| Issue | Status after pass | Decision |
|---|---|---|
#3177 | Related, planning-reviewed | Renderer composition pressure is real, but raw Slate should not own a renderer registry. Target raw Slate shape is Editable render* escape hatches plus reusable model middleware; Plate owns renderer/plugin composition. Execution proof landed; no fix/improve claim is added. |
#5961 | Related, not claimed | DevTools onKeyDown warning remains stale/triage-closed. Removing raw key-command registry DX does not reproduce or fix the original warning. |
#4613 | Improves, unchanged | Existing clipboard improve claim stays scoped to typed insertData handlers. This plan refines authoring vocabulary away from public capabilities; it does not broaden clipboard behavior claims. |
| input-rule family | Already cut, unchanged | Public raw Slate input-rule helpers stay out. Plate owns semantic input-rule families; raw Slate keeps transform middleware. |
Decision:
No new Fixes or Improves issue claims. Later issue-sync accounting updated
the manual ledger, coverage matrix, and PR reference where they still described
renderer registries as the accepted raw Slate target.
Plan:
docs/plans/2026-05-17-slate-v2-plate-fit-api-hard-cuts-ralplan.mdAdditional issue pressure reviewed:
#3222, #3802, #3557, #4089#5050, #5010, #4795#3586, #3568, #4681#5233, #4569, #4440, #4888#4956, #5172Decision:
onCommand cut: public
onCommand / EditableCommand* are cut, and Slate-owned native-format
behavior stays internal/runtime-owned after removal.capabilities cut: clipboard.insertData input
ingress stays, custom fragment-key fixes stay, and output serializers remain
outside this plan.Claim result:
Fixes or Improves issue claims.capabilities, and the public onCommand cut.Plan:
docs/plans/2026-05-17-slate-v2-plate-fit-api-hard-cuts-ralplan.mdSynced artifacts:
docs/slate-issues/gitcrawl-v2-sync-ledger.mddocs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/references/pr-description.mddocs/slate-v2/ledgers/fork-issue-dossier.mdSynced decisions:
| Issue | Accounting result |
|---|---|
#3177 | Stays Related / planning-reviewed. Raw Slate should not own a renderer registry; target is raw Editable render* plus model/runtime extensions, with Plate owning product renderer/plugin composition. |
#5961 | Stays not claimed. Raw key-command registry removal does not reproduce or fix the stale DevTools onKeyDown warning; raw Slate keeps Editable onKeyDown. |
#4613 | Existing clipboard improve claim stays scoped to typed insertData input ingress. No broader method override, paste-rule, or output serializer claim. |
#4569 | Existing docs fix claim stays, with wording shifted from public string capabilities to typed clipboard ingress. |
#5233 | Existing custom fragment-key fix claim stays unchanged and must remain green when clipboard authoring vocabulary changes. |
Claim result:
0.0.Planning source:
docs/plans/2026-05-23-slate-v2-tanstack-virtual-ios-perf-ralplan.mdReviewed surface:
https://tanstack.com/blog/tanstack-virtual-perf-and-ios.tmp/slate-v2/packages/slate-react/package.json.tmp/slate-v2/bun.lock.tmp/slate-v2/packages/slate-react/src/dom-strategy/use-virtualized-root-plan.ts.tmp/slate-v2/docs/libraries/slate-react/experimental-virtualized-rendering.mddocs/research/sources/editor-architecture/tanstack-virtual-and-github-large-surface-virtualization.mdDecision:
Adopt the latest TanStack Virtual release as an internal viewport/range engine upgrade for experimental virtualized mode, keep the Slate public API unchanged, and route internal layout-backed virtualized scroll writes through TanStack where practical. This is not an issue closure slice.
Issue accounting:
| Issue | Classification | Reason |
|---|---|---|
#790 | Related, proof-route backlog | Latest TanStack Virtual improves the internal path, but Slate still needs mount/edit/scroll benchmark and browser proof before claiming dynamic rendering. |
#5826 | Fixes | Exact huge-document browser proof covers the long-editor refocus autoscroll report. |
#5538, #4995, #5088, #5473 | Related, unchanged | Upstream iOS momentum scroll deferral supports the scroll-routing implementation route, but exact Slate focus/selection scroll issues still need targeted repro proof. |
#5391, #5095, #4751, #4354, #3760 | Related/non-claimed, unchanged | TanStack's iOS scroll fix is not proof for Slate iOS selection, IME, spellcheck, or toolbar behavior. |
Claim result:
0.0.Planning source:
docs/plans/2026-05-18-slate-v2-table-transform-boundary-ralplan.mdReviewed surface:
.tmp/slate-v2/site/examples/ts/tables.tsx.tmp/slate-v2/site/examples/ts/markdown-shortcuts.tsx.tmp/slate-v2/site/examples/ts/richtext.tsx.tmp/slate-v2/packages/slate/src/interfaces/editor.ts.tmp/slate-v2/packages/slate/src/create-editor.tsdocs/slate-v2/references/pr-description.mdDecision:
Backspace/Delete/Enter table-cell boundary behavior is model transform behavior,
not raw keyboard UI behavior. The target authoring shape is an example-local
table() extension using transforms.deleteBackward, deleteForward, and
insertBreak. Markdown Enter/Backspace and richtext exit-on-Enter follow the
same rule. UI-only hotkeys and widget navigation stay in Editable onKeyDown.
Issue accounting:
| Issue | Classification | Reason |
|---|---|---|
#6034 | Existing Fixes row unchanged | The current fixed claim is ArrowDown at the last table cell. This plan changes authoring ownership for Backspace/Delete/Enter and does not broaden the ArrowDown proof. |
#4658 | Related, unchanged | Custom table text outside table belongs to table boundary and invalid DOM import policy. A local table transform extension can reduce escape routes, but no exact repro or browser proof is added by this planning pass. |
#5355 | Not claimed, unchanged | colgroup / col crash behavior depends on app-rendered DOM shapes that omit editable descendants, not table-cell Backspace/Delete/Enter transform ownership. |
#2558 | Not claimed, unchanged | Multi-cell table selection requires an explicit table selection model; this plan does not add one. |
#3408 | Related, unchanged | Delete-backward table/list replacement pressure stays in the structural delete family; this plan only routes example policy through transform middleware. |
#5961 | Related, not claimed | Raw Slate still keeps Editable onKeyDown for UI shortcuts; moving transform-equivalent behavior out of onKeyDown does not reproduce or fix the stale DevTools render-warning report. |
#3568, #3586, #4681 | Related, unchanged | The public onCommand hard cut and native input boundary remain as previously classified. This plan narrows example guidance but does not add native-format or paste proof. |
Claim result:
0.0.PR sync:
docs/slate-v2/references/pr-description.md records the table transform
boundary and links this plan.docs/slate-v2/ledgers/issue-coverage-matrix.md keeps existing rows; no new
Fixes, Improves, Related, or Not claimed row is required because all
reviewed issue classifications already exist.Planning source:
docs/plans/2026-05-18-slate-v2-android-markdown-shortcut-flush-dx-ralplan.mdReviewed surface:
.tmp/slate-v2/site/examples/ts/markdown-shortcuts.tsx.tmp/slate-v2/packages/slate-react/src/hooks/android-input-manager/android-input-manager.ts.tmp/slate-v2/packages/slate-react/src/editable/runtime-before-input-events.ts.tmp/slate-v2/packages/slate/src/core/transform-middleware.ts.tmp/slate-v2/packages/slate-dom/src/plugin/dom-editor.tsDecision:
The app-side scheduleAndroidMarkdownShortcutFlush(editor) helper is not the
right canonical DX. Markdown shortcut policy should stay in
extension.transforms.insertText, while Slate React owns Android pending-diff
flush timing. Raw Slate should not add a product markdown shortcut API or
revive public Editable inputRules for this case.
Issue accounting:
| Issue | Classification | Reason |
|---|---|---|
#4532 | Related, implementation-reviewed | The implementation removes the example-side Android flush helper, routes stored Android text diffs through registered insertText transform middleware, and passes local regression proof. Candidate Improves #4532 still requires raw Android browser/device proof. |
#4531, #4543, #6022, #5983, #4400, #5883, #5130, #5050 | Related, unchanged | These share Android, IME, beforeinput, or input-policy ownership, but the Android markdown shortcut flush plan does not prove their exact repros. |
Claim result:
0.0.+1 for #4532.Planning source:
docs/plans/2026-05-18-slate-v2-extension-slots-ralplan.mdReviewed surface:
.tmp/slate-v2/packages/slate/src/interfaces/editor.ts.tmp/slate-v2/packages/slate/src/core/editor-extension.ts.tmp/slate-v2/packages/slate/src/core/public-state.ts.tmp/slate-v2/packages/slate-history/src/history-extension.ts.tmp/slate-v2/packages/slate-dom/src/plugin/with-dom.ts.tmp/slate-v2/packages/slate-react/src/plugin/with-react.tsDecision:
Keep the mechanisms, but do not keep registry-shaped names as the normal
extension author API. Target operations.apply for low-level operation hooks,
onCommit for post-transaction observers, and setup for extension-local
runtime installation. Keep internal registry storage names if they are useful
inside the runtime.
Issue accounting:
| Issue | Classification | Reason |
|---|---|---|
#3557 | Related, planning-reviewed | Broad method override pressure must keep full extension middleware coverage across transforms, queries, normalizers, operation apply hooks, and commit observers. Slot naming does not close the exact legacy insert override report. |
#1770, #2288, #3741, #3874 | Related, unchanged | Operation and commit lifecycles preserve the transaction/op/collab pressure already represented in the core-operation rows. The naming review adds no operation-composition, range-operation, or moved-node payload claim. |
#1024, #5233, #4569 | Existing clipboard classifications unchanged | Clipboard ingress still belongs to typed clipboard APIs and extension-owned insertData; the extension slot naming review does not broaden clipboard fix claims. |
#3222, #4089, #3177 | Related, unchanged | Plugin/extension API pressure supports better extension authoring vocabulary, but raw Slate still should not own Plate-style product plugin bundles or renderer registries. |
Claim result:
0.0.Related, Fixes, and Improves rows remain at their current
classification.Planning source:
docs/plans/2026-05-22-slate-v2-pretext-layout-rendering-architecture-ralplan.mdReviewed surface:
.tmp/slate-v2/packages/slate-layout/src/index.ts.tmp/slate-v2/packages/slate-layout/src/react.tsx.tmp/slate-v2/packages/slate-layout-pretext/src/index.ts.tmp/slate-v2/packages/slate-react/src/rendering-strategy/create-segment-plan.ts.tmp/slate-v2/packages/slate-react/src/dom-strategy/use-virtualized-root-plan.ts.tmp/slate-v2/packages/slate-dom/src/plugin/dom-coverage.tsdocs/slate-issues/gitcrawl-v2-sync-ledger.mddocs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/references/pr-description.mdDecision:
The right architecture is a generic slate-layout derived layout service,
Pretext as the default layout-aware engine, domStrategy as the Slate React DOM
materialization policy, and layout-driven virtualization. This is not an issue
closure slice. It is a boundary rewrite plan for later implementation proof.
Issue accounting:
| Issue | Classification | Reason |
|---|---|---|
#790 | Related, proof-route backlog | Layout-driven virtualization directly targets dynamic rendering pressure, but needs benchmark and browser proof before any claim. |
#4141 | Existing Improves unchanged | Layout subscriptions must preserve current rerender-breadth wins; no new proof is added here. |
#5944 | Related, issue-reviewed | Stable per-line pagination is in scope for the layout target, but needs current page-boundary browser proof. |
#5924 | Not claimed, unchanged | Structural DOM should use DOM coverage and mount-plan policy; this plan does not add a public ignore-cursor API. |
#3892 | Policy non-claim, unchanged | Generic layout substrate helps custom surfaces, but product custom editor surfaces remain outside raw Slate closure. |
#2572 | Policy non-claim, unchanged | Accessibility is a release gate for missing-DOM modes, not an architecture-doc issue fix. |
#5131, #2051 | Guardrail rows, unchanged | Future layout snapshot consumers must prove narrow invalidation and avoid broad editor subscriptions. |
Claim result:
0.0.Source plan:
docs/plans/2026-05-25-slate-v2-pretext-pagination-virtualization-feedback.mdDecision:
Pretext remains the default layout engine target, but the plan explicitly refuses
to claim cross-client/server page-break determinism while prepare() still
depends on canvas measurement. Final planning wording keeps measurementProfile
as snapshot metadata, groups page display settings under pageView, cuts public
pageVirtualization, virtualizes pages/spreads internally behind virtualized
domStrategy, keeps pageBreaks opt-in for strict collaboration/export
fidelity, and routes table/media/BFC pagination through generic provider/split
protocols. Default editing stays locally derived layout.
Issue accounting:
| Issue | Classification | Reason |
|---|---|---|
#5944 | Related, issue-reviewed | Stable per-line pagination is the direct issue, but needs current browser proof for page-boundary flicker, caret mapping, and page-break stability before any claim. |
#790 | Related, proof-route backlog | Internal page/spread virtualization directly targets dynamic rendering pressure, but needs mount/edit/scroll benchmark, mounted-count proof, DOM coverage, and browser native-behavior proof before any claim. |
#5924 | Not claimed, unchanged | Page frames, table structure, and debug DOM should route through DOM coverage, mount policy, and provider/split protocols; this plan does not add a public ignore-cursor API. |
#4141 | Existing Improves unchanged | Layout/page subscriptions must preserve nested rerender-breadth proof and avoid widening affected ranges. |
#5131, #2051 | Guardrail rows, unchanged | Layout snapshot consumers and page virtualization must prove narrow subscriptions and rerender breadth. |
#2793 | Release guard, unchanged | Missing-DOM/page-virtualized modes cannot claim native screen-reader equivalence without assistive-tech proof or explicit degradation docs. |
#2572 | Policy non-claim, unchanged | Accessibility remains a release guard, not a planning-doc issue fix. |
#3892 | Policy non-claim, unchanged | Generic layout substrate helps custom surfaces, but product custom layout engines stay outside raw Slate closure. |
#5945, #4056, #5992 | Existing Improves unchanged | Large-document operation/clipboard benchmark claims remain owned by their existing proof rows; this pagination plan does not promote them. |
Claim result:
0.0.