diff --git a/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md b/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md index f807036c..3a2a6224 100755 --- a/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md +++ b/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md @@ -3,7 +3,7 @@ updated: '2026-10-20' --- # TD: Pixel Definition: CPM Readiness Telemetry (macOS/iOS) -> **#7379 — дополнение 20 октября 2026:** production `9effd97877`, review fixes `f08aefe1b8`, все 6 threads resolved; **267 selected unit PASS**, 43 новых shared regression methods. Предложенный focus/iframe guard применён и проверен настоящим WKWebView; late reload default OFF, P4 detection независим. Старый BSK crash run повторён успешно; CI нового head завершён: **43 SUCCESS / 17 SKIPPED**, без failures/pending, merge state CLEAN. Harness `0b1d6771fe` наследует этот production head, signed build-for-testing PASS, 14 fixture-only paths. Подробности и ограничения — в последнем разделе «#7379: review fixes и CI». Эта сверка не переоценивает остальные CPM PR. +> **#7379 — независимый P2 flag, 20 октября 2026:** production `55a42802a6`, harness `a6e6835a5f`; новый `webExtensions.cpmBackgroundLoadRecovery` **default ON на iOS/macOS** отделяет same-context error-6 retry от `cpmMessagingHangRecovery` (full-context restart). **271 selected unit PASS**, 47 новых shared regression methods; четыре новых independence regressions дают 4 FAIL с прежними связанными проверками и PASS с новым flag. Signed macOS harness build PASS, iOS local build и CI нового head ещё выполняются/в очереди. Late GET reload по-прежнему default OFF; P4 detection независим. Подробности — в последнем разделе про independent P2 flag. ## Current implementation — verified 20 October 2026 @@ -612,3 +612,22 @@ Checkpoint `8a27a69776` включил эти harness fixes. Первая лок `webExtensions.cpmLateBackgroundDocumentRecovery` по-прежнему **default disabled на iOS и macOS**; P4 detection работает независимо и не требует reload или safety-script evaluation. Этот проход не включает rollout flag и не доказывает готовность включать late reload для всех документов. Все промежуточные результаты сохранены в **`/private/tmp/cpm-pr7379-comments-ci-20261020/`**: CI .xcresult/.ips и raw log, replies/resolution JSON, normal/red-control test logs, lint/validators, merge logs и harness build logs. При подготовке WK fixture `loadHTMLString` сначала дал 9 assertions из-за отсутствия history item; заменён реальной navigation. Промежуточный synthetic `WKNavigation()` в reload spy вызвал локальный SIGTRAP (`CFRetain(NULL)` в WKNavigation dealloc); fixture теперь вызывает `super.reload()` и ждёт реальный finish. Первая harness build попытка использовала stale absolute artifact paths; повторная подготовлена со свежим locked package cache. + + +## #7379: independent P2 background-load recovery flag — 20 октября 2026 + +По запросу пользователя P2 same-context retry отделён от полной перезагрузки extension context. Production **`55a42802a6bf1210a51642c3ae59504078ad82d3`** опубликован в [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379). Review-only harness **`a6e6835a5f9eac783f6c64ec9467deb9302535b2`** содержит этот head и по-прежнему не предназначен для main. + +- Новый remote subfeature — **`webExtensions.cpmBackgroundLoadRecovery`**, `Config(defaultValue: .enabled)` на **обеих платформах**, macOS category `.webExtensions`, local override разрешён стандартным default. Общий `WebExtensionsSubfeature` и обе production factories подключены к отдельному `isCPMBackgroundLoadRecoveryEnabled` closure. +- Новый flag проверяется при решении о retry и повторно перед deferred execution. Он управляет только retry фонового контента после error 6 в том же context; прежние rate limit, foreground checks и защита от конкурентного restart сохранены. +- `webExtensions.cpmMessagingHangRecovery` управляет full-context restart после подтверждённого messaging hang. Retry работает при restart OFF; restart работает при retry OFF. +- `stateRestorationGate`, late GET recovery default OFF и независимый P4 detection не менялись. Этот проход не исправляет известный повторный error 6 на P2 retry в macOS 27 и не объявляет полный app ON/OFF/ON зелёным. +- Remote override добавляется в **`duckduckgo/privacy-configuration`** под subfeature `cpmBackgroundLoadRecovery` родителя `webExtensions`. Пока subfeature отсутствует в remote config, применяется новый enabled default; если remote config явно задаёт состояние, он имеет приоритет. Generated embedded config здесь не редактировался; remote rollout не выполнялся. Для traceability использована существующая [задача самого P1/P2 fix](https://app.asana.com/0/0/1219531810004072). + +**Регрессии:** обновлён existing runtime kill-switch test; добавлены 4 метода: actual background retry при hang recovery OFF, confirmed-hang restart при retry OFF, veto queued retry после runtime disable, и error-6 notification при retry OFF / restart ON. **271 selected CPM/lifecycle/manager PASS / 0 FAIL**; в production PR теперь **47** новых shared test methods относительно базы. Изолированный контроль с прежними `isCPMMessagingHangRecoveryEnabled()` в обоих retry guards дал **4 failed methods / 10 assertions**; исходники production для контроля не менялись. + +**Платформы и CI:** strict production SwiftLint **7 files / 0 violations**, fixture lint **2 / 0**; signed macOS app + integration test build **PASS**, Apple Development / Team `HKE973VLUW`. Local iOS app build ещё выполняется. CI нового `55a42802a6` ещё выполняется/в очереди, без failures при последней проверке; прежние **43 SUCCESS / 17 SKIPPED** относятся к `9effd97877`, а не к новому flag head. + +**Harness:** P2 метод переключает `.cpmBackgroundLoadRecovery`; `.cpmMessagingHangRecovery` остаётся false, так что P2 positive теперь отдельно проверяет retry без full restart. Negative scheme отключает новый P2 flag через прежний `CPM_APP_INTEGRATION_DISABLE_P1_P2_FIXES`; остальные controls и девять app methods сохранены. README (включая mapping P2 flag и 47 production regressions) обновлён; PR description дополнен одной строкой, существующие reviewer steps сохранены. Новый полный app ON/OFF/ON не запускался. + +Артефакты: **`/private/tmp/cpm-pr7379-independent-retry-flag-20261020/`** — normal/red-control test logs, lint, signed harness build/signature, iOS build и CI watch, PR description before/after. Существовавшие до работы локальные Package.resolved изменения не включены в commits; production dependency diff SHA256 по-прежнему `66123735bfe51a00cb1775b5526cf6b9c0310aee79d23fc0e4e47b1b62cbdcdb`. diff --git a/work/projects/cpm-status-2026-10-15.md b/work/projects/cpm-status-2026-10-15.md index f87b8c40..39e73b64 100755 --- a/work/projects/cpm-status-2026-10-15.md +++ b/work/projects/cpm-status-2026-10-15.md @@ -11,7 +11,7 @@ updated: '2026-10-20' > **P5 #7473 — merged 20 октября 2026, 14:17:11 Бишкек (08:17:11 UTC):** [merge `9bcce0264e`](https://github.com/duckduckgo/apple-browsers/commit/9bcce0264e60ef79b98c1b8aeb23ef9f26c45bc0) в `release/macos/1.213.0`, финальный PR head `574e9288ae`. Фикс shared-pinned window close включён по умолчанию и имеет remote failsafe. Подробности реализации, review и проверок — [[cpm-status-2026-10-15#P5 — merged 20 октября 2026]]. Merge в release branch подтверждён; публикация сборки, rollout и production effect этим не установлены. Эта сверка касается #7473. -> **#7379 — дополнение 20 октября 2026:** production `9effd97877`, review fixes `f08aefe1b8`, все 6 threads resolved; **267 selected unit PASS**, 43 новых shared regression methods. Предложенный focus/iframe guard применён и проверен настоящим WKWebView; late reload default OFF, P4 detection независим. Старый BSK crash run повторён успешно; CI нового head завершён: **43 SUCCESS / 17 SKIPPED**, без failures/pending, merge state CLEAN. Harness `0b1d6771fe` наследует этот production head, signed build-for-testing PASS, 14 fixture-only paths. Подробности и ограничения — в последнем разделе «#7379: review fixes и CI». Эта сверка не переоценивает остальные CPM PR. +> **#7379 — независимый P2 flag, 20 октября 2026:** production `55a42802a6`, harness `a6e6835a5f`; новый `webExtensions.cpmBackgroundLoadRecovery` **default ON на iOS/macOS** отделяет same-context error-6 retry от `cpmMessagingHangRecovery` (full-context restart). **271 selected unit PASS**, 47 новых shared regression methods; четыре новых independence regressions дают 4 FAIL с прежними связанными проверками и PASS с новым flag. Signed macOS harness build PASS, iOS local build и CI нового head ещё выполняются/в очереди. Late GET reload по-прежнему default OFF; P4 detection независим. Подробности — в последнем разделе про independent P2 flag. **Сверено 20 октября 2026, 11:40–11:45 Бишкек (05:40–05:45 UTC): опубликованные heads, состояния PR, exact-head CI и исходники.** Актуальны §1–9; короткие прежние обновления перенесены в §9а, подробные журналы ниже сохраняют результаты своих дат и ревизий. @@ -24,7 +24,7 @@ updated: '2026-10-20' ## 1. Коротко - **Телеметрия #7376 реализована и опубликована, но PR закрыт без мержа.** Один `web_extension_cpm_episode`, daily+count, вместо 11 отдельных failure/stuck/recovery/reload-failed пикселей. `stuck` различает подтверждённость повторного сбоя и одну/несколько наблюдавшихся failing tabs; `bg_events` для stuck содержит начальный снимок и продолжение до первого подтверждения. Все параметры, частота и удаления — в [[cpm-pr0-episode-telemetry-summary-2026-10-16]]. -- **#7379**: head `9effd97877` содержит install/upgrade readiness, P1 wake, P2 retry и независимый P4 detection; late-document reload default OFF. Шесть review threads исправлены и resolved; предложенный focus/iframe guard и пять real-WKWebView тестов добавлены. 267 selected unit PASS / 43 новых shared regression methods. Старый BSK crash workflow повторён успешно; CI текущего head завершён: **43 SUCCESS / 17 SKIPPED, без failures/pending**. +- **#7379**: head `55a42802a6` содержит install/upgrade readiness, P1 wake, P2 retry и P4 detection. Новый `webExtensions.cpmBackgroundLoadRecovery` **default ON на iOS/macOS**, независим от full-context restart flag; late GET recovery default OFF. 271 selected unit PASS / 47 новых shared regression methods, 6 review threads resolved. CI нового head ещё выполняется/в очереди; прежний head `9effd97877` завершился 43 SUCCESS / 17 SKIPPED. - **Network recovery #7459** опубликован с отдельным `web_extension_cpm_network_process_recovery_applied` daily+count без custom parameters. Это измерение выполненного restart, не доказательство восстановления и не замена network-атрибуции каждого failure report. - **P3 #7493** реализует стабильный приватный origin, CI зелёный; полный production no-background failure не воспроизведён. **P5 #7473 merged** 20 октября в `release/macos/1.213.0` (`9bcce0264e`), CI зелёный на финальном head `574e9288ae`; это один доказанный механизм, не вся P5-когорта. Публикация/rollout ещё не подтверждены. - **Полная диагностика Others и отсечение всех ложных срабатываний ещё не обеспечены.** Нет page ACK/последнего подтверждённого этапа, конечного исхода изначально pending load и `network_replaced_since_view` в episode report (§6). `reason=other` — контекст навигации, не историческая причинная группа Others. @@ -37,7 +37,7 @@ updated: '2026-10-20' - [#7376](https://github.com/duckduckgo/apple-browsers/pull/7376), `alex/cpm-messaging-readiness-telemetry`, head **`5d1cb4abd2`** → `release/ios/7.243.0`: **CLOSED, не merged**, review APPROVED, CI зелёный (65 check-run entries). Локальный worktree: `alex/cpm-telemetry-pr0`. Полный пакет на этом исходнике: **777 tests / 0 failures**, strict lint 6 файлов / 0 violations, pixel definitions обеих платформ PASS. Тесты выполнялись в изолированной копии с актуальным dependency resolution; пользовательский `Package.resolved` в worktree сохранён. - [#7484](https://github.com/duckduckgo/apple-browsers/pull/7484), `alex/cpm-messaging-readiness-telemetry-macos-release`, **`3fb13b81fe`** → `release/macos/1.213.0`: OPEN, CI зелёный (68 entries), **merge conflict / dirty**. Это копия более раннего #7376: ещё `was_stuck`, нет four-state `stuck` и двухфазного `bg_events`. Называть PR идентичными сейчас нельзя. -- [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379), `alex/cpm-fix-init-loss`, **`9effd97877`** → `alex/cpm-messaging-readiness-telemetry / da8e714b33`: OPEN, **CI GREEN: 43 SUCCESS / 17 SKIPPED, 0 failures/pending; merge state CLEAN**. BSK, iOS/macOS app builds/tests, shared packages, UI/PIR, validators и lint завершены. Сверены 6 resolved review threads, 267 selected unit PASS, 43 новых shared regression methods и validators. Исходный crash `674bb809f2` / run `39272483366` подробно сохранён в последнем разделе; attempt 2 SUCCESS не устанавливает его root cause. Production worktree `alex/cpm-fix-init-loss-production`; review-only harness `codex/cpm-fix-init-loss-integration-tests / 0b1d6771fe`, 14 paths, signed build-for-testing PASS. Новый app ON/OFF/ON не проводился; прежние результаты относятся к указанным heads. +- [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379), `alex/cpm-fix-init-loss`, **`55a42802a6`** → `alex/cpm-messaging-readiness-telemetry / da8e714b33`: OPEN, **CI IN_PROGRESS/QUEUED, failures пока нет**. Добавлен independent default-enabled P2 retry flag; 271 selected unit PASS / 47 новых shared regressions. Signed macOS harness build PASS; local iOS build выполняется. Harness `codex/cpm-fix-init-loss-integration-tests / a6e6835a5f` содержит production head. Старый `9effd97877` CI 43 SUCCESS / 17 SKIPPED сохранён как история; новый полный app ON/OFF/ON не проводился. - [#7459](https://github.com/duckduckgo/apple-browsers/pull/7459), `alex/cpm-network-process-recovery`, **`f41c7b7047`** → `alex/cpm-messaging-readiness-telemetry`: OPEN, CI зелёный (59 entries). Network recovery default ON на обеих платформах, remote kill switch сохранён; добавлен applied pixel. Review-only harness — `codex/cpm-network-process-integration-tests`. - [#7493](https://github.com/duckduckgo/apple-browsers/pull/7493), `alex/cpm-p3-stable-base-url`, **`dd96018da9`** → `alex/cpm-messaging-readiness-telemetry`: OPEN, CI зелёный (60 entries). P3 stable-origin policy, default ON с remote kill switch; harness `codex/cpm-p3-integration-tests`. PR содержит результаты 784 package tests и signed ON 10/10 → OFF ровно 3 origin-continuity failures → ON 30/30 executions. Это проверка origin/migration и CPM controls на macOS, не воспроизведение полного P3 failure и не iOS runtime test. - [#7473](https://github.com/duckduckgo/apple-browsers/pull/7473), `alex/cpm-p5-pinned-window-close`, финальный head **`574e9288ae`** → **`release/macos/1.213.0`**: **MERGED 20 октября 2026, 08:17:11 UTC / 14:17:11 Бишкек**, [merge `9bcce0264e`](https://github.com/duckduckgo/apple-browsers/commit/9bcce0264e60ef79b98c1b8aeb23ef9f26c45bc0). На финальном PR head: **47 SUCCESS / 23 SKIPPED**, без failures/pending по сверке после merge; skipped entries не считаются выполненными тестами. Default-ON failsafe `webExtensionSharedPinnedTabWindowClose`. В merge только 5 production/unit-test paths; real-window fixture и его configuration hook остались локально. Подробности — [[cpm-status-2026-10-15#P5 — merged 20 октября 2026]]. @@ -245,7 +245,7 @@ Parser должен разделять по **`,` и `;`**, игнорирова 1. #7376 закрыт без merge; зависимые #7379/#7459/#7493 по-прежнему основаны на его ветке. Это незавершённая публикация, а не shipped telemetry. 2. macOS #7484 нужно синхронизировать с текущим episode contract и устранить release-base conflict; сейчас его payload отличается. В этом документационном проходе код и PR не менялись. -3. Прежний красный BSK gate #7379 успешно повторён; на новом `9effd97877` CI **43 SUCCESS / 17 SKIPPED, без failures/pending; CLEAN**. Точная причина исходного crash не установлена; stack и результаты сохранены в последнем разделе. +3. На предыдущем head `9effd97877` все CI завершились зелёными; новый flag head `55a42802a6` пока IN_PROGRESS/QUEUED без failures. Точная причина исходного ConfigurationFetcher crash не установлена; последнее изменение отделяет P2 retry flag и не исправляет его повторный WebKit error 6. 4. Для `bg_events` остаётся риск вытеснения всего initial snapshot; резервирование бюджета двух фаз не реализовано. Аналитические consumers должны поддержать `;` и `...`. 5. Нужны целевые измерения §6: end-to-end stages/page ACK, final pending-load outcome, network replacement относительно view; текущий applied pixel закрывает только учёт применения B. Healthy baseline и targeted startup/no-view measurements не реализованы. 6. Для нового `stuck` и двухфазного `bg_events` требуется актуальный privacy contract и оценка комбинированной различимости; прежние расчёты не переносить на новый payload. @@ -1505,3 +1505,22 @@ Checkpoint `8a27a69776` включил эти harness fixes. Первая лок `webExtensions.cpmLateBackgroundDocumentRecovery` по-прежнему **default disabled на iOS и macOS**; P4 detection работает независимо и не требует reload или safety-script evaluation. Этот проход не включает rollout flag и не доказывает готовность включать late reload для всех документов. Все промежуточные результаты сохранены в **`/private/tmp/cpm-pr7379-comments-ci-20261020/`**: CI .xcresult/.ips и raw log, replies/resolution JSON, normal/red-control test logs, lint/validators, merge logs и harness build logs. При подготовке WK fixture `loadHTMLString` сначала дал 9 assertions из-за отсутствия history item; заменён реальной navigation. Промежуточный synthetic `WKNavigation()` в reload spy вызвал локальный SIGTRAP (`CFRetain(NULL)` в WKNavigation dealloc); fixture теперь вызывает `super.reload()` и ждёт реальный finish. Первая harness build попытка использовала stale absolute artifact paths; повторная подготовлена со свежим locked package cache. + + +## #7379: independent P2 background-load recovery flag — 20 октября 2026 + +По запросу пользователя P2 same-context retry отделён от полной перезагрузки extension context. Production **`55a42802a6bf1210a51642c3ae59504078ad82d3`** опубликован в [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379). Review-only harness **`a6e6835a5f9eac783f6c64ec9467deb9302535b2`** содержит этот head и по-прежнему не предназначен для main. + +- Новый remote subfeature — **`webExtensions.cpmBackgroundLoadRecovery`**, `Config(defaultValue: .enabled)` на **обеих платформах**, macOS category `.webExtensions`, local override разрешён стандартным default. Общий `WebExtensionsSubfeature` и обе production factories подключены к отдельному `isCPMBackgroundLoadRecoveryEnabled` closure. +- Новый flag проверяется при решении о retry и повторно перед deferred execution. Он управляет только retry фонового контента после error 6 в том же context; прежние rate limit, foreground checks и защита от конкурентного restart сохранены. +- `webExtensions.cpmMessagingHangRecovery` управляет full-context restart после подтверждённого messaging hang. Retry работает при restart OFF; restart работает при retry OFF. +- `stateRestorationGate`, late GET recovery default OFF и независимый P4 detection не менялись. Этот проход не исправляет известный повторный error 6 на P2 retry в macOS 27 и не объявляет полный app ON/OFF/ON зелёным. +- Remote override добавляется в **`duckduckgo/privacy-configuration`** под subfeature `cpmBackgroundLoadRecovery` родителя `webExtensions`. Пока subfeature отсутствует в remote config, применяется новый enabled default; если remote config явно задаёт состояние, он имеет приоритет. Generated embedded config здесь не редактировался; remote rollout не выполнялся. Для traceability использована существующая [задача самого P1/P2 fix](https://app.asana.com/0/0/1219531810004072). + +**Регрессии:** обновлён existing runtime kill-switch test; добавлены 4 метода: actual background retry при hang recovery OFF, confirmed-hang restart при retry OFF, veto queued retry после runtime disable, и error-6 notification при retry OFF / restart ON. **271 selected CPM/lifecycle/manager PASS / 0 FAIL**; в production PR теперь **47** новых shared test methods относительно базы. Изолированный контроль с прежними `isCPMMessagingHangRecoveryEnabled()` в обоих retry guards дал **4 failed methods / 10 assertions**; исходники production для контроля не менялись. + +**Платформы и CI:** strict production SwiftLint **7 files / 0 violations**, fixture lint **2 / 0**; signed macOS app + integration test build **PASS**, Apple Development / Team `HKE973VLUW`. Local iOS app build ещё выполняется. CI нового `55a42802a6` ещё выполняется/в очереди, без failures при последней проверке; прежние **43 SUCCESS / 17 SKIPPED** относятся к `9effd97877`, а не к новому flag head. + +**Harness:** P2 метод переключает `.cpmBackgroundLoadRecovery`; `.cpmMessagingHangRecovery` остаётся false, так что P2 positive теперь отдельно проверяет retry без full restart. Negative scheme отключает новый P2 flag через прежний `CPM_APP_INTEGRATION_DISABLE_P1_P2_FIXES`; остальные controls и девять app methods сохранены. README (включая mapping P2 flag и 47 production regressions) обновлён; PR description дополнен одной строкой, существующие reviewer steps сохранены. Новый полный app ON/OFF/ON не запускался. + +Артефакты: **`/private/tmp/cpm-pr7379-independent-retry-flag-20261020/`** — normal/red-control test logs, lint, signed harness build/signature, iOS build и CI watch, PR description before/after. Существовавшие до работы локальные Package.resolved изменения не включены в commits; production dependency diff SHA256 по-прежнему `66123735bfe51a00cb1775b5526cf6b9c0310aee79d23fc0e4e47b1b62cbdcdb`. diff --git a/work/projects/cpm-web-extension-code-guide-2026-10-09.md b/work/projects/cpm-web-extension-code-guide-2026-10-09.md index e11fdcaf..99a069ea 100755 --- a/work/projects/cpm-web-extension-code-guide-2026-10-09.md +++ b/work/projects/cpm-web-extension-code-guide-2026-10-09.md @@ -9,7 +9,7 @@ updated: '2026-10-20' --- # CPM Web Extension — карта кода по worktree и строкам -> **#7379 — дополнение 20 октября 2026:** production `9effd97877`, review fixes `f08aefe1b8`, все 6 threads resolved; **267 selected unit PASS**, 43 новых shared regression methods. Предложенный focus/iframe guard применён и проверен настоящим WKWebView; late reload default OFF, P4 detection независим. Старый BSK crash run повторён успешно; CI нового head завершён: **43 SUCCESS / 17 SKIPPED**, без failures/pending, merge state CLEAN. Harness `0b1d6771fe` наследует этот production head, signed build-for-testing PASS, 14 fixture-only paths. Подробности и ограничения — в последнем разделе «#7379: review fixes и CI». Эта сверка не переоценивает остальные CPM PR. +> **#7379 — независимый P2 flag, 20 октября 2026:** production `55a42802a6`, harness `a6e6835a5f`; новый `webExtensions.cpmBackgroundLoadRecovery` **default ON на iOS/macOS** отделяет same-context error-6 retry от `cpmMessagingHangRecovery` (full-context restart). **271 selected unit PASS**, 47 новых shared regression methods; четыре новых independence regressions дают 4 FAIL с прежними связанными проверками и PASS с новым flag. Signed macOS harness build PASS, iOS local build и CI нового head ещё выполняются/в очереди. Late GET reload по-прежнему default OFF; P4 detection независим. Подробности — в последнем разделе про independent P2 flag. **Проверено 20 октября 2026:** карта ниже отражает существующие worktree и опубликованные heads; старые line numbers и результаты в архивных разделах относятся к своим ревизиям. PR/CI — [[cpm-status-2026-10-15#2. PR и quality gates]]. Пользовательский dirty `Package.resolved` в telemetry worktree сохранён. @@ -710,3 +710,22 @@ Checkpoint `8a27a69776` включил эти harness fixes. Первая лок `webExtensions.cpmLateBackgroundDocumentRecovery` по-прежнему **default disabled на iOS и macOS**; P4 detection работает независимо и не требует reload или safety-script evaluation. Этот проход не включает rollout flag и не доказывает готовность включать late reload для всех документов. Все промежуточные результаты сохранены в **`/private/tmp/cpm-pr7379-comments-ci-20261020/`**: CI .xcresult/.ips и raw log, replies/resolution JSON, normal/red-control test logs, lint/validators, merge logs и harness build logs. При подготовке WK fixture `loadHTMLString` сначала дал 9 assertions из-за отсутствия history item; заменён реальной navigation. Промежуточный synthetic `WKNavigation()` в reload spy вызвал локальный SIGTRAP (`CFRetain(NULL)` в WKNavigation dealloc); fixture теперь вызывает `super.reload()` и ждёт реальный finish. Первая harness build попытка использовала stale absolute artifact paths; повторная подготовлена со свежим locked package cache. + + +## #7379: independent P2 background-load recovery flag — 20 октября 2026 + +По запросу пользователя P2 same-context retry отделён от полной перезагрузки extension context. Production **`55a42802a6bf1210a51642c3ae59504078ad82d3`** опубликован в [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379). Review-only harness **`a6e6835a5f9eac783f6c64ec9467deb9302535b2`** содержит этот head и по-прежнему не предназначен для main. + +- Новый remote subfeature — **`webExtensions.cpmBackgroundLoadRecovery`**, `Config(defaultValue: .enabled)` на **обеих платформах**, macOS category `.webExtensions`, local override разрешён стандартным default. Общий `WebExtensionsSubfeature` и обе production factories подключены к отдельному `isCPMBackgroundLoadRecoveryEnabled` closure. +- Новый flag проверяется при решении о retry и повторно перед deferred execution. Он управляет только retry фонового контента после error 6 в том же context; прежние rate limit, foreground checks и защита от конкурентного restart сохранены. +- `webExtensions.cpmMessagingHangRecovery` управляет full-context restart после подтверждённого messaging hang. Retry работает при restart OFF; restart работает при retry OFF. +- `stateRestorationGate`, late GET recovery default OFF и независимый P4 detection не менялись. Этот проход не исправляет известный повторный error 6 на P2 retry в macOS 27 и не объявляет полный app ON/OFF/ON зелёным. +- Remote override добавляется в **`duckduckgo/privacy-configuration`** под subfeature `cpmBackgroundLoadRecovery` родителя `webExtensions`. Пока subfeature отсутствует в remote config, применяется новый enabled default; если remote config явно задаёт состояние, он имеет приоритет. Generated embedded config здесь не редактировался; remote rollout не выполнялся. Для traceability использована существующая [задача самого P1/P2 fix](https://app.asana.com/0/0/1219531810004072). + +**Регрессии:** обновлён existing runtime kill-switch test; добавлены 4 метода: actual background retry при hang recovery OFF, confirmed-hang restart при retry OFF, veto queued retry после runtime disable, и error-6 notification при retry OFF / restart ON. **271 selected CPM/lifecycle/manager PASS / 0 FAIL**; в production PR теперь **47** новых shared test methods относительно базы. Изолированный контроль с прежними `isCPMMessagingHangRecoveryEnabled()` в обоих retry guards дал **4 failed methods / 10 assertions**; исходники production для контроля не менялись. + +**Платформы и CI:** strict production SwiftLint **7 files / 0 violations**, fixture lint **2 / 0**; signed macOS app + integration test build **PASS**, Apple Development / Team `HKE973VLUW`. Local iOS app build ещё выполняется. CI нового `55a42802a6` ещё выполняется/в очереди, без failures при последней проверке; прежние **43 SUCCESS / 17 SKIPPED** относятся к `9effd97877`, а не к новому flag head. + +**Harness:** P2 метод переключает `.cpmBackgroundLoadRecovery`; `.cpmMessagingHangRecovery` остаётся false, так что P2 positive теперь отдельно проверяет retry без full restart. Negative scheme отключает новый P2 flag через прежний `CPM_APP_INTEGRATION_DISABLE_P1_P2_FIXES`; остальные controls и девять app methods сохранены. README (включая mapping P2 flag и 47 production regressions) обновлён; PR description дополнен одной строкой, существующие reviewer steps сохранены. Новый полный app ON/OFF/ON не запускался. + +Артефакты: **`/private/tmp/cpm-pr7379-independent-retry-flag-20261020/`** — normal/red-control test logs, lint, signed harness build/signature, iOS build и CI watch, PR description before/after. Существовавшие до работы локальные Package.resolved изменения не включены в commits; production dependency diff SHA256 по-прежнему `66123735bfe51a00cb1775b5526cf6b9c0310aee79d23fc0e4e47b1b62cbdcdb`.