Files
orchestrator/docs/work-items/ORCH-116/07-infra-requirements.md

6.4 KiB
Raw Blame History

work_item, stage, author_agent, status, created_at, model_used
work_item stage author_agent status created_at model_used
ORCH-116 architecture architect proposed 2026-06-16 claude-opus-4-8

07 — Инфраструктурные требования: ORCH-116 — детерминированный test-раннер

Work Item: ORCH-116 · Repo: orchestrator · Стадия: architecture

Топология не меняется (всё в Docker на одном сервере mva154, SQLite, собственная очередь). Раздел фиксирует рантайм-предусловия детерминированного раннера и подтверждает отсутствие новых компонентов/портов/зависимостей образа.

1. Топология — без изменений

Новых контейнеров / сервисов / портов / сетей нет. Раннер исполняется внутри уже работающего прод-контейнера orchestrator (8500) как синхронный обработчик джоба tester (перехват в launch_job до _spawn) — там же, где сейчас стартует LLM-tester. Staging-контур (8501) для ORCH-116 не используется (в отличие от ORCH-115) — это ребро testing, а не deploy-staging.

2. Рантайм-предусловия (предсуществующие, проверить)

# Предусловие Статус Обоснование
P-1 python -m pytest исполним внутри прод/staging-образа уже выполнено pytest уже гоняется в worktree внутри этого же образа coverage-gate (ORCH-027) и merge-gate re-test (ORCH-110). Новых pip-зависимостей нет (в отличие от pytest-cov ORCH-027 — он не требуется: ORCH-116 читает только exit-код, не покрытие).
P-2 Per-branch worktree ветки задачи материализуем (git_worktree.get_worktree_path) уже выполнено механика worktree используется всеми гейтами/раннерами; раннер исполняет pytest в worktree ветки (анти checkout-гонка, ORCH-112), не в общем /repos/orchestrator.
P-3 proc_group.run_in_process_group (tree-kill) доступен на POSIX-хосте уже выполнено ORCH-110; fallback к subprocess.run на не-POSIX (subprocess_tree_kill_enabled).
P-4 Read-only smoke: запущенный оркестратор отвечает на GET /health, /status, /queue по config-резолвнутому base URL уже выполнено те же эндпоинты read-only опрашивал LLM-tester (шаг 3 промпта). Base URL — из config (host-параметризация ORCH-101, без host-хардкодов). Smoke строго read-only; опционален (test_runner_smoke_enabled).
P-5 git-identity актора test-runner для best-effort push лога в фичеветку уже выполнено HOME + email-домен из settings (ORCH-101), как у staging-runner. Push только в фичеветку, никогда в main/force-push.

3. Конфигурация (env, дефолт = боевое; пустой .env ⇒ поведение для in-scope)

Ключ env Дефолт Назначение
test_runner_enabled ORCH_TEST_RUNNER_ENABLED True kill-switch (off → LLM-tester байт-в-байт)
test_runner_repos ORCH_TEST_RUNNER_REPOS "" CSV-скоуп; пусто → self-hosting only
test_runner_target ORCH_TEST_RUNNER_TARGET tests/ pytest-таргет тест-контракта
test_runner_timeout_s ORCH_TEST_RUNNER_TIMEOUT_S 900 таймаут pytest (D9; согласован со сквозным бюджетом ORCH-065/109/110 без правки reaper_max_running_s)
test_runner_smoke_enabled ORCH_TEST_RUNNER_SMOKE_ENABLED True опц. read-only smoke
test_runner_infra_max_retries ORCH_TEST_RUNNER_INFRA_MAX_RETRIES 2 бюджет tool-error DEFER (D5)
test_runner_infra_retry_delay_s ORCH_TEST_RUNNER_INFRA_RETRY_DELAY_S 30 задержка DEFER-re-queue

.env.example пополнить этими ключами (канон старта, норматив ORCH-101). Изменений docker-compose.yml / Dockerfile / образа нет.

4. Сквозной бюджет времени (NFR-4)

Ребро testing отдельно от deploy-staging. Окно «running» tester-джоба = только pytest+smoke (≤test_runner_timeout_s=900s); тяжёлые под-гейты (security/merge/coverage/image-freshness) живут на ребре deploy-staging → deploy. Прежний LLM-tester шёл под agent_timeout_seconds=1800s (config.py:159; tester без выделенного per-role ключа). 900 < 1800 → Σ(работ на ребре testing) не растёт → инвариант reaper_max_running_s (5400) > Σ + grace сохранён без правки reaper'а.

5. Self-hosting safety (BR-7 / AC-10)

Раннер на testing никогда не рестартит контейнер 8500, не выполняет docker compose up -d orchestrator/--build, не пушит force в main, не правит .env/.env.staging/docker-compose.yml. Он лишь исполняет pytest в worktree, делает read-only GET и пишет/пушит лог в фичеветку. Деплой-решений ORCH-116 не принимает (это стадия testing, до прод-деплоя) — staging-гейт остаётся обязательной страховкой на последующих рёбрах.

6. Вывод

Инфраструктурных изменений нет (топология/порты/образ/зависимости — без правок). Все предусловия P-1…P-5 предсуществуют. Эскалация arch:major-change не требуется.