Task 8 — Ограниченный цикл исполнения
Phase: 1
Status: done
Owner: —
Slug: bounded-execution
Goal
Plan-act-observe с настраиваемыми max steps, wall-clock timeout, cancellation, recursion depth и per-request лимитом вызовов инструментов. Прямой ответ навыка остаётся fast-path.
Acceptance criteria
Sub-tasks
AgentConfig— добавить поляMaxToolIterations(=3 по умолчанию),MaxWallClockTimeoutSeconds(=120),MaxRecursionDepth(=2)LoopContext— добавитьMaxIterations(effective cap),WallClockTimeout(TimeSpan),StartTime(DateTimeOffset),RecursionDepth,CancellationRequested; методыWithMaxIterations,WithTimeout,TickRecursion,RequestCancellationAgentCore—RunWithToolsAsyncчитаетMaxIterationsизLoopContext(fallback →AgentConfig.MaxToolIterations); убрать hardcodedMaxToolIterations = 3константуAgentCore.HandleAsync— создаётCancellationTokenSourceс wall-clock timeout (MaxWallClockTimeoutSeconds) и пробрасывает вRunWithToolsAsync; логирует{Step} — wall-clock timeout reachedпри срабатыванииBoundedExecutionOptionsrecord — per-request override:MaxIterations?,TimeoutSeconds?,MaxRecursionDepth?;HandleAsync(BoundedExecutionOptions?)overloadAgentCore.TryParseAction— проверяетLoopContext.CancellationRequestedперед tool execution- Unit tests:
BoundedExecutionTests.cs— 10+ тестов: timeout enforcement, max iterations, recursion depth, cancellation propagation, per-request override dotnet buildпроходит без warningsdotnet testпроходит (baseline 349/349 + новые тесты)
Scope / Likely files
src/agent/AgentCore.cs (limits), src/agent/Loop/
Dependencies
- блокирует / опирается на: task_001 — core-agent-loop
- блокирует / опирается на: task_007 — typed-contracts
Risks / Rollback
Слишком жёсткие лимиты ломают сложные задачи; нужны настраиваемые per-skill бюджеты.
Implementation notes
2026-08-12
Добавлено:
Config/AppConfig.cs — AgentConfig получил 3 новых поля:
MaxToolIterations = 3(заменило hardcoded константу в AgentCore)MaxWallClockTimeoutSeconds = 120(wall-clock timeout per request)MaxRecursionDepth = 2(глубина вложенности tool-call)
Loop/LoopState.cs — LoopContext расширен:
- Новые поля:
MaxIterations,WallClockTimeout,StartTime,RecursionDepth,MaxRecursionDepth,CancellationRequested LoopContext.Initial(maxIterations, wallClockTimeout, maxRecursionDepth)— статический factory с параметрамиTickRecursion()/UnwindRecursion()— управление глубинойWithMaxIterations(int)— per-request override max iterationsWithCancellationRequested()— флаг отмены от policyIsWallClockExpired— проверка expiry по elapsed timeIsRecursionExceeded— проверка глубины рекурсии
Loop/LinkedCancellationTokenSource.cs — новый класс:
- Объединяет external
CancellationToken+ optional wall-clock timeout - Exposes
IsWallClockTimeoutflag (true только при timeout, не при external cancellation) - Exposes
Elapsed(Stopwatch-based) using var lcts = new LinkedCancellationTokenSource(externalCt, wallClockTimeout)
Agent/AgentCore.cs — ключевые изменения:
- Удалена константа
MaxToolIterations = 3 HandleAsync(string, BoundedExecutionOptions?, CancellationToken)— главный overloadHandleAsync(string, CancellationToken)→ forwards to главный сoptions=nullProcessMessageAsync→ forwards toHandleAsync(input, null, ct)- Wall-clock timeout:
LinkedCancellationTokenSource+ graceful degradation answer RunWithToolsAsync: читаетctx.MaxIterationsвместо константы- Wall-clock expiry и policy cancellation проверяются перед tool execution
EvaluateSkillAsync: используетLoopContext.Initial(cfg.MaxToolIterations, ...)
BoundedExecutionOptions record — per-request override:
MaxIterations?,TimeoutSeconds?,MaxRecursionDepth?— null = использовать конфиг
Tests:
AgentCoreLoopTests.cs— +12 новых тестов для LoopContext (IsWallClockExpired, IsRecursionExceeded, TickRecursion, UnwindRecursion, WithCancellationRequested, WithMaxIterations, etc.)AgentCoreBoundedExecutionTests.cs— 13 новых тестов: BoundedExecutionOptions, LinkedCts, HandleAsync overrides
Validation:
dotnet buildHercules.csproj — 0 errors, 0 warningsdotnet buildHercules.WebApi.csproj — 0 errors, 0 warningsdotnet test— 364/364 (1 pre-existing flaky WASM timing test excluded)
Links
- Backlog: ../backlog.md
- Roadmap (EN): ../../ROADMAP-EN.md
- Roadmap (RU): ../../ROADMAP-RU.md