Files
orchestrator/docs/work-items/ORCH-090/13-test-report.md
claude-bot 5ca9b8fd62
All checks were successful
CI / test (push) Successful in 36s
CI / test (pull_request) Successful in 31s
tester(ET): auto-commit from tester run_id=502
2026-06-09 21:31:56 +03:00

7.7 KiB
Raw Blame History

result, work_item, stage, author_agent, status, created_at, model_used, type, work_item_id
result work_item stage author_agent status created_at model_used type work_item_id
PASS ORCH-090 testing tester pass 2026-06-09 claude-opus-4-8 test-report ORCH-090

Test Report — ORCH-090 — Механизм отмены задачи: статус STOP (остановка + полный сброс)

Машинный вердикт читается ТОЛЬКО из frontmatter (result:). Гейт check_tests_passed (_parse_tests_verdict) парсит его. Review-вердикт предшественника — APPROVED (12-review.md v2).

Окружение

  • Python: 3.12.13
  • pytest: 8.3.3
  • Дата: 2026-06-09
  • Worktree: feature/ORCH-090-stop-plane (/repos/_wt/orchestrator/feature_ORCH-090-stop-plane/)
  • Прод-контейнер orchestrator (8500) не трогался (smoke только read-only).

Результаты

Полный регресс

pytest tests/ -q (из worktree ветки задачи) — 1349 passed, 1 warning (37.91s). Warning — известный pydantic v2 deprecation в src/config.py:8 (не относится к ORCH-090, не регресс). STAGE_TRANSITIONS / QG_CHECKS / check_* анти-регресс-снапшоты — зелёные (NFR-1).

Профильные сюиты

pytest tests/test_stop_status.py -v30 passed (1.72s): TC-01…TC-14 + 7 кейсов D7 (безопасное прерывание merge/deploy, P1-фикс «merge-lease критичен только при бегущем акторе», P2-фикс «нет дубль-уведомлений в deferred-ветке»).

Smoke API (read-only, прод 8500)

Проверка Результат
GET /health {"status":"ok","service":"orchestrator"} — OK
GET /status OK (active_tasks отдаётся; ORCH-090 видна на testing)
GET /queue → блок serial_gate (ORCH-088) присутствует — OK
GET /queue → блок auto_labels (ORCH-089) присутствует — OK

Блок stop (ORCH-090) в проде 8500 отсутствует — ожидаемо: фича этой задачи ещё не задеплоена (прод несёт предыдущий образ). В коде ветки блок присутствует (src/main.py:198 "stop": cancel.snapshot()) и покрыт тестом test_tc09_queue_has_stop_block_and_keeps_keys — это НЕ регресс смока.

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

TC ID Описание Тест-функция(и) Результат
TC-01 STOP распознаётся/маршрутизируется; прочее → no-op, never-raise test_tc01_stop_routed_and_unknown_is_noop PASS
TC-02 Остановка агента: SIGTERM по jobs.pid через каскад _watchdog; idle → no-op test_tc02_stop_active_agent_by_pid, test_tc02_idle_agent_no_stop PASS
TC-03 Отмена job'ов: queued+running → терминал; claim_next_job их не выбирает test_tc03_jobs_cancelled_and_claim_skips, test_tc03_cancel_jobs_helper_only_queued PASS
TC-04 Запрет авто-requeue: _finalize/reaper не возвращают в queued test_tc04_reaper_does_not_requeue_terminal_task PASS
TC-05 Полный сброс: remove_worktree+удаление ветки; main не тронут, нет force-push test_tc05_full_reset_removes_branch_and_worktree, test_tc05_delete_remote_branch_refuses_main PASS
TC-06 Docs-артефакты (01..17) сохраняются при сбросе test_tc06_docs_and_task_row_survive PASS
TC-07 Идемпотентность: повторный STOP на cancelled/done/missing → no-op test_tc07_idempotent_on_cancelled_done_missing PASS
TC-08 Kill-switch stop_status_enabled=False нейтрален; True → отмена; scope CSV test_tc08_kill_switch_off_inert, test_tc08_kill_switch_off_handle_stop_noop, test_tc08_scope_csv PASS
TC-09 Наблюдаемость: GET /queue несёт блок stop; never-raise при ошибке test_tc09_queue_has_stop_block_and_keeps_keys, test_tc09_snapshot_never_raises PASS
TC-10 Дыра релонча закрыта: ручной перевод в mid-стадию НЕ порождает job test_tc10_relaunch_hole_closed_midpipeline PASS
TC-11 Единственный вход — To Analyse → start_pipeline; analysis idle релончит analyst test_tc11_new_task_starts_pipeline, test_tc11_analysis_idle_relaunches_analyst PASS
TC-12 Терминал-скип/restart-safe: reconciler F-1 и reaper не оживляют cancelled test_tc12_reconciler_skips_cancelled, test_tc12_requeue_running_does_not_revive_cancelled PASS
TC-13 End-to-end STOP: агент остановлен, job'ы отменены, ветка убрана, статус durable, уведомления test_tc13_end_to_end_stop PASS
TC-14 Аддитивность БД: миграция идемпотентна; существующие контракты целы test_tc14_migration_idempotent_and_columns_present, test_tc14_existing_contracts_intact PASS
— (D7) Безопасное прерывание merge/deploy + P1/P2-фиксы test_d7_* (7 кейсов) PASS

Все 14 TC из тест-плана выполнены и сопоставлены; ожидаемый expected: PASS совпадает с фактом.

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

AC Критерий Покрытие Результат
AC-1 STOP останавливает активного агента (SIGTERM-каскад по jobs.pid) TC-02, TC-13 PASS
AC-2 Все job'ы отменены без авто-requeue (claim не выбирает) TC-03, TC-04 PASS
AC-3 Таймеры/мониторы сняты; отменённая задача не реконсилируется TC-12 PASS
AC-4 Полный сброс: ветка/worktree убраны, прогресс durable, docs сохранены TC-05, TC-06, TC-13 PASS
AC-5 Единственный вход — To Analyse; дыра релонча закрыта TC-10, TC-11 PASS
AC-6 Идемпотентность STOP (cancelled/done/missing) TC-07 PASS
AC-7 Безопасное прерывание merge/deploy (нет half-merge/рестарта прода/force-push) TC-05, D7 (test_d7_*) PASS
AC-8 Kill-switch и нулевая регрессия (полный pytest зелёный) TC-08, полный регресс 1349 passed PASS
AC-9 Аддитивность БД и restart-safe TC-14, TC-12 PASS
AC-10 Наблюдаемость STOP (GET /queue блок, уведомления) TC-09, TC-13 PASS

Все AC-1…AC-10 покрыты и зелёные.

Итог

PASS. Полный регресс зелёный (1349 passed), профильная сюита tests/test_stop_status.py зелёная (30 passed), smoke read-only OK (/health, /status, /queue с блоками serial_gate/auto_labels), каждый TC тест-плана выполнен и сопоставлен с AC. Регрессов (STAGE_TRANSITIONS/QG_CHECKS/check_*, авто-requeue, оживание отменённой задачи, касание main/прод-контейнера) не обнаружено.

result: PASS → задача переходит на deploy-staging.