[CL-RECOVERY] fix: убрать ложные срабатывания auto-close disposition эвристики #168
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "agent/cto/pix-12986-terminal-disposition-fix"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
Исправлена regex-эвристика в
server/src/services/recovery/service.ts(issueScopedTerminalDisposition/extractDeclaredHandoffTerminalDisposition), которая определяет итоговый статус задачи по тексту финального результата успешного запуска, когда агент не вызвал явный PATCH статуса.Эвристика искала терминальные слова (
done,завершен,выполнен,закрыти т.д.) в радиусе 120 символов от идентификатора задачи, без проверки границы слова и без учёта отрицания.Зачем
Обнаружено при аудите автономии (PIX-12986, 2026-07-04): задачи PIX-12935 (
grantRoleна Base mainnet) и PIX-12933 (пополнение gas-wallets) были автоматически закрыты системой какdone, хотя агент явно написал в финальном summaryin_progress, а реальное действие CEO (on-chain транзакция) ещё не произошло. Обе задачи — финансовые/on-chain блокеры, ожидающие ручного действия CEO.Корень проблемы: слово
завершенсовпадало как подстрока внутри несвязанного словазавершения("Сводка завершения heartbeat", то есть про завершение самого прогона, а не задачи), плюс не проверялось отрицание ("ещё не done", "не закрыто").Последствие: ложное закрытие финансовых блокеров маскирует реальный статус ожидания CEO-решения и рвёт continuation path (задача была бы разбужена автоматически при ответе CEO, пока висит
in_progress/blocked).План тестирования
pnpm --filter @paperclipai/server typecheck— 0 ошибокpnpm exec vitest run src/services/recovery/— 34/34 тестов зелёные (было 27, +7 новых regression-тестов вterminal-disposition.test.ts)resultJson.summary) и проверяют, что после фикса результат —null(неdone), а также что реальные case (done,blocked) по-прежнему детектятся.Где могу ошибаться
extractDeclaredHandoffTerminalDispositionиissueScopedTerminalDispositionпереведены вexportдля тестируемости — публичный контракт модуля не менялся, только видимость.doneв БД до этого фикса — отдельно скорректированы вручную через API в рамках PIX-12986 (не через этот PR, т.к. это данные, а не код).Регекс-эвристика issueScopedTerminalDisposition/extractDeclaredHandoffTerminalDisposition не проверяла границы слов и отрицание, из-за чего PIX-12935 и PIX-12933 (финансовые блокеры on-chain grantRole и gas-wallet funding) были автоматически закрыты как `done`, хотя агент явно указал `in_progress` и реальное действие CEO ещё не выполнено. Причина: слово "завершен" совпадало как подстрока в "завершения" (сводка о завершении heartbeat, а не задачи), без учёта соседних кириллических символов и отрицания "не". Добавлена проверка границы слова (не кириллический символ до/после совпадения) и отрицания ("не X" перед терминальным словом), плюс regression-тесты на реальных текстах из PIX-12935/PIX-12933.