Самообновление агента: v5 и запускатель run.py (#19) #20

Merged
aep merged 8 commits from feat/19-agent-self-update into main 2026-10-14 21:58:08 +03:00
Owner

Closes #19. Хаб — aep/jira-hub#22 (PR рядом; спека jira-hub/openspec/changes/agent-self-update/).

Что сделано

  • Агент v5 (src/agent.py): update.json рядом с агентом; update_state и launcher_version в каждом claim; после claim без команды — Updater.check: скачивание GET /agent/release, sha256, компиляция, AGENT_VERSION, agent.py.new, selftest новой версии (0 — годен, 3 — временный сбой, иное — rejected), выход 75; отвергнутые версии не повторяются; без запускателя — подсказка в лог раз в час; auto_update в agent.json; команда selftest.
  • Запускатель src/run.py (stdlib, не импортирует агента): дочерний agent.py run; 75 — копия в .prev и атомарная подмена, trial; падение или 10 мин без ok — откат; выход без Ctrl-C — тоже падение; перезапуск с паузой 5…300 с; блокировка run.py.lock.
  • Код новой версии приходит только через API хаба и пишется в каталог агента — общая папка для кода не используется.
  • Тесты: test_update.py, test_launcher.py (поддельные агенты), test_self_update_e2e.py (настоящие run.py + agent.py + фейки: v5 → v6, Ctrl-C группе → 0). README (раздел «Самообновление», запуск через run.py), ARCHITECTURE.md, CLAUDE.md (раздел «Выкатка новой версии» — публикация в чеклисте закрытия).

Тесты: /usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t . → 193 OK (Python 3.9.6).

Rulings I made

  • R-19 — tests/test_folder.py::test_version_is_4 → test_version_is_5: план не учёл старый тест версии; цена: нет.
  • R-20 — выход 0/130/-SIGINT — остановка человеком, только если run.py сам получил SIGINT/SIGTERM; иначе падение (в trial — откат); Ctrl-C при выходе с 75 — подмена и выход, trial при следующем старте; спека и design 16/17 обновлены (хаб ed9c32a); цена: kill <pid агента> перезапускает агента — останавливать run.py (README).
  • R-21 — M-1 ревью (отрицательный sleep в pause роняет run.py) повышена до Important: run.py обновляется вручную; цена: нет.

Находки финального ревью (opus)

Маркер Находка Статус
I-1 новая версия, сама вышедшая с 0 в пробный период, не откатывалась — мост стоит fixed 20b858c
M-1 отрицательный sleep в pause() роняет запускатель (повышена, R-21) fixed 20b858c
M-2 сигнал остановки между выходом агента и новым запуском теряется; Ctrl-C при выходе 75 fixed 20b858c
M-3 trial не привязан к sha agent.py — устаревший trial откатывает здоровую версию / цикл 10 мин deferred
M-4 после таймаута пробного периода откат без повторной проверки ok deferred
M-5 падение run.py между os.replace(new, agent) и записью trial deferred
M-6 OSError (диск полон) в prepare агента и apply_update запускателя deferred
M-7 код 1 «агент уже запущен» от осиротевшего агента в trial откатывает здоровую версию (Ctrl-C на старте закрыт R-20) deferred
M-8 спека: «SIGINT игнорировать» против design 19 fixed ed9c32a (хаб)
M-9 рулинг без маркера, пустая таблица design.md агента fixed 20b858c
M-10 agent.py.new.tmp не чистится при старте; sha256=None → бесконечные временные сбои; нет тестов on_sigterm и trial при перезапуске run.py deferred

После merge (design.md, Migration Plan)

  1. Последнее ручное обновление: agent.py v5 и run.py в корень RSHB/; на виртуалке остановить v4, скопировать в ~/jira-agent-bundle, python3 agent.py check, запуск python3 run.py.
  2. Живая проверка: публикация v6 (только номер) → ok; v7, падающая на старте → откат, rolled_back; v8 = код v6 → ставится.

🤖 Generated with Claude Code

Closes #19. Хаб — aep/jira-hub#22 (PR рядом; спека `jira-hub/openspec/changes/agent-self-update/`). ## Что сделано - **Агент v5** (`src/agent.py`): `update.json` рядом с агентом; `update_state` и `launcher_version` в каждом `claim`; после `claim` без команды — `Updater.check`: скачивание `GET /agent/release`, sha256, компиляция, `AGENT_VERSION`, `agent.py.new`, `selftest` новой версии (0 — годен, 3 — временный сбой, иное — `rejected`), выход 75; отвергнутые версии не повторяются; без запускателя — подсказка в лог раз в час; `auto_update` в `agent.json`; команда `selftest`. - **Запускатель `src/run.py`** (stdlib, не импортирует агента): дочерний `agent.py run`; 75 — копия в `.prev` и атомарная подмена, `trial`; падение или 10 мин без `ok` — откат; выход без Ctrl-C — тоже падение; перезапуск с паузой 5…300 с; блокировка `run.py.lock`. - Код новой версии приходит только через API хаба и пишется в каталог агента — общая папка для кода не используется. - Тесты: `test_update.py`, `test_launcher.py` (поддельные агенты), `test_self_update_e2e.py` (настоящие `run.py` + `agent.py` + фейки: v5 → v6, Ctrl-C группе → 0). README (раздел «Самообновление», запуск через `run.py`), ARCHITECTURE.md, CLAUDE.md (раздел «Выкатка новой версии» — публикация в чеклисте закрытия). Тесты: `/usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t .` → 193 OK (Python 3.9.6). ## Rulings I made - R-19 — `tests/test_folder.py::test_version_is_4` → `test_version_is_5`: план не учёл старый тест версии; цена: нет. - R-20 — выход 0/130/-SIGINT — остановка человеком, только если `run.py` сам получил SIGINT/SIGTERM; иначе падение (в `trial` — откат); Ctrl-C при выходе с 75 — подмена и выход, `trial` при следующем старте; спека и design 16/17 обновлены (хаб ed9c32a); цена: `kill <pid агента>` перезапускает агента — останавливать `run.py` (README). - R-21 — M-1 ревью (отрицательный `sleep` в `pause` роняет `run.py`) повышена до Important: `run.py` обновляется вручную; цена: нет. ## Находки финального ревью (opus) | Маркер | Находка | Статус | |---|---|---| | I-1 | новая версия, сама вышедшая с 0 в пробный период, не откатывалась — мост стоит | fixed 20b858c | | M-1 | отрицательный `sleep` в `pause()` роняет запускатель (повышена, R-21) | fixed 20b858c | | M-2 | сигнал остановки между выходом агента и новым запуском теряется; Ctrl-C при выходе 75 | fixed 20b858c | | M-3 | `trial` не привязан к sha `agent.py` — устаревший `trial` откатывает здоровую версию / цикл 10 мин | deferred | | M-4 | после таймаута пробного периода откат без повторной проверки `ok` | deferred | | M-5 | падение `run.py` между `os.replace(new, agent)` и записью `trial` | deferred | | M-6 | OSError (диск полон) в `prepare` агента и `apply_update` запускателя | deferred | | M-7 | код 1 «агент уже запущен» от осиротевшего агента в `trial` откатывает здоровую версию (Ctrl-C на старте закрыт R-20) | deferred | | M-8 | спека: «SIGINT игнорировать» против design 19 | fixed ed9c32a (хаб) | | M-9 | рулинг без маркера, пустая таблица design.md агента | fixed 20b858c | | M-10 | `agent.py.new.tmp` не чистится при старте; `sha256=None` → бесконечные временные сбои; нет тестов `on_sigterm` и `trial` при перезапуске `run.py` | deferred | ## После merge (design.md, Migration Plan) 1. Последнее ручное обновление: `agent.py` v5 и `run.py` в корень `RSHB/`; на виртуалке остановить v4, скопировать в `~/jira-agent-bundle`, `python3 agent.py check`, запуск `python3 run.py`. 2. Живая проверка: публикация v6 (только номер) → `ok`; v7, падающая на старте → откат, `rolled_back`; v8 = код v6 → ставится. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 8 commits 2026-10-14 21:42:58 +03:00
aep merged commit 4ce71c41c7 into main 2026-10-14 21:58:08 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/jira-agent#20
No description provided.