[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:
1 parent
ac721b6a22
commit
449c867f90
4 files changed
+84
-2
No files matched your search
@@ -11,6 +11,24 @@ updated: '2026-10-30'
|
||||
|
||||
Internal metrics; keep these figures out of public PRs. Previous analysis: [[cpm-metrics-causes-and-mitigations-2026-10-16]], [[cpm-status-2026-10-15]] (§3–5, 12–14 October cut).
|
||||
|
||||
## Upgrade-before-load — 30 October 2026
|
||||
|
||||
[#7767](https://github.com/duckduckgo/apple-browsers/pull/7767) now implements the extension-updated follow-up. Head **`45593bbb4e`**, latest merged main **`3046f67631`**; **OPEN / MERGEABLE**, not merged or released. Exact-head CI: **43 passed, 15 skipped, no failed/pending checks**, including successful iOS/macOS/BSK/DBP result checks.
|
||||
|
||||
The launch pre-sync handles **CPM only**, without scriptlet downloads, before loading installed contexts. The normal full sync follows; other extension types retain load-before-sync. Failed pre-load upgrades keep the previous installation available and the normal sync can retry after load. Disabled CPM is removed before load. The default-enabled remote failsafe `webExtensions.cpmUpgradeBeforeLoad` is captured when the manager is created; OFF restores the previous order on the next manager/app launch. Origin reuse additionally depends on stable-origin policy, OS 26.6+, a private CPM manifest and no live old context. Runtime upgrades keep distinct origins.
|
||||
|
||||
No new pixel or success tracking was added. Existing install-error pixels mark CPM pre-load errors using **`.before_load` in error domain**, preserving code/userInfo/available underlying errors; ordinary sync retains the original domain. Missing bundle/type mismatch use `EmbeddedSyncError: DDGError`, codes 1/2. The earlier 29 Oct UTC ClickHouse cut found **518 iOS / 16 macOS standard install-error events** across versions; 14 macOS events were invalid archive. No installation/session key connects these pixels to failure episodes, and hourly correlation did not establish causation. `extension_updated` records successful update history. Those queries were not rerun for this update.
|
||||
|
||||
Validation is revision-specific: 1,037 package tests passed after the first main merge; 11 real-WebKit harness scenarios passed on `fafcb1ffda`; 89 manager tests passed after the final telemetry fix. iOS CI initially crashed because the telemetry test read an unavailable package resource bundle. `00ddded2ff` replaces that dependency with a generated ZIP fixture. The corrected test passed on iOS 27 Simulator even with the resource bundle removed; the latest PR head subsequently passed CI. Full iOS app upgrade/startup runtime was not locally validated.
|
||||
|
||||
Harness medians, 20 launches/scenario with three document replies: old order **180.9 / 173.6 / 208.3 / 205.8 ms**; latest CPM-only sample **181.7 / 172.3 / 179.5 / 178.4 ms** for first install / unchanged / upgrade / upgrade with 2,000 cookie-bearing sites. All 240 replies in the latest sample arrived. These are separate package-harness samples, not full-app startup measurements or proof of reduced production hangs.
|
||||
|
||||
**Interpretation of priorities below:** the 26–27 Oct macOS wake/other groups predate the error-page fix and may include false positives. The confirmed local mechanism justifies upgrade-before-load as an actionable follow-up; its production effect is unmeasured. iOS should be analysed separately, not assumed to be a proven clean control: error-page behavior at iOS app runtime was not validated in this work. Compare post-rollout versions/OS/flag states before assigning the old wake cohort to real CPM breakage.
|
||||
|
||||
The release PRs #7752/#7753 are merged, while GitHub still lists 7.243.0 / 1.213.0 as the latest non-prerelease tags at this check. 7.244.0-8+ios and 1.214.0-862+macos are marked prerelease. This does not establish App Store rollout.
|
||||
|
||||
Current implementation, rollback, telemetry, per-head tests and artifact locations: [[cpm-status-2026-10-15#Текущее состояние — 30 октября 2026, 16:48 Бишкек]]. Earlier data cuts and reproduction results below remain historical evidence.
|
||||
|
||||
## Release update — 30 October 2026
|
||||
|
||||
- **Merged, not yet verified as publicly released:** [iOS #7753](https://github.com/duckduckgo/apple-browsers/pull/7753) into `release/ios/7.244.0` (merge `26a461e30e73608e75e6d84e09bca0ced842993c`) and [macOS #7752](https://github.com/duckduckgo/apple-browsers/pull/7752) into `release/macos/1.214.0` (merge `1e392bac233d7e3e5ccef340ebc82ad7aee72922`). Latest public GitHub releases checked on 30 Oct are still 7.243.0 / 1.213.0. Merge does not establish rollout or production effect.
|
||||
@@ -51,7 +69,7 @@ Share of macOS cross-tab permanent: idle wake 174 (45%), other 78 (20%), extensi
|
||||
- Add telemetry: events after the first failure (two-phase `bg_events`), a healthy-navigation baseline, retry/recovery applied in the episode.
|
||||
- Keep-warm experiment behind a flag (also a causal test).
|
||||
- **Update 28–29 Oct:** error pages were found to be counted as CPM failures with exactly the wake signature (reproduced in the harness and in a macOS integration test); fix in PRs #7752 (macOS 1.214.0) and #7753 (iOS 7.244.0). Details and the other checks in the section "Idle wake investigation — 28 October 2026" below.
|
||||
2. **Extension updated (20%).** Load the new bundled version before the old one at launch, and keep the origin across upgrades. Repeats after every app update.
|
||||
2. **Extension updated (20% in the historical 26–27 Oct cut).** Implemented in [#7767](https://github.com/duckduckgo/apple-browsers/pull/7767): prepare CPM before load, carrying a private origin only when allowed and no old context is live. The PR is open with green CI; production effect is unmeasured. See the 30 Oct update above.
|
||||
3. **Other (20%).** No distinguishing signal yet; needs the telemetry from step 1.
|
||||
|
||||
Not priorities:
|
||||
|
||||
@@ -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 или подтверждённый эффект.
|
||||
|
||||
@@ -1,8 +1,22 @@
|
||||
---
|
||||
updated: '2026-10-20'
|
||||
updated: '2026-10-30'
|
||||
---
|
||||
# CPM Web Extension Breakage — статус и проверка причин
|
||||
|
||||
## Текущее состояние — 30 октября 2026
|
||||
|
||||
Upgrade-before-load реализован в [PR #7767](https://github.com/duckduckgo/apple-browsers/pull/7767), head `45593bbb4e`, main `3046f67631` влит. PR OPEN/MERGEABLE; exact-head CI **43 SUCCESS / 15 SKIPPED / 0 failed/pending**. Не merged и не shipped.
|
||||
|
||||
Подготовка до load применяется только к CPM, без scriptlet downloads. Ошибка upgrade оставляет старую установку для load и последующего retry. `webExtensions.cpmUpgradeBeforeLoad` — default-ON failsafe, применяется при создании manager; OFF возвращает прежний порядок на следующем manager/запуске. Origin reuse дополнительно зависит от stable-origin policy, OS 26.6+, приватного manifest и отсутствия живого старого context.
|
||||
|
||||
Проверки относятся к своим revisions: 1037 package tests после первого main merge; 11 real-WebKit upgrade/fallback/flag/profile scenarios на `fafcb1ffda`; 89 manager tests после финального telemetry fixture fix. Единственное iOS CI падение было в тесте из-за отсутствующего resource bundle. После `00ddded2ff` тест создаёт собственный ZIP и проходит на iOS 27 Simulator также при удалённом bundle. Full-app startup/upgrade на iOS локально не проверялся.
|
||||
|
||||
Нового failure/success pixel нет: существующий install-error pixel получает domain suffix `.before_load` только для CPM pre-load errors; code/userInfo/доступная underlying chain сохранены. Missing bundle/type mismatch — `DDGError`, коды 1/2.
|
||||
|
||||
Актуальные детали, baseline/after timings и ограничения: [[cpm-status-2026-10-15#Текущее состояние — 30 октября 2026, 16:48 Бишкек]]. Приоритеты с учётом error-page false positives: [[cpm-post-release-analysis-2026-10-27#Upgrade-before-load — 30 October 2026]]. Точки входа и рабочие копии: [[cpm-web-extension-code-guide-2026-10-09#Upgrade-before-load — PR 7767]].
|
||||
|
||||
Ниже сохранены датированные прежние состояния PR, тестов и планов; их OPEN/CI/«не опубликовано» не описывают текущий #7767.
|
||||
|
||||
> **Сверено 20 октября 2026.** Актуальный реестр PR/CI — [[cpm-status-2026-10-15#2. PR и quality gates]], телеметрия/границы диагностики — §6, исходники — [[cpm-web-extension-code-guide-2026-10-09#0. Текущая карта worktree и точек входа]].
|
||||
>
|
||||
> #7376 `5d1cb4abd2` опубликован, CI зелёный, но закрыт без merge. #7484 — старый macOS payload с conflict. #7379 имеет failed BSK crash gate; #7459 и #7493 имеют зелёный exact-head CI. **P5 #7473 merged 20 октября в `release/macos/1.213.0` (`9bcce0264e`)**, CI финального head `574e9288ae` зелёный; default-ON failsafe сохранён. Unit tests проверяют WebKit `openTabs`; real-window fixture остаётся вне merge. Проверенный ON/OFF/ON и границы — [[cpm-status-2026-10-15#P5 — merged 20 октября 2026]]. Публикация/rollout ещё не установлены. Новая телеметрия измеряет completed episodes, не совпадает со старой системой event totals.
|
||||
|
||||
@@ -9,6 +9,21 @@ updated: '2026-10-30'
|
||||
---
|
||||
# CPM Web Extension — карта кода по worktree и строкам
|
||||
|
||||
## Upgrade-before-load — PR 7767
|
||||
|
||||
Проверено 30 октября 2026, 16:48 Бишкек: [#7767](https://github.com/duckduckgo/apple-browsers/pull/7767), production worktree **`/Users/admin/DuckDuckGo/apple-browsers.git/cpm-upgrade-before-load`**, branch `codex/cpm-upgrade-before-load`, head **`45593bbb4e`**. Main `3046f67631` влит; PR OPEN/MERGEABLE, exact-head CI 43 SUCCESS / 15 SKIPPED, 0 failed/pending. Не merged и не shipped.
|
||||
|
||||
- `SharedPackages/WebExtensions/Sources/WebExtensions/Lifecycle/WebExtensionLifecycleCoordinator.swift`, `loadAndSyncInstalledExtensions()`: CPM pre-sync при включённом failsafe → load installed → общий embedded sync.
|
||||
- `Manager/WebExtensionManager+EmbeddedExtensions.swift`, `syncCPMExtensionBeforeLoad(isEnabled:)`: только `.embedded`; не запускает scriptlets; disabled CPM удаляется до load. `syncEmbeddedExtension`/`installEmbeddedExtension`: install before uninstall, fallback к старой установке; origin переносится только без живого старого context. Runtime/post-load upgrades сохраняют разные origins.
|
||||
- `Loading/CPMExtensionBaseURLPolicy.swift`: `originForUpgrade`, `pendingOriginIdentifiers`, `baseURL(for:webExtension:)`. При объединении с main сохранены OS 26.6+ gate, rotation на disabled/unsupported context load и отказ от inherited origin при публичных ресурсах. Persisted key — `cpmStableOriginIdentifier`.
|
||||
- `Manager/WebExtensionManager.swift`, `isCPMUpgradeBeforeLoadEnabled`: значение фиксируется при создании manager. Обе платформенные factory передают `.cpmUpgradeBeforeLoad`; конфигурации в `iOS/LocalPackages/FeatureFlags-iOS/Sources/FeatureFlags/FeatureFlag.swift` и `macOS/LocalPackages/FeatureFlags-macOS/Sources/FeatureFlags/FeatureFlag.swift`: code default ON, remote failsafe `webExtensions.cpmUpgradeBeforeLoad`. [Registry task](https://app.asana.com/1/137249556945/project/1211834678943996/task/1220009029295774). OFF применяется к следующему manager.
|
||||
- `fireEmbeddedSyncError` в embedded-manager extension: существующий error pixel; CPM pre-load domain получает `.before_load`, остальной sync — исходную ошибку. `EmbeddedSyncError: DDGError`: missingBundle=1, typeMismatch=2. Нового pixel/stage parameter/success tracking нет. WebKit error normalization остаётся в `WKWebExtension+CopyingErrors.swift`; в helper достаточно `error as NSError`.
|
||||
- `Tests/WebExtensionsTests/WebExtensionManagerTests.swift`, `testCPMSyncErrorMarksOnlyBeforeLoadAndPreservesCause`: один telemetry regression method, domain/code/userInfo/underlying cause и missing-bundle DDGError. После iOS CI crash тест создаёт собственный ZIP через существующий helper, без `Bundle.module`. Проверен на iOS 27 Simulator также без resource bundle.
|
||||
- Review-only harness — `/Users/admin/DuckDuckGo/apple-browsers.git/cpm-upgrade-before-load-harness`, `Tests/WebExtensionsTests/CPMRepro/CPMReproUpgradeTests.swift`. Это отдельный исторический checkout, не текущий head PR. Финальный опубликованный `fafcb1ffda` был отдельно проверен с копией harness: 11 PASS, после проверки временная копия удалена. Для воспроизведения с новой production revision fixture переносится в изолированный checkout, без включения в PR.
|
||||
- Артефакты before/after: `/Users/admin/DuckDuckGo/apple-browsers.git/cpm-upgrade-before-load-results-2026-10-29/` (`summary.json`, `cpm-only-summary.json`, `CPM_ONLY_REVIEW.md`). Более поздние логи: `/private/tmp/cpm-7767-main-merge-tests.log`, `cpm-7767-full-review-head-harness.log`, `cpm-7767-ci-fixture-macos.log`, `cpm-7767-ci-fixture-ios-no-bundle.xcresult`.
|
||||
|
||||
Поведение, сравнение времени и границы доказательств: [[cpm-status-2026-10-15#Текущее состояние — 30 октября 2026, 16:48 Бишкек]]. Runtime iOS-проверка здесь относится к telemetry test, а не к полному startup/upgrade приложения. Следующее обновление ниже относится к release error-page/stable-origin PRs, не к #7767.
|
||||
|
||||
## Актуализация 30 октября 2026
|
||||
|
||||
Release PR merged: [iOS #7753](https://github.com/duckduckgo/apple-browsers/pull/7753), head `fef5f9cdd35977b0cb848ac81f4feaca3e6a9ba6`, worktree `cpm-error-page-filter-ios`; [macOS #7752](https://github.com/duckduckgo/apple-browsers/pull/7752), head `551cb2edd00c02e038b2b46a07a8c32d0b33e666`, worktree `cpm-error-page-filter`.
|
||||
|
||||
Reference in new issue
Block a user