diff --git a/memory/2026-06-07.md b/memory/2026-06-07.md new file mode 100644 index 0000000..22b54f1 --- /dev/null +++ b/memory/2026-06-07.md @@ -0,0 +1,81 @@ +# 2026-06-07 (вс) + +## 🏆 ORCH-36 self-deploy ЗАМКНУЛСЯ — прод задеплоил сам себя + +Утренняя сессия (06:00–07:00 UTC). ORCH-36 (исполняемый самодеплой стадии `deploy`) +доехала до **Done** — конвейер впервые задеплоил себя по полному циклу Phase A→B→C +(approve → детачед ssh-хук → finalizer). Self-hosting bootstrap пройден. + +**Эпик ORCH-54: 4/6 в проде** — ORCH-40 (права), ORCH-43 (merge-gate), ORCH-36 +(самодеплой), ORCH-53 (reconciler). Конвейер автономен: мержит → катит в прод → чинит +застрявшее. Ручной деплой как класс позади. + +### Каскад из 4 инфра-багов (вскрылись ТОЛЬКО при реальном деплое, чинились ручным bootstrap-разрывом) +1. 🔴 **uid 1000 без passwd-записи** → `ssh launch failed (rc=255): No user exists for + uid 1000`. Регрессия ORCH-40 (compose `user: 1000:1000`, образ без passwd). Фикс: + Dockerfile `useradd -u 1000 slin`, коммит `64e031a`. +2. 🔴 **env-префикс** → host пустой. config `env_prefix="ORCH_"`, а compose задавал + `DEPLOY_*` без префикса (легаси enduro). pydantic игнор → дефолт host="". Фикс: + `ORCH_DEPLOY_SSH_USER/HOST/HOOK_SCRIPT/HOST_REPO_PATH` в compose, коммит `115519e`. + Hook-путь тоже был enduro-шный, поправлен на `scripts/orchestrator-deploy-hook.sh`. +3. 🔴 **`/var/log/orchestrator` root-owned** → `tee: Permission denied`, хук exit 1. + Фикс: `chown -R slin:slin /var/log/orchestrator` на хосте. +4. 🔴🔴 **retag берёт УСТАРЕВШИЙ staging-образ** (самый опасный). BUILD-ONCE retag + (ORCH-36 BR-6) тегает `orchestrator-orchestrator-staging`→prod без rebuild. Staging- + образ никто не пересобрал из main → деплой «зелёный» (health ok), но катит СТАРЫЙ код + (2-дневной давности), пропадает `deploy-finalizer` (`Unknown agent: deploy-finalizer`), + ORCH-36 не закрывается, бесконечная петля. **Не падает — тихо откатывает прод.** + Ручной разрыв: пересобрать staging-образ из main перед retag → Phase C отработал. + +### Сквозной урок: bootstrap самохостинга +Задача, меняющая deploy/merge-механику самого оркестратора, упирается в парадокс: её +механизм не работает, пока не в проде, а влить можно только старым механизмом. Каждый +слой (код→права→env→образ) вскрывается ТОЛЬКО при первом реальном прогоне. Закладывать +ручной bootstrap-чеклист + реальный staging-прогон до мержа. + +**Урок в репо:** `docs/history/LESSONS_ORCH-036-selfdeploy.md` (коммит `e4c6401`). +Локальная копия: `temp/LESSONS_ORCH-036-selfdeploy.md`. + +## 📋 Follow-up задачи заведены в Plane (все в Backlog — НЕ триггерят конвейер) +- **ORCH-58** 🔴 retag устаревшего staging-образа (P0, самый опасный) — **запущена в работу** (In Progress) +- **ORCH-59** — Confirm Deploy статус вместо перегруженного Approved (P1, решение Owner). + ⚠️ Статуса `Confirm Deploy` в Plane проекте ORCH ПОКА НЕТ — его создаст и обработает + именно ORCH-59 (создавать руками рано — будет мёртвый клик). Approve деплоя сейчас = + перевод issue в Approved. +- **ORCH-60** — reconciler не трогает escalated/max-retries (P1, фикс хвоста ORCH-53) +- **ET-13** (новая) — z9-z11 чистый старт, ссылка на развалившуюся ET-013 +- **старая ET-013 → Cancelled** (мусор убран, reconciler перестаёт дёргать) + +Скрипт заведения: `temp/create_followups.py`. + +## 🎯 Приоритеты добивания эпика ORCH-54 (оценка сложность/риск) +- **P0 блокеры деплоя:** ORCH-58 (retag, средняя/ВЫС.риск — в работе) → ORCH-21 + (post-deploy мониторинг+авто-rollback, ВЫС.сложность/сред.риск, ★) → ORCH-51 (окно + тишины смежных проектов, средняя/сред.) +- **P1 мелкие нужные фиксы:** ORCH-60 (НИЗ./НИЗ., ~10-20 строк) → ORCH-57 (normalize + root-owned, низ./низ., хвост ORCH-40) → ORCH-59 (Confirm Deploy, низ-сред./низ-сред.) +- **P2 защитные гейты:** ORCH-23 (бюджетный circuit-breaker $, ★) → ORCH-22 (security + secret-scanning гейт, ★) + +**Рекомендация Стрим (Слава ещё не выбрал финально):** не «или-или». 58 уже едет +(concurrency=1, параллельно нечего делать) → после неё быстрая безопасная пачка P1 +(60→57→59) для видимого прогресса → тяжёлый рискованный ORCH-21 отдельным заходом на +свежую голову (не два высокорисковых деплой-изменения подряд). Слава склонялся уточнить +порядок; ORCH-58 точно первой. + +## Прод-состояние на конец сессии +- main `115519e`+`e4c6401`, образ orchestrator 2026-06-07 ~09:47 +- self_deploy.py + reconciler.py в проде, deploy-finalizer зарегистрирован (grep=5) +- uid 1000 = slin (passwd ok), ssh slin@127.0.0.1 работает (host-network), /var/log/orchestrator writable +- staging-образ пересобран из актуального main (петля retag разорвана вручную) +- ORCH-36 task 43 → done + +## Технические референсы (для будущих сессий) +- ORCH config: `env_prefix="ORCH_"` — ВСЕ настройки через pydantic Settings ОБЯЗАНЫ иметь префикс ORCH_ +- Проверка резолва env: `docker exec orchestrator python3 -c 'from src.config import settings; print(settings.deploy_ssh_host)'` +- self_deploy Phase B: детачед `ssh slin@127.0.0.1 → setsid bash hook --deploy`; маркеры + `/repos/.deploy-state-orchestrator/ORCH-NNN/{approve-requested,initiated,result}` +- deploy-хук: `scripts/orchestrator-deploy-hook.sh`, лог `/var/log/orchestrator/deploy-hook.log` +- merge-lease: `/repos/.merge-lease-orchestrator.json` (ORCH-43 сериализует мержи); recreate контейнера его сбрасывает +- Plane ORCH state ids (проект `8da6aa25-...`): Backlog `2d5d42ff-...`, Approved `63f2c8fe-...`, In Review `c52e99b9-...` +- Re-trigger Phase B без нового кода: flip Plane In Review → Approved (то же значение webhook не ловит)