[2026-10-30] eagle: work/projects/cpm-post-release-analysis-2026-10-27.md work/projects/cpm-status-2026-10-15.md work/projects/cpm-web-extension-breakage-validation.md work/projects/cpm-web-extension-code-guide-2026-10-09.md

This commit is contained in:
Alexey Martemyanov committed 2026-10-30 16:54:20 +06:00
1 parent ac721b6a22
commit 449c867f90
4 files changed
+84 -2

No files matched your search

+35
View File
@@ -9,6 +9,41 @@ updated: '2026-10-30'
---
# CPM Web Extension: единый статус
## Текущее состояние — 30 октября 2026, 16:48 Бишкек
### Upgrade-before-load: PR открыт, CI зелёный
[#7767 — Upgrade CPM before loading installed extensions](https://github.com/duckduckgo/apple-browsers/pull/7767), ветка `codex/cpm-upgrade-before-load`, опубликованный head **`45593bbb4e631b5daae9ed77e95f4bd760f738fa`**, base `main` **`3046f67631d5655f227cd2e7e7ebf4ef60d0d90a`**. Актуальный main влит в ветку PR; конфликт stable-origin policy устранён с сохранением OS 26.6+ gate и pending-origin cleanup/rotation. PR **OPEN, MERGEABLE**, не merged и не shipped. Проверено на этом head: **43 checks SUCCESS, 15 SKIPPED, 0 failed/pending**; итоговые iOS/macOS/BSK/DBP, Danger и SwiftLint — SUCCESS. `mergeStateStatus=BLOCKED` при зелёных checks не означает merge conflict.
**Порядок запуска:** при включённом `cpmUpgradeBeforeLoad` coordinator сначала подготавливает только CPM (`.embedded`), затем загружает установленные extensions, затем выполняет обычный общий sync. Предварительная фаза обновляет/устанавливает включённый CPM либо удаляет выключенный, не запускает scriptlet handling и не синхронизирует остальные bundled types. Другие contexts ждут завершения этой подготовки, но для них сохраняется собственный порядок load → sync. Scriptlet downloads начинаются после загрузки contexts; зависшая загрузка ad-block scriptlets не держит их незагруженными.
**Fallback и совместимость:** новая версия устанавливается до удаления старой; ошибка pre-load upgrade оставляет прежнюю установку для следующего load. Обычный post-load sync затем может повторить попытку. Если повреждённая current-version установка была пропущена pre-load, load удаляет её и общий sync восстанавливает в том же запуске. При выключенном флаге действует прежний порядок: load установленной версии → общий sync/upgrade.
**Origin:** переносится только для CPM при включённом upgrade-before-load, включённой stable-origin policy и отсутствии загруженного старого context. Для присвоения stable baseURL также нужны OS 26.6+ и приватный CPM manifest без web-accessible resources. Runtime upgrade или post-load retry при живом старом context использует отдельные origins, потому что установка ненадолго загружает обе версии. Ротации после background failures сохраняются; неподходящий manifest очищает унаследованный pending origin, а отключённая policy/неподдерживаемая ОС не сохраняет abandoned origin. JSON key `cpmStableOriginIdentifier` и installation-UUID fallback из main сохранены.
**Откат:** `webExtensions.cpmUpgradeBeforeLoad` — remote-releasable failsafe, code default ON на iOS/macOS. [Feature Flag Registry](https://app.asana.com/1/137249556945/project/1211834678943996/task/1220009029295774). Значение фиксируется при создании manager; изменение применяется к следующему manager, обычно после перезапуска приложения. OFF возвращает старый launch order и прекращает перенос origin в upgrade. Отдельный `cpmStableBaseURL` по-прежнему управляет stable origin. Live remote configuration в этом обновлении не менялась и не проверялась.
### Диагностика failures без нового пикселя
Используется существующий `embeddedInstallError` / CPM install-error pixel обеих платформ. Только ошибка CPM pre-load sync получает суффикс **`.before_load` в error domain**; code, userInfo и доступная underlying-error chain сохраняются. Обычный post-load sync передаёт исходную ошибку без суффикса. Новых success/outcome pixels, stage parameters, таймеров и launch tracking нет.
Отсутствующий bundle и несовпадение типа теперь тоже сообщаются через существующий error pixel: `EmbeddedSyncError: DDGError`, domain `WebExtensionEmbeddedSync`, codes **1 = missingBundle, 2 = typeMismatch**. `typeMismatch` перехватывается внутри sync и не прерывает загрузку остальных типов. Ошибки WebKit нормализуются в обёртках самих WebKit API; повторный `webKitSafe` в telemetry helper удалён. Для изменения domain используется `error as NSError`.
Ранее выполненный ClickHouse-срез за **29 октября UTC**, без суммирования standard и daily legs: **518 iOS / 16 macOS install-error events** по всем версиям; на macOS 14 из 16 — invalid archive (`WKWebExtensionErrorDomain:9`), на iOS преобладали storage и invalid-archive errors. Это события ошибок, не affected-user rate. Проверка корреляции с CPM failure episodes **не установила причинную связь**: общих installation/session IDs нет, а почасовые totals зависят от трафика. `extension_updated` в истории означает успешное обновление и само по себе не связывает episode с install error. Этот срез не перезапрашивался при обновлении документации; он предшествует rollout нового domain suffix.
### Проверки, производительность и границы
- После первого merge main (`f479f5deb2`): **1037 package tests / 0 failures**, shared iOS Simulator compilation и strict lint PASS.
- На опубликованном `fafcb1ffda`: **11 real-WebKit harness scenarios / 0 failures / 0 skips**, включая fallback, flag OFF, disabled CPM, runtime upgrade, повторные launch upgrades и persistent profile с 2000 cookie-bearing sites. Это package harness, не full-app E2E.
- После перехода на DDGError и исправления теста: **89 manager tests PASS**, strict lint PASS. Тест телеметрии упал в iOS CI из-за обращения к отсутствующему `Bundle.module`; `00ddded2ff` заменил настоящий CPM archive минимальным ZIP fixture, создаваемым тестом. Исправленный тест реально прошёл на **iOS 27 Simulator**, в том числе при намеренно убранном resource bundle. В production code ради этого падения ничего не менялось. Новый файл тестов не добавлялся; сохранён один telemetry regression method.
- На последнем merge `45593bbb4e` — зелёный exact-head CI, как указано выше. Исторические локальные counts относятся к своим heads; это не новые прогоны на последнем merge.
**Измерение 29 октября:** по 20 launches на сценарий, три документа на launch. Медиана времени до ответов всех трёх документов: прежний load-before-sync — **180.9 / 173.6 / 208.3 / 205.8 ms**; последний CPM-only sample — **181.7 / 172.3 / 179.5 / 178.4 ms** для first install / unchanged / upgrade / upgrade + 2000 sites. Во всех 240 measured replies последней серии — 0 потерь, один context. Это отдельные harness samples; в них не видно регрессии первого/обычного запуска, но они не измеряют полный старт приложения, большой HTTP cache или production hang rate. Сырые результаты: `/Users/admin/DuckDuckGo/apple-browsers.git/cpm-upgrade-before-load-results-2026-10-29/`, `summary.json`, `cpm-only-summary.json`, `CPM_ONLY_REVIEW.md`.
**Что остаётся неизвестным:** production-доля failures, устраняемых новым порядком; эффект после rollout; полный iOS app startup/upgrade runtime и full-app UI этого PR локально не проверялись. iOS Simulator telemetry test не является таким app-level прогоном. Error-page fix #7752/#7753 уже merged в release branches, но macOS wake/other baseline до него может содержать false positives. iOS полезен как отдельный срез, однако его нельзя считать доказанно незагрязнённым контролем без соответствующей runtime-проверки. Сравнивать платформы, версии, ОС и rollout/flag states отдельно; новые production metrics в этом обновлении не получались.
Код и worktree: [[cpm-web-extension-code-guide-2026-10-09#Upgrade-before-load — PR 7767]]. Приоритеты и границы старого production baseline: [[cpm-post-release-analysis-2026-10-27#Upgrade-before-load — 30 October 2026]].
## Обновление 30 октября 2026 — release PR merged
[iOS #7753](https://github.com/duckduckgo/apple-browsers/pull/7753) merged в `release/ios/7.244.0`, [macOS #7752](https://github.com/duckduckgo/apple-browsers/pull/7752) — в `release/macos/1.214.0`. Последние публичные GitHub-релизы при проверке 30 октября — 7.243.0 / 1.213.0: merge не означает rollout или подтверждённый эффект.