6.4 KiB
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 не требуется.