fix(notifications): tracker orphan cleanup + effort + honest done-time (ORCH-087) #87

Merged
admin merged 8 commits from feature/ORCH-087-orch-87-to-analyse-bump into main 2026-06-09 10:12:06 +03:00
Owner

ORCH-087 — Live-трекер: зачистка сирот + эффорт в карточке + честное время

Фикс «замёрзших» осиротевших карточек live-трекера + доделка строки стадии и итогового времени. Реализует ADR-001 (bump сохранён дефолтом).

Что сделано

  • G1 — зачистка сирот: аддитивный леджер tracker_messages (src/db.py) + хелперы add/get_open/mark_deleted. bump удаляет ВСЕ незакрытые mid задачи, а не только скаляр tasks.tracker_message_id (сохранён, BC). Новый mid в леджер только при успешном send (BR-6); transient-delete → ретрай; «already gone»/>48ч → закрыт. Остаточная гонка самозалечивается за один bump.
  • G3 — deploy-цикл: ключ confirm_deploy в _LIVE_BRANCH_LABELS (полнота Awaiting Deploy → Deploying → Confirm Deploy → Monitoring → Done).
  • BR-EFF — эффорт в строке: колонка agent_runs.effort (идемпотентно), стамп фактического resolve_agent_effort в launcher._spawn; рендер · {model} · {effort} (developer xhigh, tester/deployer medium, прочие high); пустой → опускается.
  • BR-G5 — честное время: done-строка ⏱️ Агенты Σ · твоё {review~cap} · общее с ожиданием {wall} — три независимых подписанных метрики; кап tracker_brd_review_cap_s (ORCH_TRACKER_BRD_REVIEW_CAP_S, дефолт 2ч, маркер ~).

Инварианты

STAGE_TRANSITIONS/QG_CHECKS/стадии — без изменений; миграции аддитивны/идемпотентны (общая прод-БД, enduro не трогается); never-raise, disable_notification, plane_issue_link (ORCH-067), disable_web_page_preview (ORCH-080) — сохранены; src/reconciler.py не эродирован (ORCH-086 на месте, BR-G6).

Тесты

tests/test_notifications_orphans.py (TC-01..05 + never-raise), tests/test_tracker_effort_time.py (TC-06/11..15 + confirm_deploy), tests/test_launcher.py::TestEffortStamp (TC-09/10). pytest tests/ -q1090 passed.

Документация (golden source, в этом же PR)

CLAUDE.md (§Нотификации), docs/architecture/README.md (Notifications), CHANGELOG.md.

Refs: ORCH-087

🤖 Generated with Claude Code

## ORCH-087 — Live-трекер: зачистка сирот + эффорт в карточке + честное время Фикс «замёрзших» осиротевших карточек live-трекера + доделка строки стадии и итогового времени. Реализует ADR-001 (bump сохранён дефолтом). ### Что сделано - **G1 — зачистка сирот:** аддитивный леджер `tracker_messages` (`src/db.py`) + хелперы `add/get_open/mark_deleted`. bump удаляет ВСЕ незакрытые mid задачи, а не только скаляр `tasks.tracker_message_id` (сохранён, BC). Новый mid в леджер только при успешном `send` (BR-6); transient-`delete` → ретрай; «already gone»/>48ч → закрыт. Остаточная гонка самозалечивается за один bump. - **G3 — deploy-цикл:** ключ `confirm_deploy` в `_LIVE_BRANCH_LABELS` (полнота Awaiting Deploy → Deploying → Confirm Deploy → Monitoring → Done). - **BR-EFF — эффорт в строке:** колонка `agent_runs.effort` (идемпотентно), стамп фактического `resolve_agent_effort` в `launcher._spawn`; рендер `· {model} · {effort}` (developer xhigh, tester/deployer medium, прочие high); пустой → опускается. - **BR-G5 — честное время:** done-строка `⏱️ Агенты Σ · твоё {review~cap} · общее с ожиданием {wall}` — три независимых подписанных метрики; кап `tracker_brd_review_cap_s` (`ORCH_TRACKER_BRD_REVIEW_CAP_S`, дефолт 2ч, маркер `~`). ### Инварианты `STAGE_TRANSITIONS`/`QG_CHECKS`/стадии — без изменений; миграции аддитивны/идемпотентны (общая прод-БД, enduro не трогается); never-raise, `disable_notification`, `plane_issue_link` (ORCH-067), `disable_web_page_preview` (ORCH-080) — сохранены; `src/reconciler.py` не эродирован (ORCH-086 на месте, BR-G6). ### Тесты `tests/test_notifications_orphans.py` (TC-01..05 + never-raise), `tests/test_tracker_effort_time.py` (TC-06/11..15 + confirm_deploy), `tests/test_launcher.py::TestEffortStamp` (TC-09/10). `pytest tests/ -q` → **1090 passed**. ### Документация (golden source, в этом же PR) `CLAUDE.md` (§Нотификации), `docs/architecture/README.md` (Notifications), `CHANGELOG.md`. Refs: ORCH-087 🤖 Generated with [Claude Code](https://claude.com/claude-code)
admin added 7 commits 2026-06-09 10:06:20 +03:00
Устраняет «замёрзшие» осиротевшие карточки live-трекера и доделывает строку
стадии/итоговое время.

G1 — зачистка сирот: аддитивный леджер tracker_messages(task_id, message_id,
created_at, deleted_at) + хелперы add/get_open/mark_deleted в src/db.py. bump
теперь удаляет ВСЕ незакрытые mid задачи (а не только скаляр
tasks.tracker_message_id, сохранён как BC-указатель). Новый mid в леджер только
при успешном send (BR-6); transient-delete остаётся для ретрая; «already
gone»/>48ч закрывается. Корень бага — скалярный учёт, терявший ссылку при
гонке/delete-fail+send-ok (ADR-001 G0).

G3 — deploy-цикл: ключ confirm_deploy в _LIVE_BRANCH_LABELS (без base-alias).

BR-EFF — эффорт в строке: колонка agent_runs.effort (_ensure_column,
идемпотентно), стамп фактического resolve_agent_effort в launcher._spawn в
момент запуска; рендер `· {model} · {effort}`, пустой → суффикс опускается.

BR-G5 — честное время: done-строка `⏱️ Агенты Σ · твоё {review~cap} · общее с
ожиданием {wall}` — три независимых подписанных метрики; кап
tracker_brd_review_cap_s (ORCH_TRACKER_BRD_REVIEW_CAP_S, дефолт 2ч, маркер ~).

Инварианты: STAGE_TRANSITIONS/QG_CHECKS/стадии без изменений; миграции
аддитивны/идемпотентны (enduro не трогается); never-raise,
disable_notification, plane_issue_link (ORCH-067), disable_web_page_preview
(ORCH-080) сохранены; src/reconciler.py не эродирован (ORCH-086 на месте).

Тесты: tests/test_notifications_orphans.py (TC-01..05 + never-raise),
tests/test_tracker_effort_time.py (TC-06/11..15 + confirm_deploy),
tests/test_launcher.py::TestEffortStamp (TC-09/10). Доки: CLAUDE.md
(§Нотификации), docs/architecture/README.md (Notifications), CHANGELOG.md.

Refs: ORCH-087

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
test_spawn_stamps_resolved_effort упал в CI с PermissionError на '/app':
launcher._spawn хардкодил output_path='/app/data/runs/{run_id}.log' и
os.makedirs('/app/data/runs'). В контейнере /app есть, на CI-хосте
(act_runner hostexecutor) — нет, makedirs бросает -> красный CI.

Фикс корня (не только теста): базовый каталог per-run логов вынесен в
Settings.runs_dir (env ORCH_RUNS_DIR, дефолт '/app/data/runs' = прод 1:1).
Новый хелпер _run_log_path(run_id) — единый источник пути, использован в
_spawn + три прежних inline-строки логов/алертов. Тест monkeypatch-ит
settings.runs_dir на tmp_path -> окружение-независим (проверено прогоном
с принудительно недоступным /app). pytest tests/ -q: 1090 passed.

STAGE_TRANSITIONS/QG_CHECKS/схема БД не тронуты. Docs: README env-таблица,
CHANGELOG.

Refs: ORCH-087
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
tester(ET): auto-commit from tester run_id=433
All checks were successful
CI / test (push) Successful in 32s
CI / test (pull_request) Successful in 30s
d9bb8d5fe3
admin force-pushed feature/ORCH-087-orch-87-to-analyse-bump from 27cea74764 to d9bb8d5fe3 2026-06-09 10:06:20 +03:00 Compare
admin added 1 commit 2026-06-09 10:12:06 +03:00
deploy(ORCH-036): finalize SUCCESS for ORCH-087
All checks were successful
CI / test (push) Successful in 28s
CI / test (pull_request) Successful in 28s
49fad5e458
admin merged commit a23d4c0971 into main 2026-06-09 10:12:06 +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#87