docs/slate-v2/ledgers/slate-editor-api.md
packages/slategetChildrengetOperationssetChildrengetSnapshotreplaceresetsubscribewithTransactionbeforeafterpositions
showed those files are already source-close enough that they were not the
best first code spend.tmp/slate-v2/packages/slate/test/query-contract.tsEditor.nodes/** oracle proof is now live and green in:
.tmp/slate-v2/packages/slate/test/legacy-editor-nodes-fixtures.tsbun test ./packages/slate/testbunx turbo build --filter=./packages/slatebunx turbo typecheck --filter=./packages/slatebun run lint:fixbun run lintsurface-contract.tstransaction-contract.tsbookmark-contract.tsrange-ref-contract.tsextension-contract.tsEditor.bookmark(...)Transforms.setSelection(...) is a patch helperTransforms.select(...) instead of expecting setSelection(...) to create
one from a partial patcheditor.operations is a compatibility mirror over internal op stateEditor.getOperations(editor) is the canonical operations read seamEditor.apply(editor, op) is now the explicit public single-op writer
over the transaction seamEditor.withTransaction(editor, tx => ...) now exposes explicit draft
reads through:
tx.childrentx.selectiontx.markstx.operationstx.apply(op) now exists as the first explicit transaction-owned write seamapplyOperation(editor, op) now exists as the internal helper/transform
writer seaminterfaces/transforms/general.tseditor/insert-break.tstransforms-node/move-nodes.tstransforms-text/delete-text.tsinterfaces/transforms/text.tstransforms-selection/select.tstransforms-selection/deselect.tstransforms-selection/set-selection.tstransforms-node/remove-nodes.tstransforms-node/set-nodes.tstransforms-node/split-nodes.tstransforms-node/insert-nodes.tstransforms-node/merge-nodes.tstx.apply(op) is now backed by the base core writer instead of delegating
through an overridden editor.applyEditor.apply(editor, op) now rides that same stronger writer instead of
treating wrapped editor.apply(op) as the public defaulteditor.onChange()editor.onChange() therefore reads more honestly as a legacy compatibility
callback over the snapshot-store seam, not the primary commit ownereditor.apply(op) seam therefore reads more honestly as
compatibility pressure, while transaction-owned code keeps moving onto the
stronger writer pathinterfaces/Editor/** fixture proofs now also read through explicit
accessors instead of ambient property mirrors by defaulteditor.children is a compatibility mirror over explicit child/snapshot
seams, not a primary read seameditor.selection is a compatibility mirror over explicit
snapshot/transaction selection seams, not a primary read seameditor.marks is a compatibility mirror over explicit
snapshot/query/transaction marks seams, not a primary read seamcore/public-state.tsinterfaces/editor.tsaccessor-transaction.test.tsinterfaces-contract.tssnapshot-contract.tssurface-contract.tstransaction-contract.tseditor.marks property writes are now explicitly proved as a live
compatibility seam in:
snapshot-contract.tsdelete-text.tsget-default-insert-location.ts
now use Editor.getChildren(editor) instead of reading editor.children
directly for live draft statenormalization-contract.tsextension-contract.ts
use Editor.getChildren(editor) for live draft reads in app-owned
normalization examplesinsertText now avoids direct editor.selection source reads in its
null-selection guard by using an explicit public-selection helper insteadslate-react provider callbacks now read through Editor.getChildren,
Editor.getOperations, and Editor.getLiveSelection instead of ambient
mirrorsslate-react browser input selection checks now read through
Editor.getLiveSelection; read-only mark and child checks use
Editor.marks / Editor.getChildrenEditor.getLiveSelection; its mark writes remain an explicit compatibility
ownerslate-dom focus and DOM-selection synchronization now reads selection
through Editor.getLiveSelectionEditor.subscribe for performance
instrumentation instead of monkey-patching editor.applyeditor.childreneditor.selection / editor.marksAudit each kept exported row against:
Do not promote a row to mirrored just because the helper name survived or a green harness exists nearby.
Current narrowing is no longer presumed bad by default. If the better API is cleaner and the old surface is baggage, cut or demote it explicitly.
Restored direct contract owners outrank source closeness when they disagree.
Recovered public names do not automatically recover every deeper legacy semantic behind them. Keep explicit cuts explicit.