Блокер (эскалация): простой команды 23:52–23:55 — исчерпан дневной лимит ключа polza, fallback-провайдера нет, Kanban авто-блокирует задачи #51

Open
opened 2026-10-22 00:11:30 +03:00 by embeddevio · 1 comment
Owner

Итог (для владельца)

Команда awg-dash простояла 2026-10-21 23:52–23:55 MSK из-за исчерпания дневного лимита ключа провайдера polza, а не из-за дефектов задач. Четыре карточки Sprint 0 ушли в blocked автоматически: диспетчер Kanban блокирует карточку после 2 подряд неуспешных попыток (kanban.failure_limit, по умолчанию 2), а каждый воркер в этом окне падал.

Сейчас провайдер снова отвечает (HTTP 200 на /v1/models и на пробный chat/completions), работа возобновлена (см. «Что уже сделано»).

Хронология

Время (MSK) Событие
23:33 стартовали 5 воркеров (Sprint 0: #17, #19, #20, #21 + ревью #20)
23:44–23:47 #17, #20 успели опубликовать отчёты и PR #50 — работа реально сделана
23:52–23:55 все обращения к провайдеру отвергнуты: Достигнут лимит по сумме (270 записей в логах)
23:53–23:55 6 падений воркеров (rc=1), диспетчер gave_up (sticky) → 4 карточки blocked
00:06 (22.10) баланс ключа обновился, лимит доступен снова
00:08 TechLead разобрал блокировки, 2 задачи перезапущены

Доказательства (воспроизводимо)

  1. Провайдер, /api/v1/balance (22.10, 00:0x MSK): available=100.27433286, amount=338.34626988, reservedAmount=0, spentAmount=964.13956371, updatedAt=2026-10-21T21:06:31Z.
  2. Провайдер, /api/v1/key: ключ pza_emOW…Nk2dIT, limit=300, limit_remaining=100.27433286, limit_reset=daily — дневной лимит 300 ₽ на ключ.
  3. В окне сбоя остаток лимита был 0.33–0.76 ₽, поэтому отвергалась даже минимальная резервация:
    openai.APIError: Резервация под запрос (1.00 ₽) превышает доступный остаток лимита (0.76 ₽)
    (/root/.hermes/profiles/devops/logs/errors.log, /root/.hermes/profiles/*/logs/managed-worker.log).
  4. Один ключ на всех: sha256 первых 16 hex совпадает у techlead-agent, devops, backend-engineer, frontend-engineer, qa-engineer → единая точка отказа.
  5. Воркер-сессии к моменту сбоя были огромными: телеметрия фиксирует запросы msgs=173 tokens=~237,011 — квота тратится на большой контекст, отсюда быстрый расход.
  6. Коды выхода воркеров: /root/.hermes/kanban/boards/awg-dash/logs/*.log → [kanban-worker-exit] rc=1 (×2 на каждую задачу; у #20 первая попытка завершилась успешно rc=0 с review_requested).

Каскад отказа (главное)

  1. Квота исчерпана → провайдер отвечает ошибкой APIError (без различимого HTTP-статуса).
  2. Hermes ретраит оборот внутри сессии (kanban_turn_recovery, 3 попытки) — контекст у воркеров огромный (до ~237k токенов на запрос).
  3. Попытка ужать контекст не проходит: сжатие контекста тоже требует провайдера, а он отвергает запросы → Context length exceeded: … Cannot compress further, в интерфейсе это выливается в сообщение This conversation has grown too long for deepseek/deepseek-v4.1-flash to read.
  4. Итог — rc=1 (обычный краш, не EX_TEMPFAIL), 2 подряд → sticky auto-block.

Вывод: предусмотренный контур «квота/биллинг не считается падением» (код 75 EX_TEMPFAIL, rate_limited → requeue без штрафа) в этом случае не сработал: ошибка пришла как openai.APIError без статуса, а финальная причина в логах выглядела как переполнение контекста, а не как квота. Диагноз сильный, но чтобы называть это багом Hermes, нужен чистый репро в окне квоты — без этого фиксирую как гипотезу первого порядка.

Вторичный дефект (не влиял на блокировку): в логах воркеров есть agent.runtime_session_store.WorkerPersistenceError: invalid_params и Session DB compression split failed — new session will NOT be indexed: invalid_params — стоит отдельного разбора после стабилизации бюджета.

Что уже сделано (TechLead, 22.10 00:08–00:12)

  • t_37f7b719 (#17, CI-пайплайн): оставлена заблокированной, но переведена в capability-блок — ложный «краш по квоте» снят, реальная причина — отсутствие Actions runner (см. отдельную эскалацию).
  • t_36a212ed (#19, OpenAPI-контракт): разблокирована, перезапущена (run #13).
  • t_150f58be (#21, dev/staging стенд): разблокирована, перезапущена (run #14, стенд по ssh на 192.168.1.147).
  • t_2dec61bb (#20, storage): переведена в review, ревьюер переназначен с автора реализации (backend-engineer, self-review) на qa-engineer (реализация уже готова: PR #50).

Решения, нужные от владельца

  1. Бюджет/лимит polza. Сейчас доступно 100.27 ₽ при дневном лимите 300 ₽. Прежний день выел лимит за ~40 минут параллельной работы 5 воркеров. Варианты: поднять дневной лимит ключа, включить авто-пополнение, либо развести профили по разным ключам (сейчас ключ один на всех — единая точка отказа).
  2. Fallback-провайдер. Во всех профилях fallback_model/fallback_providers закомментированы, а auxiliary-провайдер для сжатия контекста берётся от основного. Пока fallback не настроен, любая квота/авария polza = полная остановка команды и невозможность сжать контекст, чтобы дожить до конца оборота. Прошу включить фолбэк (пусть дорогой, но доступный) для аварийного дожима.
  3. Ограничить параллелизм под бюджет. Предлагаю kanban.max_in_progress: 2 (и, при необходимости, kanban.max_in_progress_per_profile: 1) — диспетчер перестанет плодить воркеров быстрее, чем это выдерживает дневной лимит. Плюс kanban.failure_limit: 3, чтобы разовый сетевой/квотный сбой не парковал карточку.
  4. Экономия. Воркер-сессии дорастают до ~237k токенов на запрос: стоит либо понижать модель для массовых задач (hermes kanban set-model <id> <model>), либо требовать от воркеров выгружать большие выводы в файлы вместо дампа в контекст (занесу в шаблон карточек).

Все действия TechLead — в advisory-режиме: мержи, пуш в main и деплой не выполнялись.

## Итог (для владельца) **Команда awg-dash простояла 2026-10-21 23:52–23:55 MSK из-за исчерпания дневного лимита ключа провайдера polza, а не из-за дефектов задач.** Четыре карточки Sprint 0 ушли в `blocked` автоматически: диспетчер Kanban блокирует карточку после 2 подряд неуспешных попыток (`kanban.failure_limit`, по умолчанию 2), а каждый воркер в этом окне падал. Сейчас провайдер снова отвечает (`HTTP 200` на `/v1/models` и на пробный `chat/completions`), работа возобновлена (см. «Что уже сделано»). ## Хронология | Время (MSK) | Событие | |---|---| | 23:33 | стартовали 5 воркеров (Sprint 0: #17, #19, #20, #21 + ревью #20) | | 23:44–23:47 | #17, #20 успели опубликовать отчёты и PR #50 — работа реально сделана | | 23:52–23:55 | все обращения к провайдеру отвергнуты: `Достигнут лимит по сумме` (270 записей в логах) | | 23:53–23:55 | 6 падений воркеров (`rc=1`), диспетчер `gave_up` (sticky) → 4 карточки `blocked` | | 00:06 (22.10) | баланс ключа обновился, лимит доступен снова | | 00:08 | TechLead разобрал блокировки, 2 задачи перезапущены | ## Доказательства (воспроизводимо) 1. Провайдер, `/api/v1/balance` (22.10, 00:0x MSK): `available=100.27433286`, `amount=338.34626988`, `reservedAmount=0`, `spentAmount=964.13956371`, `updatedAt=2026-10-21T21:06:31Z`. 2. Провайдер, `/api/v1/key`: ключ `pza_emOW…Nk2dIT`, `limit=300`, `limit_remaining=100.27433286`, `limit_reset=daily` — **дневной лимит 300 ₽ на ключ**. 3. В окне сбоя остаток лимита был **0.33–0.76 ₽**, поэтому отвергалась даже минимальная резервация: `openai.APIError: Резервация под запрос (1.00 ₽) превышает доступный остаток лимита (0.76 ₽)` (`/root/.hermes/profiles/devops/logs/errors.log`, `/root/.hermes/profiles/*/logs/managed-worker.log`). 4. **Один ключ на всех**: sha256 первых 16 hex совпадает у `techlead-agent`, `devops`, `backend-engineer`, `frontend-engineer`, `qa-engineer` → единая точка отказа. 5. Воркер-сессии к моменту сбоя были огромными: телеметрия фиксирует запросы `msgs=173 tokens=~237,011` — квота тратится на большой контекст, отсюда быстрый расход. 6. Коды выхода воркеров: `/root/.hermes/kanban/boards/awg-dash/logs/*.log` → `[kanban-worker-exit] rc=1` (×2 на каждую задачу; у #20 первая попытка завершилась успешно `rc=0` с `review_requested`). ## Каскад отказа (главное) 1. Квота исчерпана → провайдер отвечает ошибкой `APIError` (без различимого HTTP-статуса). 2. Hermes ретраит оборот **внутри сессии** (`kanban_turn_recovery`, 3 попытки) — контекст у воркеров огромный (до ~237k токенов на запрос). 3. Попытка ужать контекст не проходит: **сжатие контекста тоже требует провайдера**, а он отвергает запросы → `Context length exceeded: … Cannot compress further`, в интерфейсе это выливается в сообщение `This conversation has grown too long for deepseek/deepseek-v4.1-flash to read`. 4. Итог — `rc=1` (обычный краш, не `EX_TEMPFAIL`), 2 подряд → sticky auto-block. **Вывод:** предусмотренный контур «квота/биллинг не считается падением» (код `75 EX_TEMPFAIL`, `rate_limited` → requeue без штрафа) в этом случае не сработал: ошибка пришла как `openai.APIError` без статуса, а финальная причина в логах выглядела как переполнение контекста, а не как квота. Диагноз сильный, но чтобы называть это багом Hermes, нужен чистый репро в окне квоты — без этого фиксирую как гипотезу первого порядка. **Вторичный дефект (не влиял на блокировку):** в логах воркеров есть `agent.runtime_session_store.WorkerPersistenceError: invalid_params` и `Session DB compression split failed — new session will NOT be indexed: invalid_params` — стоит отдельного разбора после стабилизации бюджета. ## Что уже сделано (TechLead, 22.10 00:08–00:12) - `t_37f7b719` (#17, CI-пайплайн): оставлена заблокированной, но переведена в **capability-блок** — ложный «краш по квоте» снят, реальная причина — отсутствие Actions runner (см. отдельную эскалацию). - `t_36a212ed` (#19, OpenAPI-контракт): разблокирована, перезапущена (run #13). - `t_150f58be` (#21, dev/staging стенд): разблокирована, перезапущена (run #14, стенд по ssh на 192.168.1.147). - `t_2dec61bb` (#20, storage): переведена в `review`, ревьюер переназначен с автора реализации (`backend-engineer`, self-review) на `qa-engineer` (реализация уже готова: PR #50). ## Решения, нужные от владельца 1. **Бюджет/лимит polza.** Сейчас доступно 100.27 ₽ при дневном лимите 300 ₽. Прежний день выел лимит за ~40 минут параллельной работы 5 воркеров. Варианты: поднять дневной лимит ключа, включить авто-пополнение, либо развести профили по разным ключам (сейчас ключ один на всех — единая точка отказа). 2. **Fallback-провайдер.** Во всех профилях `fallback_model`/`fallback_providers` закомментированы, а `auxiliary`-провайдер для сжатия контекста берётся от основного. Пока fallback не настроен, любая квота/авария polza = полная остановка команды **и невозможность сжать контекст**, чтобы дожить до конца оборота. Прошу включить фолбэк (пусть дорогой, но доступный) для аварийного дожима. 3. **Ограничить параллелизм под бюджет.** Предлагаю `kanban.max_in_progress: 2` (и, при необходимости, `kanban.max_in_progress_per_profile: 1`) — диспетчер перестанет плодить воркеров быстрее, чем это выдерживает дневной лимит. Плюс `kanban.failure_limit: 3`, чтобы разовый сетевой/квотный сбой не парковал карточку. 4. **Экономия.** Воркер-сессии дорастают до ~237k токенов на запрос: стоит либо понижать модель для массовых задач (`hermes kanban set-model <id> <model>`), либо требовать от воркеров выгружать большие выводы в файлы вместо дампа в контекст (занесу в шаблон карточек). _Все действия TechLead — в advisory-режиме: мержи, пуш в main и деплой не выполнялись._
embeddevio added the devopsblocker labels 2026-10-22 00:11:30 +03:00
embeddevio self-assigned this 2026-10-22 00:11:30 +03:00
Author
Owner

Текущий статус ключа polza (проверено 29.10.2026 20:54 MSK).

Метрика Значение
GET /v1/models 200 (ключ жив, не 403/401)
GET /v1/balance available 384.72 ₽, reserved 0, spent 1207.88 ₽ (весь период)
GET /v1/key limit: 400 (daily), limit_remaining: **384.72**, limit_reset: daily, usage_daily: 15.28
ключ во всех 5 профилях один и тот же (sha256 префикс f9cc87ff8ac0 — валидно для backend/frontend/qa/devops/techlead)

Простой 22.10 не воспроизводится: за сутки израсходовано 15.28 ₽ из 400 — сама задача его не исчерпала.

Структурный риск остаётся и требует решения владельца (деньгами):

  1. один ключ на все пять профиля → любой расход общий, fallback_model нигде не настроен — исчерпание 400 ₽/сутки останавливает всю команду;
  2. 400 ₽ по факту ≈ 2.2 ч работы 3 воркеров (≈3 ₽/мин наблюдённо) — длинный спринт в день не влезает;
  3. авто-блок Kanban после 2 крэшей (openai.APIError без статуса) превращает квочный сбой в blocked-карточки.

Решение нужно по одному из вариантов (оставляю на владельца): (а) поднять дневной лимит/пополнить — тогда планирую спринт по бюджету; (б) прописать fallback_model на другого провайдера — тогда команда не встанет целиком; (в) принять как есть — тогда не более 1 —2 воркеров одновременно и 30-минутный дайджест как санитар.

Issue оставляю открытым именно ради этого решения (инцидент как таковой снят, лимит сброшен резетом).

**Текущий статус ключа polza (проверено 29.10.2026 20:54 MSK).** | Метрика | Значение | |---|---| | `GET /v1/models` | **200** (ключ жив, не 403/401) | | `GET /v1/balance` | available **384.72 ₽**, reserved 0, spent 1207.88 ₽ (весь период) | | `GET /v1/key` | `limit: 400` (daily), `limit_remaining: **384.72**`, `limit_reset: daily`, `usage_daily: 15.28` | | ключ во всех 5 профилях | один и тот же (`sha256` префикс `f9cc87ff8ac0` — валидно для backend/frontend/qa/devops/techlead) | Простой 22.10 не воспроизводится: за сутки израсходовано 15.28 ₽ из 400 — сама задача его не исчерпала. **Структурный риск остаётся и требует решения владельца** (деньгами): 1. один ключ на все пять профиля → любой расход общий, `fallback_model` нигде не настроен — исчерпание 400 ₽/сутки останавливает всю команду; 2. 400 ₽ по факту ≈ 2.2 ч работы 3 воркеров (≈3 ₽/мин наблюдённо) — длинный спринт в день не влезает; 3. авто-блок Kanban после 2 крэшей (`openai.APIError` без статуса) превращает квочный сбой в `blocked`-карточки. Решение нужно по одному из вариантов (оставляю на владельца): (а) поднять дневной лимит/пополнить — тогда планирую спринт по бюджету; (б) прописать `fallback_model` на другого провайдера — тогда команда не встанет целиком; (в) принять как есть — тогда не более 1 —2 воркеров одновременно и 30-минутный дайджест как санитар. Issue **оставляю открытым** именно ради этого решения (инцидент как таковой снят, лимит сброшен резетом).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: embeddevio/awg-dash#51