diff --git a/.changeset/rude-vans-retire.md b/.changeset/rude-vans-retire.md
new file mode 100644
index 000000000000..c092f797055d
--- /dev/null
+++ b/.changeset/rude-vans-retire.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: prevent re-activated stale batches from break reactivity
diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js
index 2956e7ed6afe..c2be841e6b1f 100644
--- a/packages/svelte/src/internal/client/reactivity/batch.js
+++ b/packages/svelte/src/internal/client/reactivity/batch.js
@@ -421,6 +421,13 @@ export class Batch {
}
static ensure() {
+ if (current_batch !== null && !batches.has(current_batch)) {
+ // A previously committed batch was reactivated via async `restore`.
+ // Treat it as inactive so a new batch can be created to process updates.
+ current_batch = null;
+ batch_values = null;
+ }
+
if (current_batch === null) {
const batch = (current_batch = new Batch());
batches.add(current_batch);
diff --git a/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/_config.js b/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/_config.js
index 50bb414afc8b..c02abb59c633 100644
--- a/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/_config.js
+++ b/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/_config.js
@@ -21,5 +21,9 @@ export default test({
input.dispatchEvent(new Event('input', { bubbles: true }));
await macrotask(6);
assert.htmlEqual(target.innerHTML, ' 3 | 12');
+ input.value = '';
+ input.dispatchEvent(new Event('input', { bubbles: true }));
+ await macrotask();
+ assert.htmlEqual(target.innerHTML, ' 4 | ');
}
});
diff --git a/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/main.svelte
index dc4a157928a3..2a36942ff256 100644
--- a/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/main.svelte
+++ b/packages/svelte/tests/runtime-runes/samples/async-resolve-stale/main.svelte
@@ -1,28 +1,32 @@