Task 36 — Протокол жизненного цикла задач
Phase: 3
Status: done
Owner: —
Slug: task-lifecycle-protocol
Goal
Delegated задачи: accepted, working, awaiting-input, completed, failed, cancelled, expired; вызывающий может poll, subscribe или callback по возможностям transport.
Acceptance criteria
Sub-tasks
src/agent/Mesh/TaskLifecycle/DelegatedTaskState.cs— enum: Accepted, Working, AwaitingInput, Completed, Failed, Cancelled, Expiredsrc/agent/Mesh/TaskLifecycle/DelegatedTask.cs— record: taskId, parentRequestId, callerAgentId, intent, state, createdAt, updatedAt, completedAt, result, error, expiresAtsrc/agent/Mesh/TaskLifecycle/ITaskLifecycleProtocol.cs— интерфейс: AcceptAsync, UpdateStateAsync, GetStateAsync, CheckExpiredAsync, CompleteAsync, FailAsync, CancelAsyncsrc/agent/Mesh/TaskLifecycle/TaskLifecycleProtocol.cs— реализация: связывает local DurableTask с inter-agent state machinesrc/agent/Mesh/TaskLifecycle/TaskLifecycleServiceExtensions.cs— DI-регистрация- WebAPI endpoints в MeshController:
POST /api/mesh/tasks/accept— принять delegated задачуGET /api/mesh/tasks/{id}— получить состояние delegated задачиPOST /api/mesh/tasks/{id}/state— обновить state (Working/AwaitingInput)POST /api/mesh/tasks/{id}/await-input— перевести в AwaitingInputPOST /api/mesh/tasks/{id}/complete— завершить с результатомPOST /api/mesh/tasks/{id}/fail— завершить с ошибкойPOST /api/mesh/tasks/{id}/cancel— отменитьPOST /api/mesh/tasks/{id}/callback— callback от вызывающего агента (input delivered)GET /api/mesh/tasks/{id}/poll— long-poll на AwaitingInputPOST /api/mesh/tasks/{id}/expire-check— принудительная проверка expirationPOST /api/mesh/tasks/{id}/notify— callback вызывающему агенту
tests/Phase3Tests/TaskLifecycleProtocolTests.cs— 33 unit tests: state transitions, expiration, invalid transitions, polldotnet build— 0 errors (warnings pre-existing)dotnet test— Phase 3 tests pass (114/114)
Scope / Likely files
src/agent/Mesh/TaskLifecycle/
Dependencies
- блокирует / опирается на: task_018 — durable-task-lifecycle
- блокирует / опирается на: task_035 — delegation-envelope
Risks / Rollback
Согласованность состояния при сбоях; idempotent transitions.
Implementation notes
2026-08-13
Добавлено:
src/agent/Mesh/TaskLifecycle/ — новый namespace для протокола:
DelegatedTaskState.cs— enum: Accepted, Working, AwaitingInput, Completed, Failed, Cancelled, ExpiredDelegatedTask.cs— record для delegated задачи: taskId, parentRequestId, callerAgentId, intent, payload, state, timestamps, result, error, cancellationReason, expiresAt, AwaitingInputContext, localTaskId; вложенныйAwaitingInputContextrecord для хранения контекста ожидания вводаITaskLifecycleProtocol.cs— интерфейс: AcceptAsync, UpdateStateAsync, AwaitInputAsync, GetStateAsync, CompleteAsync, FailAsync, CancelAsync, CheckExpiredAsync, RecordInputAsync, BindLocalTaskAsync, PollForInputDeliveryAsync, NotifyStateChangeAsyncTaskLifecycleProtocol.cs— реализация: ConcurrentDictionary in-memory хранилище, полный state machine с валидацией переходов, TaskCompletionSource для long-poll на AwaitingInput, callback через IntentTransportTaskLifecycleServiceExtensions.cs— DI-регистрация
src/agent/Mesh/MeshServiceExtensions.cs — добавлена регистрация ITaskLifecycleProtocol в AddMeshServices() с IntentTransport для callback-уведомлений.
src/agent/Hercules.WebApi/Controllers/MeshController.cs — 11 новых endpoints:
- POST
/api/mesh/tasks/accept— принять delegated задачу - GET
/api/mesh/tasks/{id}— получить состояние - POST
/api/mesh/tasks/{id}/state— обновить state - POST
/api/mesh/tasks/{id}/await-input— перевести в AwaitingInput - POST
/api/mesh/tasks/{id}/complete— завершить с результатом - POST
/api/mesh/tasks/{id}/fail— завершить с ошибкой - POST
/api/mesh/tasks/{id}/cancel— отменить - POST
/api/mesh/tasks/{id}/callback— callback от вызывающего агента - GET
/api/mesh/tasks/{id}/poll— long-poll на AwaitingInput - POST
/api/mesh/tasks/{id}/expire-check— проверка expiration - POST
/api/mesh/tasks/{id}/notify— callback вызывающему агенту
tests/.../Phase3Tests/TaskLifecycleProtocolTests.cs — 33 unit tests:
- accept, deadline, state transitions, invalid transitions, terminal state blocking, expiration, record input, bind local task, poll resolution, AwaitingInput context scenarios
Validation:
dotnet buildHercules.csproj — 0 errors, 14 warnings (pre-existing: NU1902 Otel, CS8602/CS8620/CS0618)dotnet buildHercules.WebApi.csproj — 0 errors, 13 warnings (pre-existing)dotnet buildHercules.Agent.Tests.csproj — 0 errors, 57 warnings (pre-existing)dotnet test --filter Phase3— 114/114 passeddotnet test --filter TaskLifecycleProtocolTests— 33/33 passed- Full suite — 957/963 (6 pre-existing: OtelService + BudgetGuard)
Links
- Backlog: ../backlog.md
- Roadmap (EN): ../../ROADMAP-EN.md
- Roadmap (RU): ../../ROADMAP-RU.md