91e58e3c9f
bustWorkspaceCache звался сразу после write, но ВНУТРИ переданной транзакции (до коммита). Окно: параллельный читатель промахивается мимо инвалидированного ключа, читает ещё НЕ закоммиченную (старую) строку и репопулирует кэш старым значением; после коммита кэш держит устаревшее до TTL (15 c). Добавил post-commit-хук в executeTx: registerAfterCommit(trx, fn) регистрирует side-effect, который дренится ТОЛЬКО после коммита транзакции — причём внешним executeTx, владеющим trx (проброшенный existingTrx срабатывает на настоящей границе коммита, а не во вложенном вызове). WeakMap по trx — без утечки. bustWorkspaceCache теперь: без trx — del сразу (уже автокоммит); с trx — регистрирует del на post-commit. Ошибка хука не валит уже закоммиченный write. Тест: порядок body→commit→hook, дренаж на внешней границе, глушение падения хука. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>