@@ -164,6 +164,39 @@ worker-testbed 2→3). До исправлений тест-сьют падал
164164 (generic T); гарды advisor — ask на незарегистрированном имени и дубль
165165 addAdvisor кидают
166166
167+ ## 10-й заход: аудит src/client/* на уязвимые места (+11 тестов, багов не найдено)
168+
169+ Отдельно перечитаны все 10 файлов клиентского слоя (ClientAgent, ClientCompute,
170+ ClientHistory, ClientMCP, ClientOperator, ClientPolicy, ClientSession, ClientState,
171+ ClientStorage, ClientSwarm) с фокусом на уязвимые сценарии: рекурсивная навигация,
172+ гонки, обрывы tool-цепочек, битые ссылки на агентов, потеря целостности history.
173+
174+ ### Новые тесты (11), сьют вырос до 143/143 — test/spec/resilience.test.mjs
175+ - приоритет навигационного тула: батч [ data-тул, nav-тул] выполняет ТОЛЬКО навигацию
176+ (защита от двойных side-эффектов при навигации);
177+ - maxToolCalls=2 срезает батч из 3 вызовов до хвостовых [ b,c] ;
178+ - дефолт CC_MAX_TOOL_CALLS=1: из батча в 2 вызова выполняется только последний
179+ (закреплено как контракт — важный неочевидный дефолт);
180+ - неизвестный тул от модели → placeholder-ответ + resque-flush истории (следующий
181+ комплишен не видит старых сообщений);
182+ - validate тула вернул false → placeholder, call не выполняется;
183+ - упавший тул (throw) останавливает цепочку: второй тул не вызывается, placeholder;
184+ - битая целостность history не доходит до модели: commitToolRequest без output
185+ (висячие tool_calls) и commitToolOutput с чужим toolId (сиротский tool-месседж)
186+ отфильтровываются в toArrayForAgent;
187+ - keepMessages=2: модель видит ровно хвостовое окно [ echo: turn3 , turn4] ;
188+ - два параллельных complete() сохраняют попарность вход→выход (busy-lock +
189+ FIFO-цепочка waitForOutput);
190+ - 10 параллельных setState-инкрементов без потерянных обновлений (queued dispatch);
191+ - битый активный агент ("ghost" не из свармы через CC_SWARM_DEFAULT_AGENT) →
192+ NoopAgent-фолбэк на defaultAgent, complete не падает и отвечает.
193+
194+ Замечания без фикса (by design): рекурсивная навигация уже покрыта в 8-м заходе
195+ (CC_THROW_WHEN_NAVIGATION_RECURSION, A↔B гасится flushMessage, CC_MAX_NESTED_EXECUTIONS);
196+ _ navigationStack растёт при каждой навигации и не дедуплицируется — это история для
197+ navigationPop; тул, закоммитивший output без продолжения флоу (executeForce/emit),
198+ оставляет complete висеть — контракт библиотеки (страховка: warning через 15с).
199+
167200## Найденные и исправленные баги (18 итого)
168201
169202### 1. Дедлок waitForOutput при functools-kit v4 (причина 39 упавших тестов)
0 commit comments