docs/plans/2026-05-04-slate-v2-full-issue-ledger-architecture-ralplan.md
The earlier sync was too narrow. It proved a few exact v2 claims, but it did not do the thing the issue corpus demands: every issue needs an explicit outcome. This pass makes that accounting concrete.
The hard take: do not fix 682 issues one by one. That is maintenance theater. Fix the architecture classes that recur, explicitly reject invalid/stale/product/docs noise, and require exact repro proof before any issue gets a Fixes #... line.
docs/slate-issues/open-issues-ledger.md, this plan, the generated 682-row issue matrix, macro theme sync, raw cluster sync, and PR reference accounting.docs/slate-issues/open-issues-ledger.mddocs/plans/2026-05-04-slate-v2-full-issue-ledger-architecture-ralplan-issue-matrix.mddocs/slate-issues/issue-clusters.mddocs/slate-issues/package-impact-matrix.mddocs/slate-issues/requirements-from-issues.mddocs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/references/pr-description.mdThe frozen ledger has 682 issue rows and 378 raw primary clusters. The macro corpus count remains 682 from the 2026-04-02 snapshot.
Official macro counts from issue-clusters.md:
| Macro theme | Issues | Decision |
|---|---|---|
| Mobile, IME, And Input Semantics | 129 | v2 shared input/composition runtime |
| Performance And Scalability | 13 | benchmark-gated cross-cut; high leverage despite low count |
| React Runtime, Identity, And Subscription Model | 111 | snapshot-driven selector/projection runtime |
| Selection, Focus, And DOM Bridge | 172 | dedicated DOM selection/focus bridge |
| Clipboard, Serialization, And External Formats | 37 | explicit clipboard/import-export boundary |
| Core Model, Operations, Normalization, And History | 69 | transaction-first core engine |
| API, Typing, And Extensibility | 33 | tighter unopinionated public API |
| Docs, Examples, Support Noise, And Repo Churn | 118 | not v2 architecture |
| Decorations, Marks, And Annotations | 19 explicit plus adjacent fallout | projection/annotation/mark lane, not legacy decorate lock-in |
Package pressure from package-impact-matrix.md:
| Ownership lane | Issues | Decision |
|---|---|---|
| runtime boundary | 407 | primary v2 owner |
| core engine | 113 | engine rewrite owner |
| maintainer noise | 162 | keep out of package architecture |
These buckets are execution-owner buckets, not a replacement for the official macro taxonomy. They intentionally route rows by the best v2 owner: input, DOM, React runtime, core engine, clipboard, API/DX, performance, or non-claim triage.
| Action bucket | Rows | Owner |
|---|---|---|
v2-input-runtime | 147 | slate-react-v2 + slate-dom-v2 input runtime |
v2-core-engine | 104 | slate-v2 core engine |
skip-invalid | 76 | maintainer triage |
v2-dom-selection | 65 | slate-dom-v2 + slate-react-v2 selection runtime |
skip-stale | 60 | current-repro triage |
needs-repro | 45 | repro-first triage |
skip-maintainer-noise | 45 | docs/examples/repo lane |
already-accounted | 30 | existing proof ledger |
v2-clipboard-serialization | 28 | slate-dom-v2 + slate-v2 clipboard boundary |
v2-react-runtime | 28 | slate-react-v2 runtime |
docs-examples | 18 | docs/examples lane |
skip-duplicate | 16 | maintainer triage |
v2-performance-benchmark | 12 | benchmark/performance lane |
ecosystem-boundary | 7 | ecosystem boundary |
v2-api-dx | 1 | slate-v2 public API/DX |
| Status | Rows |
|---|---|
cluster-synced | 387 |
triage-closed | 152 |
issue-reviewed | 64 |
not-claimed | 58 |
improves-claimed | 18 |
fixes-claimed | 3 |
No row remains not-started. That does not mean every issue is fixed. It means every row has a deliberate v2 outcome.
issue-coverage-matrix.md.cluster-synced for architecture absorption. Use Fixes #... only after exact repro proof.v2-input-runtimeSample rows: #6022, #5989, #5984, #5983, #5931, #5891, #5883, #5836
Keep. This is the top macro priority. Resolve through first-class composition lifecycle, beforeinput policy, Android/iOS proof, keyboard-layout handling, placeholder/empty-state rules, and no DOM/model desync during suppressed input.
v2-dom-selectionSample rows: #6034, #5874, #5867, #5847, #5749, #5632, #5628, #5559
Keep. DOM point/path, focus, voids, inlines, zero-width, table selection, nested editors, shadow DOM, drag/drop, and contenteditable boundaries belong in slate-dom-v2 plus React lifecycle integration. The current live proof owner includes .tmp/slate-v2/packages/slate-dom/test/bridge.ts and .tmp/slate-v2/packages/slate-dom/test/dom-coverage.ts.
v2-react-runtimeSample rows: #5826, #5806, #5690, #5689, #5669, #5603, #5473, #5404
Keep. React runtime issues are not solved by making core React-shaped. They need committed snapshots, stable editor identity, selector-first subscriptions, provider replacement correctness, and sidecar projection/annotation/widget stores. Live source already exposes these lanes in .tmp/slate-v2/packages/slate-react/src/index.ts and tests them in provider-hooks-contract.tsx, annotation-store-contract.tsx, and projection tests.
v2-core-engineSample rows: #5977, #5811, #5771, #5733, #5691, #5629, #5599, #5587
Keep. Core model pressure justifies transactions, stable runtime identity, op-first external semantics, normalization debt, commit metadata, and history grouping. It does not justify throwing away Slate's JSON model. Live proof owners include .tmp/slate-v2/packages/slate/test/operations-contract.ts and .tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts.
v2-clipboard-serializationSample rows: #5630, #5616, #5429, #5328, #5233, #5151, #3857, #3801
Keep. Clipboard and serialization need explicit boundaries: schema-safe fragment formats, model-backed copy when DOM coverage is incomplete, stale-DOM prevention, and HTML import/export ownership. Do not absorb every third-party document serializer into raw Slate.
v2-api-dxSample rows: #3802
Keep selectively. DX matters, but compatibility clutter is the trap. Favor editor.read, editor.update, extension methods, public-surface contracts, and JSDoc clarity over resurrecting legacy Editor.* teaching or arbitrary helper growth.
v2-performance-benchmarkSample rows: #5992, #5216, #3752, #3751, #3748, #4210, #4202, #4056
Keep with hard gates. The GitHub diff-line lesson applies: make repeated units cheap first, isolate rare state, use event delegation, ban effects in hot repeated units, index lookups, and add explicit cohort/perf/native-behavior proof. Virtualization stays experimental and policy-gated.
needs-reproSample rows: #5994, #5974, #5972, #5944, #5918, #5839, #5813, #5798
Do not architect around these yet. They stay reviewed but not claimed until a current minimal repro exists. Repro-first is not bureaucracy here; it prevents designing for ghosts.
skip-invalid, skip-duplicate, skip-staleInvalid sample: #6016, #5958, #5912, #5895, #5838, #5824, #5820, #5748
Duplicate sample: #6007, #5698, #3723, #3710, #3705, #3466, #3433, #3369
Stale sample: #5961, #5956, #5928, #5924, #5894, #5844, #5833, #5617
Do not do these as v2 architecture. Close/merge/repro-refresh them. A rewrite should not become a landfill for invalid reports, known duplicates, or old environment rot.
skip-maintainer-noise, docs-examples, ecosystem-boundaryMaintainer-noise sample: #5786, #5757, #5612, #5520, #5507, #5436, #5403, #5400
Docs/examples sample: #5750, #5000, #4825, #4773, #4575, #4573, #4570, #4532
Ecosystem sample: #5588, #5253, #5067, #5037, #4792, #4302, #4083
Keep these outside core architecture. Docs/examples can and should improve, but they are not proof that raw Slate needs product-shaped APIs. Ecosystem requests need substrate primitives, not baked-in product policy.
Principles:
Chosen option: full-row classification plus macro/cluster sync.
Rejected options:
Consequence: v2 execution should work by bucket gates, not issue-number theater. Exact Fixes #... rows come only after dedicated repro tests land.
The PR auto-close count remains 3:
The current issue-coverage matrix remains the exact implementation claim ledger. This plan adds full corpus classification, not new exact closure proof.
Fixes rows rare and proof-backed.docs/plans/2026-05-04-slate-v2-full-issue-ledger-architecture-ralplan-issue-matrix.md, add exact tests only for rows with current repros, and update issue-coverage-matrix.md only when proof lands.| Pass | Status | Owner | Evidence | Next |
|---|---|---|---|---|
input-runtime-proof-tracer | complete for first vertical slice; wider bucket remains pending | .tmp/slate-v2/packages/slate-react input runtime | Added focused contract for active IME composition keydown staying browser/composition-owned; bun --filter slate-react test:vitest -- editing-kernel-contract; bun --filter slate-react typecheck; focused Biome check/fix. | Continue with dom-selection-bridge-proof; keep exact issue claims unchanged until current repro proof maps to a specific issue. |
dom-selection-bridge-proof | complete for first vertical slice; wider bucket remains pending | .tmp/slate-v2/packages/slate-dom selection runtime | Added focused contract for editor-owned unmapped event targets resolving through browser caret ranges; bun test slate-dom/test/bridge.test.ts from .tmp/slate-v2/packages; bun --filter slate-dom typecheck; focused Biome check/fix. | Continue with the v2-input-runtime bucket plan because it is the largest unresolved ClawSweeper bucket and the pending target already names it. |
v2-input-runtime-bucket-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate-react input runtime | docs/plans/2026-05-04-slate-v2-clawsweeper-v2-input-runtime-ralplan.md; .tmp/completion-checks/slate-v2-clawsweeper-v2-input-runtime-ralplan.md; final score 0.92; no new fixed issue claims. | Continue with v2-input-runtime-execution. |
v2-input-runtime-execution | complete for available local proof lane | .tmp/slate-v2/packages/slate-react input runtime | .tmp/completion-checks/slate-v2-clawsweeper-v2-input-runtime-execution.md records focused unit/browser proof, Slate Browser proof, PR reference sync, and raw mobile non-claim boundary. | Continue with v2-react-runtime-bucket-ralplan. |
v2-react-runtime-bucket-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate-react runtime | docs/plans/2026-05-04-slate-v2-clawsweeper-v2-react-runtime-ralplan.md selects the next cluster, completes current-state read, ClawSweeper related issue discovery, issue-ledger routing, live source refresh, performance/DX/migration proof gates, objection/high-risk pass, issue-sync accounting, and closure at score 0.92; #5509/#3309 moved to v2-react-runtime; no new fixed issue claims. | Continue with ralph execution: provider/hook identity and selector fanout. |
v2-react-runtime-execution | complete for available local proof lane | .tmp/slate-v2/packages/slate-react runtime | .tmp/completion-checks/slate-v2-clawsweeper-v2-react-runtime-execution.md records exported EditorSelectorOptions<TEditor>, generic selector typecheck coverage, focused provider/surface tests, sidecar contract tests, PR reference sync, and unchanged fixed issue claims. | Continue with v2-clipboard-serialization-bucket-ralplan. |
v2-clipboard-serialization-bucket-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate-dom clipboard runtime | docs/plans/2026-05-04-slate-v2-clawsweeper-v2-clipboard-serialization-ralplan.md selects the next cluster, reviews representative gitcrawl rows #5328/#4857/#5233/#3486/#4542/#5151/#4802/#4806, refreshes live source owners, syncs PR and fork ledgers, and closes at score 0.91; no new fixed issue claims. | Continue with ralph execution: fail-closed internal fragment import. |
v2-clipboard-serialization-execution | complete for Slice 1 | .tmp/slate-v2/packages/slate-dom clipboard runtime | .tmp/completion-checks/slate-v2-clawsweeper-v2-clipboard-serialization-execution.md records fail-closed internal fragment import tests and implementation; #5328/#4857 moved to Improves; fixed issue claims unchanged. | Continue with Slice 2: fragment insertion shape and selection placement. |
v2-clipboard-fragment-insertion-shape-execution | complete for Slice 2 | .tmp/slate-v2/packages/slate fragment insertion | .tmp/completion-checks/slate-v2-clawsweeper-v2-clipboard-fragment-insertion-shape-execution.md records focused core and DOM clipboard proof for rich fragment target-block preservation; #5151 moved to Improves; fixed issue claims unchanged. | Continue with Slice 3: inline void copy/cut/paste. |
v2-clipboard-inline-void-execution | complete for Slice 3 | .tmp/slate-v2/packages/slate-dom clipboard runtime | .tmp/completion-checks/slate-v2-clawsweeper-v2-clipboard-inline-void-execution.md records selected inline void copy/paste/cut package proof and the safe non-spacer fragment attach fix; #4802/#4806 moved to Improves; fixed issue claims unchanged. | Continue with Slice 4: structural cut/delete. |
v2-clipboard-structural-cut-delete-execution | complete for Slice 4 | .tmp/slate-v2/packages/slate-react; .tmp/slate-v2/packages/slate | .tmp/completion-checks/slate-v2-clawsweeper-v2-clipboard-structural-cut-delete-execution.md records selected block-void cut proof, list delete model proof, #3857/#3801/#3469 moved to Improves, and unchanged fixed claims. | Continue with Slice 5: API and extension surface. |
v2-clipboard-api-extension-surface-execution | complete for Slice 5 | .tmp/slate-v2/packages/slate-dom; .tmp/slate-v2/packages/slate-react; .tmp/slate-v2/site/examples | .tmp/completion-checks/slate-v2-clawsweeper-v2-clipboard-api-extension-surface-execution.md records options-object withDOM/withReact, keyed embedded fragments, public insertData handler typing, docs/examples, #5233/#3486/#4569 fixed, and #1024/#4613 improved. | Continue with Slice 6: large payload performance. |
v2-clipboard-large-payload-performance-execution | complete for bounded Slice 6 | .tmp/slate-v2/scripts/benchmarks; .tmp/slate-v2/packages/slate-dom | .tmp/completion-checks/slate-v2-clawsweeper-v2-clipboard-large-payload-performance-execution.md records bounded large-payload benchmark artifacts and a rejected slower optimization candidate; #4056/#5945/#5992 remain not fixed from that slice. | Continue with the separate #5992 range-delete / replace_children plan. |
range-delete-replace-children-ralplan | complete | .tmp/slate-v2/packages/slate; .tmp/slate-v2/playwright/stress | .tmp/completion-checks/slate-v2-range-delete-replace-children-ralplan.md records replace_children apply/inverse/ref/history/collab proof, benchmark proof, and browser stress; #2288 and #5992 are Improves, not auto-close fixes. | Continue with DOM selection boundary proof. |
dom-selection-boundary-proof | complete | .tmp/slate-v2/packages/slate-dom; .tmp/slate-v2/packages/slate-react; browser examples | .tmp/completion-checks/slate-v2-dom-selection-boundary-proof-ralplan.md records exact fixed claims for #6034/#3871/#5847/#3991/#4301/#4074/#3148/#3429/#4789/#4984 and explicit non-claims for #5355/#4618. | Continue with v2-core-engine-history-selection-undo-ralplan. |
v2-core-engine-history-selection-undo-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate; .tmp/slate-v2/packages/slate-history | docs/plans/2026-05-06-slate-v2-core-history-selection-undo-ralplan.md selects clusters 6 and 27 plus #4559 as the next issue-backed core lane, completes ClawSweeper related rows for #3534/#3551/#3705/#3756/#3921/#4559 plus #1770/#2288/#3741/#3752, syncs the fork dossier/matrix/PR count, and closes at score 0.93; exact issue claims unchanged. | Continue with ralph execution: red issue-shaped history tests. |
v2-core-engine-history-selection-undo-execution | complete for first proof slice | .tmp/slate-v2/packages/slate-history | .tmp/completion-checks/slate-v2-core-history-selection-undo-execution.md records package proofs for #3534/#3551/#4559, improved partial set_selection proof for #3705/#3921, focused verification, and PR/coverage/dossier sync. | Continue with the next slate-ralplan bucket selection. |
v2-core-engine-structural-delete-normalization-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate | docs/plans/2026-05-07-slate-v2-core-structural-delete-normalization-ralplan.md selects structural delete, merge/split barriers, and normalization fixpoint proof as the next core lane; routes #4121/#2500/#3965/#5811/#3950/#1654 as targets, keeps #5972 repro-first, excludes #5977/#3964/#3973 from this lane, and syncs coverage/PR/dossier accounting. | Continue with ralph execution: red issue-shaped delete and normalization tests. |
v2-core-engine-structural-delete-normalization-execution | complete for focused package proof slice | .tmp/slate-v2/packages/slate | .tmp/completion-checks/slate-v2-core-structural-delete-normalization-execution.md records fixed claims for #4121/#2500/#3965/#3950, improved claims for #5811/#1654, the isIsolating Backspace/merge fix, focused package tests, typecheck, lint, and PR/coverage/dossier sync. | Continue with slate-ralplan next-bucket selection or a follow-up split-specific #1654 plan if needed. |
inline-delete-boundary-repro-ralplan | Slate Ralplan done | .tmp/slate-v2/playwright/integration/examples/inlines.test.ts; owner classified by red proof | docs/plans/2026-05-07-slate-v2-inline-delete-boundary-repro-ralplan.md selects #5972 as the next browser-first lane, runs gitcrawl/ClawSweeper discovery, rejects public API expansion, maps Lexical/ProseMirror/Tiptap delete-boundary strategy, and keeps the issue Related until exact inlines proof lands. | Continue with ralph execution: add the red empty editable inline Backspace browser row, classify owner, then patch the narrow path. |
inline-delete-boundary-repro-execution | complete | .tmp/slate-v2/packages/slate; browser inlines example | .tmp/completion-checks/slate-v2-inline-delete-boundary-repro-ralplan.md records the core delete target fix and cross-browser inlines proof for #5972; fixed issue claims and PR reference are synced. | Continue with v2-operation-extensibility-validation-ralplan. |
v2-operation-extensibility-validation-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate operation API/runtime | docs/plans/2026-05-07-slate-v2-operation-extensibility-validation-ralplan.md selects #5977 as the next active target, routes #5558 as related operation type-guard DX pressure, rejects arbitrary custom operation acceptance, and keeps exact fixed claims unchanged until issue-shaped proof lands. | Continue with ralph execution: prove #5977 editor detection first, then add the smallest API/runtime fix. |
v2-operation-extensibility-validation-execution | complete | .tmp/slate-v2/packages/slate; .tmp/slate-v2/packages/slate-dom | .tmp/completion-checks/slate-v2-operation-extensibility-validation-execution.md records fixed proof for #5977, improved proof for #5558, strict built-in Operation.isOperation, concrete operation subtype guards, and fail-closed unknown replay. | Continue with the next slate-ralplan bucket selection. |
v2-core-caret-movement-word-insert-break-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate caret movement and split selection | docs/plans/2026-05-07-slate-v2-core-caret-movement-word-insert-break-ralplan.md selects #3964/#3973 as the next active targets, routes #3499/#4357/#4195/#3841/#5629/#4648 as related/non-claim rows, rejects public normalizePoint and punctuation policy expansion for this lane, and keeps exact fixed claims unchanged until issue-shaped proof lands. | Continue with ralph execution: red package tests for marked insertBreak selection and multi-leaf word movement. |
v2-core-caret-movement-word-insert-break-execution | complete | .tmp/slate-v2/packages/slate caret movement and split selection | .tmp/completion-checks/slate-v2-core-caret-movement-word-insert-break-execution.md records package regression proof for #3964/#3973/#4357, keeps #3499/#4195/#3841/#5629/#4648 related or not claimed, and syncs PR/coverage/dossier accounting. | Continue with the next slate-ralplan bucket selection. |
v2-insert-fragment-at-location-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate fragment insertion | docs/plans/2026-05-07-slate-v2-insert-fragment-at-location-ralplan.md selects #5412/#5429 as the next active core transform targets, keeps #5089/#4542/#5151/#3557/#3155 related or improved, and rejects #5080/#3891/#5129 as separate owners. | Continue with ralph execution: red package tests for explicit insertFragment({ at }) and empty-node caret placement. |
v2-insert-fragment-at-location-execution | complete | .tmp/slate-v2/packages/slate fragment insertion | .tmp/completion-checks/slate-v2-insert-fragment-at-location-execution.md records exact package proof for #5412/#5429, verifies focused insertFragment tests, typecheck, lint, and syncs PR/coverage/dossier accounting. | Continue with the next slate-ralplan bucket selection. |
v2-multiblock-fragment-middle-insert-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate; .tmp/slate-v2/packages/slate-dom fragment insertion | docs/plans/2026-05-07-slate-v2-multiblock-fragment-middle-insert-ralplan.md selects #5089 as the exact middle-paragraph multi-block fragment insertion target, keeps #4542/#3155 related, and requires package plus DOM clipboard boundary proof before any fixed claim. | Continue with ralph execution: exact package and DOM clipboard tests. |
v2-multiblock-fragment-middle-insert-execution | complete | .tmp/slate-v2/packages/slate; .tmp/slate-v2/packages/slate-dom fragment insertion | .tmp/completion-checks/slate-v2-multiblock-fragment-middle-insert-execution.md records package and DOM clipboard proof for #5089, no source patch, focused tests, typecheck, lint, and PR/coverage/dossier sync. | Continue with the next slate-ralplan bucket selection. |
v2-editor-nodes-reverse-order-ralplan | Slate Ralplan done | .tmp/slate-v2/packages/slate query traversal | docs/plans/2026-05-07-slate-v2-editor-nodes-reverse-order-ralplan.md selects #5080 as the next package-only query traversal target, confirms the live state.nodes.match({ reverse: true }) mismatch, completes related issue discovery for #5684/#5028/#3885, syncs the fork dossier/matrix/PR reference, narrows the first implementation owner to editor/nodes.ts, chooses forward traversal plus reverse emitted matched entries as the patch strategy, completes performance/TDD pressure, accepts the objection/high-risk pass, and closes at score 0.92. | Continue with ralph execution: red public query-contract test, then editor/nodes.ts patch. |
Verdict: ready for RALPH execution planning. Not ready to claim more fixed issues.