sveltejs / svelte · Issue No. 18524
Since 5.55.6 (#18205, "blocking" → "merging" batch strategy), a batch that shares any written (non-derived) source with an earlier still-pending batch is merged into it (#find_earlier_batch() → #merge()). Two consequences:
$state values are updated (reads see the new values); only the DOM commit never happens.#merge() copies the merged batch's current sources into the stuck batch, so the stuck batch's "contagion set" grows with every merge. Batches that share a source only with a previously merged batch — not with anything the stuck batch originally wrote — get swallowed too. One hung async can progressively deaden the whole app, interaction by interaction.On ≤ 5.55.5 the same interaction sequence works: the blocking strategy only blocked a batch when it intersected and differed from the earlier batch's writes, and, crucially, transitively-connected batches did not block, because #is_blocked() consulted the blocker's own blocking_pending, which is empty for a batch that merely got deferred (it has no async of its own).
- svelte 5.56.4 (regression window 5.55.6 → 5.56.4; 5.55.5 OK), @sveltejs/vite-plugin-svelte 6.2.4, vite 7.3.6
- Chrome 143 / macOS (also reproduced in the svelte.dev playground)
blocking an upgrade
Relay reads this issue against the repository's contribution signals: the files it is likely to touch, how the maintainers triage work this size, and what the first contribution would exercise.
The full analysis for this issue is still being assembled. Until then, the description above and the thread on GitHub are the most reliable context.