5.7 KiB
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.pyv2 (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 Linknull, 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 publishv9 (самообновление с v8), затем владелец вручную ставитrun.pyv2. Запускатель v2 с агентом v8 работает, но код 73 понимает только от v9.