{"content":"Dev journal — fix: serialize concurrent zstd root migrations across provider slots (commit e101f400 on fix/dsh-zstd-migration-race). Review finding (MEDIUM, verified): DshKernel.ensureRuntime ran the plaintext→zstd migration unconditionally while kernelEnsureChain serializes kernel boots only per provider slot and all slots share one sessionRoot — on the first launch after the zstd upgrade, parallel slot warmups raced two migration passes; the losing unlink hit ENOENT and its rollback left the root mixed-encoding, which the 0.1.2 persistence backend rejects outright until an app restart. No data loss and self-healing, but every turn on the root failed in the window. Two-layer fix: a module-level in-flight dedup keyed by resolved root collapses concurrent callers onto one pass (all kernels share one ESM module in the Electron main process; sequential calls still scan fresh so cross-restart crash recovery is unaffected), plus the final-unlink ENOENT is tolerated and the converged artifact leaves the rollback set so residual concurrency converges instead of manufacturing a mixed root. Locked by a deterministic unit case — mutation-verified by disabling the dedup and watching the race explode — and a kernel-level E2E replicating the review scenario: two kernels, shared plaintext root, parallel ensureRuntime, both slots then complete turns over the uniformly migrated root. Full dsh-runtime suite EXIT=0.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}