work_item: ORCH-060
description: >
  Reconciler F-1 пропускает escalated (retry >= MAX_DEVELOPER_RETRIES) и
  явно-blocked / needs-input задачи; happy-path и no-spam сохранены.
  Конвенции test-фикстур — как в существующем tests/test_reconciler.py
  (изолированная sqlite-БД, моки Plane/Telegram/gate). Хелпер _make_task
  вставляет задачу; developer-ретраи моделируются вставкой N строк в agent_runs
  (agent='developer'); зелёный CI — через _green_ci(monkeypatch).

tests:
  - id: TC-01
    type: unit
    description: "AC-1: escalated dev-задача (ровно MAX_DEVELOPER_RETRIES developer-ранов) при зелёном CI НЕ разблокируется — стадия остаётся development, unblocked_total==0, новых job нет"
    module: tests/test_reconciler.py
    setup: "_make_task('development', age_s=grace+60); insert MAX_DEVELOPER_RETRIES rows agent_runs(agent='developer'); _green_ci()"
    expected: PASS

  - id: TC-02
    type: unit
    description: "AC-2: developer-ранов > MAX_DEVELOPER_RETRIES (4–5) → также skip"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-03
    type: unit
    description: "AC-3 (регресс happy-path): developer-ранов < MAX (0/1/2) при зелёном CI → задача доигрывается development->review, unblocked_total==1"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-04
    type: unit
    description: "AC-4: граница — задача с ровно MAX пропущена, задача с MAX-1 доиграна (ровно одна advance)"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-05
    type: unit
    description: "AC-5: задача в Plane-статусе Blocked (retry<лимита) пропущена — стадия не меняется, unblocked_total==0 (мок проверки статуса возвращает Blocked)"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-06
    type: unit
    description: "AC-6: задача в Plane-статусе Needs Input (retry<лимита) пропущена"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-07
    type: unit
    description: "AC-7 (no spam): на escalated-задаче не вызваны _note_unblock / send_telegram / notify_qg_failure; нет лог-строки 'разблокирована'"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-08
    type: unit
    description: "AC-8: на escalated-задаче мок check_ci_green НЕ вызван (skip раньше пред-оценки гейта)"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-09
    type: unit
    description: "AC-9 (регресс F-2): issue в Blocked/Needs Input не передаётся ни в handle_status_start, ни в handle_verdict при reconcile_plane_once; unblocked_total==0"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-10
    type: unit
    description: "AC-10 (never-raise): проверка blocked/needs-input бросает исключение на одной задаче → тик не падает, сбойная skip, валидная соседняя обработана"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-11
    type: unit
    description: "AC-11: граница берётся из stage_engine.MAX_DEVELOPER_RETRIES — тест с monkeypatch значения константы меняет точку отсечения (нет хардкода 3)"
    module: tests/test_reconciler.py
    expected: PASS

  - id: TC-12
    type: integration
    description: "AC-13 (регресс): полный прогон tests/test_reconciler.py (ORCH-053 кейсы) — все прежние тесты зелёные"
    module: tests/test_reconciler.py
    expected: PASS
