diff --git a/docs/work-items/ORCH-102/13-test-report.md b/docs/work-items/ORCH-102/13-test-report.md new file mode 100644 index 0000000..5971bcf --- /dev/null +++ b/docs/work-items/ORCH-102/13-test-report.md @@ -0,0 +1,95 @@ +--- +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`. + +