All bugs
mediumSub-second glitches

Users with 9 notes are told they have none for 760ms

A flash of wrong content during the initial sync. Data loads fine, and it's gone before anyone can point at it.

collaborative-ai-editorFound 2026-06-23Full report in Replay QA

What the recording showed

.notes-list[data-empty="true"] rendered 'No notes yet' from 54545ms to 55306ms, while the Yjs index snapshot GET had already returned 200.

Actual

On opening the workspace the sidebar shows 'No notes yet. Create your first note.' for ~760ms (54545ms → 55306ms), then replaces it with the 9 real notes once the Yjs index document finishes syncing.

Expected

While the index document is still syncing the sidebar should show a loading indicator/skeleton (or nothing), and only fall back to the 'No notes yet' empty state after sync completes and confirms the workspace genuinely has zero notes. The user should never be told they have no notes when they do.

Session replay

Chronology of events

1
The app at 0:00.00:00.0
0:00.0

User clicks the 'Open Apple workspace' button on the landing page to enter the workspace. User interaction.

2 evidence probes (UserInteractions, InspectElement)
UserInteractions {"mode":"interactions","recordingId":"c8afcbcf-c6de-46ca-8cdc-b3fd3941b07f"}
→ # User Interactions

**Showing 1–14 of 14 interactions**

| # | Time | Type | Detail | Point |
|---|------|------|--------|-------|
| 0 | 54040ms | click | Click at (640, 399) | Point:1 |
| 1 | 64205ms | click | Click at (135, 74) | Point:2 |
| 2 | 82558ms | click | Click at (480, 21) | Point:3 |
| 3 | 106002ms | click | Click at (1257, 21) | Point:4 |
| 4 | 116515ms | click | Click at (686, 412) | Point:5 |
| 5 | 118788ms | click | Click at (1112, 21) | Point:6 |
| 6 | 135943ms | click | Click at (691, 396) | Point:7 |
| 7 | 138353ms | click | Click at (409, 21) | Point:8 |
| 8 | 162551ms | click | Click at (605, 511) | Point:9 |
| 9 | 196115ms | keypress | Key Press: / | Point:10 |
| 10 | 209555ms | click | Click at (605, 511) | Point:11 |
| 11 | 220331ms | keypress | Key Press: / | Point:12 |
| 12 | 244222ms | click | Click at (1201, 61) | Point:13 |
| 13 | 264849ms | click | Click at (1201, 61) | Point:14 |

## Next Steps

- Use DescribePoint with a point reference to inspect the code at a specific interaction
- Use Evaluate with a point reference for ad-hoc value inspection at that moment
- Use `type: 'click'` or `type: 'keypress'` to filter by interaction type
InspectElement {"point":"Point:1","element":".doc-picker-button--landing","recordingId":"c8afcbcf-c6de-46ca-8cdc-b3fd3941b07f"}
→ Element:6 is `<button type="submit" tabindex="0" class="doc-picker-button doc-picker-button--landing"></button>`.
No elements are obstructing the center point of this element.

Element:6 has 422px width and 34px height.
Margin: top 0px right 0px bottom 0px left 0px.
Padding: top 0px right 12.25px bottom 0px left 12.25px.

Distances to its parent element:
- Top overflows parent by 131.00px
- Right is aligned with parent boundary
- Bottom is aligned with parent boundary
- Left is aligned with parent boundary

### Parent Element:7

Element:7 is `<form class="landing-form"></form>`.

Element:7 has 422px width and 165px height.
Margin: top 17.5px right 0px bottom 0px left 0px.
Padding: top 0px right 0px bottom 0px left 0px.

Distances to its parent element:
- Top overflows parent by 130.06px
- Right overflows parent by 29.00px
- Bottom overflows parent by 25.50px
- Left overflows parent by 29.00px

### Parent Element:8

Element:8 is `<div class="landing-card"></div>`.

Element:8 has 480px width and 320.5625px height.
Margin: top 0px right 0px bottom 0px left 0px.
Padding: top 24.5px right 28px bottom 24.5px left 28px.

Distances to its parent element:
- Top is aligned with parent boundary
- Right is aligned with parent boundary
- Bottom overflows parent by 156.03px
- Left is aligned with parent boundary

### Parent Element:9

Element:9 is `<div class="landing-stack"></div>`.

Element:9 has 480px width and 476.59375px height.
Margin: top 0px right 0px bottom 0px left 0px.
Paddin…
2
The app at 0:00.90:00.9
0:00.9

481ms after the click (54545ms) the notes sidebar renders the empty state: '.notes-list' carries data-empty="true" and shows 'No notes yet. Create your first note.' — only 1 interactive element exists in the sidebar (the + add button). The workspace actually has 9 notes, so this empty state is false.

3
The app at 0:01.00:01.0
0:01.0

~760ms later (55306ms), once the Yjs index document finishes syncing, the empty state is replaced by the list of 9 real notes (Edge Cases, Poem, New Note, hey, ...) — the sidebar now contains 10 interactive elements. The content the user sees changes from 'no notes' to a full list.

Root cause

In assets/_workspace-Jnfl8jZH.js the notes GridList is rendered with renderEmptyState: () => <div className="notes-list__empty">No notes yet. Create your first note.</div> and children: t.map(...) where t is the notes array. The empty-state branch is gated solely on the notes array being empty — there is no loading/synced flag. During the initial Yjs index-document sync the notes array is empty, so the GridList renders the false 'No notes yet' empty state until the snapshot arrives and populates the array.

1 evidence probe (SearchSources)
SearchSources {"pattern":"No notes yet|Create your first note","recordingId":"c8afcbcf-c6de-46ca-8cdc-b3fd3941b07f","includeGenerated":true}
→ ### https://collaborative-ai-editor.brett-lamy.workers.dev/assets/_workspace-Jnfl8jZH.js
L1:101184: ...te:()=>T.jsx("div",{className:"notes-list__empty",children:"No notes yet. Create your first note."}),children:t.map(a=>T...
L1:101198: ...div",{className:"notes-list__empty",children:"No notes yet. Create your first note."}),children:t.map(a=>T.jsxs(hr,{id:a...

Root cause → actual behavior

1

At Point:19 (54545ms) the '.notes-list' element has attribute data-empty="true" and renders 'No notes yet. Create your first note.', while at Point:20 (55306ms) the same sidebar contains 10 interactive items (the 9 notes plus the add button) — proving the empty state was a transient render, not the real state.

1 evidence probe (Evaluate)
Evaluate {"point":"Point:19","expression":"(()=>{const a=document.querySelector('aside');const e=[...document.querySelectorAll('*')].find(x=>x.children.length===0&&/No notes yet/.test(x.textContent));return {emptyText:e?.textContent,interactive:a?.querySelectorAll('a,button,li').length};})()","recordingId":"c8afcbcf-c6de-46ca-8cdc-b3fd3941b07f"}
→ {
  "emptyText": "No notes yet. Create your first note.",
  "interactive": 1
}
2

The data load actually succeeds: the Yjs index-document request GET /api/yjs/docs/rooms/ws-apple-index/v3/collaboration?offset=snapshot fires at 54558ms (just after the empty state renders) and the index requests return HTTP 200, after which the notes populate. The empty state was therefore shown during a successful load, not a failed one.

1 evidence probe (NetworkRequest)
NetworkRequest {"mode":"requests","urlFilter":"ws-apple-index","recordingId":"c8afcbcf-c6de-46ca-8cdc-b3fd3941b07f"}
→ # Network Requests

**Filters:** URL contains "ws-apple-index"
**Showing 1–14 of 14 requests**

_All URLs relative to https://collaborative-ai-editor.brett-lamy.workers.dev_

| # | Time | Method | URL | Status | Duration | Type |
|---|------|--------|-----|--------|----------|------|
| 0 | 54219ms | PUT | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration | 200 | 338ms | fetch |
| 1 | 54558ms | GET | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration?offset=snapshot | — | — | fetch |
| 2 | 54750ms | GET | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration?offset=snapshot&live=sse | 200 | 60375ms | fetch |
| 3 | 54750ms | GET | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration?offset=snapshot&live=sse | 200 | 60375ms | fetch |
| 4 | 64616ms | POST | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration | 204 | 488ms | fetch |
| 5 | 65693ms | POST | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration | 204 | 270ms | fetch |
| 6 | 115127ms | GET | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration?offset=dbb4c_000000000000... | 200 | 60148ms | fetch |
| 7 | 174150ms | POST | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration | 204 | 509ms | fetch |
| 8 | 175276ms | GET | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration?offset=dbb4c_000000000000... | 200 | 60162ms | fetch |
| 9 | 184041ms | POST | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration | 204 | 243ms | fetch |
| 10 | 196154ms | POST | /api/yjs/docs/rooms/ws-apple-index/v3/collaboration | 204 | 446ms | fetch |
…

Is your app hiding bugs like this?

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