docs/slate-v2-draft/true-slate-rc-proof-ledger.md
Proof ledger for the work that sits beyond the completed POC RC and must be
closed before a True Slate RC claim is honest.
Every row must name:
Browser and future agent-native rows must emit:
Scoped diff seed:
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:
EMPTYHigh-risk legacy files already reviewed:
packages/slate-react/src/components/editable.tsxpackages/slate-react/src/components/string.tsxpackages/slate-react/src/hooks/android-input-manager/android-input-manager.tspackages/slate-react/src/hooks/android-input-manager/use-android-input-manager.tspackages/slate-react/src/components/restore-dom/restore-dom.tsxpackages/slate-react/src/components/restore-dom/restore-dom-manager.tspackages/slate-react/test/react-editor.spec.tsxextended| Lane | Surface | Expected outcome | Actual outcome | Artifact links | Owning doc | Execution owner | Status |
|---|---|---|---|---|---|---|---|
| example parity | legacy/current example matrix across site/examples/**, playwright/integration/examples/**, and replacement-compatibility rows | every 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 comparison | current 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 truth | legacy-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.md | 2026-04-15-slate-v2-example-parity-recovery-plan.md | site/examples + playwright/integration/examples + legacy example surfaces | open |
Exact legacy compat behaviors still unproved:
beforeinput / keyboard-feature behavior beyond ordinary
typing and structural rowsThese 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.
| Lane | Surface | Expected outcome | Actual outcome | Artifact links | Owning doc | Execution owner | Status |
|---|---|---|---|---|---|---|---|
| browser/input parity | placeholder IME | empty placeholder composition matches legacy relied-on behavior strongly enough to support the RC claim | Chromium 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 routes | placeholder-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.md | true-slate-rc-proof-ledger.md | playwright + site/examples + browser-mobile transports | open |
| browser/input parity | inline-edge IME | inline-edge composition lands on the intended text leaf with legacy-equivalent behavior across the required browser matrix | Chromium 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 typing | inline-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.md | true-slate-rc-proof-ledger.md | playwright + site/examples + browser-mobile transports | open |
| browser/input parity | void-edge IME | void-like IME behavior matches legacy spacer semantics across the required browser matrix | Chromium 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 typing | void-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.md | true-slate-rc-proof-ledger.md | playwright + site/examples + browser-mobile transports | open |
| browser/input parity | focus restore and transient DOM-point gaps | focus recovery and transient bridge gaps fail closed at least as safely as the legacy stack on the required browser matrix | mounted-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 blocker | surface-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.json | true-slate-rc-proof-ledger.md | packages/slate-react + packages/slate-dom | open |
| browser/input parity | zero-width selection normalization | zero-width DOM/Slate selection round-trip stays correct across the required browser matrix | current bridge proof is green, and the zero-width matrix row is now green on Chromium, Firefox, and desktop WebKit; real iOS Safari remains unproved | zero-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.json | true-slate-rc-proof-ledger.md | packages/slate-dom + slate-browser | open |
| browser/input parity | post-composition undo / redo | undo and redo immediately after composition are directly proved on the required IME rows | dedicated 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 elsewhere | placeholder-ime.test.ts, inline-edge-ime.test.ts, void-edge-ime.test.ts, package.json | true-slate-rc-proof-ledger.md | packages/slate-history + playwright | open |
| browser/input parity | Android composition / diff / flush | Android-specific composition/diff/flush behavior has direct parity proof or explicit justified omission | the 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 stack | android-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.md | true-slate-rc-proof-ledger.md | platform parity lane | tooling-blocked / external |
| browser/input parity | iOS Safari / WebKit composition / focus | iOS Safari / WebKit composition and focus behavior is directly proved or explicitly justified as non-behavioral | desktop 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.md | rich-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.json | true-slate-rc-proof-ledger.md | platform parity lane | tooling-blocked / non-RC |
| browser/input parity | Firefox composition / selection recovery | Firefox 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-behavioral | Firefox 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 evidence | rich-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.md | true-slate-rc-proof-ledger.md | platform parity lane | local-closed |
Manual-device readiness note:
?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| Lane | Surface | Expected outcome | Actual outcome | Artifact links | Owning doc | Execution owner | Status |
|---|---|---|---|---|---|---|---|
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/test/extension-contract.ts | the current instance-method plus transaction-boundary extension model supports real wrapper ports, not only test-time monkey patches | the 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 architecture | extension-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.md | true-slate-rc-proof-ledger.md | packages/slate + slate-history + slate-react + site/examples | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/test/snapshot-contract.ts | representative editor/API and operation rows cover the recovered contract, not only the current narrow core claim | createEditor() now exposes an overrideable instance surface for the editor/transform methods the current engine already supports, and Editor.* delegates through that instance seam | snapshot-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/test | closed |
| headless/core | /Users/zbeyens/git/slate-v2/packages/slate/test/headless-contract.ts | direct non-React composition across the current package split is first-class, source-runnable, and does not require the React runtime | a 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 it | headless-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.md | true-slate-rc-proof-ledger.md | packages/slate + slate-history + slate-hyperscript + docs | closed |
| headless/core | /Users/zbeyens/git/slate-v2/packages/slate/test/range-ref-contract.ts | headless refs and anchor behavior stay first-class under the recovered contract | range 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 semantics | range-ref-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/test | closed |
| headless/core | /Users/zbeyens/git/slate-v2/packages/slate/test/clipboard-contract.ts | clipboard/import-export behavior is scoped honestly and backed by direct proof | fragment extraction and insertion are proved across mixed-inline, nested quote/list, wrapper-unit, and complex multi-block structures, including explicit insertion targets and selection rebasing | clipboard-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/test | closed |
| history/collab | /Users/zbeyens/git/slate-v2/packages/slate-history/test/integrity-contract.ts | operation/history integrity stays coherent enough to support undo/redo and external collaboration adapters without relying on callback luck or fake op inversion | a 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 demos | integrity-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.md | true-slate-rc-proof-ledger.md | packages/slate + slate-history + docs | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/editor.ts | overrideable behavior methods for the currently supported delete seam exist on the instance and on Editor.* without widening semantics beyond the current delete transform | deleteBackward, deleteForward, and deleteFragment are now attached to the editor instance and delegated by Editor.* | snapshot-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/editor.ts | withoutNormalizing exists as a compatibility seam without pretending the engine already supports broader normalize-control semantics | withoutNormalizing is restored as an alias over the current transaction boundary | snapshot-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/editor.ts | remaining editor-instance compatibility hooks exist on the current engine instead of disappearing into undocumented cuts | getChildren, 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 hook | snapshot-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/editor.ts | insertBreak and insertSoftBreak recover the currently proved top-level block split seam, including edge-position always-split behavior | insertBreak and insertSoftBreak now split the current top-level block and move the selection into the new block on the proved seam | snapshot-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/editor.ts | query hooks are restored for the current seam without pretending normalizeNode or markableVoid are already solved | editor.isInline, editor.isVoid, Editor.isInline, Editor.isVoid, and Editor.isEditor exist, and EditableTextBlocks falls back to editor.isInline when no explicit prop is supplied | snapshot-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/editor.ts | markableVoid controls whether mark helpers may target the text child inside a void element | markableVoid exists on the instance and addMark / removeMark honor it on the current void-child mark seam | snapshot-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/core.ts | normalizeNode exists as a real multi-pass transaction-time seam that can enforce supported root and descendant rewrites | normalizeNode runs during outer transaction completion and is proved both in core contract tests and the forced-layout runtime surface | snapshot-contract.ts, app-owned-customization.tsx, react-editor-contract.tsx | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/core.ts | shouldNormalize exists as a narrow pass-level gate over the custom normalization seam | shouldNormalize 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 it | snapshot-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/create-editor.ts | a safe built-in normalization floor exists without reviving blanket legacy child-family coercion | the 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 register | snapshot-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.md | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| schema / normalization | /Users/zbeyens/git/slate-v2/packages/slate/test/normalization-contract.ts | representative deleted normalization rows are either recovered on the current default seam, recovered on the explicit seam, or exposed as truly missing | a 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 parity | normalization-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.md | true-slate-rc-proof-ledger.md | packages/slate + slate-react + docs/slate-v2 | closed |
| public surface | replacement-candidate.md | the repo can state one coherent broad package-level public claim with stable surfaces, secondary surfaces, and explicit non-claims | the 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 theoretical | replacement-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.md | true-slate-rc-proof-ledger.md | docs/slate-v2 + package readmes | reopened / under audit |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate/test/interfaces-contract.ts | representative deleted interface/runtime-guard rows are recovered on the current helper surface instead of only surviving implicitly in broader suites | a 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 seam | interfaces-contract.ts, 2026-04-09-slate-v2-interfaces-family-deleted-test-closure.md | release-file-review-ledger.md | packages/slate/test | closed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate/test/operations-contract.ts | representative deleted raw-operation rows are recovered on the current operation seam instead of staying implicit inside the giant snapshot suite | a 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 ambiguous | operations-contract.ts, 2026-04-09-slate-v2-operations-family-deleted-test-closure.md | release-file-review-ledger.md | packages/slate/test | closed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate/test/transaction-contract.ts | the current transaction surface is explicit without pretending legacy partial-commit withBatch(...) failure semantics are still part of the kept contract | a 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 parity | transaction-contract.ts, 2026-04-13-slate-v2-full-no-regression-story-plan.md | release-file-review-ledger.md | packages/slate/test | closed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate/test/legacy-transforms-fixtures.ts | direct legacy transform audit is the control read for transform-helper parity instead of family-summary inference | the 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 only | legacy-transforms-fixtures.ts, transforms-contract.ts, clipboard-contract.ts, 2026-04-13-slate-v2-exhaustive-api-contract-recovery-plan.md | release-file-review-ledger.md | packages/slate/test | reopened / narrowed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate/test/text-units-contract.ts | representative deleted string-unit helper rows are recovered on the current internal text-unit surface instead of silently drifting away | a 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 proof | text-units-contract.ts, 2026-04-09-slate-v2-utils-and-root-test-entrypoint-closure.md | release-file-review-ledger.md | packages/slate/test | closed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate/src/editor.ts | the static and instance read/query layer exists for the current live-tree surface instead of leaving the public API full of dead names | the 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 parity | snapshot-contract.ts, query-contract.ts, 2026-04-13-slate-v2-full-no-regression-story-plan.md | release-file-review-ledger.md | packages/slate/src | reopened / under audit |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate/src/interfaces.ts | the exported utility surface keeps the minimal reasoning primitives Slate users expect | Path.*, 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 helper | snapshot-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.md | release-file-review-ledger.md | packages/slate/src | closed |
| extension model | /Users/zbeyens/git/slate-v2/packages/slate/src/editor.ts | singular node insertion exists on the editor surface without redefining node transform semantics | insertNode now exists on both Editor.* and editor.* as the singular-node insertion seam over the current insertNodes behavior | snapshot-contract.ts | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| headless/core | /Users/zbeyens/git/slate-v2/packages/slate/src/editor.ts | point/path/range ref surfaces exist for the current runtime-id and range-ref model | pathRef, 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 updates | snapshot-contract.ts, 2026-04-09-slate-v2-ref-docs-truth-pass.md | true-slate-rc-proof-ledger.md | packages/slate/src | closed |
| runtime/browser | /Users/zbeyens/git/slate-v2/packages/slate-react/test | runtime proof supports the recovered contract without redefining the core as React-first | same-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 behavior | provider-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.md | docs/slate-browser/proof-lane-matrix.md | packages/slate-react/test | closed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate-react/test/surface-contract.tsx | deleted Slate React test-family rows that still belong to the live package have direct proof on the current editor-facing surfaces | the 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 scope | surface-contract.tsx, 2026-04-09-slate-v2-slate-react-deleted-test-family-closure.md | release-file-review-ledger.md | packages/slate-react/test | closed |
| runtime/browser | /Users/zbeyens/git/slate-v2/playwright/integration/examples/read-only.test.ts | dedicated current-example browser proof covers browser-only current surfaces outside the replacement matrix | same-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 suite | read-only.test.ts, shadow-dom.test.ts, iframe.test.ts, plaintext.test.ts, 2026-04-09-slate-browser-e2e-surface-widening.md | docs/slate-browser/proof-lane-matrix.md | playwright/integration/examples | closed |
| runtime/browser | /Users/zbeyens/git/slate-v2/playwright/integration/examples/replacement-compatibility.test.ts | widened browser proof stays aligned with the recovered contract and emits reviewable artifacts where required | same-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 links | replacement-compatibility.test.ts, 2026-04-09-slate-v2-runtime-browser-proof-closure.md | docs/slate-browser/proof-lane-matrix.md | playwright/integration/examples | closed |
| runtime/browser | docs/slate-browser/proof-lane-matrix.md | specialist browser lanes map cleanly into the True Slate RC contract and artifact requirements | the 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:local | docs/slate-browser/proof-lane-matrix.md, 2026-04-09-slate-v2-runtime-browser-proof-closure.md | docs/slate-browser/proof-lane-matrix.md | docs/slate-browser | closed |
| runtime/browser | /Users/zbeyens/git/slate-v2/packages/slate-browser/src/playwright/index.ts | the specialist proof package owns a coherent current browser-testing surface instead of acting like unnamed helper code | slate-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.md | docs/slate-browser/proof-lane-matrix.md | packages/slate-browser | closed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate-dom/test/bridge.ts | the slate-dom package claim stays narrow and explicit, but the stable DOMBridge / ClipboardBridge surfaces have direct package proof | the 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 scope | bridge.ts, clipboard-boundary.ts, 2026-04-09-slate-v2-slate-dom-proof-closure.md | release-file-review-ledger.md | packages/slate-dom/test | closed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate-hyperscript/test/index.js | the contributor-facing slate-hyperscript package slot is runnable and proved from source in the current workspace | the 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 PnP | index.js, smoke.js, 2026-04-09-slate-v2-slate-hyperscript-proof-closure.md | release-file-review-ledger.md | packages/slate-hyperscript | closed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate/src/index.ts | runtime helpers consumed by sibling packages remain part of the slate public surface instead of disappearing into stale dist/types luck | source 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 semantics | snapshot-contract.ts, 2026-04-09-slate-v2-transforms-namespace-recovery.md | release-file-review-ledger.md | packages/slate/src | closed |
| public surface | /Users/zbeyens/git/slate-v2/packages/slate-react/src/index.ts | the 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 survived | slate-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 green | provider-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.mdc | true-slate-rc-proof-ledger.md | packages/slate-react/src | reopened / under audit |
This file is not a backlog dumpster.
If a row cannot explain why it belongs to True Slate RC, it does not belong
here.
| Lane | Surface | Expected outcome | Actual outcome | Artifact links | Owning doc | Execution owner | Status |
|---|---|---|---|---|---|---|---|
| perf gate | pnpm bench:replacement:placeholder:local | mounted-runtime baseline lane is measured and classified against the default recommendation surface | current placeholder mean 3.39ms vs legacy 8.03ms; blocker lane passes | replacement-gates-scoreboard.md, package.json | replacement-gates-scoreboard.md | scripts + site/examples | closed |
| perf gate | pnpm bench:history:compare:local | withHistory(createEditor()) undo / redo cost is measured directly against legacy Slate on a large-document default-editor lane | fresh 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 cut | replacement-gates-scoreboard.md, package.json, .tmp/slate-history-benchmark.json | replacement-gates-scoreboard.md | packages/slate-history + scripts | closed |
| perf gate | pnpm bench:replacement:richtext:local | mainstream richtext latency lane is measured and classified as a blocker class affecting the current recommendation surface | current 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 reopened | replacement-gates-scoreboard.md, package.json | replacement-gates-scoreboard.md | scripts + site/examples | closed |
| perf gate | pnpm bench:replacement:huge-document:local | huge-document user-flow lane is measured and classified against the broader replacement claim | current lane beats legacy on ready, type, select-all, and paste; blocker lane passes | replacement-gates-scoreboard.md, package.json | replacement-gates-scoreboard.md | scripts + site/examples | closed |
| perf gate | pnpm bench:replacement:huge-document:overlays:local | the 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 numbers | fresh 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 measure | replacement-gates-scoreboard.md, package.json, .tmp/slate-replacement-huge-document-overlays-benchmark.json | replacement-gates-scoreboard.md | site/examples + scripts | closed |
| perf gate | pnpm bench:react:rerender-breadth:local | mounted runtime locality proof stays explicit when overlay-source toggles, hidden panes, and annotation-backed widgets are added to the package story | the 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 cost | replacement-gates-scoreboard.md, package.json, packages/slate-react/tmp/slate-react-rerender-breadth-benchmark.json | replacement-gates-scoreboard.md | packages/slate-react + scripts | closed |
| perf gate | pnpm bench:normalization:local | core normalization local lanes are measured and tracked as diagnostic perf evidence | explicit normalize and observation lanes are command-backed; diagnostic package remains slower than legacy-adjacent expectations | replacement-gates-scoreboard.md, normalization-reference.md, package.json | replacement-gates-scoreboard.md | packages/slate + scripts | closed |
| perf gate | pnpm bench:normalization:compare:local | core normalization compare lanes are measured against /Users/zbeyens/git/slate and classified as diagnostic evidence | current 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 lane | replacement-gates-scoreboard.md, normalization-reference.md, package.json | replacement-gates-scoreboard.md | packages/slate + scripts | closed |