Files
wiki/memory/2026-06-07.md
2026-06-07 11:20:01 +03:00

10 KiB
Raw Blame History

2026-06-07 (вс)

🏆 ORCH-36 self-deploy ЗАМКНУЛСЯ — прод задеплоил сам себя

Утренняя сессия (06:0007: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-ownedtee: 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 не ловит)

ORCH-58 (retag-баг) — в работе, застряла на доводке (вечер 07.06)

Запущена в конвейер, BRD-гейт апрувнут за Славу (flip Approved). Прошла Architecture → Development. Developer написал ХОРОШИЙ TDD-код, но не довёл:

  • Новый модуль src/image_freshness.py (312 строк, provenance/freshness/build-once)
  • Интеграция в self_deploy / stage_engine / qg/checks
  • Подробные тесты tests/test_deploy_hook_provenance.py (TC07/TC08)
  • 🔴 НО реализацию в scripts/orchestrator-deploy-hook.sh + Dockerfile НЕ дописал → 4 теста красные → CI failure → задача застряла на development

CI-разбор (test-run #221): 610 passed. Падения: 4 FAILED = dev'овы provenance-тесты (реальный баг — тесты есть, реализации нет); 13 ERROR test_git_worktree/test_merge_gate = окружение (нет git в одноразовом python:3.12-slim), НЕ вина кода. ruff 70 ошибок, но большинство E402 в test_webhooks.py — существующий код, не dev. Reconciler с 07:48 поллит каждые 2 мин, но не двигает (ровно баг ORCH-60).

Решение: путь B (Слава выбрал) — узкое ТЗ-доводка + Dev-агент, НЕ полный конвейерный retry. ТЗ: temp/DEV_TASK_ORCH-058_finish.md (точные строки вставки guard в хук 154-162, fail-closed по OCI revision-label, режим --build-staging, ARG GIT_SHA+LABEL в Dockerfile, backward-compat при пустом EXPECTED_REVISION чтобы не сломать ORCH-36).

🔴 БЛОКЕР на сейчас: Dev-агент (vibecode/claude-sonnet-4.6) упал — кончились кредиты (billing «insufficient balance»), не стартовал (runtime 1s, 0 токенов, код не тронут). ВЕТКА feature/ORCH-058-self-deploy-retag-staging ЦЕЛА, ТЗ готово. Жду решения Славы: сменить модель Dev-агента (рекоменд. tokenator/claude-sonnet-4-6) и перезапустить тот же ТЗ, ЛИБО пополнить vibecode. Перезапуск Dev — мгновенный, как только Слава скажет модель.

NB на будущее: vibecode-баланс может кончиться молча → Dev-спавн падает на старте. Проверять модель/баланс при спавне Dev-агента. Фолбэк-модели с балансом: tokenator (opus/sonnet), anthropic напрямую, GLM, DeepSeek.