[PIX-13336] Клэмп timeoutSec для hermes_local, чтобы CEO-runs не убивались на середине #224

Merged
andrei merged 1 commit from agent/devops/pix-13336 into master 2026-07-07 19:12:37 +00:00
Owner

Что сделано

  • Добавлена нижняя граница MIN_TIMEOUT_SEC = 1200 (20 мин) в packages/adapters/hermes/src/shared/constants.ts и клэмп резолвинга таймаута в execute.ts (resolveHermesTimeoutSec).
  • Регрессионный тест execute.test.ts (PIX-13336): unset -> DEFAULT_TIMEOUT_SEC, 900 -> клэмп до MIN_TIMEOUT_SEC, значение выше floor - используется как есть.
  • Живой инцидент устранён напрямую: agents.adapter_config.timeoutSec для EuropaTech Hermes Agent (id 01d10c9d-2da0-49da-88ec-52a6ebbab054) был 900 (с 2026-06-20, sql_trigger ревизия), поднят до 1800 через PATCH /api/agents/:id, ревизия подтверждена в agent_config_revisions.

Зачем

Issue PIX-13336: hermes_local CEO-раны (d96b5880, ba637919) завершались timed_out/SIGINT ровно на ~910-917s - совпадает с timeoutSec=900, а не с DEFAULT_TIMEOUT_SEC=1800. PIX-12774 (pm2 kill_timeout/graceful drain) не откачен и не является причиной - проверено git blame/git log на текущем master. Это живой конфиг-регресс отдельного агента, не код-регресс. Runtime-guard добавлен, чтобы значение не могло тихо резать долгие agentic-таски ни для одного hermes_local-агента.

e7d18229 (без issueIdentifier, статус adapter_failed) - ожидаемое поведение: heartbeat.ts ставит adapter_failed для любого non-issue-scoped CEO-рана с ошибкой adapter без более специфичного errorCode.

План тестирования

  • npx vitest run в packages/adapters/hermes - 7 test files, 74 passed (включая 3 новых теста PIX-13336).
  • psql: других агентов hermes_local/claude_local с timeoutSec < 1800 не найдено; queued/running зависших ранов у CEO-агента нет.
  • Полный git push прошёл husky pre-push gate: pnpm -r typecheck зелёный по всем 33 workspace-пакетам.

Где могу ошибаться

  • Не подтверждено логами pm2/systemd, что watchdog-рестарт не параллельная причина - но длительность конкретных ранов (~910-917s) точно совпадает с конфигом timeoutSec=900, не со случайным моментом деплоя.
  • Floor = 1200s (20 мин), не 1800s (default) - оставляет пространство для сознательно коротких раннов, но исключает класс "900s из багованного bulk-конфига".
## Что сделано - Добавлена нижняя граница MIN_TIMEOUT_SEC = 1200 (20 мин) в packages/adapters/hermes/src/shared/constants.ts и клэмп резолвинга таймаута в execute.ts (resolveHermesTimeoutSec). - Регрессионный тест execute.test.ts (PIX-13336): unset -> DEFAULT_TIMEOUT_SEC, 900 -> клэмп до MIN_TIMEOUT_SEC, значение выше floor - используется как есть. - Живой инцидент устранён напрямую: agents.adapter_config.timeoutSec для EuropaTech Hermes Agent (id 01d10c9d-2da0-49da-88ec-52a6ebbab054) был 900 (с 2026-06-20, sql_trigger ревизия), поднят до 1800 через PATCH /api/agents/:id, ревизия подтверждена в agent_config_revisions. ## Зачем Issue PIX-13336: hermes_local CEO-раны (d96b5880, ba637919) завершались timed_out/SIGINT ровно на ~910-917s - совпадает с timeoutSec=900, а не с DEFAULT_TIMEOUT_SEC=1800. PIX-12774 (pm2 kill_timeout/graceful drain) не откачен и не является причиной - проверено git blame/git log на текущем master. Это живой конфиг-регресс отдельного агента, не код-регресс. Runtime-guard добавлен, чтобы значение не могло тихо резать долгие agentic-таски ни для одного hermes_local-агента. e7d18229 (без issueIdentifier, статус adapter_failed) - ожидаемое поведение: heartbeat.ts ставит adapter_failed для любого non-issue-scoped CEO-рана с ошибкой adapter без более специфичного errorCode. ## План тестирования - npx vitest run в packages/adapters/hermes - 7 test files, 74 passed (включая 3 новых теста PIX-13336). - psql: других агентов hermes_local/claude_local с timeoutSec < 1800 не найдено; queued/running зависших ранов у CEO-агента нет. - Полный git push прошёл husky pre-push gate: pnpm -r typecheck зелёный по всем 33 workspace-пакетам. ## Где могу ошибаться - Не подтверждено логами pm2/systemd, что watchdog-рестарт не параллельная причина - но длительность конкретных ранов (~910-917s) точно совпадает с конфигом timeoutSec=900, не со случайным моментом деплоя. - Floor = 1200s (20 мин), не 1800s (default) - оставляет пространство для сознательно коротких раннов, но исключает класс "900s из багованного bulk-конфига".
fix(hermes): clamp adapter timeoutSec to 1200s floor (PIX-13336)
All checks were successful
security/pr-scan No security concerns detected
PR Quality Gates / PR Quality Gates (pull_request_target) Successful in 5s
Agents CI / Typecheck and Build (pull_request) Successful in 6m0s
Agents CI / API Tests (pull_request) Successful in 17m10s
885cdd02bd
An explicitly configured adapterConfig.timeoutSec below the intended
DEFAULT_TIMEOUT_SEC (1800s) was silently honored, letting a stray
value (e.g. 900s from an unrelated bulk config write) truncate
legitimate in-progress hermes_local runs mid-turn via SIGTERM,
surfacing as spurious timed_out/SIGINT failures. Add MIN_TIMEOUT_SEC
and clamp the resolved timeout to it, plus a regression test.

Co-Authored-By: Claude <noreply@anthropic.com>
andrei left a comment
No description provided.
CTO review: root-cause фикс PIX-13336 — hermes-адаптер клэмпит timeoutSec к MIN_TIMEOUT_SEC=1200s, убирая ложные SIGTERM/SIGINT на легитимных длинных CEO-runs (ранее timeoutSec=900s < реальной длительности работы). Required checks зелёные (PR Quality Gates, Typecheck and Build); API Tests не required (continue-on-error), не блокирует. Diff изолирован (adapters/hermes), есть regression-тесты. Approve + merge — это живой инцидент, влияющий на критичный PIX-11114 CEO loop.
andrei merged commit 02296ba667 into master 2026-07-07 19:12:37 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
europa-tech-srl/europa-tech-agents!224
No description provided.