---
result: PASS   # PASS | FAIL — машинный вердикт, UPPERCASE
work_item: ORCH-009
stage: testing
author_agent: tester
status: pass
created_at: 2026-06-10
model_used: claude-opus-4-8
type: test-report
work_item_id: ORCH-009
---

# Test Report — ORCH-009 — Turnkey-онбординг проектов (kit + CLI + runbook)

> Машинный вердикт читается ТОЛЬКО из frontmatter (`result:`). Перепрогон стадии testing на
> opus после сброса session-limit (ре-ран по запросу). Review-вердикт цикла 2 — `APPROVED`
> (`12-review.md`, P0/P1 нет). Дельта цикла (герметизация ORCH-41-тестов `e903818`) перепроверена
> полным регрессом под фактическим окружением worktree.

## Окружение
- Python: 3.12.13
- pytest: 8.3.3 (pytest-cov 5.0.0, asyncio 0.23.8)
- Дата: 2026-06-10
- Worktree: `feature/ORCH-009-turnkey-plane` (`/repos/_wt/orchestrator/feature_ORCH-009-turnkey-plane`, HEAD `b97ffae`)
- Прод-контейнер `orchestrator` (8500) — НЕ трогался (smoke read-only).

## Smoke API (read-only)
- `GET /health` → `{"status":"ok","service":"orchestrator"}` ✅
- `GET /status` → отвечает; задача ORCH-009 (task 87) на стадии `testing` ✅
- `GET /queue` → блок `serial_gate` **присутствует** (ORCH-088) ✅; блок `auto_labels` присутствует ✅
  (полный набор ключей: `auto_labels, bug_fast_track, build_cache_prune, counts, coverage,
  disk_monitor, fs_ownership, lessons, max_concurrency, merge_verify, poll_interval, post_deploy,
  reaper, recent, reconcile, resilience, serial_gate, stop, task_deps`).

## Результаты

### Полный регресс
`pytest tests/ -q` → **1713 passed, 0 failed, 1 warning** за 65.40s (exit 0). Прод-контейнер не
трогался. Средовая мина merge-gate цикла 1 обезврежена фиксом `e903818` — регресс зелёный.

### Профильные сюиты (онбординг)
`pytest tests/test_onboarding_kit.py tests/test_onboarding_script.py tests/test_onboarding_invariants.py -v`
→ **83 passed, 0 failed** за 0.55s (exit 0). Сетевых вызовов нет (Plane/Gitea — фейк-клиенты, NFR-5).

### Сопоставление с тест-планом (`04-test-plan.yaml`)

| TC ID | Описание | Тест-функция | Рез. |
|-------|----------|--------------|------|
| TC-01 | Kit содержит все элементы FR-1 (6 промптов + доки) | `test_tc01_kit_contains_all_required_elements`, `test_tc01_kit_readme_and_placeholder_dictionary_exist` | PASS |
| TC-02 | Материализация добавляет live-копии `_templates`/`_standards`; форк канона отсутствует | `test_tc02_materialise_live_copies_canon`, `test_kit_does_not_fork_the_canon` | PASS |
| TC-03 | 5 XML-секций в нормативном порядке (6 ролей) | `test_tc03_five_xml_sections_in_normative_order[*]` | PASS |
| TC-04 | `<escalation>` у dev/rev/tester; запреты «❌→✅» | `test_tc04_escalation_section_after_success_criteria[*]`, `test_tc04_bans_use_cross_check_format[*]` | PASS |
| TC-05 | Директивы доки (читай паспорт/AGENTS/ADR; пиши в work-items; CHANGELOG) | `test_tc05_prompt_directs_agent_to_docs[*]`, `test_tc05_changelog_duty_present[*]`, `test_tc05_architect_carries_adr_rules` | PASS |
| TC-06 | 6-польная схема 52c; verdict-ключи байт-в-байт; даты/модели — плейсхолдеры | `test_tc06_six_schema_fields_named[*]`, `test_tc06_schema_pins_role_author_and_stage[*]`, `test_tc06_machine_verdict_keys_byte_exact`, `test_tc06_dates_and_models_are_placeholders[*]` | PASS |
| TC-07 | reviewer-gate: дока не обновлена → `REQUEST_CHANGES` | `test_tc07_reviewer_gate_docs_not_updated_means_request_changes` | PASS |
| TC-08 | Языковая политика (5 ru + deployer en) | `test_tc08_ru_canon_for_five_roles[*]`, `test_tc08_deployer_is_english` | PASS |
| TC-09 | Рендер подставляет все плейсхолдеры (нет неразрешённых) | `test_tc09_render_resolves_all_placeholders`, `test_render_is_a_pure_replace` | PASS |
| TC-10 | Нет утечек орк-специфики (ORCH-/8500/8501/self-hosting) | `test_tc10_no_orchestrator_specific_leaks` | PASS |
| TC-11 | Ссылочная целостность отрендеренных промптов/AGENTS | `test_tc11_referenced_paths_exist_in_materialised_tree` | PASS |
| TC-12 | Registry round-trip через фактический `_parse_projects_json`; существующие записи целы | `test_tc12_registry_round_trip_through_actual_parser`, `test_tc12_merge_is_idempotent_no_duplicates` | PASS |
| TC-13 | План Plane: все статусы `_PLANE_NAME_TO_KEY` (вкл. `Confirm Deploy`/`STOP`) + лейблы | `test_tc13_plan_covers_all_statuses_and_labels`, `test_state_groups_match_plane_name_to_key` | PASS |
| TC-14 | Недоступный Plane-шаг → `manual-step` (не падение/не молча) | `test_tc14_plane_refusal_becomes_manual_step` | PASS |
| TC-15 | План Gitea: репо + webhook (push/pr/status + HMAC) + initial push | `test_tc15_plan_contains_gitea_repo_webhook_and_push` | PASS |
| TC-16 | dry-run (plan) — ноль мутаций | `test_tc16_plan_is_a_pure_dry_run`, `test_secret_never_leaks_into_report` | PASS |
| TC-17 | Повторный apply: `skipped(exists)`, без дублей/удалений; отчёт created/skipped/manual | `test_tc17_second_apply_skips_everything_existing` | PASS |
| TC-18 | Нет операций рестарта/правки прод-.env/push в существующие репо (NFR-2) | `test_tc18_fresh_apply_runs_git_only_inside_workdir`, `test_tc18_source_has_no_container_or_env_mutation_ops` | PASS |
| TC-19 | INFRA.md шаблон: обязательные секции; INFRA орка не тронут | `test_tc19_infra_template_mandatory_sections`, `test_tc19_orchestrator_own_infra_untouched_sections` | PASS |
| TC-20 | Runbook: слои предусловия→Plane→Gitea→kit→регистрация→верификация→откат | `test_tc20_runbook_exists_and_layer_order`, `test_tc20_runbook_manual_steps_and_selfhosting_warning`, `test_tc20_runbook_verification_and_smoke_journal` | PASS |
| TC-21 | Снапшот `STAGE_TRANSITIONS`/`QG_CHECKS`; `src/**` не ссылается на онбординг; закрытый список импортов | `test_tc21_stage_transitions_snapshot`, `test_tc21_qg_checks_registry_snapshot`, `test_tc21_src_never_references_onboarding`, `test_tc21_cli_src_imports_stay_in_closed_list`, `test_tc21_kit_prompts_name_only_real_gates` | PASS |
| TC-22 | Полный регресс `tests/` зелёный | весь прогон `pytest tests/` (1713 passed) | PASS |

**Итого тест-плана: 22/22 TC выполнены и PASS.**

### Сопоставление с критериями приёмки (`03-acceptance-criteria.md`)

| AC | Покрытие | Результат |
|----|----------|-----------|
| AC-1 Kit полон | TC-01 | PASS |
| AC-2 Канон 52d/92 промптов | TC-03/04/05/06 | PASS |
| AC-3 Reviewer-gate доки | TC-07 | PASS |
| AC-4 Языковая политика | TC-08 | PASS |
| AC-5 Материализация / нет утечек | TC-02/09/10/11 | PASS |
| AC-6 Registry round-trip | TC-12 | PASS |
| AC-7 План Plane (статусы/лейблы) | TC-13/14 | PASS |
| AC-8 План Gitea + dry-run без мутаций | TC-15/16 | PASS |
| AC-9 Идемпотентность/безопасность apply | TC-17/18 | PASS |
| AC-10 INFRA.md шаблон | TC-19 | PASS |
| AC-11 Runbook полон | TC-20 | PASS |
| AC-12 `src/**` не тронут (снапшот + регресс) | TC-21/22 | PASS |
| AC-13 Операторский smoke на песочнице | вне pytest (см. ниже) | DEFERRED (операторский гейт до `Confirm Deploy`) |

## AC-13 — операторский smoke (не блокирует ребро testing → deploy-staging)
AC-13 по построению (ADR D8, scope-нота `04-test-plan.yaml`) — **документированный операторский
прогон** на песочнице staging 8501 с реальными Plane/Gitea-вызовами. Это мутирующая операторская
процедура → вне read-only smoke и автоматизированного скоупа тестера. «Журнал smoke-прогонов»
в `docs/operations/ONBOARDING.md` сейчас — плейсхолдер (прогон не выполнен).
- **Не блокирует данную стадию:** AC-13 обязателен **до `Confirm Deploy`** (человеческий гейт
  прод-деплоя, ORCH-059), который наступает ПОСЛЕ `deploy-staging`. Ребро `testing → deploy-staging`
  он не гейтит (это операторская страховка, а не Quality Gate; `QG_CHECKS` не содержит проверки AC-13).
- **Handoff оператору:** выполнить runbook §5.2 (staging 8501, sandbox-префикс) и запротоколировать
  результат в «Журнале smoke-прогонов» `ONBOARDING.md` **перед** нажатием `Confirm Deploy`.

## Вывод pytest (итоги)
```
# полный регресс
1713 passed, 1 warning in 65.40s (exit 0)

# профильные сюиты онбординга
83 passed, 1 warning in 0.55s (exit 0)
```
(Единственный warning — `PydanticDeprecatedSince20` в `src/config.py:8`, существующий, не связан с задачей.)

## Итог
**PASS.** Полный регресс зелёный (1713 passed), все 22 TC тест-плана выполнены и PASS, все
машинно-проверяемые AC (1–12) закрыты, read-only smoke API в норме (`serial_gate`/`auto_labels`
в `/queue` присутствуют). AC-13 — операторский smoke, отложен к гейту `Confirm Deploy` (не блокирует
переход на `deploy-staging`). Задача готова к стадии `deploy-staging`.
