From ffa91b585b20c7714fd5cde333a19d98b6a9ad09 Mon Sep 17 00:00:00 2001 From: arlo Date: Thu, 15 Oct 2026 14:43:32 +0800 Subject: [PATCH] fix(kit): keep handle ids unique after the registry is cleared Co-Authored-By: Claude Opus 5.5 (1M context) --- packages/kit/src/codec/handles.ts | 2 +- tests/unit/codec/handles.test.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/kit/src/codec/handles.ts b/packages/kit/src/codec/handles.ts index 6ee5e0066..ae8c5d98e 100644 --- a/packages/kit/src/codec/handles.ts +++ b/packages/kit/src/codec/handles.ts @@ -92,7 +92,7 @@ export class ValueHandleRegistry { this.handleToScope.clear() this.scopeToHandles.clear() this.objectToHandle = new WeakMap() - this.seed = 0 + // Keep seed: a stale handle from before clear() must miss, not resolve to a new object. } private evictOverflow(): void { diff --git a/tests/unit/codec/handles.test.ts b/tests/unit/codec/handles.test.ts index f6c99aa5b..3b3fad2d3 100644 --- a/tests/unit/codec/handles.test.ts +++ b/tests/unit/codec/handles.test.ts @@ -73,4 +73,15 @@ describe('ValueHandleRegistry', () => { registry.releaseScope('state:component-a') expect(registry.get(childHandle)).toBeUndefined() }) + + it('does not reuse handle ids after clear', () => { + const registry = new ValueHandleRegistry() + const stale = registry.getOrCreate({ old: true }) + registry.clear() + const fresh = { fresh: true } + const handle = registry.getOrCreate(fresh) + expect(handle).not.toBe(stale) + expect(registry.get(stale)).toBeUndefined() + expect(registry.get(handle)).toBe(fresh) + }) })