From 59e47ba067ce97763b514dd060176ff045957095 Mon Sep 17 00:00:00 2001 From: claude-bot Date: Sat, 6 Jun 2026 15:07:07 +0000 Subject: [PATCH] tester(ET): auto-commit from tester run_id=179 --- docs/work-items/ORCH-040/13-test-report.md | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 docs/work-items/ORCH-040/13-test-report.md diff --git a/docs/work-items/ORCH-040/13-test-report.md b/docs/work-items/ORCH-040/13-test-report.md new file mode 100644 index 0000000..7330aa0 --- /dev/null +++ b/docs/work-items/ORCH-040/13-test-report.md @@ -0,0 +1,94 @@ +--- +type: test-report +work_item_id: ORCH-040 +result: PASS +--- + +# Test Report — ORCH-040 + +Тема: agent-файлы конвейера создаются под uid хоста (`1000:1000`, slin), +а не `root:root`. Реализация — Вариант 1 (`user: "1000:1000"` в обоих +compose-сервисах), правка только в `docker-compose.yml` + тесты. + +## Окружение +- Python: 3.12.13 +- pytest: 8.3.3 +- Сервис (prod 8500): `/health` → 200 `{"status":"ok"}`; preflight_ok=true (`2.1.142 (Claude Code)`) +- Дата: 2026-06-06T15:06:25Z +- Ветка: feature/ORCH-040-root-git + +## Smoke test API (read-only GET, прод-контейнер не трогался) +| Endpoint | Результат | +|----------|-----------| +| GET /health | 200 — `{"status":"ok","service":"orchestrator"}` | +| GET /status | 200 — активная задача ORCH-040 (stage=testing) | +| GET /queue | 200 — counts ok, max_concurrency=1, breaker=closed, preflight_ok=true | + +> curl в окружении тестера отсутствует; smoke выполнен эквивалентным запросом +> через `python -m urllib.request` (только GET, без побочных эффектов). + +## Результаты (по 04-test-plan.yaml) + +| TC ID | Описание | Тип | Результат | +|-------|----------|-----|-----------| +| TC-01 | compose: оба сервиса `user: "1000:1000"` (Вариант 1) | unit | PASS | +| TC-02 | compose: оба сервиса сохраняют `group_add: ["999"]` (МИНА 1, docker.sock) | unit | PASS | +| TC-03 | compose: SSH-маунт target под `/home/slin/.ssh`, согласован с HOME | unit | PASS | +| TC-04 | launcher: форсимый HOME совместим с claude/SSH-маунтами (`/home/slin`) | unit | PASS | +| TC-05 | полный регресс `pytest tests/` зелёный (нет регресса конвейера/launcher) | unit | PASS (501 passed) | +| TC-06 | staging E2E: артефакты worktree/docs создаются `1000:1000` (AC-1) | integration | DEFERRED → deploy-staging | +| TC-07 | хост под slin: `git pull/status/reset` без Permission denied (AC-2) | integration | DEFERRED → deploy-staging | +| TC-08 | claude preflight/auth под uid 1000, агент exit_code=0 (AC-3, МИНА 2) | integration | DEFERRED → deploy-staging | +| TC-09 | docker.sock + ssh-деплой под uid 1000 (AC-4, AC-5) | integration | DEFERRED → deploy-staging | + +**О TC-06…TC-09:** по дизайну test-plan'а это ops/integration-проверки на +staging (8501) и хосте, касающиеся прав ФС хоста и docker-рантайма. Они +относятся к стадии `deploy-staging` (их PASS фиксируется в `15-staging-log.md`, +`staging_status:`) и не воспроизводимы в окружении стадии `testing` без +рестарта контейнера под новым uid. Это совпадает с замечанием ревью +(12-review.md, P3): runtime/host-критерии AC-1…AC-5 подтверждаются на +`deploy-staging`, а не при тестировании кода. Запуск деструктивных операций / +рестарт self в рамках стадии testing запрещён (CLAUDE.md, self-hosting). + +## Покрытие критериев приёмки (03-acceptance-criteria.md) +| AC | Статус на стадии testing | +|----|--------------------------| +| AC-1 (артефакты под uid хоста) | runtime — проверяется на deploy-staging | +| AC-2 (git под slin) | runtime — проверяется на deploy-staging | +| AC-3 (claude preflight ok) | preflight_ok=true в `/queue`; полное E2E — deploy-staging | +| AC-4 (docker.sock доступен) | конфиг подтверждён TC-02; runtime — deploy-staging | +| AC-5 (SSH-деплой) | конфиг подтверждён TC-03; runtime — deploy-staging | +| AC-6 (конвейер без регресса, pytest зелёный) | **PASS** — 501 passed | +| AC-7 (проверено на staging до прода) | стадия deploy-staging | +| AC-8 (документация/ADR обновлены) | **PASS** — подтверждено ревью (APPROVED) | +| AC-9 (прод не уронен вне окна тишины) | стадия deploy/окно тишины | +| AC-10 (host-prerequisites зафиксированы) | **PASS** — P-1…P-4 в ADR/INFRA | + +## Вывод pytest +``` +$ python -m pytest tests/ -v --tb=short +platform linux -- Python 3.12.13, pytest-8.3.3, pluggy-1.6.0 +configfile: pytest.ini +plugins: anyio-4.13.0, asyncio-0.23.8 +... +======================== 501 passed, 1 warning in 8.54s ======================== + +$ python -m pytest tests/test_orch040_compose.py -v +tests/test_orch040_compose.py::test_tc01_service_runs_as_host_uid[orchestrator] PASSED +tests/test_orch040_compose.py::test_tc01_service_runs_as_host_uid[orchestrator-staging] PASSED +tests/test_orch040_compose.py::test_tc02_group_add_keeps_docker_gid[orchestrator] PASSED +tests/test_orch040_compose.py::test_tc02_group_add_keeps_docker_gid[orchestrator-staging] PASSED +tests/test_orch040_compose.py::test_tc03_ssh_mount_under_home[orchestrator] PASSED +tests/test_orch040_compose.py::test_tc03_ssh_mount_under_home[orchestrator-staging] PASSED +tests/test_orch040_compose.py::test_tc04_launcher_home_matches_mounts PASSED +========================= 7 passed, 1 warning in 0.31s ========================= +``` +(1 warning — Pydantic V2 deprecation в `src/config.py`, не относится к ORCH-040.) + +## Итог +**PASS** — все автоматизируемые тесты (TC-01…TC-05) зелёные, полный регресс +501 passed, smoke API ok, документация/ADR подтверждены ревью. Runtime/host +критерии (TC-06…TC-09, AC-1…AC-5/7/9) корректно отложены на обязательную +стадию `deploy-staging` (8501) — страховку self-hosting перед прод-деплоем. + +Задача переходит на стадию **deploy-staging**.