diff --git a/.changeset/sour-jars-sniff.md b/.changeset/sour-jars-sniff.md
new file mode 100644
index 000000000000..0c710d7a7b9e
--- /dev/null
+++ b/.changeset/sour-jars-sniff.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: mark reactions of `MAYBE_DIRTY` reactions too
diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js
index 9b534d2d7190..71a76f2d567e 100644
--- a/packages/svelte/src/internal/client/reactivity/sources.js
+++ b/packages/svelte/src/internal/client/reactivity/sources.js
@@ -329,7 +329,7 @@ function mark_reactions(signal, status) {
set_signal_status(reaction, status);
// If the signal a) was previously clean or b) is an unowned derived, then mark it
- if ((flags & (CLEAN | UNOWNED)) !== 0) {
+ if ((flags & (CLEAN | UNOWNED | MAYBE_DIRTY)) !== 0) {
if ((flags & DERIVED) !== 0) {
mark_reactions(/** @type {Derived} */ (reaction), MAYBE_DIRTY);
} else {
diff --git a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/A.svelte b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/A.svelte
new file mode 100644
index 000000000000..c4b6f2e3a087
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/A.svelte
@@ -0,0 +1,10 @@
+
+
+a
\ No newline at end of file
diff --git a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/B.svelte b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/B.svelte
new file mode 100644
index 000000000000..17bc76f775de
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/B.svelte
@@ -0,0 +1,10 @@
+
+
+b
\ No newline at end of file
diff --git a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/_config.js
new file mode 100644
index 000000000000..c2f95c88827a
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/_config.js
@@ -0,0 +1,14 @@
+import { flushSync } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ html: ' a',
+ async test({ assert, target }) {
+ const btn = target.querySelector('button');
+ flushSync(() => {
+ btn?.click();
+ });
+
+ assert.htmlEqual(target.innerHTML, ` b`);
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte
new file mode 100644
index 000000000000..a898b909e131
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/derived-dirty-after-read/main.svelte
@@ -0,0 +1,22 @@
+
+
+
+
+
\ No newline at end of file