7.7 KiB
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.mdv2).
Окружение
- 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 -v — 30 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.