0.134.29

Fixed (DEFERRED-задачи §3.1 Agent/Runtime, см. docs/audit/backend-2026-06.md §3.1)

  • H-A-2 SessionActor.channel/chatID/agentChatID — добавлен chanMu sync.RWMutex и helper ChannelInfo()/setChannelInfo(). Все чтения из subagent-горутин теперь через ChannelInfo() (RLock). Закрывает race condition при одновременной записи в handleInbound и чтении в runChild.
  • H-A-10 SubagentManager.SpawnWithConfigcontext.WithTimeout(context.Background(), ...) заменён на context.WithTimeout(ctx, ...) с использованием переданного parent context. Теперь отмена parent-контекста (supervisor restart, /stop) корректно распространяется на subagent.
  • H-A-6 SessionActor.run — добавлен bgWG sync.WaitGroup. Фоновые горутины maybeRealtimeExtract и pruneToolResults регистрируются через bgWG.Add(1)/bgWG.Done(). Actor run() ждёт завершения через bgWG.Wait() перед отправкой actorDone. Устраняет goroutine leak при shutdown.
  • H-A-7 SessionActor.pruneToolResults — добавлен debounce (300s) через lastPruneAt atomic.Int64. Повторный prune в течение 5 минут пропускается. Снижает нагрузку на БД при частых сообщениях.
  • H-A-8 SessionActor.handleInbound — убран ненадёжный content-match при определении lastOldMsgID. Заменён на индексное сопоставление: подсчёт видимых сообщений в dbMessages до len(oldZone). Корректно работает при дублирующихся content.
  • H-A-4 SessionActor.activeSubagentsatomic.AddInt32/LoadInt32/StoreInt32 заменены на обычный int32 под pendingMu. Состояние activeSubagents теперь консистентно с pendingInjections в injectionCallback.

Documented (ложные тревоги аудита §3.1)

  • H-A-1 streamHook.lastIterMsgID/lastIterTitle/lastIterEntries — все доступы происходят в AfterIteration, который вызывается последовательно в actor-горутине. OnSubagentCompleted читает только spawnTrack (под iterMu). Race condition не существует.
  • H-A-3 FlushQueue — код уже использует корректный drain-паттерн (for { select { case <-a.ch: default: return } }). Аудит был неверным.
  • H-A-5 cancel()/busy в run() — синхронизация через a.mu (cancel func) и pendingCond (busy flag) корректна. Добавлен поясняющий комментарий.

Build / Tests

  • go test ./internal/agent/... -race — все тесты проходят.
  • go build ./... — OK.