7ed558e457
Коммит 4. При достижении cap реестра live-сессий эвиктился LRU-кандидат через destroy(), что реджектило его in-flight mutate терминальной ошибкой. Но update такого mutate мог УЖЕ дойти до сервера и персиститься → эвикция превращала удачную запись в ложный proval → retry-склонный агент повторял запись → ДУБЛИКАТ (тот же механизм, что в инциденте #435). Правка: - цикл эвикции теперь ПРЕДПОЧИТАЕТ idle-жертву: идёт по LRU-порядку, пропускает busy-сессии (isBusy() — есть in-flight mutate) и эвиктит старейшую idle; - если ВСЕ сессии busy (эвикция неизбежна для приёма новой записи) — эвиктит LRU busy через evictForCap(), который реджектит in-flight op ПОМЕЧЕННОЙ ошибкой INDETERMINATE «write may have applied — verify before retry», а не плоским failure. Маркер collabIndeterminate + guard isCollabIndeterminateError (симметрично isCollabAuthFailedError), чтобы «проверь перед ретраем» можно было отличить от чистого провала. Тесты (мутационные): busy LRU-сессия сохраняется, эвиктится younger idle, и её запись доезжает на ack; when-all-busy — эвикция реджектит запись именно INDETERMINATE-ошибкой с маркером и текстом verify-before-retry. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>