# 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` если хочешь переиспользовать), например: ```python 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. После каждого пункта — короткий отчёт. - Если ТЗ расходится с кодом — отчитайся, не выдумывай. Один исполнитель, не паникуй про параллельные сессии.