diff --git a/.changeset/pretty-planes-visit.md b/.changeset/pretty-planes-visit.md
new file mode 100644
index 000000000000..d2ee0cae2efb
--- /dev/null
+++ b/.changeset/pretty-planes-visit.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: improve internal_set versioning mechanic
diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js
index cae49c18323f..27e8fd824dc5 100644
--- a/packages/svelte/src/internal/client/reactivity/sources.js
+++ b/packages/svelte/src/internal/client/reactivity/sources.js
@@ -162,7 +162,6 @@ export function internal_set(source, value) {
 		}
 
 		source.v = value;
-		source.wv = increment_write_version();
 
 		if (DEV && tracing_mode_flag) {
 			source.updated = get_stack('UpdatedAt');
@@ -180,6 +179,8 @@ export function internal_set(source, value) {
 			set_signal_status(source, (source.f & UNOWNED) === 0 ? CLEAN : MAYBE_DIRTY);
 		}
 
+		source.wv = increment_write_version();
+
 		mark_reactions(source, DIRTY);
 
 		// It's possible that the current reaction might not have up-to-date dependencies
diff --git a/packages/svelte/tests/runtime-runes/samples/writable-derived-2/_config.js b/packages/svelte/tests/runtime-runes/samples/writable-derived-2/_config.js
new file mode 100644
index 000000000000..fde3e7b1eada
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/writable-derived-2/_config.js
@@ -0,0 +1,7 @@
+import { test } from '../../test';
+
+export default test({
+	html: `true true`,
+
+	test({ assert, target, window }) {}
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/writable-derived-2/main.svelte b/packages/svelte/tests/runtime-runes/samples/writable-derived-2/main.svelte
new file mode 100644
index 000000000000..741aa6912542
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/writable-derived-2/main.svelte
@@ -0,0 +1,9 @@
+<script>
+	import { expect2, createAppState } from "./util.svelte.js"
+
+  const result = createAppState({ source: () => "wrong" });
+  result.onChange("right");
+  const expect1 = result.value === "right";
+</script>
+
+{expect1} {expect2}
diff --git a/packages/svelte/tests/runtime-runes/samples/writable-derived-2/util.svelte.js b/packages/svelte/tests/runtime-runes/samples/writable-derived-2/util.svelte.js
new file mode 100644
index 000000000000..8e862753ab90
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/writable-derived-2/util.svelte.js
@@ -0,0 +1,17 @@
+export const createAppState = (options) => {
+	const source = $derived(options.source());
+	let value = $derived(source);
+
+	return {
+		get value() {
+			return value;
+		},
+		onChange(nextValue) {
+			value = nextValue;
+		}
+	};
+};
+
+const result = createAppState({ source: () => 'wrong' });
+result.onChange('right');
+export const expect2 = result.value === 'right';