Files with spaces in the name don't show up in listings
Only one specific file is missing, and the rest of the directory looks right.
Github CloneFound 2026-09-03Full report in Replay QA
What the recording showed
A logpoint in RepositoryTree sampled 84 renders across the recording. 'chapter-one' was present in every one, and 'my file' was missing (index −1) in every one.
Actual
The docs directory listing renders only chapter-one.md, notes/draft.md, src/index.ts, guide-old.md and README.md. No entry named "my file.md" is rendered anywhere in the listing: a Logpoint inside the RepositoryTree component (84 sampled tree renders spanning the whole recording) reads the tree's rendered shadow-DOM text at URL /tree/main/docs and returns hasChapter=true but idxMyFile=-1 — the string "my file" never appears in any sampled render, including after the user scrolls to look for it below the fold.
Expected
At /maple/reading-room/tree/main/docs the listing should show every file in the docs directory, including both "chapter-one.md" and the file named exactly "my file.md", as the journey scenario requires ("verify chapter-one.md and the file named exactly my file.md are both visible and the breadcrumb path is docs"). A file whose name contains a space should render in the directory listing like any other entry.
Session replay
Chronology of events

0:13.7The user activates the 'docs' directory link in the reading-room file tree with a real pointer click; the app navigates from /maple/reading-room/tree/main to /maple/reading-room/tree/main/docs (confirmed by the URL change and the breadcrumb 'reading-room / docs').
2 evidence probes (UserInteractions, GetPointComponent)
UserInteractions {"mode":"interactions","type":"click"}
→ # User Interactions
**Filter:** click only
**Showing 1–3 of 3 interactions**
| # | Time | Type | Detail | Point |
|---|------|------|--------|-------|
| 0 | 18848ms | click | Click at (640, 429) | Point:1 |
| 1 | 32196ms | click | Click at (593, 488) | Point:2 |
| 2 | 82528ms | click | Click at (769, 360) | Point:3 |
## 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 typeGetPointComponent {"point":"Point:66"}
→ ⚠️ **React is present in this recording, but could not be analyzed** — library sources could not be located.
No component could be resolved for this point. Any conclusion about this app's React behavior would be unsupported. Treat the recording as unmeasured — this is **not** a clean bill of health.
Evidence React is present: runtime.
0:14.5The docs directory view renders (live status, breadcrumb 'reading-room / docs') but the listing shows only five entries — chapter-one.md, notes/draft.md, src/index.ts, guide-old.md, README.md. No 'my file.md' entry is rendered anywhere in the listing; a Logpoint inside the RepositoryTree component at this state reads the tree's rendered content and finds 'chapter-one' present but the string 'my file' absent (index -1).
1 evidence probe (Logpoint)
Logpoint {"line":71,"path":"http://127.0.0.1:61787/assets/RepositoryTree-BIhBVSqC.js","beginPoint":"Point:65","expression":"(() => { function collect(root, out) { root.querySelectorAll('*').forEach(el => { if (el.shadowRoot) collect(el.shadowRoot, out); }); const text = root.textContent || ''; if (text) out.push(text); return out; } const all = collect(document, []); const joined = all.join('\\n'); return { url: location.href, hasMyFileAny: joined.includes('my file'), idxMyFile: joined.indexOf('my file'), hasChapter: joined.includes('chapter-one'), hasDocs: joined.includes('docs') }; })()"}
→ Found 84 total hits at http://127.0.0.1:61787/assets/RepositoryTree-BIhBVSqC.js:71 (showing first 20)
Hit 1 at point Point:65 @ 82474.83ms:
Expression: (() => { function collect(root, out) { root.querySelectorAll('*').forEach(el => { if (el.shadowRoot) collect(el.shadowRoot, out); }); const text = root.textContent || ''; if (text) out.push(text); return out; } const all = collect(document, []); const joined = all.join('\n'); return { url: location.href, hasMyFileAny: joined.includes('my file'), idxMyFile: joined.indexOf('my file'), hasChapter: joined.includes('chapter-one'), hasDocs: joined.includes('docs') }; })()
Result: {
"url": "http://127.0.0.1:61787/maple/reading-room/tree/main",
"hasMyFileAny": false,
"idxMyFile": -1,
"hasChapter": true,
"hasDocs": true
}
Hit 2 at point Point:66 @ 82504.19ms:
Expression: (() => { function collect(root, out) { root.querySelectorAll('*').forEach(el => { if (el.shadowRoot) collect(el.shadowRoot, out); }); const text = root.textContent || ''; if (text) out.push(text); return out; } const all = collect(document, []); const joined = all.join('\n'); return { url: location.href, hasMyFileAny: joined.includes('my file'), idxMyFile: joined.indexOf('my file'), hasChapter: joined.includes('chapter-one'), hasDocs: joined.includes('docs') }; })()
Result: {
"url": "http://127.0.0.1:61787/maple/reading-room/tree/main/docs",
"hasMyFileAny": false,
"idxMyFile": -1,
"hasChapter": true,
"hasDocs": true
}
Hit 3 at point Point…Steps to reproduce
Exercise the following existing saved scenario in the app and confirm it works:
Use the Replay QA tunnel only, not a local browser URL. Sign in with the available fixture identity if prompted. Open /maple/reading-room/tree/main, verify sorted root rows, live status, reducer version 2, checkpoint, and digest. Activate the docs directory link with a real pointer or keyboard action; verify chapter-one.md and the file named exactly my file.md are both visible and the breadcrumb path is docs. Return to root using the visible breadcrumb. Observe live guide-old.md to guide.md rename and obsolete.txt delete then recreate without a document navigation; verify stale names disappear and the digest/checkpoint advance. Activate docs again, leaving the route at /tree/main/docs, then observe the populated docs directory rename to archive-docs; verify the nested view becomes empty while the old docs path is not repopulated. Check final digest/checkpoint against the visible live state, no uncaught console errors, repository /api/repos/.../events projection requests only, no /streams requests or Electric credentials, and no full-page reload for the live mutation sequence. This is a focused regression journey, not an exploration.
Additional checks:
Use the Replay QA tunnel only, not a local browser URL. Sign in with the available fixture identity if prompted. Open /maple/reading-room/tree/main, verify sorted root rows, live status, reducer version 2, checkpoint, and digest. Activate the docs directory link with a real pointer or keyboard action; verify chapter-one.md and the file named exactly my file.md are both visible and the breadcrumb path is docs. Return to root using the visible breadcrumb. Observe live guide-old.md to guide.md rename and obsolete.txt delete then recreate without a document navigation; verify stale names disappear and the digest/checkpoint advance. Activate docs again, leaving the route at /tree/main/docs, then observe the populated docs directory rename to archive-docs; verify the nested view becomes empty while the old docs path is not repopulated. Check final digest/checkpoint against the visible live state, no uncaught console errors, repository /api/repos/.../events projection requests only, no /streams requests or Electric credentials, and no full-page reload for the live mutation sequence. This is a focused regression journey, not an exploration.
If the app cannot perform this or behaves incorrectly, report FAIL describing the defect; otherwise report DONE.
Root cause
The RepositoryTree file-tree component (assets/RepositoryTree-BIhBVSqC.js, function Uc) never renders a row for the file named with a space ("my file.md") in the docs directory view: a Logpoint evaluation anchored inside the component (Point:80, ~90066ms, URL http://127.0.0.1:61787/maple/reading-room/tree/main/docs) reads the component's rendered shadow-DOM text and returns hasChapter=true while idxMyFile=-1 — the string "my file" appears in none of the 84 sampled tree renders across the recording, so the docs listing renders only chapter-one.md, notes/draft.md, src/index.ts, guide-old.md and README.md and omits the required "my file.md" entry the journey fixture seeds. The filename containing a space is dropped from the listing the tree component renders.
1 evidence probe (Logpoint)
Logpoint {"line":71,"path":"http://127.0.0.1:61787/assets/RepositoryTree-BIhBVSqC.js","beginPoint":"Point:65","expression":"(() => { function collect(root, out) { root.querySelectorAll('*').forEach(el => { if (el.shadowRoot) collect(el.shadowRoot, out); }); const text = root.textContent || ''; if (text) out.push(text); return out; } const all = collect(document, []); const joined = all.join('\\n'); return { url: location.href, hasMyFileAny: joined.includes('my file'), idxMyFile: joined.indexOf('my file'), hasChapter: joined.includes('chapter-one'), hasDocs: joined.includes('docs') }; })()"}
→ Found 84 total hits at http://127.0.0.1:61787/assets/RepositoryTree-BIhBVSqC.js:71 (showing first 20)
Hit 1 at point Point:65 @ 82474.83ms:
Expression: (() => { function collect(root, out) { root.querySelectorAll('*').forEach(el => { if (el.shadowRoot) collect(el.shadowRoot, out); }); const text = root.textContent || ''; if (text) out.push(text); return out; } const all = collect(document, []); const joined = all.join('\n'); return { url: location.href, hasMyFileAny: joined.includes('my file'), idxMyFile: joined.indexOf('my file'), hasChapter: joined.includes('chapter-one'), hasDocs: joined.includes('docs') }; })()
Result: {
"url": "http://127.0.0.1:61787/maple/reading-room/tree/main",
"hasMyFileAny": false,
"idxMyFile": -1,
"hasChapter": true,
"hasDocs": true
}
Hit 2 at point Point:66 @ 82504.19ms:
Expression: (() => { function collect(root, out) { root.querySelectorAll('*').forEach(el => { if (el.shadowRoot) collect(el.shadowRoot, out); }); const text = root.textContent || ''; if (text) out.push(text); return out; } const all = collect(document, []); const joined = all.join('\n'); return { url: location.href, hasMyFileAny: joined.includes('my file'), idxMyFile: joined.indexOf('my file'), hasChapter: joined.includes('chapter-one'), hasDocs: joined.includes('docs') }; })()
Result: {
"url": "http://127.0.0.1:61787/maple/reading-room/tree/main/docs",
"hasMyFileAny": false,
"idxMyFile": -1,
"hasChapter": true,
"hasDocs": true
}
Hit 3 at point Point…Root cause → actual behavior
The user clicks the 'docs' directory entry in the file tree; the app navigates from /maple/reading-room/tree/main to /maple/reading-room/tree/main/docs (Logpoint hit at Point:66, ~82504ms, shows location.href change to /tree/main/docs and the breadcrumb renders 'reading-room / docs').
1 evidence probe (UserInteractions)
UserInteractions {"mode":"interactions","type":"click"}
→ # User Interactions
**Filter:** click only
**Showing 1–3 of 3 interactions**
| # | Time | Type | Detail | Point |
|---|------|------|--------|-------|
| 0 | 18848ms | click | Click at (640, 429) | Point:1 |
| 1 | 32196ms | click | Click at (593, 488) | Point:2 |
| 2 | 82528ms | click | Click at (769, 360) | Point:3 |
## 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 typeAt the docs route the RepositoryTree component renders the listing without any 'my file' text: Logpoint hits at Point:80 (~90066ms) show the rendered shadow-DOM content contains 'chapter-one' (hasChapter=true) while 'my file' is absent (idxMyFile=-1), so the listing shows only five entries and the required file is invisible — the journey's docs-view verification fails.
1 evidence probe (Logpoint)
Logpoint {"line":71,"path":"http://127.0.0.1:61787/assets/RepositoryTree-BIhBVSqC.js","beginPoint":"Point:65","expression":"(() => { function collect(root, out) { root.querySelectorAll('*').forEach(el => { if (el.shadowRoot) collect(el.shadowRoot, out); }); const text = root.textContent || ''; if (text) out.push(text); return out; } const all = collect(document, []); const joined = all.join('\\n'); return { url: location.href, hasMyFileAny: joined.includes('my file'), idxMyFile: joined.indexOf('my file'), hasChapter: joined.includes('chapter-one'), hasDocs: joined.includes('docs') }; })()"}
→ Found 84 total hits at http://127.0.0.1:61787/assets/RepositoryTree-BIhBVSqC.js:71 (showing first 20)
Hit 1 at point Point:65 @ 82474.83ms:
Expression: (() => { function collect(root, out) { root.querySelectorAll('*').forEach(el => { if (el.shadowRoot) collect(el.shadowRoot, out); }); const text = root.textContent || ''; if (text) out.push(text); return out; } const all = collect(document, []); const joined = all.join('\n'); return { url: location.href, hasMyFileAny: joined.includes('my file'), idxMyFile: joined.indexOf('my file'), hasChapter: joined.includes('chapter-one'), hasDocs: joined.includes('docs') }; })()
Result: {
"url": "http://127.0.0.1:61787/maple/reading-room/tree/main",
"hasMyFileAny": false,
"idxMyFile": -1,
"hasChapter": true,
"hasDocs": true
}
Hit 2 at point Point:66 @ 82504.19ms:
Expression: (() => { function collect(root, out) { root.querySelectorAll('*').forEach(el => { if (el.shadowRoot) collect(el.shadowRoot, out); }); const text = root.textContent || ''; if (text) out.push(text); return out; } const all = collect(document, []); const joined = all.join('\n'); return { url: location.href, hasMyFileAny: joined.includes('my file'), idxMyFile: joined.indexOf('my file'), hasChapter: joined.includes('chapter-one'), hasDocs: joined.includes('docs') }; })()
Result: {
"url": "http://127.0.0.1:61787/maple/reading-room/tree/main/docs",
"hasMyFileAny": false,
"idxMyFile": -1,
"hasChapter": true,
"hasDocs": true
}
Hit 3 at point Point…Is your app hiding bugs like this?
Replay QA explores every build, records what it finds, and writes the root cause.

