fix(reconciler): terminal-skip + state_uuid dedup on F-1 path (ORCH-086) #86

Merged
admin merged 7 commits from feature/ORCH-086-orch-86-reconciler-telegram-et into main 2026-06-09 05:00:13 +03:00
Owner

ORCH-086 — терминал-скип и state_uuid-dedup на пути F-1 реконсилятора

Закрывает F-1-пробел ORCH-068: терминал-исключение и in-memory dedup (изначально только F-2) распространены на gate-side путь реконсилятора. Устраняет периодическое ложное 🔧 reconciler: ET-002 done разблокирована (потерян webhook) для задачи, терминальной в Plane, но дрейфнувшей в БД орка (особенно после рестарта).

Изменения (src/reconciler.py, локализовано)

  • D1 _resolve_issue_status(task)один сетевой резолв Plane-статуса задачи за тик (states, groups, state_uuid) после дешёвых локальных гардов (busy/young/escalated в Plane не ходят); never-raise → ({}, {}, None).
  • D2 безусловный терминал-скип ДО Guard 2: группа Plane completed/cancelled (fallback — логические ключи done/cancelled, ЛИБО стадия в БД орка ∈ {done, cancelled}, т.к. cancelled не отсекается выборкой) → ранний return + skipped_terminal_total++. Не подчинён reconcile_skip_blocked_enabled (тот гейтит только Guard 2).
  • D3 _is_blocked_or_needs_input переиспользует резолв D1 (опц. аргументы; _UNSET → самостоятельный резолв для прямых/легаси-вызовов, поведение 1:1).
  • D4 вызов _note_unblock на F-1 передаёт state_uuid → dedup работает на обоих путях (deduped_total++ на повторе).

Инварианты

STAGE_TRANSITIONS, QG_CHECKS, схема БД, сигнатуры advance_stage/advance_if_gate_passed/_note_unblock, форма status()/GET /queue, новые config-флаги — без изменений; never-raise сохранён. Анти-регресс (AC-4): легитимный unblock реально застрявшей не-терминальной задачи по-прежнему advance + ровно один Telegram.

Тесты

  • tests/test_reconciler.py — TC-86-01..09/11 (терминал по группе completed/cancelled, fallback по логическому ключу, DB-side cancelled, проброс/dedup state_uuid, анти-регресс, never-raise, независимость от Guard-2-флага).
  • tests/test_reconciler_plane.py — TC-86-10 (форма status() неизменна).
  • tests/test_orch026_task_deps.py — обновлён мок Guard 2 под эволюцию сигнатуры.
  • Полный прогон: 1069 passed.

Документация

  • docs/architecture/README.md (раздел Reconciler F-1) + CHANGELOG.md.
  • ADR: docs/work-items/ORCH-086/06-adr/ADR-001-reconciler-f1-terminal-skip-and-dedup.md.

Refs: ORCH-086

🤖 Generated with Claude Code

## ORCH-086 — терминал-скип и `state_uuid`-dedup на пути F-1 реконсилятора Закрывает F-1-пробел **ORCH-068**: терминал-исключение и in-memory dedup (изначально только F-2) распространены на gate-side путь реконсилятора. Устраняет периодическое ложное `🔧 reconciler: ET-002 done разблокирована (потерян webhook)` для задачи, терминальной в Plane, но дрейфнувшей в БД орка (особенно после рестарта). ### Изменения (`src/reconciler.py`, локализовано) - **D1** `_resolve_issue_status(task)` — **один** сетевой резолв Plane-статуса задачи за тик `(states, groups, state_uuid)` после дешёвых локальных гардов (busy/young/escalated в Plane не ходят); never-raise → `({}, {}, None)`. - **D2** безусловный терминал-скип ДО Guard 2: группа Plane `completed`/`cancelled` (fallback — логические ключи `done`/`cancelled`, ЛИБО стадия в БД орка ∈ `{done, cancelled}`, т.к. `cancelled` не отсекается выборкой) → ранний `return` + `skipped_terminal_total++`. Не подчинён `reconcile_skip_blocked_enabled` (тот гейтит только Guard 2). - **D3** `_is_blocked_or_needs_input` переиспользует резолв D1 (опц. аргументы; `_UNSET` → самостоятельный резолв для прямых/легаси-вызовов, поведение 1:1). - **D4** вызов `_note_unblock` на F-1 передаёт `state_uuid` → dedup работает на обоих путях (`deduped_total++` на повторе). ### Инварианты `STAGE_TRANSITIONS`, `QG_CHECKS`, схема БД, сигнатуры `advance_stage`/`advance_if_gate_passed`/`_note_unblock`, форма `status()`/`GET /queue`, новые config-флаги — **без изменений**; never-raise сохранён. Анти-регресс (AC-4): легитимный unblock реально застрявшей не-терминальной задачи по-прежнему `advance` + ровно один Telegram. ### Тесты - `tests/test_reconciler.py` — TC-86-01..09/11 (терминал по группе completed/cancelled, fallback по логическому ключу, DB-side cancelled, проброс/dedup `state_uuid`, анти-регресс, never-raise, независимость от Guard-2-флага). - `tests/test_reconciler_plane.py` — TC-86-10 (форма `status()` неизменна). - `tests/test_orch026_task_deps.py` — обновлён мок Guard 2 под эволюцию сигнатуры. - Полный прогон: **1069 passed**. ### Документация - `docs/architecture/README.md` (раздел Reconciler F-1) + `CHANGELOG.md`. - ADR: `docs/work-items/ORCH-086/06-adr/ADR-001-reconciler-f1-terminal-skip-and-dedup.md`. Refs: ORCH-086 🤖 Generated with [Claude Code](https://claude.com/claude-code)
admin added 6 commits 2026-06-09 02:26:50 +03:00
Закрывает F-1-пробел ORCH-068: терминал-исключение и in-memory dedup
(изначально только F-2) распространены на gate-side путь реконсилятора,
устраняя ложное «🔧 reconciler: ET-002 done разблокирована (потерян
webhook)» (особенно после рестарта).

- D1: новый _resolve_issue_status — один сетевой резолв Plane-статуса
  задачи за тик (states, groups, state_uuid) после дешёвых локальных
  гардов; never-raise -> ({}, {}, None) при сбое.
- D2: безусловный терминал-скип ДО Guard 2 (группа Plane completed/
  cancelled, fallback на логические ключи done/cancelled, либо стадия в
  БД орка ∈ {done, cancelled}); skipped_terminal_total++, не подчинён
  reconcile_skip_blocked_enabled.
- D3: _is_blocked_or_needs_input переиспользует резолв D1 (опц. аргументы,
  _UNSET -> самостоятельный резолв для прямых/легаси-вызовов; 1:1).
- D4: вызов _note_unblock на F-1 теперь передаёт state_uuid -> dedup
  работает на обоих путях (deduped_total++ на повторе).

Анти-регресс: легитимный unblock не-терминальной застрявшей задачи
по-прежнему advance + один Telegram. STAGE_TRANSITIONS / QG_CHECKS /
схема БД / сигнатуры advance_*/_note_unblock / форма status() / новые
флаги — без изменений; never-raise сохранён.

Тесты: tests/test_reconciler.py TC-86-01..09/11,
tests/test_reconciler_plane.py TC-86-10. Полный прогон зелёный (1069).

Refs: ORCH-086
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tester(ET): auto-commit from tester run_id=424
All checks were successful
CI / test (push) Successful in 28s
CI / test (pull_request) Successful in 30s
9c19588bcd
admin force-pushed feature/ORCH-086-orch-86-reconciler-telegram-et from 132206d2fc to 9c19588bcd 2026-06-09 02:26:50 +03:00 Compare
admin added 1 commit 2026-06-09 05:00:12 +03:00
deploy(ORCH-036): finalize SUCCESS for ORCH-086
All checks were successful
CI / test (push) Successful in 26s
CI / test (pull_request) Successful in 26s
1b095282bf
admin merged commit 493b9be9c4 into main 2026-06-09 05:00:13 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/orchestrator#86