All bugs
highRender & network forensics

Yjs provider sends 56 requests that can't succeed

The visible symptom is just 'Editor disconnected'. The retry storm behind it is invisible.

collaborative-ai-editor (production)Found 2026-09-22Full report in Replay QA

What the recording showed

The first PUT returned 530 'error code: 1016' at 107988ms. 37ms later the provider (Ry.ensureDocument) started re-POSTing awareness with no backoff: 56 times, all 530.

Actual

The provider issues an unbounded series of POSTs to /api/yjs/docs/rooms/ws-apple-note-458f1c9f/v3/collaboration?awareness=default — 56 requests in this recording, starting 37ms after the initial PUT fails at 107988ms and continuing until the end of the session — and every single one returns HTTP 530 with body "error code: 1016". The editor status bar shows "Editor disconnected" and "Participants 0" throughout, and content typed by the user is never synced.

Expected

The provider should treat the document-creation failure (HTTP 530, "error code: 1016") as terminal for the session after a bounded number of retries: stop re-POSTing to /v3/collaboration, surface a clear error to the user, and reuse a single pending request instead of re-issuing per sync/awareness update. The editor should show an explicit 'could not connect' error rather than silently hammering a dead origin.

Session replay

Chronology of events

1
The app at 0:07.80:07.8
0:07.8

The user has opened the app and created a new note; the app shows the editor screen. Immediately after, the Yjs provider attempts to create the collaboration document room for note ws-apple-note-458f1c9f via PUT /api/yjs/docs/rooms/ws-apple-note-458f1c9f/v3/collaboration.

2
The app at 0:08.40:08.4
0:08.4

Document creation fails: the PUT at 107988ms returns HTTP 530 ("error code: 1016"), and the provider immediately fires the first of the doomed POSTs to /api/yjs/docs/rooms/ws-apple-note-458f1c9f/v3/collaboration?awareness=default (108045ms and 108071ms, both 530). The editor status bar already shows "Editor disconnected" and "Participants 0". Two console errors record "Failed to create document: 530 error code: 1016". From here the POSTs repeat without pause — 56 in total, every one 530.

3
The app at 0:10.50:10.5
0:10.5

Over a minute later the provider is STILL re-POSTing to the same dead endpoint (POSTs continue at 122088ms, 127489ms, 132626ms, 141739ms…, all HTTP 530). The editor status bar still reads "Editor disconnected · Chat connecting · Participants 0"; the note is empty and the user's typing is never synced. The doomed request firehose runs for the rest of the recording with no backoff, no user-visible error, and no recovery.

Root cause

The Yjs provider class Ry in assets/main-BIfeKqPq.js has no failure handling for a dead sync origin: ensureDocument() throws ("Failed to create document: 530 error code: 1016", recorded in the console.error at [workspace-index] error / [yjs-provider] error), but the provider's update/awareness handlers keep calling the sync endpoint on every document update and awareness tick regardless. Because the connection never succeeds, the doc/awareness state never reaches "synced", so each local change and awareness ping re-queues another POST to the same /v3/collaboration URL — 56 identical POSTs, all answered HTTP 530 "error code: 1016", with no backoff, deduplication, or abort. The bug in the client is that failing sync is retried indefinitely instead of being detected, capped, and reported, so a dead origin turns into an endless firehose of doomed requests and an editor that never syncs.

5 evidence probes (ProvidedData, NetworkRequest, ConsoleMessages, ReadSource)
ProvidedData {"label":"pass-1-network-finding"}
→ the same endpoint was requested 56× (https://collaborative-ai-editor.brett-lamy.workers.dev/api/yjs/docs/rooms/ws-apple-note-458f1c9f/v3/collaboration) and EVERY response that could be read failed (HTTP 530) — these requests cannot succeed, so this is not mere over-fetching: report the failing writes and the load they add, and check whether anything on the page is waiting behind them
NetworkRequest {"mode":"summary","urlFilter":"v3/collaboration","slowThresholdMs":2000}
→ # Network Requests — Summary

**Filters:** URL contains "v3/collaboration"
**Total requests:** 57 (of 86 total)
**Failed (HTTP ≥400):** 57
**Slow (≥2000ms):** 0

**Response times:** avg 36ms, median 17ms, max 372ms

## Status Distribution

| Status | Count |
|--------|-------|
| 5xx | 57 |

## Top Domains

| Domain | Count |
|--------|-------|
| collaborative-ai-editor.brett-lamy.workers.dev | 57 |

## HTTP Methods

| Method | Count |
|--------|-------|
| POST | 55 |
| PUT | 2 |

## Next Steps

- Use `mode: 'requests'` to browse the full request list with pagination
- Use `urlFilter` to narrow to failing endpoints
NetworkRequest {"mode":"detail","startTime":107000,"requestIndex":4}
→ A POST network request with ID 1251.42 was made to https://collaborative-ai-editor.brett-lamy.workers.dev/api/yjs/docs/rooms/ws-apple-note-458f1c9f/v3/collaboration?awareness=default:
<request_summary>
The response had status 530 ().
</request_summary>
Initiated at Point:42 @ 108045.00ms
Events:
  request @ 108045ms
  request-body @ 108045ms
  response @ 108416ms
  response-body @ 108417ms
  request-done @ 108417ms
Request headers:
<requestHeaders>
sec-ch-ua: 
content-type: application/octet-stream
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/108.0.5359.0 Safari/537.36
sec-ch-ua-platform: 
</requestHeaders>
Response headers:
<responseHeaders>
date: Tue, 22 Sep 2026 07:04:44 GMT
referrer-policy: same-origin
nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
server: cloudflare
x-frame-options: SAMEORIGIN
report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=iyUWk%2B47d07lpXCmBDwvjNGctaZBcaHi8sRAhWQ0r17l7nROC3MD1Ra%2FWpnR%2FnRz0FrLZqQ48eQMtdAIrbxAzM2BQd%2F2z4v6K7ImtCBBYEBsbb3XW3lVkXNwsY0kn%2FsOiMwkI6w9ToFaJD2pmDtDqx7KIiy1E3FA30LvUm8eeAH1"}]}
content-type: text/plain; charset=UTF-8
cache-control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
server-timing: cfExtPri
cf-ray: a3ef750e8f79224d-CMH
alt-svc: h3=":443"; ma=86400
priority: u=1,i=?0
content-length: 16
expires: Thu, 01 Jan 1970 00:00:01 GMT
</r…
ConsoleMessages {"mode":"summary"}
→ Console Messages Summary: 2 total messages
Breakdown: 2 errors

All 2 error/warning messages:
[console.error] (Point:1): "[workspace-index] error" {"__class":"Error","stack":"Error: Failed to create document: 530 error code: 1016\n    at Ry.ensureDocument (https://collaborative-ai-editor.brett-lamy.workers.dev/assets/main-BIfeKqPq.js:94:25955)\n    at async Ry.connect (https://collaborative-ai-editor.brett-lamy.workers.dev/assets/main-BIfeKqPq.js:94:24369)","message":"Failed to create document: 530 error code: 1016"}
[console.error] (Point:2): "[yjs-provider] error" {"__class":"Error","stack":"Error: Failed to create document: 530 error code: 1016\n    at Ry.ensureDocument (https://collaborative-ai-editor.brett-lamy.workers.dev/assets/main-BIfeKqPq.js:94:25955)\n    at async Ry.connect (https://collaborative-ai-editor.brett-lamy.workers.dev/assets/main-BIfeKqPq.js:94:24369)","message":"Failed to create document: 530 error code: 1016"}

Next Steps:
• Use mode="messages" to see the full paginated message list
• Use mode="messages", level="error" to see all error messages
• Use mode="message-detail", point="Point:N" to inspect a specific message
ReadSource {"line":34880,"path":"https://collaborative-ai-editor.brett-lamy.workers.dev/assets/main-BIfeKqPq.js"}
→  hits | L | code 
------|------|------
   0 | 34855 |        this.pendingAwareness = null) 
     | 34856 |     } 
     | 34857 |     destroy() { 
   0 | 34858 |       this.disconnect().catch(() => { 
     | 34859 |       }), 
   0 | 34860 |       this.doc.off("update", this.handleDocumentUpdate), 
   0 | 34861 |       this.awareness && this.awareness.off("update", this.handleAwarenessUpdate), 
   0 | 34862 |       super.destroy() 
     | 34863 |     } 
     | 34864 |     async flush() { 
   0 | 34865 |       this._ctx?.producer && await this._ctx.producer.flush() 
     | 34866 |     } 
     | 34867 |     docUrl() { 
   0 | 34868 |       return `${this.baseUrl}/docs/${this.docId}` 
     | 34869 |     } 
     | 34870 |     awarenessUrl(e="default") { 
   0 | 34871 |       return `${this.docUrl()}?awareness=${encodeURIComponent(e)}` 
     | 34872 |     } 
     | 34873 |     async ensureDocument(e) { 
   0 | 34874 |       const n = this.docUrl(), 
   0 | 34875 |         r = await fetch( 
     | 34876 |           n, 
     | 34877 |           { 
     | 34878 |             method: "PUT", 
     | 34879 |             headers: { 
     | *34880 |               ...this.headers, 
     | 34881 |               "content-type": "application/octet-stream" 
     | 34882 |             }, 
     | 34883 |             signal: e.controller.signal 
     | 34884 |           } 
     | 34885 |         ); 
   0 | 34886 |       if (r.status === 201 || r.status === 200) { 
   0 | 34887 |         await r.ar…

Root cause → actual behavior

1

The origin behind the /v3/collaboration endpoint is unreachable: the initial PUT document-creation request at 107988ms is answered HTTP 530 with body "error code: 1016", and ensureDocument() throws (console.error "Failed to create document: 530 error code: 1016" at Ry.ensureDocument in assets/main-BIfeKqPq.js).

2

The Yjs provider class Ry has no cap/backoff/abort for this failure: its document-update and awareness handlers keep issuing POSTs to the same /v3/collaboration?awareness=default URL on every local update and awareness tick. The first two POSTs fire within 83ms of the failed PUT, and the series continues for the whole session — 56 POSTs in total, every one answered HTTP 530 "error code: 1016" (e.g. at 122088ms, 127489ms, 132626ms, 141739ms, all 530).

3

User-visible result: the sync never succeeds, so the editor status bar shows "Editor disconnected" and "Participants 0" from 108100ms through the end of the recording (still present at 150000ms), and content the user types into the note is never saved/synced — while the client continues to burn 56 failed requests against a dead origin.

Is your app hiding bugs like this?

Replay QA explores every build, records what it finds, and writes the root cause.