Repository navigation
[Updater] Восстановить и проверить сквозное обновление Telegram-WSP (upstream sync → Android APK) #45
Description
Цель
Восстановить сквозной проверяемый путь обновления Telegram-WSP: обнаружение нового Telegram upstream → воспроизводимая интеграция → проверенная release-сборка → обнаружение и безопасная установка APK на Android. Исправить выявленные сбои без переписывания Telegram networking или ослабления защиты обновлений.
Стадия проекта: публичный MVP. Не требуется создавать отдельный универсальный update framework; необходимые исправления должны быть соразмерны существующему механизму.
Фактическое состояние на 25.10.2026
A. Автоматическое обновление upstream достоверно заблокировано
- Последний опубликованный стабильный релиз: v12.10.6-wsp.2, Telegram 12.10.6 (build 7112).
config/upstream.json: Telegram commitf2908b14133bbffbf7ab04f641ecb5bfaf533242.- Scheduled run 40179486858 25.10.2026 определил Telegram 13.0.3 (build 7183), commit
0aae959806c57be8ad457980f2a5c6277ff18635, но завершился FAIL на шагеReproduce integration against new Telegram:
scripts/apply-integration.ps1:235
Telegram API Gradle anchor count is 0; expected 1.
- В
scripts/apply-integration.ps1якорь дляTMessagesProj/build.gradleожидаетminSdkVersion 21. В Telegram 13.0.3defaultConfigиспользуетminSdkVersion 23. Это подтверждённая причина первого падения; после исправления нужно проверить остальные якоря и полный pipeline, не предполагать, что других несовместимостей нет. - Последовательные scheduled runs также завершались неуспешно; job публикации пропущен. Существующий релиз 12.10.6 не удалён.
B. Встроенное обновление APK содержит проблемы надёжности (по анализу кода; end-to-end на устройстве не проверен)
Файл: integration/telegram/TgWsProxyBootstrap.java.
KEY_UPDATE_LAST_CHECKсохраняется до запросаlatest.json. При таймауте, 4xx/5xx, отсутствии сети или повреждённом manifest повторные запуски не предпринимают проверку до истечения 12 часов.- Проверка запускается однократно при старте процесса (
start()); у пользователя нет обнаруженного отдельного действия «Проверить обновления». При длительной работе клиента очередная проверка не планируется. - Предложение обновления ждёт
LaunchActivity.instanceограниченное число раз (30 попыток); если Activity не готова, результат проверки теряется, хотя время проверки уже записано. HttpURLConnectionдля feed и APK не подтверждает использование общего network/proxy policy. Если GitHub недоступен напрямую, Telegram через TgWsProxy может продолжать работать, а updater — нет. Нужна проверка реальной маршрутизации и применимый безопасный fallback.scripts/ci.ps1проверяет присутствие фрагментов исходного кода, но это не эквивалент сценария «старая версия → предложение → скачивание → проверка → системный installer → сохранение данных».
Существующие защитные меры сохранить: загрузка с доверенного HTTPS release-источника, SHA-256 APK, совпадение package ID org.telegram.messenger.web и signing certificate с установленным приложением, пользовательское подтверждение системной установки, лимиты на размер APK, отсутствие токенов/секретов в клиенте, корректное сравнение versionCode.
Scope
1. Восстановить совместимость overlay с новым Telegram (P0 для следующей upstream-публикации)
- Проверить diff
DrKLO/Telegram@f2908b14→@0aae9598, в особенности Gradle/manifest, source/API anchors и minSdk. - Сделать целевой и fail-closed адаптер в
scripts/apply-integration.ps1: поддержать подтверждённые варианты якорей, однозначно обнаруживать несовместимость и не подменять/игнорировать ошибки. - Отдельно решить, можно ли сохранить заявленную Android 5.0 (API 21) совместимость. Если upstream реально требует
minSdk 23, не скрывать это override: согласовать изменение поддерживаемого minSdk со сборкой, документацией и проверками, не обещать неподтверждённую совместимость. - Проверить остальные места integration overlay и допустимый diff, сохранить
tgnetнетронутым и архитектуруTelegram → adapter → tgwsproxy-core. - Добиться воспроизводимого
prepare-integration.ps1 -Forceиscripts/ci.ps1как на старом pinned upstream, так и на новом при соответствующей фиксации pin; для нового upstream выполнить необходимую build-валидацию. - Перед изменением
mainи выпуском подписанного APK сохранить существующие secrets/CI/release gates, использовать штатный release workflow; не публиковать на основании одной успешно прошедшей текстовой проверки.
2. Починить жизненный цикл проверки обновлений внутри приложения (P1)
- Разделить
last successful checkиlast attempted check/backoff: успешная проверка соблюдает штатные 12 часов; ожидаемая ошибка сети не блокирует повторную попытку на 12 часов. Избежать tight retry loops. - Добавить доступный ручной путь «Проверить обновления» в существующий интерфейс без отдельной сложной UI-системы. Ручная проверка не должна молча отбрасываться из-за автоматического cooldown.
- Обеспечить обновление результата проверки при появлении foreground Activity, даже если она не была готова при получении feed; не показывать диалог поверх неактуального/уничтоженного Activity.
- Реализовать соразмерную повторную проверку при длительной работе/возобновлении приложения без фоновой службы, если можно использовать существующий lifecycle.
- Показывать однозначную идентификацию доступного Telegram-WSP release (включая WSP revision/tag, а не только Telegram
versionName) и доступ к release notes. - Явно обработать «актуальная версия», «обновление найдено», отмену пользователем и ошибку проверки; обычный запуск/работу TgWsProxy не блокировать.
3. Проверить доставку APK и безопасность
- Выяснить и зафиксировать фактическую network/proxy policy для GitHub feed и бинарника в целевой среде; применить поддерживаемый безопасный путь или обоснованный fallback на официальный GitHub Release/браузер. Не пытаться передавать HTTPS через MTProto frontend
127.0.0.1:1443как через обычный HTTP proxy. - Убедиться, что redirects, URL/path/host, содержимое feed, версия/tag, hash и артефакт проверяются до установки. Не ослаблять TLS, package/signature/SHA-256 gates.
- При прерывании/неуспехе загрузки не выдавать partial за готовый APK; повторное скачивание и кэш ведут себя предсказуемо.
- При отсутствии разрешения Android «Установка из этого источника» оставлять пользователю понятный путь продолжения после выдачи разрешения.
- Не открывать installer для неподтверждённого или не более нового APK. Не удалять и не сбрасывать пользовательские данные для обновления.
Acceptance criteria
-
Telegram upstream syncпри Telegram 13.0.3 (build 7183) проходит проверку интеграции без указанного Gradle anchor failure; полный required CI/build status наблюдаем и документирован. Если выяснится новый независимый blocker, его фиксируют явно, не объявляют обновление рабочим. - Старый pinned upstream остаётся воспроизводимым, либо переход задокументирован и старый regression fixture сохранён.
- Выбранный minSdk соответствует требованиям реального upstream, приложения, core и опубликованной документации.
- Для установленной latest версии обновление не предлагается; для меньшего
versionCodeпоказывается корректная версия Telegram-WSP и предложение обновления. - После сетевой ошибки возможна повторная проверка без необоснованного 12-часового ожидания; ручное действие инициирует новую проверку.
- Неактивная Activity/foreground transition не приводит к потере обнаруженного доступного обновления.
- При download/manifest/checksum/certificate/package mismatch установка не запускается.
- На Android выполнен поддерживаемый upgrade из предыдущего подписанного релиза в более новый через штатный installer: учётная запись, настройки прокси и другие данные сохраняются; запуск после обновления корректен.
- Стандартный клиент Telegram и TgWsProxy продолжают работать при недоступном release endpoint.
- Не возникает старого бага публикации ревизии
wsp.1поверх более новойwsp.2(см. закрытые Не создавать устаревшую WSP-ревизию при scheduled upstream sync #39 и Наследовать актуальную WSP-ревизию при обновлении Telegram upstream #41); stable-клиенту не предлагаются prerelease.
Проверки
Автоматические (добавить регрессии, предпочесть существующий scripts/ci.ps1 и точечные JVM/Android tests):
- Детерминированная проверка overlay: старый pinned upstream и Telegram 13.0.3, несовпадение якоря → ожидаемый fail-closed.
- Табличные тесты сравнения
versionCode(current/latest, old/new WSP revision, новая версия upstream, некорректные значения). - Fake HTTP/fake clock: успех, no update, 404/500, timeout, offline, corrupted/missing
latest.json, retry/backoff, ручной bypass cooldown, foreground Activity. - APK cases: SHA mismatch, invalid/mismatched signing cert, чужой package, incomplete download, oversize, отсутствие разрешения install.
- Повторная проверка branch/release logic и существующей ревизионной защиты из Не создавать устаревшую WSP-ревизию при scheduled upstream sync #39/Наследовать актуальную WSP-ревизию при обновлении Telegram upstream #41.
-
scripts/prepare-integration.ps1 -Force,scripts/ci.ps1, полноценная release-assembly на поддерживаемом toolchain; документировать PASS/FAIL/NOT_RUN, не подменять реальную проверку regex-проверкой исходников.
Device acceptance (если не покрывается воспроизводимой Android instrumentation):
- Подписанная предыдущая версия → обновление до более нового тестового/проверенного релиза через реальный installer.
- Повторный запуск; сохранены аккаунты, proxy mode, домены, worker pools и настройки (без публикации приватных конфигураций).
- Проверка при доступном/недоступном GitHub в целевой сети, смене сети, отказе в разрешении установки и восстановлении после отказа.
Вне scope
- Доработка транспортных маршрутов TgWsProxy, новый VPN/HTTP proxy backend или переписывание
tgnet. - Ребрендинг, новые proxy UI-функции, дополнительная платформа/магазин, полная переработка release архитектуры.
- Повторная реализация закрытых Не создавать устаревшую WSP-ревизию при scheduled upstream sync #39/Наследовать актуальную WSP-ревизию при обновлении Telegram upstream #41 без обнаруженной регрессии.
- Автоматическая публикация новой версии до прохождения применимых проверок безопасности, сборки и device acceptance.
Ссылки
- Исходный успешный канал обновлений: PR #21.
- Два ранее исправленных бага release revision: #39, #41.
- Код обновлений:
TgWsProxyBootstrap.java. - Проблемный overlay:
apply-integration.ps1. - Лог проблемы: run 40179486858.
Definition of Done: подтверждены обе стороны update chain (GitHub release pipeline и установленное Android-приложение), исправления защищены регрессиями, неподтверждённые сценарии отмечены как ограничения, release security gates не ослаблены.
Activity
fix(upstream): preserve verified API 21/23 Gradle SDK contracts (#45)
fix(updater): retry after failure, manual and foreground checks, stri…
fix(updater): reject insecure and untrusted release redirects (#45)
feat(updater): manual check and trusted browser fallback in proxy set…
fix(release): derive manifest minimumSdk from validated Telegram Grad…
test(release): validate packaged APK SDK against upstream floor (#45)
fix(updater): persist pending offer across process restart without 12…
test(ci): pinned/new Telegram matrix, fail-closed SDK and APK compile (…
ci(upstream): compile candidate before updating main pin (#45)
docs: correct stable release, API 21/23 and updater recovery paths (#45)
test(ci): protect updater lifecycle, stable metadata and SDK invarian…
fix(ci): repair complete release metadata SDK validation block (#45)
fix(release): complete APK minimum SDK check (#45)
fix(release): remove accidental duplicate tail; validate SDK cleanly (#…
fix(release): remove accidental duplicate tail and preserve APK SDK a…
4 remaining items
fix(android): route settings updater actions through TgWsProxyControl…
test(ci): assert core-to-standalone updater action bridge (#45)
fix(updater): discard stale pending offer when latest release require…
fix(ci): preserve bootstrap controller-start contract (#45)
fix(release): retry unpublished Telegram versions without overwriting…
test(release): cover automatic retry, stable revision and no-overwrit…
fix(sync): retry missing stable release after validated pin was commi…
test(ci): execute release retry and stable-revision regression matrix (…
fix(release): prevent overwriting existing signed APK and stable mani…
fix(tests): correct PowerShell interpolated case labels (#45)
docs: describe fully scheduled Telegram release and recovery without …
test(ci): enforce immutable signed release assets on automatic retries (
fix: restore automatic Telegram upstream release pipeline (#46)
Regstar2 commentedon Oct 26, 2026
Закрываю Issue #45 по прямому решению владельца проекта. Это административное закрытие с явно оставшимися непроверенными acceptance criteria, а не подтверждение полной проверки Android updater end-to-end.
Подтверждено:
53e9840209025fa5ec16dfbf3afc3e9c89ecc64b).v13.1.1-wsp.2, Telegram 13.1.1/build 7237, WSP revision 2: https://github.com/Regstar2/telegram-wsp/releases/tag/v13.1.1-wsp.2versionCode=7237029.Осталось без подтверждения: реальное обновление установленного
v12.10.6-wsp.2доv13.1.1-wsp.2через встроенный updater и системный installer с сохранением учётной записи/настроек, условия недоступного GitHub и негативные сценарии HTTP/SHA/signature/package/permission через Android E2E. Успех workflow публикации этого не доказывает. Указанные пункты при необходимости следует проверять отдельно до заявления о полностью проверенном end-to-end обновлении.