6.7 KiB
DEV TASK — финальная гигиена: L-1 (комментарий) + L-2 (ротация логов) + L-3 (эмодзи-константы)
Проект: orchestrator | Сервер: slin@82.22.50.71 | Репо: /home/slin/repos/orchestrator | Контейнер: orchestrator (8500)
Ветка: feature/ORCH-cleanup-L1L2L3 из свежего main (git checkout main && git pull && git checkout -b feature/ORCH-cleanup-L1L2L3).
Три мелких независимых пункта, отдельными коммитами. Низкий риск, но аккуратность та же.
⚠️ ГРАБЛЯ push (ORCH-7, НЕ повтори): после push git log origin/main..origin/feature/ORCH-cleanup-L1L2L3 ДОЛЖЕН показать твои коммиты ДО отчёта «PR готов».
L-1 — поправить врущий комментарий в stages.py (1 строка)
Где: src/stages.py:8 — в docstring/шапке STAGE_TRANSITIONS:
- agent: the agent to launch when entering the NEXT stage
Проблема: это НЕВЕРНО и именно этот нейминг породил баг ORCH-4 (launcher брал агента не той стадии). Строка 33 уже верная: «agent to launch when advancing FROM this stage». Фикс: привести шапку (стр.8) в соответствие с фактической семантикой:
- agent: the agent to launch when advancing FROM this stage (NOT the next stage's agent)
Никакого кода не менять — только комментарий. STAGE_TRANSITIONS и логику НЕ трогать.
Коммит: docs(stages): fix misleading STAGE_TRANSITIONS comment (L-1)
L-2 — ротация логов прогонов (реальная гигиена)
Где: логи пишутся в /app/data/runs/{run_id}.log (src/agents/launcher.py:143 и др.). Накапливаются без ограничения.
Что сделать:
- Добавить функцию очистки старых логов в
runs/— напримерprune_run_logs(runs_dir, keep_days=30, keep_max=500): удаляет .log старше keep_days ИЛИ оставляет только keep_max самых свежих (что наступит раньше). Безопасно: только*.logв этом каталоге, не трогать другие файлы. - Вызывать её в подходящий момент: либо при старте приложения (
init/lifespan), либо после финализации job (_finalize_job). Выбери наименее инвазивный — вызов при старте проще и безопаснее. Best-effort: ошибка ротации НЕ должна ронять приложение (обернуть try/except + logger.warning). - Параметры (keep_days/keep_max) — через env/config с разумными дефолтами (по образцу resilience-ключей в ORCH-1b, если такой паттерн есть; иначе константы с комментарием).
- НЕ удалять лог текущего/активного прогона.
Тест:
tests/test_log_rotation.py— создать tmp-каталог с N фейковыми .log разного возраста (touch с mtime), вызвать prune, проверить что старые/лишние удалены, свежие и не-.log файлы целы. Коммит:feat(launcher): prune old run logs (L-2)
L-3 — эмодзи-литералы → константы (косметика)
Где: src/plane_sync.py — захардкоженные эмодзи в строках:
- стр.197
f"🔄 Stage: {old_stage} → {new_stage}" - стр.235
f"⚠️ QG failed at {stage}: ..." - стр.242
"✅ Task completed! ..."Что сделать: вынести эмодзи в именованные константы в начало модуля (или в маленький общий модульsrc/emoji.pyесли хочешь переиспользовать), например:
EMOJI_STAGE = "🔄"
EMOJI_QG_FAIL = "⚠️"
EMOJI_DONE = "✅"
и подставить в f-строки. Текст сообщений НЕ менять — байт-в-байт тот же вывод. Это чисто читаемость.
Тест: не обязателен (поведение не меняется); если просто — добавь assert что константы непусты. Главное — существующие тесты plane_sync (если есть) зелёные.
Коммит: refactor(plane_sync): extract emoji literals to constants (L-3)
Ограничения
- 🚫 НЕ трогай: nginx, openclaw.json, .env-секреты, deploy-хук, Plane-webhook is_active, ORCH-1/1b/2/4/5/6/7, stage_engine.py, STAGE_TRANSITIONS (логику), HMAC, очередь.
- Baseline: 145 passed, 9 pre-existing 401 — НЕ чинить и НЕ ломать. Новые тесты зелёные, старые не падают.
- Conventional Commits, 3 отдельных коммита по пунктам.
- Тесты в контейнере:
IMG=$(docker inspect orchestrator --format '{{.Config.Image}}'); docker run --rm -v /home/slin/repos/orchestrator:/code -w /code --entrypoint python3 $IMG -m pytest tests/ -q
Проверка (Стрим проверит вживую)
| # | Что | Критерий |
|---|---|---|
| 1 | L-1 | stages.py:8 больше не врёт; логика/STAGE_TRANSITIONS не тронуты |
| 2 | L-2 | prune-функция + вызов; ошибка ротации не роняет app; активный лог не трогается; тест зелёный |
| 3 | L-3 | эмодзи в константах; вывод сообщений байт-в-байт прежний |
| 4 | тесты | мой прогон: было 145 → стало 145+новые passed, 9 pre-existing не тронуты |
| 5 | git | PR в main, remote содержит коммиты (грабля ORCH-7) |
Отчёт
- НЕ деплоить, НЕ мержить (мерж делает Стрим после живой проверки).
- Запушь ветку (ПРОВЕРЬ remote!), открой PR в main. После каждого пункта — короткий отчёт.
- Если ТЗ расходится с кодом — отчитайся, не выдумывай. Один исполнитель, не паникуй про параллельные сессии.