Владелец показал, как это сделано в Cockpit Tools: окно при запуске, видимая загрузка, останов служб, установка и запуск без участия человека. Строить заново нечего. Проверено: проверка при запуске уже выполняется, но в тихом режиме; обработчик хода скачивания в загрузчике уже написан, но его результат никуда не выводится; останов и перезапуск держатся на schedule_restart и не проверены на обеих системах. Внешнее условие: лента релизов отстала на v0.1.2-b7 при установленной 0.1.3 — пока свежий релиз не опубликован, обновлять не на что. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
12 KiB
Задание A59: обновление, которое видно и доводит себя до конца
Дата поступления
2026-09-02
База
origin/main (58cb88e).
git fetch origin --prune
git checkout -b antigravity/a59-visible-update origin/main
В main напрямую не пушить.
Порядок исполнения
Два прохода: Flash реализует, Pro проводит аудит. Пункт P0-7 написан для аудитора.
Зона: обновление и перезапуск. С A58 (состояние agy) не пересекается.
Задача
Владелец показал, как это устроено в Cockpit Tools, и хочет так же:
захожу в программу и независимо от того, работала она или нет, выходит окно об обновлении. ставишь новую версию (что на линукс, что на винде) — сразу видно загрузку и что скачивается. потом он останавливает сам все службы, устанавливает программу новую и запускает.
Сейчас владелец ставит каждую сборку установщиком вручную. Обновление внутри программы написано, но не доведено до вида, в котором им пользуются.
Что проверено ревьюером — заново не выяснять
Строить с нуля ничего не надо, почти всё уже есть.
UpdateManager.check_for_updates есть
UpdateManager._download_file есть, с обработчиком хода: content-length и
progress_cb(downloaded / total)
UpdateManager.download_and_verify есть, с проверкой SHA-256
UpdateManager.install_latest_update есть
UpdateManager.schedule_restart есть
действия check_updates и apply_update есть в обработчике
проверка при запуске сервера есть: server.py вызывает check_for_updates
проверка при открытии интерфейса есть: app.js вызывает checkUpdates(true)
Три разрыва, и все на виду.
- Проверка при запуске молчит.
checkUpdates(true)— тихий режим: обновление находится, но владельцу не показывается ничего. - Ход скачивания никуда не идёт.
progress_cbв загрузчике есть, но его никто не передаёт и результат не отображается. - Останов служб и запуск после установки держится на
schedule_restartи не проверен на обеих системах.
Плюс внешнее условие: лента релизов отстала. Последний опубликованный — v0.1.2-b7, а установлена 0.1.3. Пока свежий релиз не опубликован, обновлять не на что, и проверить работу нельзя.
P0-1. Окно при запуске
- Обновление есть — показывается окно, а не значок в углу. Независимо от того, работала программа до этого или нет.
- В окне: номер версии, что нового, размер загрузки. «Что нового» брать из описания релиза; нет описания — писать
Н/Д: описание не приложено, а не пустоту. - Отказаться можно, и отказ запоминается для этой версии: повторно то же окно не всплывает.
- Обновления нет — окна нет. Молчание при отсутствии новостей.
P0-2. Скачивание видно
- Полоса хода и проценты, источник —
progress_cb, он уже написан. - Показывать, что именно скачивается: имя файла и размер, «сколько из скольких».
- Нет
content-length— так и писать:Н/Д: сервер не сообщил размер, и показывать скачанный объём без процентов. Выдумывать проценты нельзя. - Скачивание можно отменить, недокачанный файл удаляется.
- Проверка SHA-256 остаётся обязательной. Не сошлась — установка не начинается, файл удаляется, причина на экран.
P0-3. Установка доводит себя до конца
- Останавливаются все свои процессы: веб-сервер, фоновые опросы, дочерние. Тот же порядок, что в установщике — там это уже сделано в
stop_running_hub. - Чужого не трогать. Останавливать только своё: по признаку хаба, в своём пользователе.
- Установка и запуск без участия владельца. После запуска — тот же экран, на котором он был.
- Работает на Linux и на Windows. Разница только в способе запуска, поведение одинаковое.
- Сорвалось на середине — откат к прежней версии и внятное сообщение. Программа обязана остаться работоспособной.
P0-4. Видно, что обновилось
- После перезапуска показать, что версия сменилась: было — стало.
- Строка сборки уже показывает коммит работающего процесса (
running_commit, снят при старте) и время запуска. Не ломать: это единственный признак, по которому отличают новый код от старого, пережившего установку. - Событие в журнале о применённом обновлении с обеими версиями.
P0-5. Ничего лишнего
- Не опрашивать в цикле. Проверка при запуске и по кнопке. Опрос в цикле уже приводил к тому, что интерфейс сам себя кормил запросами.
- Опросы состояния молчат — они в
SILENT_ACTIONS, туда же добавить опрос хода загрузки. - Автоматическая установка без спроса запрещена. Показать, предложить, дождаться нажатия.
P0-6. Проверка исполнением
Тестами это не ловится: дело в живом переходе между версиями.
- Обновиться на живой установке с предыдущей версии на текущую. На обеих системах. Скриншоты окна и полосы хода приложить.
- Замерить время от нажатия до готовности.
- Проверить, что после перезапуска работает новый код — по
running_commit, а не по номеру версии. - Проверить отказ: испорченная сумма, обрыв сети, отмена на середине.
- Проверить, что старый процесс не остался.
P0-7. Аудит вторым проходом
- Пройти обновление целиком на обеих системах.
- Проверить, что проценты не выдумываются при отсутствии
content-length. - Проверить откат при сорвавшейся установке.
- Проверить, что останавливается только своё.
- Побочные изменения объяснить.
- Пропущенный пункт назвать пропущенным.
Ограничения
- Проверку SHA-256 и список разрешённых адресов не ослаблять.
- Показ работающего коммита и времени запуска не ломать.
- Фронтенд без npm, без сборки, без фреймворков — по
docs/web-api/CONTRACT.md§1. - Правки ревьюера из
mainне откатывать. - Версию
0.1.3не понижать. - Правило честности без исключений: неизвестный размер —
Н/Дс причиной, а не поддельные проценты.
Критерии приёмки
- Ветка в
origin,git statusчист. - При запуске с доступным обновлением показывается окно; без обновления — не показывается.
- Отказ от версии запоминается, окно не всплывает повторно.
- Полоса хода и объём отображаются; без
content-length— честноеН/Дбез процентов. - Отмена удаляет недокачанный файл.
- Несовпадение SHA-256 прекращает установку с сообщением.
- Установка сама останавливает свои процессы, ставит и запускает; проверено на Linux и Windows.
- Сорвавшаяся установка откатывается, программа остаётся работоспособной.
- После перезапуска
running_commitсоответствует новой сборке. - Опроса в цикле нет; опрос хода загрузки молчалив.
ruff check .чисто; релизный гейт 10/10; тестов не меньше 708.- Отчёт:
START_HEAD,FINAL_HEAD,origin/main,git status,X passed / Y skipped / Z failed.
Главное
Механизм написан, но им нельзя пользоваться: проверка находит обновление и молчит, ход загрузки считается и никуда не выводится. Владелец из-за этого ставит каждую сборку руками, а сегодня их было десять.
Задание не про новый код, а про то, чтобы уже написанное дошло до экрана и довело себя до конца: показать, скачать на глазах, остановить своё, поставить, запустить.
Порядок сдачи
Передать точный FINAL_COMMIT_SHA.