docs/plans/2026-05-23-slate-v2-table-selection-arrow-navigation-ralplan.md
Do not rewrite the Slate runtime for this lane.
The current architecture is the right shape:
slate-dom owns DOM-to-Slate point import, mounted text bounds, and fail-closed
DOM coverage policy.slate-react owns browser event import, selection reconciliation, focus, and
native-selection repair.The next Ralph pass should harden exact table boundary proof and clean the table example DX, not create a broad table engine.
Score: 0.88.
Confidence: high for the boundary decision, medium for #4658 exact closure until Ralph proves the repro in-browser.
Turn the table selection/arrow-navigation family into a precise execution lane: prove the exact browser behavior we can honestly claim, keep non-claims honest, and prevent future table regressions without smuggling product-table behavior into raw Slate.
/examples/tables browser proof..tmp/slate-v2.colgroup, col,
rowspan, Web Components, or unregistered structural DOM.Fixes #4658, Fixes #5355, or Fixes #2558 without exact matching
browser proof.docs/slate-issues/gitcrawl-live-open-ledger.md: #6034, #5355, #4658 are
live open singleton rows.docs/slate-issues/gitcrawl-v2-sync-ledger.md: #6034 is fixes-claimed;
#4658 is cluster-synced; #5355 is issue-reviewed; #2558 is
cluster-synced.docs/slate-v2/ledgers/issue-coverage-matrix.md: #6034 is a current fixed
issue claim; #4658 and #2558 are related/not-claimed table pressure; #5355 is
not claimed.docs/slate-v2/ledgers/fork-issue-dossier.md: #6034 has exact ArrowDown
proof; #4658 is table boundary / invalid DOM import policy; #5355 depends on
missing editable descendants in colgroup / col; #2558 needs a real table
selection model..tmp/slate-v2/site/examples/ts/tables.tsx: current example has local
table() extension transforms that keep Backspace/Delete/Enter inside cell
boundaries..tmp/slate-v2/playwright/integration/examples/tables.test.ts: current proof
covers Backspace/Delete/Enter containment, #6034 ArrowDown table-last-node,
triple-click cell selection, drag from table toward trailing text, and
horizontal cell boundary navigation with render-budget checks..tmp/slate-v2/playwright/stress/generated-editing.test.ts: stress case
covers table-cell-boundary-navigation.Selection.addRange.| Issue | Current classification | Plan decision |
|---|---|---|
| #6034 | Fixes | Keep as fixed. Do not broaden. Existing exact proof: remove trailing paragraph, make table last node, ArrowDown at final cell, type, text stays in final cell. |
| #4658 | Related / cluster-synced | Target for Ralph repro. Promote only if exact custom-table/outside-table typing repro is proven fixed with browser and DOM selection evidence. Otherwise keep related. |
| #5355 | Not claimed / issue-reviewed | Keep not claimed unless Ralph creates a registered Slate-owned DOM coverage boundary fixture for colgroup / col and proves arrowing into/out of it does not crash. Raw app omissions stay unsupported. |
| #2558 | Not claimed | Keep not claimed. Multi-cell table selection needs an explicit table selection model and is not part of raw Slate DOM bridge closure. |
| #5551 | Not claimed | Keep not claimed. Firefox rowspan / native table range behavior belongs to the future table-selection-model lane. |
slate-dom.slate-react.table() extension transforms for table-cell authoring policy..tmp/slate-v2 table source/tests first:
site/examples/ts/tables.tsxplaywright/integration/examples/tables.test.tsplaywright/stress/generated-editing.test.tspackages/slate/src/editor/positions.tspackages/slate-dom/test/bridge.tscd .tmp/slate-v2 && PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/tables.test.ts --project=chromium --workers=1colgroup / col; otherwise document not-claimed and skip source churn.addRange is not valid proof.docs/slate-issues/gitcrawl-v2-sync-ledger.mddocs/slate-v2/ledgers/fork-issue-dossier.mddocs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/references/pr-description.mddocs/slate-issues/gitcrawl-recluster-map.mdMinimum same-slice proof for Ralph:
PLAYWRIGHT_RETRIES=0 bunx playwright test playwright/integration/examples/tables.test.ts --project=chromium --workers=1bunx playwright test playwright/stress/generated-editing.test.ts --project=chromium --grep "table-cell-boundary-navigation"bun test packages/slate/test packages/slate-dom/test.tmp/slate-v2:
bun lint:fixbun typecheck:rootA table issue can be promoted only when all are true:
Anything less stays related or not claimed.
| Pass | Status | Notes |
|---|---|---|
| Skill boundary | complete | Planning-only. No .tmp/slate-v2 implementation edits from this pass. |
| Cache-first issue accounting | complete | Read live ledger, sync ledger, coverage matrix, fork dossier, recluster map, PR reference. |
| Prior solution review | complete | Table helper, keydown ownership, Firefox multi-range, and position-boundary notes applied. |
| Current source/test inspection | complete | Read table example, focused tests, stress row, DOM bridge evidence. |
| Architecture verdict | complete | Keep architecture; harden exact table proof; no raw table selection model. |
| Ralph handoff | complete | Execution plan and proof commands listed above. |
| Ralph execution | complete | Updated the table example copy to match the actual contract and made the ArrowDown test derive the trailing paragraph length from the rendered example. |
| Focused table proof | complete | Fresh static server on http://localhost:3111: Chromium table suite 10 passed; stress table-cell-boundary-navigation 1 passed. |
| Final gates | complete | bun build:next, bun lint:fix, and bun typecheck:root passed in .tmp/slate-v2. |
| Lane status | complete | #6034 stays fixed; #4658 stays related; #5355 and #2558 stay not claimed. No ledger claim changes were made. |
Ralph closed this lane without broad architecture changes.
The exact current evidence keeps #4658 related/not-claimed because the upstream
custom-table outside-table repro is stronger than the generic table boundary
proof. #5355 remains not claimed because raw app-rendered colgroup / col
nodes with omitted editable descendants are still outside the supported DOM
coverage boundary. #2558 remains not claimed because multi-cell table selection
needs an explicit table-selection model.