Самообновление агента: публикация версии в хабе (#22) #23

Merged
aep merged 7 commits from feat/22-agent-self-update into main 2026-10-14 21:58:04 +03:00
Owner

Closes #22. Агентская часть — aep/jira-agent#19 (PR рядом).

Что сделано

Самообновление агента моста, сторона хаба (OpenSpec change agent-self-update, спека и решения — openspec/changes/agent-self-update/).

  • jira-hub agent publish <agent.py> — версия из строки AGENT_VERSION = N, только вверх, sha256; файлы release/agent.py + manifest.json в каталоге данных (0700), без изменения схемы БД.
  • POST /agent/claim: в ответе agent_release {version, sha256} | null; в теле принимаются update_state, launcher_version (хаб хранит в памяти, неверные типы игнорирует).
  • GET /agent/release (агентский токен) → {version, sha256, content}; нет публикации/sha не сходится — 404 no_release.
  • GET /agent и MCP agent_status: публикация, состояние обновления, запускатель, подсказка (update_hint).
  • README (раздел «Самообновление агента»), ARCHITECTURE.md, CLAUDE.md.

Тесты: uv run pytest -q → 233 passed. openspec validate agent-self-update --strict — valid.

Rulings I made

Рулинги спеки R-1…R-18 — в design.md («Decisions made without discussion»). При исполнении и ревью:

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

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

Маркер Находка Статус
I-1 PermissionError при чтении release/ → 500 на claim после выдачи команды (очередь уходит в failed) fixed 3a4fed9
M-1 OSError при записи publish — трейсбек, новый agent.py при старом манифесте deferred
M-2 после перезапуска хаба до первого claim ложная подсказка «агент запущен без run.py» deferred
M-3 предупреждение о битом манифесте на каждый запрос deferred
M-4 конфликт с #21 в сигнатуре Hub.__init__ (web_dir/release_dir) при ребейзе; CLAUDE.md «текущий change» deferred
M-5 load: не-UTF-8 файл с совпадающим sha → 500 вместо 404 deferred
M-6 release._write_atomic без fsync deferred
M-7 version манифеста приводится int() без проверки типа deferred

После merge

git pull + launchctl kickstart -k gui/$(id -u)/ru.aepif.jira-hub; GET /agent → release = null. Затем — PR агента и последнее ручное обновление на виртуалке (design.md, Migration Plan).

🤖 Generated with Claude Code

Closes #22. Агентская часть — aep/jira-agent#19 (PR рядом). ## Что сделано Самообновление агента моста, сторона хаба (OpenSpec change `agent-self-update`, спека и решения — `openspec/changes/agent-self-update/`). - `jira-hub agent publish <agent.py>` — версия из строки `AGENT_VERSION = N`, только вверх, sha256; файлы `release/agent.py` + `manifest.json` в каталоге данных (0700), без изменения схемы БД. - `POST /agent/claim`: в ответе `agent_release {version, sha256} | null`; в теле принимаются `update_state`, `launcher_version` (хаб хранит в памяти, неверные типы игнорирует). - `GET /agent/release` (агентский токен) → `{version, sha256, content}`; нет публикации/sha не сходится — 404 `no_release`. - `GET /agent` и MCP `agent_status`: публикация, состояние обновления, запускатель, подсказка (`update_hint`). - README (раздел «Самообновление агента»), ARCHITECTURE.md, CLAUDE.md. Тесты: `uv run pytest -q` → 233 passed. `openspec validate agent-self-update --strict` — valid. ## Rulings I made Рулинги спеки R-1…R-18 — в `design.md` («Decisions made without discussion»). При исполнении и ревью: - R-19 (агент) — `test_version_is_4` → `test_version_is_5`; цена ошибки: нет. - R-20 (design #16, #17) — выход агента 0/130 — остановка человеком только если `run.py` сам получил SIGINT/SIGTERM, иначе падение (в `trial` — откат); цена: `kill <pid агента>` перезапускает агента, останавливать нужно `run.py`. - R-21 — M-1 ревью агента (отрицательный `sleep` в `pause`) повышена до Important и исправлена; цена: нет. ## Находки финального ревью (opus) | Маркер | Находка | Статус | |---|---|---| | I-1 | PermissionError при чтении `release/` → 500 на `claim` после выдачи команды (очередь уходит в failed) | fixed 3a4fed9 | | M-1 | OSError при записи `publish` — трейсбек, новый agent.py при старом манифесте | deferred | | M-2 | после перезапуска хаба до первого claim ложная подсказка «агент запущен без run.py» | deferred | | M-3 | предупреждение о битом манифесте на каждый запрос | deferred | | M-4 | конфликт с #21 в сигнатуре `Hub.__init__` (`web_dir`/`release_dir`) при ребейзе; CLAUDE.md «текущий change» | deferred | | M-5 | `load`: не-UTF-8 файл с совпадающим sha → 500 вместо 404 | deferred | | M-6 | `release._write_atomic` без fsync | deferred | | M-7 | `version` манифеста приводится `int()` без проверки типа | deferred | ## После merge `git pull` + `launchctl kickstart -k gui/$(id -u)/ru.aepif.jira-hub`; `GET /agent` → `release = null`. Затем — PR агента и последнее ручное обновление на виртуалке (design.md, Migration Plan). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 7 commits 2026-10-14 21:42:54 +03:00
aep merged commit d43608c647 into main 2026-10-14 21:58:04 +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/sdlc-hub#23
No description provided.