Skip to the content.

Task 77 — Sync-over-async sweep: ToolPolicyEngine, SloService, Redis/Postgres timers, RolloutController

Phase: 5 Initiative: 45 Status: done Owner: — Slug: sync-over-async-sweep

Goal

После task_071 (Storage layer) нужно убрать sync-over-async в остальных горячих путях и background timers. Блокирующие .GetAwaiter().GetResult() на thread-pool потоках вызывают thread starvation под нагрузкой и риск deadlock.

Точки исправления:

Acceptance criteria

Sub-tasks

Status

Status: done (2026-08-14, roadmap tick)

Implementation notes

Scope / Likely files

src/agent/Tools/Policy/ToolPolicyEngine.cs, src/agent/Slo/SloService.cs, src/agent/Mesh/Backends/Redis/RedisTaskQueue.cs, src/agent/Mesh/Backends/Redis/RedisMeshStateStore.cs, src/agent/Mesh/Backends/Postgres/PostgresMeshStateStore.cs, src/agent/Mesh/Backends/Postgres/PostgresTaskQueue.cs, src/agent/Hercules.WebApi/Controllers/RolloutController.cs, src/agent/Mesh/Escalation/EscalationService.cs, src/agent/LLM/LlmClientFactory.cs

Dependencies

Risks / Rollback

Interface changes (Evaluate → async, SloService methods → async) ripple through callers. async void timers risky если unhandled exceptions — обязательно try/catch + log. Rollback: вернуть sync wrappers (но starvation останется).

Validation

Commit