update sandbox control task plan
This commit is contained in:
parent
1b38bcfeab
commit
312b657e49
1 changed files with 121 additions and 0 deletions
121
tasks.md
121
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 или отсутствуют
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue