tester(ET): auto-commit from tester run_id=600
All checks were successful
CI / test (push) Successful in 58s
CI / test (pull_request) Successful in 57s

This commit is contained in:
2026-06-10 19:40:51 +03:00
parent b97ffae7a1
commit e5c3774bc5

View File

@@ -1,169 +1,117 @@
---
result: PASS
result: PASS # PASS | FAIL — машинный вердикт, UPPERCASE
work_item: ORCH-009
stage: testing
author_agent: tester
status: pass
created_at: 2026-06-10
model_used: claude-fable-5
model_used: claude-opus-4-8
type: test-report
work_item_id: ORCH-009
---
# Test Report — ORCH-009 — Turnkey-онбординг проектов (kit + CLI + runbook)
> Машинный вердикт — в frontmatter (`result: PASS`). Ниже — факты, на которых он основан.
> Машинный вердикт читается ТОЛЬКО из 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: 8.3.3 (pytest-cov 5.0.0, asyncio 0.23.8)
- Дата: 2026-06-10
- Worktree: `/repos/_wt/orchestrator/feature_ORCH-009-turnkey-plane/` (ветка
`feature/ORCH-009-turnkey-plane`) — прогон в worktree ветки задачи, НЕ в общем чекауте
`/repos/orchestrator` (анти-гонка checkout).
- Прод `http://localhost:8500/health``{"status":"ok","service":"orchestrator"}`
- Staging `http://localhost:8501/health``{"status":"ok","service":"orchestrator"}`
- Прод-контейнер не трогался (read-only smoke, NFR self-hosting).
- 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/ -v --tb=short`)
**1712 passed, 1 failed (средовое, pre-existing — не регресс PR), 1 warning, 69.90s.**
### Полный регресс
`pytest tests/ -q`**1713 passed, 0 failed, 1 warning** за 65.40s (exit 0). Прод-контейнер не
трогался. Средовая мина merge-gate цикла 1 обезврежена фиксом `e903818`регресс зелёный.
Единственное падение — `tests/test_resolve_agent_effort.py::test_flags_present_when_configured`:
```
assert "--model claude-opus-4-8 " in flags
E AssertionError: assert '--model claude-opus-4-8 ' in
'--model claude-fable-5 --effort xhigh --fallback-model claude-sonnet-4-6 '
```
Диагноз (подтверждает handoff-пункт №2 reviewer'а в `12-review.md`): падение вызвано
env-переменными агент-раннера (`ORCH_AGENT_MODEL_DEFAULT=claude-fable-5`,
`ORCH_AGENT_FALLBACK_MODEL`, `ORCH_AGENT_EFFORT_*`), а не кодом ветки. Контрольный перепрогон
с полностью очищенной средой (`env -u ORCH_AGENT_*`):
```
pytest tests/test_resolve_agent_effort.py tests/test_resolve_agent_model.py -q
49 passed, 1 warning in 0.44s
```
Дополнительно проверено: `git diff --name-only origin/main...HEAD` НЕ содержит `src/**`,
`.openclaw/**`, `tests/test_resolve_agent_*` — PR эти файлы не трогает (pre-existing средовой
эффект; авторитетен CI с чистой средой). С учётом контрольного прогона **эффективный регресс
полностью зелёный**.
### Профильные сюиты (онбординг)
`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).
### Профильные сюиты задачи
| Модуль | Результат |
|--------|-----------|
| `tests/test_onboarding_kit.py` | **60/60 PASSED** |
| `tests/test_onboarding_script.py` | **18/18 PASSED** |
| `tests/test_onboarding_invariants.py` | **5/5 PASSED** |
| **Итого профильных** | **83/83 PASSED** |
### Сопоставление с тест-планом (`04-test-plan.yaml`)
### Smoke API (read-only, прод 8500)
| Проверка | Результат |
|----------|-----------|
| `GET /health` | ✅ `{"status":"ok"}` |
| `GET /status` | ✅ активные задачи отдаются (ORCH-009 `stage=testing`, ORCH-101 `analysis`) |
| `GET /queue` → блок `serial_gate` (ORCH-088) | ✅ **присутствует**: `enabled: true`, per-repo картина корректна (активная ORCH-009, ожидающая ORCH-101 — FIFO, заморозок нет) |
| `GET /queue` → блок `auto_labels` (ORCH-089) | ✅ присутствует (`autoApprove`/`autoDeploy`) |
| `GET /health` staging 8501 (контур smoke D8) | ✅ ok |
| 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 |
Регресса смока нет.
### Сопоставление с тест-планом (`04-test-plan.yaml`) — каждый TC
| TC ID | Описание (кратко) | Тест-функция(и) | Результат |
|-------|-------------------|------------------|-----------|
| TC-01 | Состав kit: все элементы FR-1 | `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` (6 параметров) | **PASS** |
| TC-04 | `<escalation>` у dev/reviewer/tester; «❌ → ✅» | `test_tc04_escalation_section_after_success_criteria`, `test_tc04_bans_use_cross_check_format` | **PASS** |
| TC-05 | Директивы доки: паспорт/AGENTS/ARCHITECTURE/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_machine_verdict_keys_byte_exact`, `test_tc06_schema_pins_role_author_and_stage`, `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 (ADR D9) | `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`, `test_placeholder_dictionary_bijection` | **PASS** |
| TC-10 | Нет утечек орк-специфики (ORCH-, 8500/8501, self-hosting) | `test_tc10_no_orchestrator_specific_leaks` | **PASS** |
| TC-11 | Ссылочная целостность отрендеренного каркаса | `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: все 22 статуса `_PLANE_NAME_TO_KEY` (incl. `Confirm Deploy`, `STOP``cancelled`) + лейблы | `test_tc13_plan_covers_all_statuses_and_labels`, `test_state_groups_match_plane_name_to_key` | **PASS** |
| TC-14 | CE-отказ Plane → `manual-step` со ссылкой на runbook, не молча | `test_tc14_plane_refusal_becomes_manual_step` | **PASS** |
| TC-15 | План Gitea: репо + webhook (push/pull_request/status, HMAC вне гита) + initial push | `test_tc15_plan_contains_gitea_repo_webhook_and_push`, `test_secret_never_leaks_into_report` | **PASS** |
| TC-16 | `plan` — чистый dry-run: ноль мутаций | `test_tc16_plan_is_a_pure_dry_run` | **PASS** |
| TC-17 | Повторный `apply``skipped(exists)`, без дублей/удалений | `test_tc17_second_apply_skips_everything_existing` | **PASS** |
| TC-18 | Нет рестартов/правки `.env`/push в существующие репо | `test_tc18_source_has_no_container_or_env_mutation_ops`, `test_tc18_fresh_apply_runs_git_only_inside_workdir` | **PASS** |
| TC-19 | INFRA.md шаблон: обязательные секции; INFRA орка не тронут | `test_tc19_infra_template_mandatory_sections`, `test_tc19_orchestrator_own_infra_untouched_sections` | **PASS** |
| TC-20 | Runbook: все слои в порядке, ручные шаги помечены, журнал smoke | `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/**` и `.openclaw/` не тронуты | `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/` зелёный | весь прогон: 1712 passed (+1 средовой pre-existing, с чистой средой 49/49 — см. выше) | **PASS** |
**22/22 TC выполнены, все PASS.**
**Итого тест-плана: 22/22 TC выполнены и PASS.**
### Сопоставление с критериями приёмки (`03-acceptance-criteria.md`)
| AC | Покрытие | Результат |
|----|----------|-----------|
| AC-1 (состав kit) | TC-01 | PASS |
| AC-2 анон 52d/92) | TC-03…TC-06 | PASS |
| AC-3 (reviewer-gate доки) | TC-07 | PASS |
| AC-4 зыковая политика, ADR D9) | TC-08 | PASS |
| AC-5 (плейсхолдеры/утечки/целостность) | TC-09…TC-11 | PASS |
| AC-6 (registry round-trip) | TC-12 | PASS |
| AC-7 (план Plane: статусы/лейблы) | TC-13, TC-14 | PASS |
| AC-8 (план Gitea + dry-run без мутаций) | TC-15, TC-16 | PASS |
| AC-9 демпотентность/безопасность apply) | TC-17, TC-18 | PASS |
| AC-10 (INFRA.md шаблон) | TC-19 | PASS |
| AC-11 (runbook полон) | TC-20 | PASS |
| AC-12 (инварианты `src/**`) | TC-21, TC-22 + diff-проверка (`origin/main...HEAD`: `src/**`, `.openclaw/**` — пусто) | ✅ PASS |
| AC-13 (операторский smoke, ADR D8) | вне pytest-скоупа (по `04-test-plan.yaml`: «выполняется вручную и протоколируется») | ⚠️ **NOT RUN — открытый операторский шаг** (см. ниже) |
| 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 — открытый ОБЯЗАТЕЛЬНЫЙ операторский шаг (ADR-001 D8)
«Журнал smoke-прогонов» в `docs/operations/ONBOARDING.md` (§ строка 186) на момент отчёта
содержит **плейсхолдер** — операторский smoke на песочнице (runbook §5.2: онбординг sandbox
`onboarding-smoke`/`SMK` → регистрация в `.env.staging` → рестарт staging → тестовая задача →
стадия analysis) **не выполнен и не запротоколирован**.
- Прогон по построению мутирующий (создание сущностей Plane/Gitea, правка `.env.staging`,
рестарт staging-контейнера) и в `04-test-plan.yaml`/AC-13 явно классифицирован как **ручной
операторский** — он вне полномочий tester-агента (read-only smoke) и не покрывается ни одним
TC; дефекта кода нет, поэтому `FAIL`/откат на development не обоснован.
- Контур smoke готов: staging 8501 жив (health ok), `verify`-режим CLI и runbook протестированы
структурно (TC-13…TC-20).
- **Эскалация оператору:** по D8 первый протокол в «Журнале smoke-прогонов» **обязателен для
приёмки ORCH-009** — выполнить прогон по runbook §5.2 и заполнить журнал **ДО прод-деплоя**
(гейт `Confirm Deploy` — человеческий, точка контроля сохраняется). Ссылка по требованию D8:
`docs/operations/ONBOARDING.md` § «Журнал smoke-прогонов».
## Вывод pytest
## 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 (итоги)
```
$ cd /repos/_wt/orchestrator/feature_ORCH-009-turnkey-plane && pytest tests/ -v --tb=short
...
tests/test_onboarding_invariants.py — 5 PASSED
tests/test_onboarding_kit.py — 60 PASSED
tests/test_onboarding_script.py — 18 PASSED
...
=================================== FAILURES ===================================
______________________ test_flags_present_when_configured ______________________
tests/test_resolve_agent_effort.py:190: in test_flags_present_when_configured
assert "--model claude-opus-4-8 " in flags
E AssertionError: assert '--model claude-opus-4-8 ' in
'--model claude-fable-5 --effort xhigh --fallback-model claude-sonnet-4-6 '
=========================== short test summary info ============================
FAILED tests/test_resolve_agent_effort.py::test_flags_present_when_configured
============= 1 failed, 1712 passed, 1 warning in 69.90s (0:01:09) =============
# полный регресс
1713 passed, 1 warning in 65.40s (exit 0)
# Контрольный перепрогон средового падения с чистой средой (handoff reviewer):
$ env -u ORCH_AGENT_* pytest tests/test_resolve_agent_effort.py tests/test_resolve_agent_model.py -q
49 passed, 1 warning in 0.44s
# профильные сюиты онбординга
83 passed, 1 warning in 0.55s (exit 0)
```
(Единственный warning — `PydanticDeprecatedSince20` в `src/config.py:8`, существующий, не связан с задачей.)
## Итог
**PASS.**
- 22/22 TC тест-плана выполнены и зелёные; AC-1…AC-12 подтверждены.
- Полный регресс эффективно зелёный (1712 passed; единственное падение — средовое pre-existing,
с чистой средой проходит; PR `src/**`/`.openclaw/**`/файлы этих тестов не трогает).
- Smoke API без регрессов: `/health`, `/status`, `/queue` (блоки `serial_gate` и `auto_labels`
присутствуют); staging 8501 жив.
- ⚠️ AC-13 (операторский smoke, D8) — **не закрыт**: обязателен к выполнению и протоколированию
оператором до прод-деплоя (`Confirm Deploy`). Дефекта кода нет — вердикт стадии testing PASS.
**PASS.** Полный регресс зелёный (1713 passed), все 22 TC тест-плана выполнены и PASS, все
машинно-проверяемые AC (112) закрыты, read-only smoke API в норме (`serial_gate`/`auto_labels`
в `/queue` присутствуют). AC-13 — операторский smoke, отложен к гейту `Confirm Deploy` (не блокирует
переход на `deploy-staging`). Задача готова к стадии `deploy-staging`.