From 312b657e4970385d8eb9e42e431d0b5bea83cbc0 Mon Sep 17 00:00:00 2001 From: gglamer Date: Tue, 28 Apr 2026 21:53:34 +0300 Subject: [PATCH] update sandbox control task plan --- tasks.md | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/tasks.md b/tasks.md index d5009d7..3fbdfe9 100644 --- a/tasks.md +++ b/tasks.md @@ -359,3 +359,124 @@ - Scope: подтвердить, что M27-M28 закрыли remaining M26 замечания - Файлы: весь измененный код после `M27`-`M28` - Критерии приемки: нет замечаний по rollback gap и startup failure observability coverage; sandbox observability slice приемлем as-is + +## Follow-up: sandbox HTTP delete, runtime endpoint, agent env и request volume + +### M30. ADR и контракты sandbox runtime params/control + +- Исполнитель: `primary-agent` +- Статус: completed +- Зависимости: нет +- Commit required: no +- Scope: зафиксировать решение в ADR-lite и подготовить минимальные domain/usecase контракты для `agent_id`, host volume, endpoint и delete sandbox +- Файлы: `docs/009-sandbox-http-control-and-runtime-params.md`, `domain/sandbox.py`, `domain/error.py`, `usecase/interface.py`, `usecase/sandbox.py` +- Решение: create принимает `agent_id` и absolute `volume_host_path`; reuse разрешен только при совпадении параметров; delete выполняется по `chat_id`; response содержит Docker-network endpoint `ip:port` +- Критерии приемки: ADR занимает 10-20 строк; в domain есть endpoint/session metadata; usecase contracts не импортируют Docker/FastAPI; есть stubs для `DeleteSandbox` без бизнес-логики + +### M31. Typed config для sandbox network и runtime port + +- Субагент: `feature-developer` +- Статус: completed +- Зависимости: `M30` +- Commit required: no +- Scope: добавить typed-config настройки Docker network, agent service port и mount target для request volume +- Файлы: `adapter/config/model.py`, `adapter/config/loader.py`, `config/app.yaml`, при необходимости `config/docker-compose.yml`, tests config loader +- Решение: добавить `sandbox.network_name: sandbox`, `sandbox.agent_service_port: 8000`, `sandbox.volume_mount_path: /workspace/volume`; network должен существовать заранее +- Критерии приемки: config собирается в dataclass tree; env overrides поддержаны; inner layers не читают env/YAML; defaults отражены в локальном config + +### M32. Docker runtime для env, volume, network endpoint и delete + +- Субагент: `feature-developer` +- Статус: completed +- Зависимости: `M30`, `M31` +- Commit required: no +- Scope: обновить Docker adapter create/delete и reconciliation под новые sandbox runtime параметры +- Файлы: `adapter/docker/runtime.py`, `adapter/sandbox/reconciliation.py`, при необходимости focused tests helpers +- Решение: `containers.run` получает `environment={'AGENT_ID': agent_id}`, `network=config.sandbox.network_name`, extra bind mount `volume_host_path -> volume_mount_path`; после start runtime достает IP из configured network и возвращает endpoint; delete делает `remove(force=True)` и NotFound считает идемпотентным успехом; labels содержат `agent_id`, `volume_host_path` и endpoint port metadata для reconciliation +- Критерии приемки: Docker details остаются в adapter; mount policy сохраняет chat `rw`, deps/tools `ro`, request volume `rw`; create возвращает endpoint; startup reconciliation восстанавливает новые session fields; observability duration/error metrics не регрессируют + +### M33. CreateSandbox параметры и conflict semantics + +- Субагент: `feature-developer` +- Статус: completed +- Зависимости: `M30`, `M32` +- Commit required: no +- Scope: обновить create usecase под `agent_id`, `volume_host_path`, endpoint response и reuse conflict rules +- Файлы: `usecase/sandbox.py`, `domain/error.py`, `adapter/di/container.py`, при необходимости `repository/sandbox_session.py` +- Решение: активная сессия переиспользуется только если `agent_id` и `volume_host_path` совпадают; при mismatch usecase поднимает sandbox conflict error; replace/cleanup rollback paths сохраняют прежнюю консистентность `sandbox.active.count` +- Критерии приемки: одна active sandbox на `chat_id`; mismatch не стартует новый контейнер; endpoint возвращается через domain session; usecase не импортирует Docker/FastAPI + +### M34. DeleteSandbox usecase и DI wiring + +- Субагент: `feature-developer` +- Статус: completed +- Зависимости: `M30`, `M32` +- Commit required: no +- Scope: реализовать usecase удаления sandbox по `chat_id` и подключить его в container +- Файлы: `usecase/sandbox.py`, `usecase/interface.py`, `adapter/di/container.py` +- Решение: под per-chat lock найти active session, вызвать `runtime.delete(container_id)`, удалить registry entry и обновить `sandbox.active.count`; missing session возвращает idempotent `not_found` result +- Критерии приемки: delete-vs-create сериализован тем же locker; NotFound runtime path не ломает идемпотентность; lifecycle metrics/logs/traces отражают deleted/not_found/error outcomes + +### M35. HTTP schemas/routes для create params и delete endpoint + +- Субагент: `feature-developer` +- Статус: completed +- Зависимости: `M33`, `M34` +- Commit required: no +- Scope: обновить FastAPI adapter под расширенный create request/response и добавить delete endpoint без auth +- Файлы: `adapter/http/fastapi/schemas.py`, `adapter/http/fastapi/dependencies.py`, `adapter/http/fastapi/routers/v1/router.py` +- Решение: `POST /api/v1/create` принимает `chat_id`, `agent_id`, `volume_host_path`; response содержит `agent_id`, `volume_host_path`, `endpoint`; `DELETE /api/v1/sandboxes/{chat_id}` возвращает `deleted` или `not_found`; conflict мапится в `409` +- Критерии приемки: router остается тонким; HTTP models остаются в FastAPI adapter; path/request validation не переносится во внутренние слои; auth не добавляется + +### M36. Тесты для delete, endpoint, env и volume mapping + +- Субагент: `test-engineer` +- Статус: completed +- Зависимости: `M31`, `M32`, `M33`, `M34`, `M35` +- Commit required: no +- Scope: покрыть новую sandbox control surface без реального production Docker stack +- Файлы: `test/test_sandbox_usecase.py`, `test/test_docker_runtime.py`, `test/test_create_http.py`, при необходимости новые focused tests +- Критерии приемки: есть tests на create request params, reuse match, reuse mismatch `409`, delete `deleted/not_found`, Docker env `AGENT_ID`, request volume bind `rw`, configured network, endpoint IP/port extraction и reconciliation новых labels; `make typecheck` и relevant pytest проходят + +### M37. Boundary review для sandbox HTTP control changes + +- Субагент: `code-reviewer` +- Статус: completed +- Зависимости: `M36` +- Commit required: no +- Scope: проверить clean architecture, boundary rules и соответствие согласованному MVP scope +- Файлы: весь измененный код после `M30`-`M36` +- Критерии приемки: Docker/FastAPI не протекают во внутренние слои; absolute host path явно ограничен как MVP-риск; dependency direction сохранен; delete/create race не нарушает one-sandbox-per-chat; замечания сведены к minor или отсутствуют + +## Follow-up после M37 boundary review + +### M38. Исправить rollback endpoint failure и canonical volume path + +- Субагент: `feature-developer` +- Статус: completed +- Зависимости: `M37` +- Commit required: no +- Scope: закрыть must/should-fix замечания M37 без смены архитектуры +- Файлы: `adapter/docker/runtime.py`, `adapter/http/fastapi/schemas.py`, `usecase/sandbox.py`, при необходимости focused tests helpers +- Решение: при ошибке после успешного `containers.run` удалить новый container до `SandboxStartError`; canonicalize `volume_host_path` на HTTP boundary; сделать `agent_id` и `volume_host_path` обязательными в `CreateSandboxCommand` +- Критерии приемки: endpoint extraction failure не оставляет untracked running container; повторный create с эквивалентным path не конфликтует из-за raw/canonical mismatch; inner create command больше не допускает пустые default params + +### M39. Регрессии для M37 review fixes + +- Субагент: `test-engineer` +- Статус: completed +- Зависимости: `M38` +- Commit required: no +- Scope: добавить tests на rollback после endpoint failure и canonical volume path reuse, обновить тесты под required command params +- Файлы: `test/test_docker_runtime.py`, `test/test_create_http.py`, `test/test_sandbox_usecase.py` +- Критерии приемки: endpoint failure удаляет созданный container; HTTP canonicalizes volume path до usecase command; `CreateSandboxCommand` без params больше не используется; `make lint`, `make typecheck`, `make test` проходят + +### M40. Повторный boundary review для sandbox HTTP control changes + +- Субагент: `code-reviewer` +- Статус: completed +- Зависимости: `M39` +- Commit required: no +- Scope: подтвердить, что M38-M39 закрыли M37 findings без новых boundary нарушений +- Файлы: весь измененный код после `M38`-`M39` +- Критерии приемки: M37 must/should-fix закрыты; clean architecture соблюдена; замечания сведены к minor или отсутствуют