fix(notifications): tracker orphan cleanup + effort + honest done-time (ORCH-087) #87
Reference in New Issue
Block a user
Delete Branch "feature/ORCH-087-orch-87-to-analyse-bump"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
ORCH-087 — Live-трекер: зачистка сирот + эффорт в карточке + честное время
Фикс «замёрзших» осиротевших карточек live-трекера + доделка строки стадии и итогового времени. Реализует ADR-001 (bump сохранён дефолтом).
Что сделано
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.confirm_deployв_LIVE_BRANCH_LABELS(полнота Awaiting Deploy → Deploying → Confirm Deploy → Monitoring → Done).agent_runs.effort(идемпотентно), стамп фактическогоresolve_agent_effortвlauncher._spawn; рендер· {model} · {effort}(developer xhigh, tester/deployer medium, прочие high); пустой → опускается.⏱️ Агенты Σ · твоё {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
Устраняет «замёрзшие» осиротевшие карточки 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>27cea74764tod9bb8d5fe3