0.134.81

Fixed

  • Race condition в drain-горутине стриминга (runner.go): горутина for range ch стартовала немедленно и конкурировала с основным for-select за события из канала — события терялись. Заменено на drain() функцию, вызываемую только на abort-путях (idle timeout, ctx.Done).
  • Роль interrupted отсутствовала в CHECK constraint БД: INSERT с role='interrupted' молча падал на SQLite и PostgreSQL. Миграция 078 добавляет 'interrupted' в constraint обеих БД.
  • Двойная публикация _turn_end при таймауте агента: timeout-defer не выставлял turnEnded = true, второй defer отправлял дублирующий _turn_end. Добавлен флаг timeoutFired.
  • Публикация timeout-уведомления в отменённый контекст: PublishOutbound вызывался после DeadlineExceeded — сообщение не доходило. Добавлен PublishOutboundCtx с context.Background() + 5s timeout.
  • Autocompact/history/LLM-фильтр не пропускали interrupted: autocompact.go, actor.go:492 и findLastTopicBreak проверяли topic_break, но не interrupted — разделитель попадал в LLM-контекст.
  • Turn timeout покрывал всю handleInbound: setup-работа (GetRecentMessages, summary LLM) потребляла бюджет агента. Timeout теперь scoped — применяется только к вызовам runner.Run/RunPlanExecute.
  • Reranker circuit breaker не работал при per-call инстансах: breaker state жил в экземпляре OllamaReranker, который создавался заново при каждом запросе. State вынесен в package-level sync.Map (ключ: baseURL|model).
  • Reranker breaker триггерился от per-document ошибок: одна malformed ошибка на документе засчитывалась как failure. Добавлен isRequestLevelError — breaker реагирует только на connection-level ошибки (connection refused, timeout, no such host).
  • isOpen() мутировал состояние breaker: side-effect (сброс openUntil) при чтении. Разделено на чистый read + recordSuccess для reset.
  • Нумерованные переменные updCtx2/updCancel2 в reindex.go: заменены на идиоматичный defer cancel() паттерн + комментарий к использованию context.Background().
  • Дублирование верстки divider в MessageList.svelte: блоки topic_break и interrupted объединены в один с {@const}.
  • Hard-coded statement_timeout=30000 в PostgreSQL pool: вынесен в TAIGACLAW_PG_STATEMENT_TIMEOUT env var (default 300000ms = 5 мин).

Added

  • Тесты circuit breaker: open/close, cooldown, concurrent access, shared state, batch failure.