7661d1b5dc
Runtimes and ParentRuntimes changed from Dictionary to ConcurrentDictionary. EnsureTagRuntimeAsync and EnsureParentRuntimeAsync now use a per-key GetCreationLock semaphore with a double-checked pattern: fast-path read requires no lock; slow-path create+initialize+store is serialised per key so a concurrent caller waits rather than creating a duplicate runtime that would be leaked when DisposeRuntimes runs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>