Runner теперь ходит к постоянным serve по HTTP API (v1.17+, /api):
- клиент Client (create/send/wait/abort/messages/verdict)
- Pool: по одному serve на каталог, ленивый подъём, root-сервер в worktree,
выделение портов, ReleaseTask при завершении задачи
- Run: CreateSession('ratatoskr-<агент>') -> Send -> поллинг Verdict из
text-частей assistant-сообщений; idle/hard таймауты дают RC=-1
- вердикт извлекается из последнего assistant text-парта (плоский text)
- тесты: unit на фейковом HTTP-сервере; e2e эмулирует serve через httptest,
агент определяется по title сессии
Исправляет баг: воркер захватывал задачу на выполнение по статусу ready
ещё до «создавай» (consent был заглушкой). Теперь:
- новый статус approved: «создавай» → ready→approved;
- воркер (pollAndDispatch + runTask) берёт ТОЛЬКО approved,
ready = черновик готов, ждёт одобрения;
- правка/текст в approved запрещены (финальное одобрение);
- e2e-тест TestE2EWorkerDoesNotTakeUnconfirmed: в ready воркер задачу
не трогает, запускает только после «создавай» → success;
- обновлены все затронутые тесты (models/core/worker) и retry-фикстуры.
Позитивный блок (задача перезапускается и доходит до success):
collecting, ready, failed, timeout
Негативный блок (завершённые состояния нельзя перезапускать — только /start):
success, cancelled → /retry отклоняется понятным сообщением
fix: handleRetry валидирует терминальные статусы (success/cancelled/aborted/
closed) и отвечает «нельзя перезапустить», вместо падения ErrInvalidStatus