Back to Plate

True Slate RC Proof Ledger

docs/slate-v2-draft/true-slate-rc-proof-ledger.md

53.0.6141.0 KB
Original Source

True Slate RC Proof Ledger

Purpose

Proof ledger for the work that sits beyond the completed POC RC and must be closed before a True Slate RC claim is honest.

Required Fields

Every row must name:

  • recovery lane
  • command/test surface
  • expected outcome
  • actual outcome
  • artifact links
  • owning doc
  • execution owner
  • status

Browser / Agent Artifact Rule

Browser and future agent-native rows must emit:

  • selection dump
  • DOM dump
  • screenshot
  • action transcript
  • action
  • expected outcome
  • actual outcome
  • artifact links

Browser / Input Review Scope

Scoped diff seed:

sh
git -C /Users/zbeyens/git/slate-v2 diff --name-status --diff-filter=ACDMRTUXB origin/main...HEAD -- \
  packages/slate-react \
  packages/slate-dom \
  packages/slate-browser \
  playwright/integration/examples \
  site/examples/ts

Current read:

  • EMPTY
  • there are no hidden unreviewed browser/input files left in the current scoped diff
  • browser/input proof now comes from the live proof rows below plus the legacy behavior-bearing files they were audited against

High-risk legacy files already reviewed:

  • packages/slate-react/src/components/editable.tsx
  • packages/slate-react/src/components/string.tsx
  • packages/slate-react/src/hooks/android-input-manager/android-input-manager.ts
  • packages/slate-react/src/hooks/android-input-manager/use-android-input-manager.ts
  • packages/slate-react/src/components/restore-dom/restore-dom.tsx
  • packages/slate-react/src/components/restore-dom/restore-dom-manager.ts
  • packages/slate-react/test/react-editor.spec.tsx

Browser / Input Current Read

  • Chromium IME/browser proof is real and worth keeping
  • local Firefox/browser parity is exhausted
  • local Android structural/browser parity is exhausted
  • the remaining unresolved slice is post-RC follow-up, not a current RC gate:
    • external Android keyboard-feature behavior:
      • autocorrect
      • glide typing
      • voice input
    • broader iOS Safari / WebKit composition/focus
  • row-specific manual capture scaffolds already exist under:

Example Parity Current Read

  • exact deleted-example ledgers are useful, but they are not enough
  • same-path current example files and same-path browser tests do not close the example lane by themselves
  • maximum parity with legacy for all examples is now a first-class blocker for the broader blanket replacement claim
  • legacy examples may be added or extended when the rewrite unlocked a fairer comparison, but those rows must be labeled explicitly as extended

Reopened Example Parity Rows

LaneSurfaceExpected outcomeActual outcomeArtifact linksOwning docExecution ownerStatus
example paritylegacy/current example matrix across site/examples/**, playwright/integration/examples/**, and replacement-compatibility rowsevery legacy example that still matters to the blanket replacement claim is classified as mirrored, recovered, extended, mixed, explicit cut, or open; same-path current files are not enough; legacy examples may be extended when the rewrite unlocked a fairer comparisoncurrent ledgers prove deleted-file accounting and many current browser/example rows, but they still do not prove maximum parity with legacy for all examples, and they do not yet classify allowed legacy example extensions as first-class truthlegacy-playwright-example-tests.md, release-file-review-ledger.md, 2026-04-13-slate-v2-full-no-regression-story-plan.md, 2026-04-15-slate-v2-example-parity-recovery-plan.md2026-04-15-slate-v2-example-parity-recovery-plan.mdsite/examples + playwright/integration/examples + legacy example surfacesopen

Exact legacy compat behaviors still unproved:

  • Android:
    • non-cancelable beforeinput / keyboard-feature behavior beyond ordinary typing and structural rows
    • IME-driven selection re-application and spellchecker/candidate behavior
  • Safari / WebKit:
    • broader contenteditable typing on placeholder-like rows
    • broader composition/focus behavior across the relied-on iOS/Safari weird input cases
  • Firefox:
    • local browser/input weirdness is closed; remaining blocker is not another Firefox hole

Post-RC Browser / Input Follow-up Rows

These rows are secondary proof.

They do not close source drift or contract-width regressions in shared files like packages/slate-react/src/components/editable.tsx by themselves. Per repair-drift.mdc, shared surface parity stays open until same-path recovery is honest or the remaining delta is explicitly justified as engine-rewrite drift.

LaneSurfaceExpected outcomeActual outcomeArtifact linksOwning docExecution ownerStatus
browser/input parityplaceholder IMEempty placeholder composition matches legacy relied-on behavior strongly enough to support the RC claimChromium direct proof is green on both FEFF and no-FEFF placeholder paths, including delayed plain typing; Firefox now has a stronger direct composition lane via Playwright keyboard.insertText; desktop WebKit has an explicit direct-input ceiling probe showing that insertText commits cleanly but does not expose composition-specific input events; Android direct placeholder/no-FEFF typing proof is green; direct Appium iOS setup can load the real routes and editor, but current iOS Safari typing through XCUITest value is still red; the current agent-browser iOS provider also remains shell-only on these routesplaceholder-ime.test.ts, firefox-direct-ime.test.ts, webkit-direct-ime-ceiling.test.ts, ime-proxy.test.ts, 2026-04-12-appium-ios-safari-loads-local-slate-routes-but-xcuitest-value-does-not-drive-contenteditable.md, package.json, 2026-04-03-jsdom-contenteditable-composition-is-not-a-trustworthy-ime-proof.mdtrue-slate-rc-proof-ledger.mdplaywright + site/examples + browser-mobile transportsopen
browser/input parityinline-edge IMEinline-edge composition lands on the intended text leaf with legacy-equivalent behavior across the required browser matrixChromium direct proof is green after semantic selection setup, Firefox now has a stronger direct composition lane via Playwright keyboard.insertText, desktop WebKit has an explicit direct-input ceiling probe showing that insertText commits cleanly but stays below composition-specific proof, and the packaged iOS Simulator/Appium inline-edge lanes are direct-green once the runner collapses DOM selection onto the leading zero-width text leaf before typinginline-edge-ime.test.ts, firefox-direct-ime.test.ts, webkit-direct-ime-ceiling.test.ts, ime-proxy.test.ts, package.json, 2026-04-04-inline-edge-ime-proofs-should-set-selection-semantically-before-composition.mdtrue-slate-rc-proof-ledger.mdplaywright + site/examples + browser-mobile transportsopen
browser/input parityvoid-edge IMEvoid-like IME behavior matches legacy spacer semantics across the required browser matrixChromium direct proof is green on the real spacer structure, Firefox now has a stronger direct composition lane via Playwright keyboard.insertText, desktop WebKit keeps an explicit direct-input ceiling probe instead of fake direct composition proof, and the packaged iOS Simulator/Appium void-edge lanes are direct-green with the same zero-width selection-collapse primitive used before typingvoid-edge-ime.test.ts, firefox-direct-ime.test.ts, webkit-direct-ime-ceiling.test.ts, ime-proxy.test.ts, package.json, 2026-04-04-void-like-zero-width-ime-proofs-need-the-real-void-spacer-structure.mdtrue-slate-rc-proof-ledger.mdplaywright + site/examples + browser-mobile transportsopen
browser/input parityfocus restore and transient DOM-point gapsfocus recovery and transient bridge gaps fail closed at least as safely as the legacy stack on the required browser matrixmounted-bridge focus rows are green in runtime/headless proof, the browser blur/focus reset row is green on Chromium, Firefox, and desktop WebKit, main IME rows are green without restore-dom, and structural Enter/Backspace churn is green on Chromium and Android through editor-owned keydown paths; the deleted restore-dom family is now treated as a rerender-era guard rather than a standalone current blockersurface-contract.tsx, rich-inline.test.ts, 2026-04-09-slate-react-focus-restore-must-fail-closed-on-transient-dom-point-gaps.md, 2026-04-12-restore-dom-was-a-rerender-era-guard-not-a-current-v2-runtime-need.md, 2026-04-12-structured-enter-and-backspace-need-editor-owned-keydown-paths.md, package.jsontrue-slate-rc-proof-ledger.mdpackages/slate-react + packages/slate-domopen
browser/input parityzero-width selection normalizationzero-width DOM/Slate selection round-trip stays correct across the required browser matrixcurrent bridge proof is green, and the zero-width matrix row is now green on Chromium, Firefox, and desktop WebKit; real iOS Safari remains unprovedzero-width-matrix.test.ts, 2026-04-03-zero-width-dom-selection-bridges-must-normalize-both-directions.md, 2026-04-04-slate-browser-playwright-helpers-must-normalize-zero-width-selection-and-wait-for-selection-sync.md, package.jsontrue-slate-rc-proof-ledger.mdpackages/slate-dom + slate-browseropen
browser/input paritypost-composition undo / redoundo and redo immediately after composition are directly proved on the required IME rowsdedicated IME history proof now exists on the FEFF placeholder path, no-FEFF placeholder path, inline-edge path, and void-edge path in Chromium; broader platform/browser IME parity is still blocked elsewhereplaceholder-ime.test.ts, inline-edge-ime.test.ts, void-edge-ime.test.ts, package.jsontrue-slate-rc-proof-ledger.mdpackages/slate-history + playwrightopen
browser/input parityAndroid composition / diff / flushAndroid-specific composition/diff/flush behavior has direct parity proof or explicit justified omissionthe Android hub exists, the mobile Playwright proxy lane is green, and Appium now has direct green packaged rows for placeholder, inline-edge, void-edge, split/join, empty/delete-rebuild, remove-range, and structural special subcases on Android Chrome emulator. The remaining Android-specific slice is keyboard-feature behavior only. Direct probes can show keyboardShown: true and switch to NATIVE_APP, but expose zero Gboard candidate nodes, and hardware keycodes only yield literal cant insertion, so autocorrect / glide / voice are tooling-blocked on the current local stackandroid-tests.test.ts, android-split-join.test.ts, android-empty-rebuild.test.ts, android-remove-range.test.ts, android-special-structural.test.ts, package.json, 2026-04-11-appium-android-setup-proof.md, 2026-04-12-appium-android-chrome-can-show-keyboard-state-without-exposing-gboard-candidates.md, true-slate-rc-proof-ledger.mdtrue-slate-rc-proof-ledger.mdplatform parity lanetooling-blocked / external
browser/input parityiOS Safari / WebKit composition / focusiOS Safari / WebKit composition and focus behavior is directly proved or explicitly justified as non-behavioraldesktop WebKit has direct proof for zero-width normalization and blur/focus recovery, an explicit direct-input ceiling probe showing that Playwright insertText does not expose composition-specific input events there, and a green browser-level proxy composition lane on the IME surfaces. On iOS Simulator Safari, direct Appium route/setup is green, inline-edge and void-edge have direct green packaged rows, but placeholder and no-FEFF placeholder typing remain behavior-red through XCUITest value. Broader iOS Safari composition/focus remains tooling-blocked beyond those rows, and the external plan now lives in 2026-04-12-ios-safari-broader-composition-focus-external-evidence-plan.mdrich-inline.test.ts, zero-width-matrix.test.ts, webkit-direct-ime-ceiling.test.ts, ime-proxy.test.ts, 2026-04-11-slate-browser-agent-browser-ios-setup-proof.md, 2026-04-12-appium-ios-safari-loads-local-slate-routes-but-xcuitest-value-does-not-drive-contenteditable.md, package.jsontrue-slate-rc-proof-ledger.mdplatform parity lanetooling-blocked / non-RC
browser/input parityFirefox composition / selection recoveryFirefox composition, selection-recovery, dragged-node-unmount cleanup, multi-range table preservation, and nested-editable focus bounce behavior are directly proved or explicitly justified as non-behavioralFirefox now has direct browser proof for zero-width normalization, blur/focus selection recovery, and direct composition on placeholder, no-FEFF placeholder, inline-edge, and void-edge via Playwright keyboard.insertText, plus dedicated drag/drop, multi-range table, and nested-editable focus lanes. Local Firefox/browser parity is exhausted; the remaining blocker is external Android keyboard-feature evidence plus broader iOS evidencerich-inline.test.ts, zero-width-matrix.test.ts, firefox-direct-ime.test.ts, drag-drop-cleanup.test.ts, table-multi-range-firefox.test.ts, firefox-nested-editable-focus.test.ts, ime-proxy.test.ts, package.json, 2026-04-12-firefox-drag-drop-proof-needs-example-owned-drop-mutation-and-document-level-drag-cleanup.md, 2026-04-12-firefox-table-multi-range-proof-needs-native-table-selection-and-a-multi-range-sync-guard.md, 2026-04-12-firefox-nested-editable-focus-proof-needs-a-real-nested-contenteditable-surface.mdtrue-slate-rc-proof-ledger.mdplatform parity lanelocal-closed

Manual-device readiness note:

  • the IME surfaces now expose a ?debug=1 overlay with Slate selection, DOM selection, placeholder shape, recent composition/input events, and live HTML so Android/iOS manual artifact capture is no longer blind

Seed Rows

LaneSurfaceExpected outcomeActual outcomeArtifact linksOwning docExecution ownerStatus
extension model/Users/zbeyens/git/slate-v2/packages/slate/test/extension-contract.tsthe current instance-method plus transaction-boundary extension model supports real wrapper ports, not only test-time monkey patchesthe lane now has explicit headless proof for primitive behavior interception and wrapper composition, a real schema-extension port on withForcedLayout, a real inline behavior port on withLinks, and a real domain-command / inline-void port on withMentions; history composition is proved in history-contract.ts; the React runtime proves direct composition with the real withLinks and withMentions wrappers and a same-seam forced-layout harness; browser proof is green across richtext, links, mentions, and forced-layout; this closes the current extension-model / behavior interception lane on the live engine without adopting the future middleware-phase architectureextension-contract.ts, history-contract.ts, react-editor-contract.tsx, with-links.ts, with-mentions.ts, with-forced-layout.ts, links.test.ts, mentions.test.ts, forced-layout.test.ts, richtext.test.ts, 2026-04-09-slate-v2-extension-model-behavior-interception-completion-plan.mdtrue-slate-rc-proof-ledger.mdpackages/slate + slate-history + slate-react + site/examplesclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/test/snapshot-contract.tsrepresentative editor/API and operation rows cover the recovered contract, not only the current narrow core claimcreateEditor() now exposes an overrideable instance surface for the editor/transform methods the current engine already supports, and Editor.* delegates through that instance seamsnapshot-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/testclosed
headless/core/Users/zbeyens/git/slate-v2/packages/slate/test/headless-contract.tsdirect non-React composition across the current package split is first-class, source-runnable, and does not require the React runtimea dedicated headless contract now proves package-name imports resolve from live workspace source for slate, slate-history, and slate-hyperscript; a hyperscript-built document can be loaded into withHistory(createEditor()), fragment insertion works through the core package, range refs update on that same headless flow, and undo restores the prior snapshot; docs now show an explicit headless entry path instead of routing every serious user through withReact(createEditor()); this closes the non-React / headless core usability lane on the current package-split model without collapsing the remaining broader public-surface work into itheadless-contract.ts, range-ref-contract.ts, clipboard-contract.ts, packages/slate/Readme.md, packages/slate-history/Readme.md, packages/slate-hyperscript/Readme.md, 01-installing-slate.md, 08-plugins.md, 2026-04-09-slate-v2-non-react-headless-core-usability-completion-plan.mdtrue-slate-rc-proof-ledger.mdpackages/slate + slate-history + slate-hyperscript + docsclosed
headless/core/Users/zbeyens/git/slate-v2/packages/slate/test/range-ref-contract.tsheadless refs and anchor behavior stay first-class under the recovered contractrange refs publish at commit, rebase across top-level, nested, mixed-inline, wrapper-list, and complex fragment insertions, clear on replace, default inward affinity at selection boundaries, and preserve sane unref / abort / no-op semanticsrange-ref-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/testclosed
headless/core/Users/zbeyens/git/slate-v2/packages/slate/test/clipboard-contract.tsclipboard/import-export behavior is scoped honestly and backed by direct prooffragment extraction and insertion are proved across mixed-inline, nested quote/list, wrapper-unit, and complex multi-block structures, including explicit insertion targets and selection rebasingclipboard-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/testclosed
history/collab/Users/zbeyens/git/slate-v2/packages/slate-history/test/integrity-contract.tsoperation/history integrity stays coherent enough to support undo/redo and external collaboration adapters without relying on callback luck or fake op inversiona dedicated integrity contract now proves the local substrate that collaboration adapters depend on: saved history batches preserve honest selection before/after state, set_selection records remain meaningful for history consumers, insert_fragment batches stay undoable through stored batch context, and commit-time history capture still records one committed batch before any reentrant userland onChange() edit starts the next one; the collaboration walkthrough and operation/history docs now state the boundary plainly, so local slate-v2 owns operation/history integrity while external slate-yjs owns CRDT/provider/cursor integration; this closes the operation-history-collaboration lane on invariant integrity, not on local multiplayer demosintegrity-contract.ts, operations-contract.ts, history-contract.ts, 07-enabling-collaborative-editing.md, operation.md, README.md, packages/slate-history/Readme.md, 2026-04-09-slate-v2-operation-history-collaboration-integrity-completion-plan.mdtrue-slate-rc-proof-ledger.mdpackages/slate + slate-history + docsclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/editor.tsoverrideable behavior methods for the currently supported delete seam exist on the instance and on Editor.* without widening semantics beyond the current delete transformdeleteBackward, deleteForward, and deleteFragment are now attached to the editor instance and delegated by Editor.*snapshot-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/editor.tswithoutNormalizing exists as a compatibility seam without pretending the engine already supports broader normalize-control semanticswithoutNormalizing is restored as an alias over the current transaction boundarysnapshot-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/editor.tsremaining editor-instance compatibility hooks exist on the current engine instead of disappearing into undocumented cutsgetChildren, setChildren, getDirtyPaths, setNormalizing, shouldMergeNodesRemovePrevNode, and the enumerable children accessor now exist on the instance surface; withoutNormalizing now suppresses normalization during the callback and normalizes once afterward; merge behavior can remove an empty previous sibling through the current hooksnapshot-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/editor.tsinsertBreak and insertSoftBreak recover the currently proved top-level block split seam, including edge-position always-split behaviorinsertBreak and insertSoftBreak now split the current top-level block and move the selection into the new block on the proved seamsnapshot-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/editor.tsquery hooks are restored for the current seam without pretending normalizeNode or markableVoid are already solvededitor.isInline, editor.isVoid, Editor.isInline, Editor.isVoid, and Editor.isEditor exist, and EditableTextBlocks falls back to editor.isInline when no explicit prop is suppliedsnapshot-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/editor.tsmarkableVoid controls whether mark helpers may target the text child inside a void elementmarkableVoid exists on the instance and addMark / removeMark honor it on the current void-child mark seamsnapshot-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/core.tsnormalizeNode exists as a real multi-pass transaction-time seam that can enforce supported root and descendant rewritesnormalizeNode runs during outer transaction completion and is proved both in core contract tests and the forced-layout runtime surfacesnapshot-contract.ts, app-owned-customization.tsx, react-editor-contract.tsxtrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/core.tsshouldNormalize exists as a narrow pass-level gate over the custom normalization seamshouldNormalize runs once per custom normalization pass, can skip that pass for the current transaction, and falls back safely when an older editor instance does not define itsnapshot-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/create-editor.tsa safe built-in normalization floor exists without reviving blanket legacy child-family coercionthe default normalizeNode now repairs empty non-editor elements, inserts leading / trailing spacer text around inline children, removes stray direct text / inline children from block-only containers on the current node-op seam, removes stray block-only text / inline children during replace/manual normalize passes, and honors opt-in fallbackElement wrapping for stray top-level or block-only text / inline children; Editor.normalize(...) now marks the pass as explicit so heavier adjacent-text cleanup and inline-container flattening can run without changing the default live transaction contract; broad live inline-container flattening is still documented as risky non-landed work because that seam keeps regressing mixed-inline clipboard/runtime proof, while explicit-only flattening is proved on the current seam and recorded in the live-shape registersnapshot-contract.ts, range-ref-contract.ts, 2026-04-09-slate-v2-built-in-normalization-recovery-lane.md, 2026-04-09-slate-range-refs-must-rebase-node-ops-before-wrap-driven-normalization.md, 2026-04-09-slate-inline-container-flattening-cannot-be-a-quick-built-in-normalization-win.md, live-shape-register.mdtrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
schema / normalization/Users/zbeyens/git/slate-v2/packages/slate/test/normalization-contract.tsrepresentative deleted normalization rows are either recovered on the current default seam, recovered on the explicit seam, or exposed as truly missinga dedicated normalization contract suite now owns the lane directly instead of acting as a teaser file: it proves safe default live invariants like empty-child repair, inline spacer insertion, node-op and replace-time block-only cleanup, and void inline/block repair; it also proves app-owned schema normalization headless-first through the real withForcedLayout wrapper, descendant-level rewrites with supported transforms, and scoped delegation back into core fallbackElement wrapping; explicit canonicalization is proved directly for adjacent-text cleanup and inline-container flattening; guard proof stays green in range-ref-contract.ts, clipboard-contract.ts, and the split slate-react proof files, and the live-shape register now names the allowed non-default live shapes and their canonicalization boundaries; this closes the schema / normalization lane on the current default-vs-explicit model without claiming blanket legacy built-in paritynormalization-contract.ts, range-ref-contract.ts, clipboard-contract.ts, app-owned-customization.tsx, react-editor-contract.tsx, with-forced-layout.ts, live-shape-register.md, 2026-04-09-slate-v2-built-in-normalization-recovery-lane.md, 2026-04-09-slate-v2-schema-normalization-extensibility-completion-plan.mdtrue-slate-rc-proof-ledger.mdpackages/slate + slate-react + docs/slate-v2closed
public surfacereplacement-candidate.mdthe repo can state one coherent broad package-level public claim with stable surfaces, secondary surfaces, and explicit non-claimsthe package matrix across slate, slate-dom, slate-react, slate-history, slate-hyperscript, and slate-browser is still useful, but the broad lane stays reopened under challenge until exhaustive per-API contract-width audit closes; the first exposed miss family, Editor.before(...) / Editor.after(...) voids: true and nonSelectable traversal rows, is now recovered in code and proof, which confirms the audit was necessary rather than theoreticalreplacement-candidate.md, Readme.md, packages/slate/Readme.md, packages/slate-react/Readme.md, packages/slate-history/Readme.md, packages/slate-dom/README.md, packages/slate-hyperscript/Readme.md, packages/slate-browser/README.md, 2026-04-09-slate-v2-broad-api-public-surface-reconciliation-completion-plan.md, 2026-04-09-slate-v2-public-surface-reconciliation.md, 2026-04-13-slate-v2-full-no-regression-story-plan.mdtrue-slate-rc-proof-ledger.mddocs/slate-v2 + package readmesreopened / under audit
public surface/Users/zbeyens/git/slate-v2/packages/slate/test/interfaces-contract.tsrepresentative deleted interface/runtime-guard rows are recovered on the current helper surface instead of only surviving implicitly in broader suitesa dedicated interfaces contract suite now proves editor-vs-element discrimination, editor-as-node truth, operation/range runtime guards, and basic text/node guard behavior on the current helper surface; the wider helper-heavy interfaces/** clusters are already mirrored in snapshot-contract.ts, and deleted CustomTypes declaration-merging rows are now a hard-cut non-claim instead of a disputed open type seaminterfaces-contract.ts, 2026-04-09-slate-v2-interfaces-family-deleted-test-closure.mdrelease-file-review-ledger.mdpackages/slate/testclosed
public surface/Users/zbeyens/git/slate-v2/packages/slate/test/operations-contract.tsrepresentative deleted raw-operation rows are recovered on the current operation seam instead of staying implicit inside the giant snapshot suitea dedicated operations contract suite now proves no-op and moving move_node, split_node text/element plus empty-properties behavior, expanded-selection remove_text, raw set_node omit-removal, and direct remove_node selection rebasing through the current core transaction seam; legacy custom-selection props and null/undefined removal sentinels are explicitly skipped instead of left ambiguousoperations-contract.ts, 2026-04-09-slate-v2-operations-family-deleted-test-closure.mdrelease-file-review-ledger.mdpackages/slate/testclosed
public surface/Users/zbeyens/git/slate-v2/packages/slate/test/transaction-contract.tsthe current transaction surface is explicit without pretending legacy partial-commit withBatch(...) failure semantics are still part of the kept contracta dedicated transaction contract suite now proves applyBatch(...) and manual withTransaction(...) parity on exact-path, mixed, structural, and direct-replacement lanes, and it explicitly proves atomic rollback on throw; exact legacy partial-commit batch failure semantics are cut instead of being laundered into fake paritytransaction-contract.ts, 2026-04-13-slate-v2-full-no-regression-story-plan.mdrelease-file-review-ledger.mdpackages/slate/testclosed
public surface/Users/zbeyens/git/slate-v2/packages/slate/test/legacy-transforms-fixtures.tsdirect legacy transform audit is the control read for transform-helper parity instead of family-summary inferencethe direct transform audit harness is now real and green under SLATE_RUN_LEGACY_TRANSFORM_AUDIT=1, which closes the earlier blanket reopen; the remaining transform debt is ledger-backed explicit-skip rows onlylegacy-transforms-fixtures.ts, transforms-contract.ts, clipboard-contract.ts, 2026-04-13-slate-v2-exhaustive-api-contract-recovery-plan.mdrelease-file-review-ledger.mdpackages/slate/testreopened / narrowed
public surface/Users/zbeyens/git/slate-v2/packages/slate/test/text-units-contract.tsrepresentative deleted string-unit helper rows are recovered on the current internal text-unit surface instead of silently drifting awaya dedicated text-units contract suite now proves grapheme and word-distance behavior across basic emoji, RTL, punctuation, and keycap cases for the current helper layer that drives cursor movement; deleted utils/deep-equal/** and the old root test-harness entrypoints are explicitly out of the live public claim instead of being treated as silent missing prooftext-units-contract.ts, 2026-04-09-slate-v2-utils-and-root-test-entrypoint-closure.mdrelease-file-review-ledger.mdpackages/slate/testclosed
public surface/Users/zbeyens/git/slate-v2/packages/slate/src/editor.tsthe static and instance read/query layer exists for the current live-tree surface instead of leaving the public API full of dead namesthe read/query layer is broadly recovered, and the first exposed miss family is now recovered too: Editor.before(...) / Editor.after(...) once again support legacy unit / voids width plus nonSelectable traversal on the current seam. This row still stays reopened under audit until the rest of the kept helpers are checked for accepted-argument, option-bag, return-shape, and behavior-width paritysnapshot-contract.ts, query-contract.ts, 2026-04-13-slate-v2-full-no-regression-story-plan.mdrelease-file-review-ledger.mdpackages/slate/srcreopened / under audit
public surface/Users/zbeyens/git/slate-v2/packages/slate/src/interfaces.tsthe exported utility surface keeps the minimal reasoning primitives Slate users expectPath.*, Point.*, and Range.* now recover the broader relationship and transform helpers serious headless callers expect, the Node / Element / Text utility family is no longer a stub, and the small meta-utility layer is restored too: Location.isLocation, Span.isSpan, Operation.*, and Scrubber.* are directly proved, with set_selection carrying full before/after state and fragment undo relying on stored batch context instead of a raw per-op inverse helpersnapshot-contract.ts, 2026-04-09-slate-v2-location-utility-surface-recovery.md, 2026-04-09-slate-v2-node-utility-surface-recovery.md, 2026-04-09-slate-v2-operation-location-scrubber-surface-recovery.mdrelease-file-review-ledger.mdpackages/slate/srcclosed
extension model/Users/zbeyens/git/slate-v2/packages/slate/src/editor.tssingular node insertion exists on the editor surface without redefining node transform semanticsinsertNode now exists on both Editor.* and editor.* as the singular-node insertion seam over the current insertNodes behaviorsnapshot-contract.tstrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
headless/core/Users/zbeyens/git/slate-v2/packages/slate/src/editor.tspoint/path/range ref surfaces exist for the current runtime-id and range-ref modelpathRef, pathRefs, pointRef, pointRefs, and rangeRefs now exist on both Editor.* and editor.*; pathRef tracks runtime-node paths across moves and invalidates on replace, pointRef rides the collapsed range-ref model, the tracked-ref sets are directly inspectable, and legacy static *Ref.transform(...) helpers are explicitly not part of the current public claim because the editor owns ref updatessnapshot-contract.ts, 2026-04-09-slate-v2-ref-docs-truth-pass.mdtrue-slate-rc-proof-ledger.mdpackages/slate/srcclosed
runtime/browser/Users/zbeyens/git/slate-v2/packages/slate-react/testruntime proof supports the recovered contract without redefining the core as React-firstsame-turn full slate-react package proof is green, now split by behavior domain instead of one runtime.tsx landfill: provider/hook proof, withReact / ReactEditor bridge proof, render primitive proof, mounted editable behavior proof, projection/ref proof, app-owned customization proof, and the large-document/scroll lane all have explicit owners, while the focused surface-contract.tsx rows still carry ReactEditor.focus, translate='no', mount stability, and path-rebasing selection behaviorprovider-hooks-contract.tsx, react-editor-contract.tsx, primitives-contract.tsx, editable-behavior.tsx, projections-and-selection-contract.tsx, app-owned-customization.tsx, large-doc-and-scroll.tsx, surface-contract.tsx, 2026-04-09-slate-v2-runtime-browser-proof-closure.mddocs/slate-browser/proof-lane-matrix.mdpackages/slate-react/testclosed
public surface/Users/zbeyens/git/slate-v2/packages/slate-react/test/surface-contract.tsxdeleted Slate React test-family rows that still belong to the live package have direct proof on the current editor-facing surfacesthe focused surface contract now directly proves ReactEditor.focus selection initialization, mid-transform focus safety, and no-onValueChange focus semantics; low-level Editable now defaults translate='no' and allows override; the structured surface keeps element mounts stable across split/merge; and useSelected stays true for the same element after structured path rebasing, while old chunking internals and exact decorate parity stay explicitly out of scopesurface-contract.tsx, 2026-04-09-slate-v2-slate-react-deleted-test-family-closure.mdrelease-file-review-ledger.mdpackages/slate-react/testclosed
runtime/browser/Users/zbeyens/git/slate-v2/playwright/integration/examples/read-only.test.tsdedicated current-example browser proof covers browser-only current surfaces outside the replacement matrixsame-turn local browser proof is green for read-only, shadow-dom, iframe, and plaintext, and the widened yarn test:slate-browser:e2e:local lane is green across 79 Chromium rows in the broad current example suiteread-only.test.ts, shadow-dom.test.ts, iframe.test.ts, plaintext.test.ts, 2026-04-09-slate-browser-e2e-surface-widening.mddocs/slate-browser/proof-lane-matrix.mdplaywright/integration/examplesclosed
runtime/browser/Users/zbeyens/git/slate-v2/playwright/integration/examples/replacement-compatibility.test.tswidened browser proof stays aligned with the recovered contract and emits reviewable artifacts where requiredsame-turn cross-repo replacement compatibility proof is green across 41 Chromium rows covering rebuilt legacy/current compatibility surfaces including markdown, forced layout, styling, hovering toolbar, editable voids, images, tables, embeds, plaintext, read-only, paste-html, annotations, mentions, and linksreplacement-compatibility.test.ts, 2026-04-09-slate-v2-runtime-browser-proof-closure.mddocs/slate-browser/proof-lane-matrix.mdplaywright/integration/examplesclosed
runtime/browserdocs/slate-browser/proof-lane-matrix.mdspecialist browser lanes map cleanly into the True Slate RC contract and artifact requirementsthe lane matrix remains aligned with the live proof surfaces, and this turn has fresh passing evidence from yarn workspace slate-browser test, yarn test:slate-browser:e2e:local, yarn test:slate-browser:ime:local, the local anchors wrapper run, and yarn test:replacement:compat:localdocs/slate-browser/proof-lane-matrix.md, 2026-04-09-slate-v2-runtime-browser-proof-closure.mddocs/slate-browser/proof-lane-matrix.mddocs/slate-browserclosed
runtime/browser/Users/zbeyens/git/slate-v2/packages/slate-browser/src/playwright/index.tsthe specialist proof package owns a coherent current browser-testing surface instead of acting like unnamed helper codeslate-browser now has fresh same-turn green evidence on test:slate-browser:core, test:slate-browser:dom, test:slate-browser:selection, test:slate-browser:ime:local, the local anchors wrapper run, the widened test:slate-browser:e2e:local lane, and test:replacement:compat:local/Users/zbeyens/git/slate-v2/packages/slate-browser/src/playwright/index.ts, proof-lane-matrix.md, 2026-04-09-slate-browser-e2e-surface-widening.md, 2026-04-09-slate-v2-runtime-browser-proof-closure.mddocs/slate-browser/proof-lane-matrix.mdpackages/slate-browserclosed
public surface/Users/zbeyens/git/slate-v2/packages/slate-dom/test/bridge.tsthe slate-dom package claim stays narrow and explicit, but the stable DOMBridge / ClipboardBridge surfaces have direct package proofthe package's own bridge and clipboard-boundary suites are green, covering mounted path/range translation, zero-width handling, decorated leaf offsets, clipboard fragment envelopes, HTML/plain-text fallback, and fail-closed boundaries, while the old Android-only DOMEditor baggage remains explicitly out of scopebridge.ts, clipboard-boundary.ts, 2026-04-09-slate-v2-slate-dom-proof-closure.mdrelease-file-review-ledger.mdpackages/slate-dom/testclosed
public surface/Users/zbeyens/git/slate-v2/packages/slate-hyperscript/test/index.jsthe contributor-facing slate-hyperscript package slot is runnable and proved from source in the current workspacethe full slate-hyperscript fixture suite and smoke suite are green again from source, and the package now has a live root index.ts entry so workspace imports do not fall through to dead dist/ paths under Yarn PnPindex.js, smoke.js, 2026-04-09-slate-v2-slate-hyperscript-proof-closure.mdrelease-file-review-ledger.mdpackages/slate-hyperscriptclosed
public surface/Users/zbeyens/git/slate-v2/packages/slate/src/index.tsruntime helpers consumed by sibling packages remain part of the slate public surface instead of disappearing into stale dist/types lucksource barrel now exports the widened utility layer plus thin transform helper namespaces: Node, Text, Element, Range, Path, Location, Span, Operation, Scrubber, NodeEntry, Ancestor, and GeneralTransforms / NodeTransforms / SelectionTransforms / TextTransforms, all proved against the current transaction engine semanticssnapshot-contract.ts, 2026-04-09-slate-v2-transforms-namespace-recovery.mdrelease-file-review-ledger.mdpackages/slate/srcclosed
public surface/Users/zbeyens/git/slate-v2/packages/slate-react/src/index.tsthe current React package exports the obvious editor-facing and advanced runtime helpers serious Slate users still expect, without pretending the old DOM plugin stack fully survivedslate-react now exports a stable editor-facing surface around Slate, EditableBlocks, Editable, useSlateSelector(...), and useSlateStatic, while the advanced runtime surface remains public for lower-level work through EditableTextBlocks, withReact(...), ReactEditor, useSlateWithV, useElement, useElementIf, useSelected, useFocused, useReadOnly, and the default rendering aliases; declaration-merging recovery is now back on the package seam, but deleted chunking/restore-dom/Android-input internals only stay cut where contract-width audit proves explicit engine-rewrite exceptions, not because specialist browser lanes happen to be greenprovider-hooks-contract.tsx, react-editor-contract.tsx, primitives-contract.tsx, editable-behavior.tsx, projections-and-selection-contract.tsx, app-owned-customization.tsx, large-doc-and-scroll.tsx, surface-contract.tsx, 2026-04-09-slate-v2-slate-react-surface-recovery.md, 2026-04-09-slate-v2-reacteditor-dom-helper-recovery.md, 2026-04-09-slate-v2-slate-provider-recovery.md, 2026-04-09-slate-v2-editable-docs-truth-pass.md, 2026-04-09-slate-v2-rendering-api-recovery.md, 2026-04-09-slate-v2-reacteditor-root-window-recovery.md, 2026-04-09-slate-v2-readonly-surface-recovery.md, 2026-04-09-slate-v2-slate-react-deleted-test-family-closure.md, 2026-04-09-slate-v2-slate-react-source-deleted-family-closure.md, repair-drift.mdctrue-slate-rc-proof-ledger.mdpackages/slate-react/srcreopened / under audit

Rule

This file is not a backlog dumpster.

If a row cannot explain why it belongs to True Slate RC, it does not belong here.

Reopened Perf Gate Rows

LaneSurfaceExpected outcomeActual outcomeArtifact linksOwning docExecution ownerStatus
perf gatepnpm bench:replacement:placeholder:localmounted-runtime baseline lane is measured and classified against the default recommendation surfacecurrent placeholder mean 3.39ms vs legacy 8.03ms; blocker lane passesreplacement-gates-scoreboard.md, package.jsonreplacement-gates-scoreboard.mdscripts + site/examplesclosed
perf gatepnpm bench:history:compare:localwithHistory(createEditor()) undo / redo cost is measured directly against legacy Slate on a large-document default-editor lanefresh same-turn 5000-block history compare still trails legacy, but stays in an acceptable band for RC: typing undo 20.27ms, typing redo 17.7ms, fragment undo 31.77ms, fragment redo 29.11ms; lane remains the sole honest owner for history compare truth after the bogus browser huge-document row was cutreplacement-gates-scoreboard.md, package.json, .tmp/slate-history-benchmark.jsonreplacement-gates-scoreboard.mdpackages/slate-history + scriptsclosed
perf gatepnpm bench:replacement:richtext:localmainstream richtext latency lane is measured and classified as a blocker class affecting the current recommendation surfacecurrent richtext blockquote mean 22.09ms vs legacy 23.01ms; blocker lane now clears after the kept leaf-path fix, so perf is no longer the reason Target A / Target B stay reopenedreplacement-gates-scoreboard.md, package.jsonreplacement-gates-scoreboard.mdscripts + site/examplesclosed
perf gatepnpm bench:replacement:huge-document:localhuge-document user-flow lane is measured and classified against the broader replacement claimcurrent lane beats legacy on ready, type, select-all, and paste; blocker lane passesreplacement-gates-scoreboard.md, package.jsonreplacement-gates-scoreboard.mdscripts + site/examplesclosed
perf gatepnpm bench:replacement:huge-document:overlays:localthe huge-document example owns one explicit overlay harness where corridor-scoped decoration toggles, annotation sidebars, and hidden-pane Activity behavior are measured directly instead of being inferred from baseline huge-document numbersfresh same-turn 1000-block overlay rerun stays owned and repeatable: overlay toggle mean 98.12ms, overlay count 2, hide/show sidebar means 97.46ms / 77.45ms, type-after-overlay mean 15.4ms, and type-after-show mean 14.54ms; the lane proves the visible editing corridor stays urgent after overlay and sidebar churn without claiming legacy parity it does not measurereplacement-gates-scoreboard.md, package.json, .tmp/slate-replacement-huge-document-overlays-benchmark.jsonreplacement-gates-scoreboard.mdsite/examples + scriptsclosed
perf gatepnpm bench:react:rerender-breadth:localmounted runtime locality proof stays explicit when overlay-source toggles, hidden panes, and annotation-backed widgets are added to the package storythe kept rerender lane still shows only useSlate() and selection subscribers rerender broadly by contract; the overlay-source toggle row keeps unrelated text and unrelated runtime ids at 0, the hidden-pane Activity row keeps hidden panel renders at 0 while preserving local state and resuming on the latest committed snapshot, and the new annotation-backed widget row rerenders only the edited left text plus projection/sidebar/widget slices at 1 each while unrelated right text stays at 0 with 0.29ms mean edit costreplacement-gates-scoreboard.md, package.json, packages/slate-react/tmp/slate-react-rerender-breadth-benchmark.jsonreplacement-gates-scoreboard.mdpackages/slate-react + scriptsclosed
perf gatepnpm bench:normalization:localcore normalization local lanes are measured and tracked as diagnostic perf evidenceexplicit normalize and observation lanes are command-backed; diagnostic package remains slower than legacy-adjacent expectationsreplacement-gates-scoreboard.md, normalization-reference.md, package.jsonreplacement-gates-scoreboard.mdpackages/slate + scriptsclosed
perf gatepnpm bench:normalization:compare:localcore normalization compare lanes are measured against /Users/zbeyens/git/slate and classified as diagnostic evidencecurrent explicit adjacent-text 125.06ms vs legacy 12.97ms; explicit inline flatten 1655.57ms vs legacy 293.62ms; read-after-each 91.76ms vs 4.39ms; class stays diagnostic until mapped into a user-facing blocker lanereplacement-gates-scoreboard.md, normalization-reference.md, package.jsonreplacement-gates-scoreboard.mdpackages/slate + scriptsclosed