{"id":"collaborative-editor","schemaVersion":1,"revision":"2026-09-14.1","status":"researching","title":"Can a Lexical editor collaborate through Yjs on Durable Objects?","area":"Composition · realtime systems","summary":"The component capabilities are documented. Provider compatibility and durable recovery are still unresolved integration work.","constraints":["Two authenticated users edit one rich-text document.","Edits must survive a backend restart; reconnect must recover missed updates.","Do not assume a generic WebSocket server implements the Yjs provider protocol."],"collection":{"agent":"Codex","model":"GPT-6","resolvedModelRevision":null,"method":"official-documentation-review","checkedAt":"2026-09-14","review":"unreviewed"},"subjects":[{"id":"lexical","name":"Lexical","role":"Editor binding","url":"https://lexical.dev/docs/collaboration/react"},{"id":"yjs","name":"Yjs / y-websocket","role":"Document synchronization","url":"https://docs.yjs.dev/ecosystem/connection-provider/y-websocket"},{"id":"cloudflare-do-sqlite","name":"Durable Objects + SQLite","role":"Proposed room host and storage","productId":"cloudflare-do-sqlite"}],"sources":[{"id":"lexical-react","title":"Lexical React collaboration","url":"https://lexical.dev/docs/collaboration/react","locator":"Getting started; Initial editor content","checkedAt":"2026-09-14","version":"Living documentation; runtime versions not pinned"},{"id":"y-provider","title":"Yjs WebSocket provider","url":"https://docs.yjs.dev/ecosystem/connection-provider/y-websocket","locator":"Client API","checkedAt":"2026-09-14","version":"Living documentation; runtime versions not pinned"},{"id":"do-ws","title":"Durable Object WebSockets","url":"https://developers.cloudflare.com/durable-objects/best-practices/websockets/","locator":"How hibernation works","checkedAt":"2026-09-14","version":"Living documentation; runtime versions not pinned"}],"claims":[{"id":"lexical-binding","text":"Lexical documents React collaboration bindings built on Yjs.","scope":"React integration in current upstream documentation.","kind":"documented","evidenceIds":["lexical-react"]},{"id":"lexical-provider","text":"Lexical identifies y-websocket as its officially supported connection provider.","scope":"This does not establish compatibility with a custom Durable Object server.","kind":"documented","evidenceIds":["lexical-react"]},{"id":"y-awareness","text":"The y-websocket client accepts an awareness instance and exposes connection and synchronization state.","scope":"Client provider API; no tested server implementation selected.","kind":"documented","evidenceIds":["y-provider"]},{"id":"do-hibernation","text":"Durable Objects can keep WebSocket clients connected during hibernation while resetting in-memory state.","scope":"Hibernation API; an in-memory Y.Doc is not a persistence strategy.","kind":"documented","evidenceIds":["do-ws"]}],"alternatives":[{"title":"Standard y-websocket baseline","tradeoff":"Use the documented provider/server arrangement to establish client behavior before replacing the backend. This is a control experiment, not evidence about Durable Objects."},{"title":"Custom Durable Object adapter","tradeoff":"Potential room-local coordination, but protocol handling, persistence and authorization remain work to implement and verify."}],"gaps":["Select and pin a compatible server adapter or implement its protocol.","Specify when a received edit becomes durable and how state is reconstructed.","Define room authorization, revocation, and server-side initialization."],"recipe":{"id":"lexical-do-probe","title":"Probe a Durable Object collaboration adapter","status":"blocked-draft","dependencyClaimIds":["lexical-binding","lexical-provider","y-awareness","do-hibernation"],"steps":[{"title":"Establish the baseline","instruction":"Pin Lexical, Yjs and y-websocket versions. Start the upstream collaboration example in two independent browsers; retain the lockfile and configuration.","expected":"A repeatable baseline environment is recorded."},{"title":"Select the room adapter","instruction":"Document the exact client/server message contract and authentication boundary. Do not substitute an echo server. This prerequisite is unresolved.","expected":"A pinned adapter and protocol fixtures exist before proceeding."},{"title":"Specify durable recovery","instruction":"Define persisted updates, snapshot recovery, and acknowledgement semantics. Separate hibernation from process restart checks.","expected":"A recovery design with an explicit durable-write boundary."},{"title":"Run the acceptance matrix","instruction":"Capture convergence, reconnect, restart and unauthorized-room results with sanitized logs and versions.","expected":"Each check has an observed result or explicit not-attempted state."}],"checks":[{"id":"convergence","expected":"Concurrent edits converge to identical document state."},{"id":"reconnect","expected":"A disconnected client recovers missed edits after reconnect."},{"id":"restart","expected":"Edits acknowledged as durable survive the specified backend restart."},{"id":"isolation","expected":"An unauthorized client cannot read or write the room."}]},"executions":[]}