[v2] Pending deferral through component: deeper cursor-boundary propagation fix
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Quiet
- Tech stack
- typescript
- Domain
- build-system, frontend, testing
Research direction
Start with packages/qwik/src/core/use/use-cursor-boundary.ts:38-52 and the existing suspense.e2e.ts and suspense.spec.tsx suites; run the relevant Suspense tests to understand the ErrorBoundary coverage. Add the non-ErrorBoundary client-deferral case, then follow the copy pattern for #8790, #8791, and #8772 to extract the fix to build/v2 with .changeset/suspense-deferral-through-component.md. If pursuing the deeper follow-up, inspect cursor-walker.ts:206, vnode-diff.ts around expectSlot, and vnode-dirty.ts, then benchmark and run the full Suspense suite.
Written by the indexing model from the issue text.
Description
Context
The addCursorBoundary walk-up in packages/qwik/src/core/use/use-cursor-boundary.ts:38-52 (fix 50c9666e2, landed on the ErrorBoundary PR #8745 branch) makes a suspending child register against the nearest cursor boundary by walking slotParent || parent. It fixes a real bug — a <Suspense> whose deferred child sits behind an intervening stateful component (e.g. an <ErrorBoundary>, which adds dirty component frames) did not show the Suspense fallback on client nav and instead blocked. The fix is Suspense-generic, but it currently only has ErrorBoundary-shaped coverage.
Three related follow-ups:
1. Add a non-EB walk-up test
suspense.e2e.ts / suspense.spec.tsx have no intervening-component client-deferral case (verified untouched vs base). Add a plain-wrapper test: a non-EB stateful component (e.g. useStore + useContextProvider) projecting a suspending child, asserting the Suspense fallback shows during client navigation. The user-facing behavior is already proven by the EB suites; this covers the generic path.
2. Extract the fix to build/v2
It's EB-independent and self-contained (one file + .changeset/suspense-deferral-through-component.md), so it fits the copy-not-move extraction pattern used for #8790 / #8791 / #8772. Blocked on (1) — a standalone PR needs the non-EB test.
3. Deeper follow-up: repair downward cursor-boundary propagation
The registration-site walk is a bounded mitigation on the rare blocking-promise path (sole caller: cursor-walker.ts:206, inside the isPromise(result) branch — not the hot dirty-mark path). The cleaner fix is to repair the downward NEAREST_CURSOR_BOUNDARY inheritance itself, so projected children of a dirty intervening component inherit the boundary — likely expectSlot (vnode-diff.ts ~735, which overwrites the slot boundary to null instead of inheriting the parent's) and/or setNearestCursorBoundary propagation (vnode-dirty.ts). That path runs on every dirty-mark, so it needs benchmarking + the full suspense suite before it can replace the registration-site walk.
None of this blocks #8745 (the shipped behavior is proven by the EB suites).
- Dominant language
- TypeScript
- Stars
- 22.1k
- Forks
- 1.4k
- Avg merge
- 1d 15h
- Merged PRs (30d)
- 98
Getting set up
Starts the project's dev container in your browser, under your own GitHub account.
- Ships a Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from QwikDev/qwik
-
docs router V2
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
DX enhancement V2
Difficulty 2/5 1-3 hours Newbie friendliness 64/100
QwikDev/qwik#8480 · 2 comments ·
Maintainers usually reply within 1 day
-
[🐞] SSG (rc.0+) ignores ssr.noExternal: bundled deps are left external in the new "ssg" environmentOpen
Difficulty 4/5 3-5 days Newbie friendliness 52/100
QwikDev/qwik#9183 · 1 comment ·
Maintainers usually reply within 1 day
-
[🐞] <Pending> child reading a signal from its owner breaks when the owner re-renders (consumerBackRef[_EFFECT_BACK_REF].set is not a function)Possibly taken @intellix claimed this 3 days ago. Open
Difficulty 3/5 1-2 days Newbie friendliness 35/100
Maintainers usually reply within 1 day
-
[🐞] Async useComputed$ resolved in an out-of-order <Pending> re-runs on the client at the first unrelated re-renderPossibly taken @intellix claimed this 3 days ago. Open
Difficulty 4/5 3-5 days Newbie friendliness 25/100
Maintainers usually reply within 1 day
Similar issues
-
Difficulty 1/5 Under an hour Newbie friendliness 82/100
siyuan-note/siyuan#20313 ·
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 92/100
alunduil/projects-v2-sync#14 ·
-
Service process inherits the caller's cwd at first use, holding that folder open on Windows (EBUSY)Open
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
DevTools page styles leak into the host app in developmentPossibly taken @onmax claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
nuxt-modules/better-auth#567 · 1 comment ·
Maintainers usually reply within 1 day