docs/plans/2026-05-13-slate-v2-yjs-core-readiness-ralplan.md
Date: 2026-05-13
Status: done
Score: 0.94
Owner skill: .agents/skills/slate-ralplan/SKILL.md
Do not create slate-yjs yet.
Current Slate v2 does not need a core rewrite for Yjs. The architecture is already pointed the right way: commits, metadata, tags, operation replay, extension runtime state, commit listeners, operation middleware, local runtime ids, and bookmark rebasing are the right substrate.
The hard cut is the legacy adapter shape. The future package must not port
slate-yjs's monkey-patched editor.apply, monkey-patched editor.onChange,
direct editor.children mutation, implicit Transforms.select restoration, or
Yjs storage leaking into raw Slate values. That shape is exactly the kind of
dirty hack v2 exists to avoid.
Before package work starts, core needs a focused readiness pass:
editor.extend(...), commit listeners, extension runtime state, and
editor.update(...).Intent: make Slate v2's core 100% ready for a clean first-party slate-yjs
package before release.
Outcome: an accepted core readiness checklist and execution queue. Package creation starts only after the queue is green.
In scope:
../slate-yjs,
../lexical/packages/lexical-yjs, ../y-prosemirror, and ../yjsslate-yjsNon-goals:
slate-yjs package in this planslate-yjs public API compatibility promiseDecision boundaries:
slate-yjs package owns Yjs schema, provider integration, awareness,
relative position conversion, canonical Y reconcile, and adapter-specific
mapping.Read from .tmp/slate-v2:
packages/slate/src/interfaces/editor.tspackages/slate/src/core/public-state.tspackages/slate/src/core/editor-extension.tspackages/slate/src/core/extension-registry.tspackages/slate-history/src/with-history.tspackages/slate/test/collab-history-runtime-contract.tsWhat is already good:
BaseEditor exposes read, subscribe, update, and extend.editor.update(...).tx.operations.replay(...) replays known operation types and rejects unknown
operation shapes.collab, history, origin, and selection.collaboration, skip-collab,
skip-dom-selection, skip-scroll-into-view, and
skip-selection-focus.history.mode = "skip", collab.saveToHistory = false, or
collab.origin = "remote".replace_children, remote history skip, local undo/redo rebase,
bookmark rebase, and runtime ids staying local.What is not proven enough:
../slate-yjsSteal:
Reject:
editor.applyeditor.onChangeeditor.children during connectFuture Slate v2 shape:
EditorCommit.operations,
metadata, tags, dirty runtime ids, and snapshot only when needededitor.update(tx => tx.operations.replay(...), { metadata, tag })tx.value.replace(...) when Y event deltas are
incomplete or ambiguous../lexical/packages/lexical-yjsSteal:
Reject:
Future Slate v2 shape:
collaboration, skip-scroll-into-view, and
skip-selection-focus tags../y-prosemirrorSteal:
Reject:
Future Slate v2 shape:
Chosen option: keep raw Slate core unopinionated and add readiness contracts before package work.
Rejected option: port legacy slate-yjs as-is.
Why rejected: it depends on the exact mutable/editor-object hooks v2 is removing. It would smuggle legacy Slate's plugin model back into v2 and force future code to debug sync through side effects.
Rejected option: move Yjs schema, awareness, or cursor policy into raw Slate.
Why rejected: that would make raw Slate opinionated and would make Plate and other adapters pay for Yjs even when they use a different collaboration layer.
Rejected option: add moved-node payloads to move_node now.
Why rejected: current proof shows remote move_node replay and runtime-id
rebasing work. Adding payloads would bloat the operation shape to satisfy one
transport style before the adapter proves it cannot reconstruct state cleanly.
Add a focused core test with a fake collaboration extension.
Acceptance:
editor.extend(...)skip-collab suppresses exportThis proves the future slate-yjs package can be cleanly mounted and unmounted.
Add the #5771-class test before package work.
Acceptance:
This is the current biggest "now or never" risk.
Add a core matrix inspired by y-prosemirror position tests.
Acceptance:
replace_childrenThe future Yjs adapter can own actual Y.RelativePosition, but core must prove
the Slate-side anchor substrate is stable.
Add a test that remote sync can replace a canonical snapshot without local history pollution.
Acceptance:
editor.update(tx => tx.value.replace(...), remoteCollabOptions) produces one
commitcollaborationThis is the escape hatch for Y event paths that cannot be translated safely.
Add a fake adapter test for lifecycle semantics.
Acceptance:
editor.children, editor.apply, or editor.onChangeAdd React/browser-facing proof only after the core tests are green.
Acceptance:
This blocks provider/cursor UI work, not raw core package readiness.
Add one collab-readiness benchmark before package work. Do not scatter single-purpose benchmark files.
Cohorts:
Measure:
The bar is not "faster than Yjs"; the bar is bounded Slate-side overhead.
Pass status: complete.
New score after this pass: 0.92.
Applicability: applied.
Existing benchmark lanes inspected:
.tmp/slate-v2/scripts/benchmarks/README.md.tmp/slate-v2/scripts/benchmarks/core/current/transaction-execution.mjs.tmp/slate-v2/scripts/benchmarks/core/current/refs-projection.mjs.tmp/slate-v2/scripts/benchmarks/core/current/query-ref-observation.mjs.tmp/slate-v2/scripts/benchmarks/core/current/history-retained-memory.mjs.tmp/slate-v2/scripts/benchmarks/shared/stats.mjsExisting lanes already cover:
Do not duplicate those lanes. The missing proof is collaboration-shaped composition: fake adapter export, remote import metadata, bookmark load, history skip, canonical reconcile, pause/reconnect cleanup, and heap tags in one lane.
Add during ralph execution, not in this planning pass:
.tmp/slate-v2/scripts/benchmarks/core/current/collab-readiness.mjsbench:core:collab-readiness:local: bun ./scripts/benchmarks/core/current/collab-readiness.mjs.tmp/slate-v2/tmp/slate-collab-readiness-benchmark.jsonUse scripts/benchmarks/shared/stats.mjs for summaries. Do not add another
stats helper.
Primary repeated units:
tx.operations.replaytx.value.replace| Cohort | Blocks | Remote ops | Bookmarks | Purpose |
|---|---|---|---|---|
| normal | 100 | 50 | 25 | Common small editor with collaboration burst. |
| large | 1,000 | 100 | 100 | Real app document with active anchors. |
| stress | 10,000 | 250 | 250 | Large document import/replay pressure before package work. |
| pathological | 1 | 1,000 same-node inserts | 50 | #5771-style hot text node pressure. |
The script should produce these lanes for each cohort:
localExportCommitMs: local editor.update plus fake adapter commit export.remoteReplayBatchMs: one remote update with all operations replayed in one
transaction.remoteReplaySeparateMs: same operations replayed as separate updates.bookmarkRebaseMs: remote replay while active bookmarks/range refs exist,
then resolve them.canonicalReplaceMs: tx.value.replace with remote collaboration metadata.historySkipMs: same remote import with withHistory, asserting undo stack
stays clean.connectDisconnectHeapDeltaBytes: repeated fake adapter extend/unextend with
optional GC, reporting heap delta and listener cleanup.Required invariant checks inside the benchmark:
collaboration tag and collab.origin = "remote"Initial policy: calibration-only, not a release gate until three clean baseline runs exist.
Artifact must include:
thresholdPolicy: {
mode: 'calibration-only',
releaseGate: false,
repeatRunsRequiredBeforeEnforcement: 3,
}
Red flags that block slate-yjs package creation even before enforced numeric
thresholds:
nullRun these from /Users/zbeyens/git/slate-v2 after the new tests/benchmark land:
bun run bench:core:transaction:local
bun run bench:core:refs-projection:local
bun run bench:core:query-ref-observation:local
bun run bench:core:history-retained-memory:local
bun run bench:core:collab-readiness:local
The first four are regression context. The fifth is the new package-start gate.
js-length-check-first, js-early-exit,
js-set-map-lookups, js-combine-iterations, rerender-defer-reads,
client-event-listeners for future React/package work.Activity, transitions, and
deferred values do not solve core replay, selection, or history correctness.Plan delta:
ralph execution acceptance before slate-yjs
package creation.Pass status: complete.
New score after this pass: 0.84.
The existing core test suite already proves enough extension and metadata substrate that the P0 execution should not waste time retesting generic extension mechanics.
Already covered by current Slate v2 tests:
extension-methods-contract.ts: register output, runtime state, cleanup
signal, peer dependencies, conflicts, and hard rejection of legacy methods
and public commands extension shapes.extension-namespaces-contract.ts: extension state/tx groups install without
mutating the editor object and cleanly unextend.transaction-contract.ts: operation middleware sees transaction apply and
tx.operations.replay, and extension commit listeners stop receiving commits
after cleanup.commit-metadata-contract.ts: collaboration tags, origin metadata,
history/selection metadata, frozen metadata, grouped updates, and full-document
replace dirtiness.write-boundary-contract.ts: no direct primitive writers, no public
editor.apply, and imported operations replay only through
tx.operations.replay.collab-history-runtime-contract.ts: deterministic peer replay, remote
history skip, undo/redo rebase, bookmark rebase, runtime-id locality, and
replace_children import.Therefore the execution queue should add four focused tests plus one optional React/browser follow-up. No public API hardening is required before these tests. If a test fails because the public surface is insufficient, that failure becomes the API change proposal.
Target file:
.tmp/slate-v2/packages/slate/test/collab-adapter-extension-contract.tsPublic APIs only:
createEditordefineEditorExtensioneditor.extendeditor.updatetx.operations.replayEditor.getLastCommitEditor.getSnapshotFake adapter shape:
connected: booleanpaused: booleanexports: Operation[][]remoteImports: numberoriginClientId: stringskip-collabcollab.origin === "remote"collaborationeditor.update(tx => tx.operations.replay(remoteOps), remoteOptions)Required assertions:
skip-collab local update exports zero batchesWhy this matters:
slate-yjs patching
editor.apply and editor.onChange.Target file:
.tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts.tmp/slate-v2/packages/slate/test/collab-selection-stress-contract.tsUse the separate file if the test grows past a few scenarios.
Scenarios:
oneinsert_text operations at offset 0!! lands after the original local caret content, not at stale
offset 311Required metadata:
{
metadata: {
collab: { origin: 'remote', saveToHistory: false },
history: { mode: 'skip' },
selection: { dom: 'preserve', focus: false, scroll: false },
},
tag: ['collaboration', 'remote-import'],
}
Required assertions:
Editor.getSnapshot(editor).selection is valid or nullWhy this matters:
Target file:
.tmp/slate-v2/packages/slate/test/collab-bookmark-position-contract.tsDocument shape:
Matrix:
replace_childrenRequired assertions:
null, not stale pathsWhy this matters:
Y.RelativePosition, but Slate must first
prove the model-side anchor/bookmark behavior is deterministic.Target file:
.tmp/slate-v2/packages/slate/test/collab-canonical-reconcile-contract.tsCore operation:
editor.update((tx) => {
tx.value.replace({
children: remoteCanonicalChildren,
selection: currentSelectionOrNull,
marks: null,
});
}, remoteOptions);
Required assertions:
replacecollaboration tag and remote collab metadatawithHistory undo stack is not pollutedWhy this matters:
y-prosemirror does not trust incremental events for every case; it can
render canonical Y state and reconcile. Slate v2 needs the same escape hatch.Priority: P1, after the P0 package-level tests.
Target:
slate-react contract test if the React runtime already consumes
skip-scroll-into-view / skip-selection-focusRequired assertions:
Why this matters:
No immediate public API hard cut is needed before the P0 tests.
Keep:
editor.extend(...)defineEditorExtension(...)editor.update(...)tx.operations.replay(...)tx.value.replace(...)Do not add:
editor.applyeditor.onChangeY.Doc handles in slatemove_node before adapter proof demands itPotential API gap to watch:
Pass status: complete.
New score after this pass: 0.89.
Steelman verdict: keep the "no new public API before P0 tests" decision, but make it stricter. The execution must prove the future adapter can be built from generic extension APIs. If the P0 adapter test needs private state, runtime monkey-patching, or metadata unavailable from public commits, that failing test becomes the API-change request.
| Decision | Strongest fair objection | Viable alternatives | Why current decision wins | Proof required | Verdict |
|---|---|---|---|---|---|
Do not add public editor.apply | A collaboration adapter needs to intercept every op; commit listeners may be too late. | Restore public editor.apply; add adapter-specific op interceptors; use operation middleware. | Public editor.apply is exactly the legacy escape hatch v2 cut. Operation middleware already routes tx.operations.replay; commit listeners see typed metadata and tags for export control. | collab-adapter-extension-contract.ts proves local export and remote import loop suppression without editor.apply. | keep |
Do not add public editor.onChange | Adapter authors know the old onChange flush model; commit listeners may feel unfamiliar. | Restore onChange; add onCommit; keep extension commit listeners. | Extension commit listeners are already the onCommit shape, with cleanup, ordering, frozen commit data, and optional snapshot. A second public callback surface would split truth. | Adapter test exports once per local commit and cleanup stops future export. | keep |
| Do not add adapter-specific methods on the editor object | A first-party slate-yjs package may want ergonomic editor.connectYjs() / editor.disconnectYjs(). | Editor object methods; extension editor group; standalone adapter controller. | Raw Slate should not grow Yjs nouns. If ergonomics are needed, the package can expose a controller or extension editor group without polluting core. | P0 adapter lifecycle test uses extension runtime state and cleanup; future package docs can expose a package-level wrapper. | keep |
| Do not pass update metadata into operation middleware yet | Per-operation middleware cannot know whether the current op came from remote import. | Add metadata to middleware context now; use commit listener for export gating; add tx-scoped metadata getter. | Export gating belongs at commit level because Yjs batches and history decisions are commit-level. Adding metadata to middleware before a failing test would widen hot-path API for speculation. | P0 test proves remote imports do not re-export via commit metadata. If an actual transform middleware needs metadata, add it with a failing adapter test. | keep, watch |
Do not add raw Y.Doc / provider / awareness handles to Slate core | A first-party package could be cleaner if core understands Yjs lifecycle. | Core Yjs handles; extension capabilities; package-local controller. | Core must stay collaboration-backend agnostic. slate-yjs can own Yjs lifecycle through extension options, runtime state, cleanup signal, and package exports. | Adapter lifecycle test proves connect, pause, reconnect, cleanup without core Yjs nouns. | keep |
Do not add moved-node payloads to move_node now | OT/Yjs transports often benefit from the moved node payload; #3741 asks for it directly. | Add payload; canonical reconcile fallback; adapter reconstructs from Y state. | Current v2 proves remote move_node replay and runtime-id rebase. A payload bloats every move op for one transport theory before the adapter proves the need. | P0 canonical reconcile plus bookmark matrix. If adapter cannot reconstruct moves without payload, add a focused operation-shape proposal. | keep |
| Do not make cursor/awareness a raw Slate API | Collaboration without cursors feels incomplete. | Raw cursor store; slate-react package hook; Plate/product cursor UI. | Cursor rendering is UI policy. Raw core should supply stable anchors/bookmarks and side-effect metadata only. | P0 bookmark matrix and P1 remote side-effect proof. | keep |
Accepted revision from this pass:
Dropped choices:
collaboration tx/state groups to raw Slate before package work.Unresolved:
slate-react honors them.No claim should be promoted by the planning pass alone. After Ralph execution
lands and verifies the P0 collaboration-selection proof, #5771 can move to
Improves; no Fixes claim is allowed without a real adapter/browser repro.
Keep:
#5771 as related/needs focused collaboration-selection proof.#5533 as related. Operation replay supports collaboration substrates, but
Slate does not ship a first-party non-Yjs collaboration protocol.#3741 as related. Do not add moved-node payloads without adapter proof.#4477 as improves only through annotation/anchor substrate; product-level
collaborative comments stay outside raw Slate.#3715 as docs/example pressure for the later package/docs lane.If P0 tests land and pass, update:
docs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/ledgers/fork-issue-dossier.mddocs/slate-v2/references/pr-description.mddocs/slate-issues/gitcrawl-v2-sync-ledger.mdDo not touch docs/slate-issues/gitcrawl-live-open-ledger.md; it is generated
live input.
Pass status: complete.
New score after this pass: 0.88.
Ledger decision: preserve current classifications. This plan changes future proof requirements, not current issue claims. No ledger edits are required until the P0 tests actually land and pass.
Evidence read:
docs/slate-issues/gitcrawl-live-open-ledger.md still lists current open
collaboration rows: #5771, #5533, #4477, #3741, #3715, and #3482.docs/slate-v2/ledgers/issue-coverage-matrix.md keeps #5771 and #5533
as Related.docs/slate-v2/ledgers/issue-coverage-matrix.md keeps #3741 as Related.docs/slate-v2/ledgers/issue-coverage-matrix.md keeps #4477 as
Improves.docs/slate-issues/gitcrawl-v2-sync-ledger.md keeps #3715 as
not-claimed.docs/slate-issues/gitcrawl-v2-sync-ledger.md keeps #3482 as
cluster-synced.Exact decisions:
| Issue | Current ledger state | This plan decision |
|---|---|---|
#5771 | Related / cluster-synced | Promote to Improves only after P0 proof lands. Exact closure still waits for provider/browser proof. |
#5533 | Related | Keep. v2 operation replay is collaboration substrate, not a first-party OT or non-Yjs collaboration protocol. |
#3741 | Related | Keep. Do not add move_node.node payloads before adapter proof shows current replay/canonical reconcile is insufficient. |
#4477 | Improves | Keep. Annotation/bookmark substrate helps, but collaborative comments remain product/Plate/package policy. |
#3715 | not-claimed | Keep. Docs/examples pressure belongs to the later slate-yjs package/docs lane, not raw core readiness. |
#3482 | cluster-synced | Keep. Void children/collaboration pressure is covered by core model/selection architecture; only promote if the P0 bookmark matrix exposes a void-adjacent gap. |
No Fixes #... claims are allowed from this plan. The strongest honest
claim after this planning pass is "readiness work queued."
| Objection | Answer | Verdict |
|---|---|---|
| "Why not just port slate-yjs?" | Because it depends on mutable editor hooks v2 deliberately removed. Porting that shape would reintroduce legacy coupling. | reject |
"Why no move_node.node payload for #3741?" | Existing v2 proof covers remote move replay and runtime-id rebasing. Payload expansion needs adapter proof first. | keep current op |
| "Why not put Yjs in raw Slate?" | Raw Slate should remain unopinionated. Yjs belongs in a package extension. | reject |
| "Is this overbuilding before a package exists?" | No. The P0 tests are the minimum proof that the package can be clean instead of a monkey-patch wrapper. | keep |
| "Can cursor UI wait?" | Yes. Core readiness needs stable anchors and side-effect policy. Cursor UI belongs to React/Plate/package work. | defer UI |
Intent boundary pass: applied. Package creation, provider UX, and Plate policy are out of scope.
Steelman pass: applied. The strongest objections are that adapter authors may
need editor.apply, per-operation metadata, or Yjs-specific lifecycle nouns.
Rejected for now because the generic extension API should prove itself through
P0 tests first.
High-risk deliberate pass: applied. Collaboration touches data integrity, selection, history, provider lifecycle, and package boundaries.
Performance-oracle: applied. The plan now requires bounded operation replay, canonical reconcile, bookmark update, history skip, and connect/disconnect heap rows before package creation.
Performance skill: applied. Cohorts, repeated-unit budgets, memory tags, and calibration policy are explicit in the collab-readiness benchmark lane.
Vercel React best practices: applied only for future React/browser side effects. No React implementation in this pass.
TDD: applied as execution rule. Each P0 row starts with a failing behavior test through public APIs, then implementation if needed.
Research-wiki: maintain mode is enough. Existing Yjs/collaboration research is adequate for this first pass; add a dedicated research page only if later passes find contradiction or missing corpus evidence.
Current pass: final readiness scoring pass, complete.
Next pass: none for slate-ralplan.
Next owner:
ralph executes the accepted core readiness queue in .tmp/slate-v2.ralph keeps slate-yjs package creation blocked until P0 tests and the
collab-readiness benchmark are green.This done state means the plan is ready for execution. It does not mean core
is package-ready yet.
Pass status: complete.
Final score: 0.94.
Decision: planning is complete and execution-ready. Do not create a
slate-yjs package yet.
Why this can close:
.tmp/slate-v2 files and
focused tests.Fixes #... claim is promoted until
proof lands.What remains before package creation:
Ralph handoff:
.tmp/slate-v2.plate-2 issue claims until passing proof justifies a ledger
update.slate-yjs package until all P0 rows and the benchmark gate
pass.Status: complete.
Current owner: .tmp/slate-v2/packages/slate.
Current pass: p0-collab-adapter-extension-contract.
Continuation prompt:
active goal state.
Scope:
.tmp/slate-v2/packages/slate/test/collab-adapter-extension-contract.ts.Next action:
.tmp/slate-v2/packages/slate/test/collab-adapter-extension-contract.ts.Evidence:
bun test ./packages/slate/test/collab-adapter-extension-contract.ts
# 1 pass, 0 fail
Verdict:
skip-collab, and cleanup listener
removal.Next action:
.tmp/slate-v2/packages/slate/test/collab-selection-stress-contract.ts.Status: complete.
Current owner: .tmp/slate-v2/packages/slate.
Changed file:
.tmp/slate-v2/packages/slate/test/collab-selection-stress-contract.ts.
Evidence:
bun test ./packages/slate/test/collab-selection-stress-contract.ts
# 5 pass, 0 fail
Verdict:
Next action:
.tmp/slate-v2/packages/slate/test/collab-bookmark-position-contract.ts.Status: complete.
Current owner: .tmp/slate-v2/packages/slate.
Changed file:
.tmp/slate-v2/packages/slate/test/collab-bookmark-position-contract.ts.
Evidence:
bun test ./packages/slate/test/collab-bookmark-position-contract.ts
# 6 pass, 0 fail
Verdict:
null.replace_children remote replay preserve or rebase
surviving bookmark ranges.unref().Next action:
.tmp/slate-v2/packages/slate/test/collab-canonical-reconcile-contract.ts.Status: complete.
Current owner: .tmp/slate-v2/packages/slate.
Changed file:
.tmp/slate-v2/packages/slate/test/collab-canonical-reconcile-contract.ts.
Evidence:
bun test ./packages/slate/test/collab-canonical-reconcile-contract.ts
# 2 pass, 0 fail
Verdict:
tx.value.replace publishes one replace commit with
collaboration metadata and skips history.Next action:
.tmp/slate-v2/packages/slate-react handling for
skip-scroll-into-view, skip-selection-focus, and
metadata.selection, then add the smallest proof or queue the exact owner.Status: complete.
Current owners:
.tmp/slate-v2/packages/slate-react/src/editable/selection-side-effect-policy.ts.tmp/slate-v2/packages/slate-react/src/editable/selection-controller.ts.tmp/slate-v2/packages/slate-react/src/editable/selection-reconciler.ts.tmp/slate-v2/packages/slate-react/src/editable/mutation-controller.ts.tmp/slate-v2/packages/slate-react/src/editable/dom-repair-queue.tsChanged tests:
.tmp/slate-v2/packages/slate-react/test/app-owned-customization.tsx.tmp/slate-v2/packages/slate-react/test/selection-side-effect-policy-contract.ts.tmp/slate-v2/packages/slate-react/test/selection-side-effect-policy-contract.test.tsEvidence:
bun test:vitest --run test/app-owned-customization.test.tsx test/selection-side-effect-policy-contract.test.ts
# 2 files passed, 8 tests passed
Verdict:
scrollSelectionIntoView is still called for normal local
selection updates.Next action:
.tmp/slate-v2/scripts/benchmarks/core/current/collab-readiness.mjs and
bench:core:collab-readiness:local.Status: implementation complete; default verification still runs in the final sweep.
Current owners:
.tmp/slate-v2/scripts/benchmarks/core/current/collab-readiness.mjs.tmp/slate-v2/package.jsonEvidence:
SLATE_COLLAB_READINESS_ITERATIONS=1 bun run bench:core:collab-readiness:local
# passed and wrote tmp/slate-collab-readiness-benchmark.json
Verdict:
Next action:
Status: complete.
Current owners:
docs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/ledgers/fork-issue-dossier.mddocs/slate-v2/references/pr-description.mddocs/slate-issues/gitcrawl-v2-sync-ledger.mdVerdict:
#5771 moved from Related / cluster-synced to Improves /
improves-claimed.Fixes #5771 claim was added. The new proof covers the Slate-side
collaboration-selection substrate; exact upstream provider/browser closure
remains unclaimed.32.Next action:
Source inspected from live local checkouts:
../slate-yjs/packages/core/src/plugins/withYjs.ts../slate-yjs/packages/core/src/applyToYjs/index.ts../slate-yjs/packages/core/src/applyToSlate/index.ts../slate-yjs/packages/core/src/utils/position.ts../slate-yjs/packages/core/src/plugins/withYHistory.ts../slate-yjs/packages/core/src/plugins/withCursors.ts../lexical/packages/lexical-yjs/src/Bindings.ts../lexical/packages/lexical-yjs/src/SyncEditorStates.ts../lexical/packages/lexical-yjs/src/SyncCursors.ts../lexical/packages/lexical-yjs/src/SyncV2.ts../y-prosemirror/src/sync-plugin.js../y-prosemirror/src/positions.js../y-prosemirror/src/undo-plugin.js../y-prosemirror/src/cursor-plugin.js.tmp/slate-v2/packages/slate/src/interfaces/editor.ts.tmp/slate-v2/packages/slate/src/core/public-state.ts.tmp/slate-v2/packages/slate/src/core/editor-extension.ts.tmp/slate-v2/packages/slate/src/core/extension-registry.ts.tmp/slate-v2/packages/slate-history/src/with-history.ts.tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.tsFinal verification sweep:
cd /Users/zbeyens/git/slate-v2 && bun lint:fix
# Checked 1616 files. Fixed 1 file.
cd /Users/zbeyens/git/slate-v2 && bun --filter slate typecheck
# slate typecheck: Exited with code 0
cd /Users/zbeyens/git/slate-v2 && bun --filter slate-react typecheck
# slate-react typecheck: Exited with code 0
cd /Users/zbeyens/git/slate-v2 && bun test \
./packages/slate/test/extension-methods-contract.ts \
./packages/slate/test/extension-namespaces-contract.ts \
./packages/slate/test/transaction-contract.ts \
./packages/slate/test/commit-metadata-contract.ts \
./packages/slate/test/write-boundary-contract.ts \
./packages/slate/test/collab-history-runtime-contract.ts \
./packages/slate/test/collab-adapter-extension-contract.ts \
./packages/slate/test/collab-selection-stress-contract.ts \
./packages/slate/test/collab-bookmark-position-contract.ts \
./packages/slate/test/collab-canonical-reconcile-contract.ts
# 71 pass, 0 fail
cd /Users/zbeyens/git/slate-v2/packages/slate-react && bun test:vitest --run \
test/app-owned-customization.test.tsx \
test/selection-side-effect-policy-contract.test.ts
# 2 files passed, 8 tests passed
cd /Users/zbeyens/git/slate-v2 && bun run bench:core:collab-readiness:local
# passed; wrote tmp/slate-collab-readiness-benchmark.json
cd /Users/zbeyens/git/slate-v2 && bun run bench:core:transaction:local
# passed; updateReplayMeanMs 0.08, separateUpdateMeanMs 0.22
cd /Users/zbeyens/git/slate-v2 && bun run bench:core:refs-projection:local
# passed
cd /Users/zbeyens/git/slate-v2 && bun run bench:core:query-ref-observation:local
# passed
cd /Users/zbeyens/git/slate-v2 && bun run bench:core:history-retained-memory:local
# passed
cd /Users/zbeyens/git/slate-v2 && bun lint
# Checked 1616 files. ESLint passed.
Completion check:
cd /Users/zbeyens/git/plate-2 && node tooling/scripts/completion-check.mjs
# [completion-check] complete: /Users/zbeyens/git/plate-2/active goal state