--- result: PASS # PASS | FAIL — машинный вердикт, UPPERCASE work_item: ORCH-102 stage: testing author_agent: tester status: pass created_at: 2026-06-11 model_used: claude-opus-4-8 type: test-report work_item_id: ORCH-102 --- # Test Report — ORCH-102 — ORCH-10a Lite-тираж: LITE_SETUP.md + канон watchdog-конфига + анти-дрейф контур ## Окружение - Python: 3.12.13 - pytest: 8.3.3 (plugins: cov-5.0.0, anyio-4.13.0, asyncio-0.23.8) - Дата: 2026-06-11 - Worktree: `/repos/_wt/orchestrator/feature_ORCH-102-orch-10a-lite-watchdog` - Ветка: `feature/ORCH-102-orch-10a-lite-watchdog` (HEAD `e67c026`) - Прогон выполнен в worktree ветки задачи (не в общем `/repos/orchestrator`). - Вердикт ревью (`12-review.md`): **APPROVED** (P0/P1 — нет). ## Smoke API (read-only) | Проверка | Результат | |----------|-----------| | `GET /health` | PASS — `{"status":"ok","service":"orchestrator"}` | | `GET /status` | PASS — задача ORCH-102 (task 89) на стадии `testing` | | `GET /queue` | PASS — отдаёт полезную нагрузку, штатные счётчики | | Блок `serial_gate` в `/queue` (ORCH-088) | PASS — присутствует; `orchestrator.active_task = ORCH-102 (testing)`, не заморожен | | Блок `auto_labels` в `/queue` (ORCH-089) | PASS — присутствует | | `GET /metrics` | PASS — `schema_version: 1` | | `GET /health` staging (8501) | PASS — `{"status":"ok","service":"orchestrator"}` | ## Smoke-процедура Lite-тиража (AC-4 / FR-5, TC-09) Воспроизводимость smoke-runbook LITE_SETUP.md подтверждена на текущей инфре (read-only, stateless, без переноса данных/секретов; прецедент ORCH-101 AC-3). Docs+tests-задача — `src/**` не тронут, полноценный e2e на новом железе заказчика заменён прогоном артефактов smoke-цепочки: | Шаг smoke (REPLICATION §4 / LITE_SETUP §10–12) | Результат | |-----|-----------| | `docs/deployment/LITE_SETUP.md` существует по канонному пути (33 КБ, 13 разделов) | PASS | | `.env.watchdog.example` существует (канон watchdog-конфига, ADR D5) | PASS | | `scripts/gen_secrets.py` запускается в безопасном (print) режиме | PASS — exit 0, файлы не тронуты (`git status` чист) | | Webhook-секреты крипто-случайны (64 hex = 32 байта) | PASS — `ORCH_PLANE_WEBHOOK_SECRET`/`ORCH_GITEA_WEBHOOK_SECRET` | | Внешние токены/боевые секреты в доке отсутствуют (плейсхолдеры) | PASS (подтверждено TC-05) | | Конфиг резолвится, инстанс поднят, health-check зелёный (см. Smoke API) | PASS | | `GET /metrics` → `schema_version: 1` | PASS | | Compose-подмножество (ровно орк+watchdog, staging за профилем) | PASS — структурно через TC-04 (yaml-парс; `docker` CLI в песочнице tester'а недоступен, свойство фиксируется тестом) | ## Результаты (покрытие TC из `04-test-plan.yaml`) | TC ID | Описание | Покрывающие тесты | Результат | |-------|----------|-------------------|-----------| | TC-01 | LITE_SETUP.md существует по канонному пути и несёт ВСЕ 13 нормативных разделов FR-1 (AC-1/FR-1) | `test_lite_setup_doc::test_doc_exists_with_all_13_sections_in_order`, `test_doc_carries_all_mandatory_bricks` | PASS | | TC-02 | Форма «каждый шаг — команда/проверка»: fenced-команды + маркеры PASS/FAIL/«Проверка», ключевые кирпичи (AC-1/FR-1, NFR-6) | `test_every_normative_section_carries_commands`, `test_doc_carries_explicit_check_markers` | PASS | | TC-03 | Согласованность env-канона: каждый `ORCH_*`/`WATCHDOG_*` в доке есть в `.env.example`; обязательный набор нового хоста явно (AC-1/AC-6/FR-1.4/FR-6.2) | `test_every_env_token_in_doc_exists_in_env_example`, `test_mandatory_new_host_keys_are_explicit`, `test_watchdog_example_keys_sync_with_env_example_block` | PASS | | TC-04 | Compose-подмножество: ровно `{orchestrator, orchestrator-watchdog, orchestrator-staging}`, staging за `profiles:[staging]`, без `plane*`/`gitea*` (AC-2/FR-2) | `test_compose_services_are_exactly_the_lite_set`, `test_compose_staging_is_strictly_behind_profile`, `test_compose_has_no_plane_or_gitea_services`, `test_doc_documents_default_up_composition` | PASS | | TC-05 | Stateless и секрет-гигиена: нормативная строка «не копируются», чистая БД + новые секреты, проверка чистоты, нет боевых литералов/секретов в код-блоках (AC-3/FR-3/NFR-3) | `test_doc_has_stateless_normative_line`, `test_doc_prescribes_clean_db_and_fresh_secrets`, `test_fenced_blocks_carry_no_forbidden_literals`, `test_fenced_blocks_carry_no_secret_like_values`, `test_secret_heuristic_is_not_evergreen`, `test_watchdog_example_secrets_are_placeholders_only` | PASS | | TC-06 | Канон не форкается: статусы ссылкой на ONBOARDING §1 + fail-closed `Confirm Deploy`/`STOP`; «22 статуса» сверены импортом `plane_sync._PLANE_NAME_TO_KEY`; env/smoke ссылкой на REPLICATION (AC-6/FR-4/NFR-4) | `test_plane_canon_is_linked_not_forked`, `test_status_count_claim_matches_plane_sync`, `test_env_map_and_smoke_are_linked_to_replication` | PASS | | TC-07 | Раздел Gitea: события `push/pull_request/status`, ОДИН глобальный webhook-секрет, норматив «branch protection НЕ включать» (ADR D10 ORCH-009) (AC-1/AC-7/FR-1.6/§3.8 А-1) | `test_gitea_section_fixes_platform_invariants`, `test_gitea_section_forbids_branch_protection` | PASS | | TC-08 | Перекрёстная документация: REPLICATION §1 ссылается на LITE_SETUP; CHANGELOG несёт ORCH-102 (AC-5/FR-7) | `test_replication_boundaries_reference_lite_setup`, `test_changelog_has_orch_102_entry` | PASS | | TC-09 | Приёмочный smoke-прогон по LITE_SETUP на чистом контуре; вердикт фиксируется tester'ом (процедура, не pytest) (AC-4/FR-5) | см. раздел «Smoke-процедура Lite-тиража» + «Smoke API» выше | PASS | | TC-10 | Полный регресс `pytest tests/ -q` зелёный; существующие структурные тесты не ослаблены; дифф не трогает машину стадий/QG/вердикты/схему БД (AC-5/AC-7/NFR-2) | весь набор — **1789 passed** | PASS | Соответствие критериям `03-acceptance-criteria.md`: AC-1 (TC-01/02/03), AC-2 (TC-04), AC-3 (TC-05), AC-4 (TC-09 + smoke-процедура), AC-5 (TC-08/TC-10), AC-6 (TC-03/06), AC-7 (TC-07/TC-10) — все покрыты и зелёные. ## Вывод pytest ``` ============================= test session starts ============================== platform linux -- Python 3.12.13, pytest-8.3.3, pluggy-1.6.0 rootdir: /repos/_wt/orchestrator/feature_ORCH-102-orch-10a-lite-watchdog configfile: pytest.ini plugins: cov-5.0.0, anyio-4.13.0, asyncio-0.23.8 ........................................................................ [100%] ================== 1789 passed, 1 warning in 64.06s (0:01:04) ================== ``` (единственный warning — PydanticDeprecatedSince20 в `src/config.py:8`, предсуществующий, не связан с задачей.) Целевой модуль задачи (отдельный прогон): ``` tests/test_lite_setup_doc.py ======================== 25 passed, 1 warning in 0.44s ========================= ``` (25 структурных тестов покрывают TC-01…TC-08; заявление CHANGELOG «25 структурных тестов» совпадает с фактом.) ## Итог **PASS** — полный регресс зелёный (1789 passed), все 10 TC из `04-test-plan.yaml` выполнены и сопоставлены с критериями `03-acceptance-criteria.md`. Smoke API read-only (включая блоки `serial_gate` и `auto_labels` в `/queue`, `/metrics schema_version:1`) и smoke-процедура Lite-тиража (LITE_SETUP.md + безопасный прогон `gen_secrets.py`, stateless, без переноса данных) зелёные. Задача переходит на `deploy-staging`.