59 lines
5.7 KiB
Markdown
59 lines
5.7 KiB
Markdown
## Why
|
||
|
||
Самообновление агента работает с 14.10.2026 (v5 → v8 на виртуалке, живая проверка пройдена), но финальное ревью
|
||
change'а `agent-self-update` оставило отложенные находки в запускателе `run.py` и `Updater` (aep/jira-agent#22):
|
||
`run.py` верит `update.json` на слово, и после падения запускателя посреди подмены или отката может откатить
|
||
здоровую версию, оставить новую версию без пробного периода или уйти в цикл «10 минут работы → SIGTERM».
|
||
Полный диск роняет агента трейсбеком и запускатель — в цикл падений. Рядом лежат мелкие находки гигиены
|
||
(aep/jira-agent#18) и неточность фейков Jira/хаба в тестах агента (aep/jira-agent#4, M-10): ошибку `ensure_sprint`
|
||
(`KeyError: 'fields'`) 13.10.2026 нашли только на живой Jira.
|
||
|
||
Решения владельца 14.10.2026 (brainstorming): чинить всё одним пакетом — агент v9 (через самообновление) и
|
||
запускатель v2 (владелец переставляет вручную); фейки подтянуть к наблюдённому поведению Jira, а не отклонять.
|
||
|
||
## What Changes
|
||
|
||
- **Запускатель `run.py` v2** (`LAUNCHER_VERSION = 2`):
|
||
- сверка при старте: `update.json` сравнивается с sha256 файла `agent.py` и наличием `agent.py.new`; устаревший
|
||
`trial` (агент не та версия) → `rolled_back` без отката; `staged` при уже подменённом `agent.py` → `trial`;
|
||
`staged` без годного `agent.py.new` → `rejected`; удаление `agent.py.new.tmp`, `agent.py.prev.tmp`, `update.json.tmp`;
|
||
- пробный период включается, только если sha256 `agent.py` равен sha256 версии в `update.json`;
|
||
- после истечения пробного периода и остановки агента `update.json` перечитывается: `ok` — отката нет;
|
||
- код выхода агента 73 («другой процесс держит журнал») — не сбой версии: без отката, перезапуск с паузой;
|
||
- `OSError` при подмене — `rejected` «подмена не удалась», работает текущая версия; запускатель не падает.
|
||
- **Агент v9** (`AGENT_VERSION = 9`):
|
||
- `run` при занятой блокировке журнала выходит с кодом 73 (было 1);
|
||
- `OSError` при подготовке версии — временный сбой (повтор через 5 мин), не трейсбек;
|
||
- `agent_release` неверного формата (версия не целое, sha256 не 64 hex-символа) игнорируется, в логе не чаще раза в час;
|
||
- время журнала в будущем — одна строка лога вместо двух противоречивых;
|
||
- ошибки хаба внутри `refresh` помечаются источником «хаб» (лог и `error` отчёта), `FolderTransport` пишет «хаб не
|
||
ответил через папку…»;
|
||
- тесты: будущее время журнала + остановка в паузе, `on_sigterm` запускателя, `trial` при перезапуске `run.py`;
|
||
- фейки: `project =` и `created >= -Nd` в поиске, очистка Epic Link `null`, 400 на `key in (...)` с несуществующим
|
||
ключом, долгий `claim` хаба.
|
||
|
||
## Capabilities
|
||
|
||
### New Capabilities
|
||
<!-- нет -->
|
||
|
||
### Modified Capabilities
|
||
- `agent`: код выхода при занятом журнале; источник ошибки хаба в `refresh`; лог при времени журнала в будущем;
|
||
самообновление — `OSError` и формат `agent_release`; запускатель — сверка состояния с файлом, повторная проверка
|
||
`ok`, код 73, `OSError` при подмене, очистка временных файлов.
|
||
|
||
## Non-Goals
|
||
|
||
- код хаба не меняется: `agent_release.sha256` у хаба всегда строка (`release.current`), формат проверяет агент;
|
||
- самообновление `run.py` — по-прежнему вручную;
|
||
- повтор подмены в запускателе после `OSError` (у запускателя нет таймера; лечится публикацией v+1, см. design R-2);
|
||
- новые состояния `update.json` — используются существующие `staged`, `trial`, `ok`, `rolled_back`, `rejected`.
|
||
|
||
## Impact
|
||
|
||
- jira-hub: только `openspec/specs/agent/spec.md` (через этот change). Код, схема БД, API, MCP — без изменений.
|
||
- jira-agent (aep/jira-agent#23): `src/agent.py` (v9), `src/run.py` (v2), `tests/` (фейки и новые тесты), README,
|
||
ARCHITECTURE.md, CLAUDE.md.
|
||
- Выкатка, порядок важен: сначала `jira-hub agent publish` v9 (самообновление с v8), затем владелец вручную ставит
|
||
`run.py` v2. Запускатель v2 с агентом v8 работает, но код 73 понимает только от v9.
|