update sandbox control task plan

This commit is contained in:
Азамат Нураев 2026-04-28 21:53:34 +03:00
parent 1b38bcfeab
commit 312b657e49

121
tasks.md
View file

@ -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 или отсутствуют