From ffd4cc828bbafd6f0f1faa5db25c8af20910f580 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Fri, 16 Oct 2026 22:24:11 +0600 Subject: [PATCH] [2026-10-16] eagle: work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md work/projects/cpm-status-2026-10-15.md work/projects/cpm-web-extension-code-guide-2026-10-09.md --- ...diness-telemetry-tech-design-2026-10-15.md | 48 ++++++++++++++++++ work/projects/cpm-status-2026-10-15.md | 50 ++++++++++++++++++- ...cpm-web-extension-code-guide-2026-10-09.md | 50 ++++++++++++++++++- 3 files changed, 146 insertions(+), 2 deletions(-) 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 baa86cb2..c7978d50 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 @@ -1,3 +1,5 @@ +> **Актуально — 16 октября 2026, PR review fixes.** В [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) проверены оба inline замечания: cancellation уже покрыта, повторные 5 секунд на каждую navigation исправлены общим deadline на startup. Production **`08866c7eda`**, 3 commits / 21 paths; review-only harness **`3f4d755511`**, 12 test-only paths, вне main. Проверки: red-before-fix **2 FAIL**, после исправления **182 unit PASS**, signed macOS build и iOS shared-module build PASS, strict lint **8 / 0**; на одних app/XCTest binaries **ON 8 PASS → OFF 6 ожидаемых functional FAIL → ON 8 PASS**, без skips. Оба review threads resolved; Danger 0 failures, только PR-size advisory; flag tracking links добавлены, defaults не менялись. Пользовательские правки и reviewer steps сохранены. Подробности этого review — в конце. Более ранние heads/results ниже сохранены как история. + > **Актуально — 16 октября 2026, reviewer ON → OFF → ON.** В [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) восстановлена проверка выключенных production flags. Review-only branch **`codex/cpm-fix-init-loss-integration-tests` / `543e37164b`** содержит два schemes: **CPM Integration Tests** → 8 PASS; **CPM Integration Tests - Fixes Disabled** → ровно 6 functional FAIL; затем normal scheme → снова 8 PASS. Проверено на одних подписанных app/XCTest binaries, без пересборки и изменения Swift code. Production PR **`da126120a9`**, 2 commits / 21 files, не менялся; harness остаётся вне main (2 test-only commits / 12 paths). Пользовательские правки PR сохранены. Подробные результаты и artifacts — в конце; прежние односхемные steps и harness head `6e4e39e67c` относятся к истории. > **Актуально — 16 октября 2026, harness вынесен из PR.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): **`alex/cpm-fix-init-loss` / `da126120a9`**, база #7376, **2 коммита / 21 файл**, production fixes + 18 новых shared unit regressions. Все local-only app tests, Xcode entries и DEBUG app hooks — только в **[`codex/cpm-fix-init-loss-integration-tests`](https://github.com/duckduckgo/apple-browsers/tree/codex/cpm-fix-init-loss-integration-tests) / `6e4e39e67c`**, один дочерний commit от PR head; **эта ветка не идёт в main**. Проверено: production app build PASS, unit **179 PASS**, harness app **8/8 PASS**, strict lint **19+8 / 0**. Reviewer steps в PR обновлены и пользовательские правки сохранены. Ниже сохранена датированная история; прежние 3 commits / 32 files и app harness в PR больше не актуальны. @@ -328,3 +330,49 @@ Baseline normal scheme на `6e4e39e67c` ранее дал **8/8 PASS**. Пос У OFF все шесть failure records сопоставлены точным test names и ожидаемым функциональным причинам; никаких deallocation/setup failures или подмены через `XCTExpectFailure`. Возврат ON восстанавливает PASS для прежних P1/P2/install/upgrade, обоих late cases, edit veto и pixel adapter. SHA256 app debug dylib и XCTest binary неизменны до/после обоих runs, Swift sources не менялись относительно baseline harness. Remote config и production defaults не редактировались. Artifacts: **`/private/tmp/cpm-flag-controls-20261016/validation-summary.json`**, `off.xcresult`, `on.xcresult`, summaries, exported JSON evidence, `binary-hashes-before.json`, `pr-after.json`, source/branch verification. Это новая runtime-проверка переключения flags, без нового production build/unit run. Reviewer теперь выбирает два готовых schemes: не редактирует ENV вручную, не выбирает шесть methods и не переключает commits. Production PR и прежние P3/P5/natural-production/iOS ограничения сохраняются. + + +## 16 октября 2026 — исправления замечаний review #7379 + +Production head: **`08866c7eda9b1395f7c0baf9887c827bd3f59ec5`**, branch **`alex/cpm-fix-init-loss`**, PR [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379), база **#7376 / `alex/cpm-messaging-readiness-telemetry` / `713d67419a`**. Три commits / 21 changed paths. Новый commit **Share CPM startup deadline across navigations** изменяет 8 существующих Swift files; app fixture/hooks в production diff не возвращены. Production и review-only branch обновлены обычным push без переписывания истории. + +### Что проверено и исправлено + +- [Замечание о неотменяемом `Task.value`](https://github.com/duckduckgo/apple-browsers/pull/7379#discussion_r4296231857): исходное замечание уже было закрыто реализацией cancellable AsyncStream bridge и regression `testBackgroundWakeWaitIsBoundedWhenWebKitIgnoresCancellation`. Проверено повторно на текущем коде: timeout освобождает navigation, даже когда реальный startup task не реагирует на cancellation; физический WebKit startup не отменяется. +- [Повторные пять секунд на каждом navigation](https://github.com/duckduckgo/apple-browsers/pull/7379#discussion_r4296231864): замечание оказалось актуальным по поведению, несмотря на устаревшее имя файла в тексте. Раньше каждый waiter имел отдельный deadline. Теперь manager возвращает стабильный `Task` текущего startup, а coordinator хранит один bounded wait для его identity. Оба уже подготовленных waiter и последующие navigation после timeout используют завершившийся wait и не платят ещё по 5 секунд. +- Новый startup/replacement получает собственный deadline. `cancelAll()` отменяет только navigation wait и очищает его cache. Startup completion очищается при matching uninstall/unload/reload/error-6 retry или замене context; поздний callback старого task не может очистить текущий startup. Timeout сам по себе не отменяет background: поздний успешный callback по-прежнему может запустить отдельный late-document recovery. +- В Mac `PrivacyDashboardTabExtension` и iOS `TabViewController` вызов provider ограничен main-frame HTTP(S), поскольку получение task теперь сразу запускает подготовку background. Iframes и другие URL schemes не начинают этот startup через navigation gate. +- Добавлены три CI unit regressions: `testTimedOutBackgroundStartupDoesNotDelayLaterNavigations` (включая waiter, подготовленный до истечения deadline), `testNewBackgroundStartupCanWaitAfterEarlierStartupTimesOut`, `testCancelAllReleasesPendingBackgroundNavigation`. Test double сохраняет identity pending startup; зависший callback моделируется неотменяемым task, затем continuation явно освобождается при cleanup. + +### Feature flag tracking и review status + +Default/config flags не менялись: `stateRestorationGate` и `cpmMessagingHangRecovery` сохраняют прежние default; отдельный `cpmLateBackgroundDocumentRecovery` остаётся **false**. Remote configuration не редактировалась. Для нового flag добавлены реальные per-platform задачи в **Apple Feature Flags Registry** и ссылки непосредственно над enum case: +- [macOS tracking task](https://app.asana.com/1/137249556945/project/1211834678943996/task/1219588497257482). +- [iOS tracking task](https://app.asana.com/1/137249556945/project/1211834678943996/task/1219588320073672). + +Оба review threads проверены и resolved; открытых inline threads после readback — 0. Danger на `08866c7eda`: **0 failures / 1 warning**, только advisory о размере PR (1090 added lines); предупреждение об отсутствующих flag tracking links исчезло. Отдельная Privacy Review task уже существовала, дубликат не создавался. + +### Проверки и отдельная test branch + +- До исправления две новые проверки дали **2/2 functional FAIL**, после успешной компиляции: повторный navigation wait и освобождение через `cancelAll`. +- После исправления пять выбранных shared suites: **182 PASS / 0 failures** (13 diagnostics + 9 readiness recovery + 78 monitor + 34 lifecycle + 48 manager). Относительно базы PR теперь 21 новый shared unit method. +- Strict SwiftLint: **8 changed Swift files / 0 violations**. +- Production **macOS Browser Debug**, обычная **Apple Development signing**, build PASS. Подпись app debug dylib проверена. **Shared WebExtensions module для iOS Simulator build PASS**; это не full iOS app build и не runtime validation iOS suspension/resume. +- Review-only **`codex/cpm-fix-init-loss-integration-tests` / `3f4d7555113d547797b45ff6b2c7b883efedd520`** синхронизирована merge нового production head; отдельный doc-only commit актуализировал README (7 новых coordinator regressions, 21 shared regression суммарно). Над production — два прежних harness commits + sync merge + README correction; diff всё ещё ровно **12 test-only paths**, 8 app methods и два shared schemes. Эта ветка не идёт в main. +- Description #7379 изменена только в двух местах для shared deadline и риска зависшего callback. Пользовательские правки и понятные Xcode steps **ON → OFF → ON**, названия schemes и ожидаемые 8 PASS / 6 FAIL / 8 PASS сохранены. Коммитить или редактировать Swift для reviewer run не нужно. + + +Финальный runtime cycle на одном наборе подписанных app/XCTest binaries: +| Scheme / запуск | Passed | Failed | Skipped | Результат | +|---|---:|---:|---:|---| +| CPM Integration Tests — ON | 8 | 0 | 0 | PASS | +| CPM Integration Tests - Fixes Disabled — OFF | 0 | 6 | 0 | Все шесть functional failures совпали с ожидаемыми симптомами | +| CPM Integration Tests — ON повторно, без сборки | 8 | 0 | 0 | PASS | + +OFF действительно отключает production flag для соответствующего сценария: install/upgrade/slow-wake потеряли первый ответ, P2 не дождался same-document recovery после фактического error 6, late install/upgrade не дождались automatic first-document recovery. `expectedFailures` в XCTest — 0: OFF остаётся явным красным контрольным запуском, а не ignored CI failure. Fixture setup/host crash/skips не засчитаны как воспроизведение. SHA256 app dylib и XCTest executable совпали до OFF, после OFF и после повторного ON. Бинарники собраны на sync head `d0922bb277`; финальный test-branch commit `3f4d755511` меняет только README. + +CI snapshot `08866c7eda` на 16:19 UTC: 31 SUCCESS, 12 SKIPPED, 3 QUEUED, 5 IN_PROGRESS; failures отсутствуют. SwiftLint, macOS/iOS pixel validation и Danger — SUCCESS. Полный CI ещё не объявлен зелёным: оставшиеся unit/UI/release jobs были pending/running. + +Артефакты этого прогона: **`/private/tmp/cpm-pr7379-review-fixes-20261016/`**. `red-tests.log` — red-before-fix; `unit-final.log`, `lint-final.log`, `production-build-final.log`, `ios-module.log` — final validation. Отдельные `app-on*`, `app-off*`, `app-on-restored*` содержат xcresult summaries и exported evidence. SHA256 app/XCTest сохранены до OFF и после каждого последующего run; review/PR/Danger/CI snapshots и `validation-summary.json` находятся там же. + +Это не новая декларация воспроизведения всех production причин. Ограничения прежнего исследования P3/P5 и iOS runtime сохраняются. Точные два новых navigation/cancellation failures сначала воспроизведены deterministic shared tests; восемь app methods проверяют реальные WebKit/app пути существующих install/upgrade, P1/P2 и late recovery сценариев. В ON evidence P2 снова записан фактический **`WKWebExtensionContextErrorDomain:6`**; late install/upgrade завершили первый navigation примерно за **5.18 / 5.10 секунды**, затем получили отдельный recovery reload, без увеличения navigation timeout. diff --git a/work/projects/cpm-status-2026-10-15.md b/work/projects/cpm-status-2026-10-15.md index af4929c3..5d25e344 100755 --- a/work/projects/cpm-status-2026-10-15.md +++ b/work/projects/cpm-status-2026-10-15.md @@ -6,6 +6,8 @@ tags: - cpm - status --- +> **Актуально — 16 октября 2026, PR review fixes.** В [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) проверены оба inline замечания: cancellation уже покрыта, повторные 5 секунд на каждую navigation исправлены общим deadline на startup. Production **`08866c7eda`**, 3 commits / 21 paths; review-only harness **`3f4d755511`**, 12 test-only paths, вне main. Проверки: red-before-fix **2 FAIL**, после исправления **182 unit PASS**, signed macOS build и iOS shared-module build PASS, strict lint **8 / 0**; на одних app/XCTest binaries **ON 8 PASS → OFF 6 ожидаемых functional FAIL → ON 8 PASS**, без skips. Оба review threads resolved; Danger 0 failures, только PR-size advisory; flag tracking links добавлены, defaults не менялись. Пользовательские правки и reviewer steps сохранены. Подробности этого review — в конце. Более ранние heads/results ниже сохранены как история. + > **Актуально — 16 октября 2026, reviewer ON → OFF → ON.** В [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) восстановлена проверка выключенных production flags. Review-only branch **`codex/cpm-fix-init-loss-integration-tests` / `543e37164b`** содержит два schemes: **CPM Integration Tests** → 8 PASS; **CPM Integration Tests - Fixes Disabled** → ровно 6 functional FAIL; затем normal scheme → снова 8 PASS. Проверено на одних подписанных app/XCTest binaries, без пересборки и изменения Swift code. Production PR **`da126120a9`**, 2 commits / 21 files, не менялся; harness остаётся вне main (2 test-only commits / 12 paths). Пользовательские правки PR сохранены. Подробные результаты и artifacts — в конце; прежние односхемные steps и harness head `6e4e39e67c` относятся к истории. > **Актуально — 16 октября 2026, harness вынесен из PR.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): **`alex/cpm-fix-init-loss` / `da126120a9`**, база #7376, **2 коммита / 21 файл**, production fixes + 18 новых shared unit regressions. Все local-only app tests, Xcode entries и DEBUG app hooks — только в **[`codex/cpm-fix-init-loss-integration-tests`](https://github.com/duckduckgo/apple-browsers/tree/codex/cpm-fix-init-loss-integration-tests) / `6e4e39e67c`**, один дочерний commit от PR head; **эта ветка не идёт в main**. Проверено: production app build PASS, unit **179 PASS**, harness app **8/8 PASS**, strict lint **19+8 / 0**. Reviewer steps в PR обновлены и пользовательские правки сохранены. Ниже сохранена датированная история; прежние 3 commits / 32 files и app harness в PR больше не актуальны. @@ -58,7 +60,7 @@ tags: |---|---|---|---|---| | [#7378](https://github.com/duckduckgo/apple-browsers/pull/7378) | `alex/cpm-repro-harness` | main | harness (только тесты); 4 быстрых теста в CI около 3 с, остальное локально через `CPM_REPRO=1` | OPEN, head `dfb96279196d`; 37 success / 18 skipped, без failure/pending; REVIEW_REQUIRED. Предыдущее Danger-предупреждение о 1570 строках сохранено как историческое; в ветке есть коммит другой сессии «Require initResp in the page…» | | [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) | `alex/cpm-fix-init-loss` | harness | фикс A: ожидание первой загрузки background после установки/апгрейда посреди сессии | OPEN, head `7ad771e227bb`; 35 success / 20 skipped, без failure/pending; прежние красный и зелёный прогоны сохраняются | -| [#7379 — актуально 16 Oct](https://github.com/duckduckgo/apple-browsers/pull/7379) | `alex/cpm-fix-init-loss`, worktree `alex/cpm-fix-p1-p2` | **#7376 / telemetry** | production install/upgrade + P1/P2 + late GET recovery, 5 fix pixels, 21 новых shared unit regressions; один navigation deadline на startup; весь app harness вне PR | OPEN, head `08866c7eda`; **3 commits / 21 files**; shared unit **182 PASS**, signed app build PASS; review-only `codex/cpm-fix-init-loss-integration-tests` / `d0922bb277`, 2 test-only commits + sync merge, 12 paths; ON/OFF schemes и reviewer ON → OFF → ON steps | +| [#7379 — актуально 16 Oct](https://github.com/duckduckgo/apple-browsers/pull/7379) | `alex/cpm-fix-init-loss`, worktree `alex/cpm-fix-p1-p2` | **#7376 / telemetry** | production install/upgrade + P1/P2 + late GET recovery, 5 fix pixels, 21 новых shared unit regressions; один navigation deadline на startup; весь app harness вне PR | OPEN, head `08866c7eda`; **3 commits / 21 files**; shared unit **182 PASS**, signed app build PASS; review-only `codex/cpm-fix-init-loss-integration-tests` / `3f4d755511`, 2 harness commits + sync merge + README correction, 12 paths; ON/OFF schemes и reviewer ON → OFF → ON steps | | [#7381](https://github.com/duckduckgo/apple-browsers/pull/7381) | `alex/cpm-fix-network-crash` | фикс A | фикс B: перезапуск background при замене Network-процесса и мёртвом worker'е | OPEN, remote head `39f94e12eaa4`; 28 success / 24 skipped / 6 failure, включая **Test (Non-Sandbox)** и итоговые отчёты. Прежний красный repro `testNetworkProcessCrashKeepsEveryTabWorking` с 3 ретраями подтверждён. Исправление `f1085846e7ff` — единственный локальный commit поверх remote head; в PR его нет, зелёного CI для него нет | | (нет PR) | `alex/cpm-fix-pixels` | фикс B + PR0 | пиксели `background_restart` и `first_load_wait` для измерения эффекта | держим до слияния PR0, A, B | @@ -1134,3 +1136,49 @@ Baseline normal scheme на `6e4e39e67c` ранее дал **8/8 PASS**. Пос У OFF все шесть failure records сопоставлены точным test names и ожидаемым функциональным причинам; никаких deallocation/setup failures или подмены через `XCTExpectFailure`. Возврат ON восстанавливает PASS для прежних P1/P2/install/upgrade, обоих late cases, edit veto и pixel adapter. SHA256 app debug dylib и XCTest binary неизменны до/после обоих runs, Swift sources не менялись относительно baseline harness. Remote config и production defaults не редактировались. Artifacts: **`/private/tmp/cpm-flag-controls-20261016/validation-summary.json`**, `off.xcresult`, `on.xcresult`, summaries, exported JSON evidence, `binary-hashes-before.json`, `pr-after.json`, source/branch verification. Это новая runtime-проверка переключения flags, без нового production build/unit run. Reviewer теперь выбирает два готовых schemes: не редактирует ENV вручную, не выбирает шесть methods и не переключает commits. Production PR и прежние P3/P5/natural-production/iOS ограничения сохраняются. + + +## 16 октября 2026 — исправления замечаний review #7379 + +Production head: **`08866c7eda9b1395f7c0baf9887c827bd3f59ec5`**, branch **`alex/cpm-fix-init-loss`**, PR [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379), база **#7376 / `alex/cpm-messaging-readiness-telemetry` / `713d67419a`**. Три commits / 21 changed paths. Новый commit **Share CPM startup deadline across navigations** изменяет 8 существующих Swift files; app fixture/hooks в production diff не возвращены. Production и review-only branch обновлены обычным push без переписывания истории. + +### Что проверено и исправлено + +- [Замечание о неотменяемом `Task.value`](https://github.com/duckduckgo/apple-browsers/pull/7379#discussion_r4296231857): исходное замечание уже было закрыто реализацией cancellable AsyncStream bridge и regression `testBackgroundWakeWaitIsBoundedWhenWebKitIgnoresCancellation`. Проверено повторно на текущем коде: timeout освобождает navigation, даже когда реальный startup task не реагирует на cancellation; физический WebKit startup не отменяется. +- [Повторные пять секунд на каждом navigation](https://github.com/duckduckgo/apple-browsers/pull/7379#discussion_r4296231864): замечание оказалось актуальным по поведению, несмотря на устаревшее имя файла в тексте. Раньше каждый waiter имел отдельный deadline. Теперь manager возвращает стабильный `Task` текущего startup, а coordinator хранит один bounded wait для его identity. Оба уже подготовленных waiter и последующие navigation после timeout используют завершившийся wait и не платят ещё по 5 секунд. +- Новый startup/replacement получает собственный deadline. `cancelAll()` отменяет только navigation wait и очищает его cache. Startup completion очищается при matching uninstall/unload/reload/error-6 retry или замене context; поздний callback старого task не может очистить текущий startup. Timeout сам по себе не отменяет background: поздний успешный callback по-прежнему может запустить отдельный late-document recovery. +- В Mac `PrivacyDashboardTabExtension` и iOS `TabViewController` вызов provider ограничен main-frame HTTP(S), поскольку получение task теперь сразу запускает подготовку background. Iframes и другие URL schemes не начинают этот startup через navigation gate. +- Добавлены три CI unit regressions: `testTimedOutBackgroundStartupDoesNotDelayLaterNavigations` (включая waiter, подготовленный до истечения deadline), `testNewBackgroundStartupCanWaitAfterEarlierStartupTimesOut`, `testCancelAllReleasesPendingBackgroundNavigation`. Test double сохраняет identity pending startup; зависший callback моделируется неотменяемым task, затем continuation явно освобождается при cleanup. + +### Feature flag tracking и review status + +Default/config flags не менялись: `stateRestorationGate` и `cpmMessagingHangRecovery` сохраняют прежние default; отдельный `cpmLateBackgroundDocumentRecovery` остаётся **false**. Remote configuration не редактировалась. Для нового flag добавлены реальные per-platform задачи в **Apple Feature Flags Registry** и ссылки непосредственно над enum case: +- [macOS tracking task](https://app.asana.com/1/137249556945/project/1211834678943996/task/1219588497257482). +- [iOS tracking task](https://app.asana.com/1/137249556945/project/1211834678943996/task/1219588320073672). + +Оба review threads проверены и resolved; открытых inline threads после readback — 0. Danger на `08866c7eda`: **0 failures / 1 warning**, только advisory о размере PR (1090 added lines); предупреждение об отсутствующих flag tracking links исчезло. Отдельная Privacy Review task уже существовала, дубликат не создавался. + +### Проверки и отдельная test branch + +- До исправления две новые проверки дали **2/2 functional FAIL**, после успешной компиляции: повторный navigation wait и освобождение через `cancelAll`. +- После исправления пять выбранных shared suites: **182 PASS / 0 failures** (13 diagnostics + 9 readiness recovery + 78 monitor + 34 lifecycle + 48 manager). Относительно базы PR теперь 21 новый shared unit method. +- Strict SwiftLint: **8 changed Swift files / 0 violations**. +- Production **macOS Browser Debug**, обычная **Apple Development signing**, build PASS. Подпись app debug dylib проверена. **Shared WebExtensions module для iOS Simulator build PASS**; это не full iOS app build и не runtime validation iOS suspension/resume. +- Review-only **`codex/cpm-fix-init-loss-integration-tests` / `3f4d7555113d547797b45ff6b2c7b883efedd520`** синхронизирована merge нового production head; отдельный doc-only commit актуализировал README (7 новых coordinator regressions, 21 shared regression суммарно). Над production — два прежних harness commits + sync merge + README correction; diff всё ещё ровно **12 test-only paths**, 8 app methods и два shared schemes. Эта ветка не идёт в main. +- Description #7379 изменена только в двух местах для shared deadline и риска зависшего callback. Пользовательские правки и понятные Xcode steps **ON → OFF → ON**, названия schemes и ожидаемые 8 PASS / 6 FAIL / 8 PASS сохранены. Коммитить или редактировать Swift для reviewer run не нужно. + + +Финальный runtime cycle на одном наборе подписанных app/XCTest binaries: +| Scheme / запуск | Passed | Failed | Skipped | Результат | +|---|---:|---:|---:|---| +| CPM Integration Tests — ON | 8 | 0 | 0 | PASS | +| CPM Integration Tests - Fixes Disabled — OFF | 0 | 6 | 0 | Все шесть functional failures совпали с ожидаемыми симптомами | +| CPM Integration Tests — ON повторно, без сборки | 8 | 0 | 0 | PASS | + +OFF действительно отключает production flag для соответствующего сценария: install/upgrade/slow-wake потеряли первый ответ, P2 не дождался same-document recovery после фактического error 6, late install/upgrade не дождались automatic first-document recovery. `expectedFailures` в XCTest — 0: OFF остаётся явным красным контрольным запуском, а не ignored CI failure. Fixture setup/host crash/skips не засчитаны как воспроизведение. SHA256 app dylib и XCTest executable совпали до OFF, после OFF и после повторного ON. Бинарники собраны на sync head `d0922bb277`; финальный test-branch commit `3f4d755511` меняет только README. + +CI snapshot `08866c7eda` на 16:19 UTC: 31 SUCCESS, 12 SKIPPED, 3 QUEUED, 5 IN_PROGRESS; failures отсутствуют. SwiftLint, macOS/iOS pixel validation и Danger — SUCCESS. Полный CI ещё не объявлен зелёным: оставшиеся unit/UI/release jobs были pending/running. + +Артефакты этого прогона: **`/private/tmp/cpm-pr7379-review-fixes-20261016/`**. `red-tests.log` — red-before-fix; `unit-final.log`, `lint-final.log`, `production-build-final.log`, `ios-module.log` — final validation. Отдельные `app-on*`, `app-off*`, `app-on-restored*` содержат xcresult summaries и exported evidence. SHA256 app/XCTest сохранены до OFF и после каждого последующего run; review/PR/Danger/CI snapshots и `validation-summary.json` находятся там же. + +Это не новая декларация воспроизведения всех production причин. Ограничения прежнего исследования P3/P5 и iOS runtime сохраняются. Точные два новых navigation/cancellation failures сначала воспроизведены deterministic shared tests; восемь app methods проверяют реальные WebKit/app пути существующих install/upgrade, P1/P2 и late recovery сценариев. В ON evidence P2 снова записан фактический **`WKWebExtensionContextErrorDomain:6`**; late install/upgrade завершили первый navigation примерно за **5.18 / 5.10 секунды**, затем получили отдельный recovery reload, без увеличения navigation timeout. 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 1197e877..830d9cdc 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 @@ -6,6 +6,8 @@ tags: - cpm - webkit --- +> **Актуально — 16 октября 2026, PR review fixes.** В [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) проверены оба inline замечания: cancellation уже покрыта, повторные 5 секунд на каждую navigation исправлены общим deadline на startup. Production **`08866c7eda`**, 3 commits / 21 paths; review-only harness **`3f4d755511`**, 12 test-only paths, вне main. Проверки: red-before-fix **2 FAIL**, после исправления **182 unit PASS**, signed macOS build и iOS shared-module build PASS, strict lint **8 / 0**; на одних app/XCTest binaries **ON 8 PASS → OFF 6 ожидаемых functional FAIL → ON 8 PASS**, без skips. Оба review threads resolved; Danger 0 failures, только PR-size advisory; flag tracking links добавлены, defaults не менялись. Пользовательские правки и reviewer steps сохранены. Подробности этого review — в конце. Более ранние heads/results ниже сохранены как история. + > **Актуально — 16 октября 2026, reviewer ON → OFF → ON.** В [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) восстановлена проверка выключенных production flags. Review-only branch **`codex/cpm-fix-init-loss-integration-tests` / `543e37164b`** содержит два schemes: **CPM Integration Tests** → 8 PASS; **CPM Integration Tests - Fixes Disabled** → ровно 6 functional FAIL; затем normal scheme → снова 8 PASS. Проверено на одних подписанных app/XCTest binaries, без пересборки и изменения Swift code. Production PR **`da126120a9`**, 2 commits / 21 files, не менялся; harness остаётся вне main (2 test-only commits / 12 paths). Пользовательские правки PR сохранены. Подробные результаты и artifacts — в конце; прежние односхемные steps и harness head `6e4e39e67c` относятся к истории. > **Актуально — 16 октября 2026, harness вынесен из PR.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): **`alex/cpm-fix-init-loss` / `da126120a9`**, база #7376, **2 коммита / 21 файл**, production fixes + 18 новых shared unit regressions. Все local-only app tests, Xcode entries и DEBUG app hooks — только в **[`codex/cpm-fix-init-loss-integration-tests`](https://github.com/duckduckgo/apple-browsers/tree/codex/cpm-fix-init-loss-integration-tests) / `6e4e39e67c`**, один дочерний commit от PR head; **эта ветка не идёт в main**. Проверено: production app build PASS, unit **179 PASS**, harness app **8/8 PASS**, strict lint **19+8 / 0**. Reviewer steps в PR обновлены и пользовательские правки сохранены. Ниже сохранена датированная история; прежние 3 commits / 32 files и app harness в PR больше не актуальны. @@ -29,7 +31,7 @@ tags: | `cpm-repro-harness` | `alex/cpm-repro-harness`; `dfb96279196d` | PR #7378: базовый harness, быстрые CI-контроли, медленные сценарии и raw WebKit characterization; без новых P5/P6 | | `cpm-fix-init-loss` — историческая строка; worktree удалён 16 Oct | `alex/cpm-fix-init-loss`; `7ad771e227bb` | PR #7379: A, первые init при install/upgrade mid-session; красное/зелёное доказательство отдельно от remaining-failures | | **`alex/cpm-fix-p1-p2` — актуально 16 Oct** | **`alex/cpm-fix-init-loss`; `08866c7eda`** | PR #7379: база #7376 / `713d67419a`; 3 commits / 21 files, production fixes/pixels + 21 новый shared unit method; один navigation deadline на startup; local-only app harness и hooks исключены | -| — (отдельная ветка, без своего worktree) | **`codex/cpm-fix-init-loss-integration-tests`; `d0922bb277`** | Два test-only commits + sync merge нового production head `08866c7eda`: 8 app methods, ON/OFF schemes, PBX + 3 DEBUG app hooks; 12 paths, не идут в main; reviewer steps включают ON → OFF → ON | +| — (отдельная ветка, без своего worktree) | **`codex/cpm-fix-init-loss-integration-tests`; `3f4d755511`** | Два harness commits + sync merge нового production head `08866c7eda` + README correction: 8 app methods, ON/OFF schemes, PBX + 3 DEBUG app hooks; 12 paths, не идут в main; reviewer steps включают ON → OFF → ON | | `cpm-fix-network-crash` | `alex/cpm-fix-network-crash`; local `f1085846e7ff` | B поверх A; 5 network/termination сценариев в FullFailure + 11 watchdog unit tests. Remote PR #7381 остаётся на `39f94e12eaa4`, красный Non-Sandbox; локальный fix не запушен | | `cpm-fix-pixels` | `alex/cpm-fix-pixels`; `d6d800846d1f` | A/B + PR0, измерение `first_load_wait`/`background_restart`; отдельный PR не зарегистрирован в текущем статусе | | `alex/cpm-messaging-readiness-telemetry` | та же; `619869ee84c6` | PR0 #7376: readiness/failure/recovery параметры, CI без failure/pending, review required | @@ -418,3 +420,49 @@ Baseline normal scheme на `6e4e39e67c` ранее дал **8/8 PASS**. Пос У OFF все шесть failure records сопоставлены точным test names и ожидаемым функциональным причинам; никаких deallocation/setup failures или подмены через `XCTExpectFailure`. Возврат ON восстанавливает PASS для прежних P1/P2/install/upgrade, обоих late cases, edit veto и pixel adapter. SHA256 app debug dylib и XCTest binary неизменны до/после обоих runs, Swift sources не менялись относительно baseline harness. Remote config и production defaults не редактировались. Artifacts: **`/private/tmp/cpm-flag-controls-20261016/validation-summary.json`**, `off.xcresult`, `on.xcresult`, summaries, exported JSON evidence, `binary-hashes-before.json`, `pr-after.json`, source/branch verification. Это новая runtime-проверка переключения flags, без нового production build/unit run. Reviewer теперь выбирает два готовых schemes: не редактирует ENV вручную, не выбирает шесть methods и не переключает commits. Production PR и прежние P3/P5/natural-production/iOS ограничения сохраняются. + + +## 16 октября 2026 — исправления замечаний review #7379 + +Production head: **`08866c7eda9b1395f7c0baf9887c827bd3f59ec5`**, branch **`alex/cpm-fix-init-loss`**, PR [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379), база **#7376 / `alex/cpm-messaging-readiness-telemetry` / `713d67419a`**. Три commits / 21 changed paths. Новый commit **Share CPM startup deadline across navigations** изменяет 8 существующих Swift files; app fixture/hooks в production diff не возвращены. Production и review-only branch обновлены обычным push без переписывания истории. + +### Что проверено и исправлено + +- [Замечание о неотменяемом `Task.value`](https://github.com/duckduckgo/apple-browsers/pull/7379#discussion_r4296231857): исходное замечание уже было закрыто реализацией cancellable AsyncStream bridge и regression `testBackgroundWakeWaitIsBoundedWhenWebKitIgnoresCancellation`. Проверено повторно на текущем коде: timeout освобождает navigation, даже когда реальный startup task не реагирует на cancellation; физический WebKit startup не отменяется. +- [Повторные пять секунд на каждом navigation](https://github.com/duckduckgo/apple-browsers/pull/7379#discussion_r4296231864): замечание оказалось актуальным по поведению, несмотря на устаревшее имя файла в тексте. Раньше каждый waiter имел отдельный deadline. Теперь manager возвращает стабильный `Task` текущего startup, а coordinator хранит один bounded wait для его identity. Оба уже подготовленных waiter и последующие navigation после timeout используют завершившийся wait и не платят ещё по 5 секунд. +- Новый startup/replacement получает собственный deadline. `cancelAll()` отменяет только navigation wait и очищает его cache. Startup completion очищается при matching uninstall/unload/reload/error-6 retry или замене context; поздний callback старого task не может очистить текущий startup. Timeout сам по себе не отменяет background: поздний успешный callback по-прежнему может запустить отдельный late-document recovery. +- В Mac `PrivacyDashboardTabExtension` и iOS `TabViewController` вызов provider ограничен main-frame HTTP(S), поскольку получение task теперь сразу запускает подготовку background. Iframes и другие URL schemes не начинают этот startup через navigation gate. +- Добавлены три CI unit regressions: `testTimedOutBackgroundStartupDoesNotDelayLaterNavigations` (включая waiter, подготовленный до истечения deadline), `testNewBackgroundStartupCanWaitAfterEarlierStartupTimesOut`, `testCancelAllReleasesPendingBackgroundNavigation`. Test double сохраняет identity pending startup; зависший callback моделируется неотменяемым task, затем continuation явно освобождается при cleanup. + +### Feature flag tracking и review status + +Default/config flags не менялись: `stateRestorationGate` и `cpmMessagingHangRecovery` сохраняют прежние default; отдельный `cpmLateBackgroundDocumentRecovery` остаётся **false**. Remote configuration не редактировалась. Для нового flag добавлены реальные per-platform задачи в **Apple Feature Flags Registry** и ссылки непосредственно над enum case: +- [macOS tracking task](https://app.asana.com/1/137249556945/project/1211834678943996/task/1219588497257482). +- [iOS tracking task](https://app.asana.com/1/137249556945/project/1211834678943996/task/1219588320073672). + +Оба review threads проверены и resolved; открытых inline threads после readback — 0. Danger на `08866c7eda`: **0 failures / 1 warning**, только advisory о размере PR (1090 added lines); предупреждение об отсутствующих flag tracking links исчезло. Отдельная Privacy Review task уже существовала, дубликат не создавался. + +### Проверки и отдельная test branch + +- До исправления две новые проверки дали **2/2 functional FAIL**, после успешной компиляции: повторный navigation wait и освобождение через `cancelAll`. +- После исправления пять выбранных shared suites: **182 PASS / 0 failures** (13 diagnostics + 9 readiness recovery + 78 monitor + 34 lifecycle + 48 manager). Относительно базы PR теперь 21 новый shared unit method. +- Strict SwiftLint: **8 changed Swift files / 0 violations**. +- Production **macOS Browser Debug**, обычная **Apple Development signing**, build PASS. Подпись app debug dylib проверена. **Shared WebExtensions module для iOS Simulator build PASS**; это не full iOS app build и не runtime validation iOS suspension/resume. +- Review-only **`codex/cpm-fix-init-loss-integration-tests` / `3f4d7555113d547797b45ff6b2c7b883efedd520`** синхронизирована merge нового production head; отдельный doc-only commit актуализировал README (7 новых coordinator regressions, 21 shared regression суммарно). Над production — два прежних harness commits + sync merge + README correction; diff всё ещё ровно **12 test-only paths**, 8 app methods и два shared schemes. Эта ветка не идёт в main. +- Description #7379 изменена только в двух местах для shared deadline и риска зависшего callback. Пользовательские правки и понятные Xcode steps **ON → OFF → ON**, названия schemes и ожидаемые 8 PASS / 6 FAIL / 8 PASS сохранены. Коммитить или редактировать Swift для reviewer run не нужно. + + +Финальный runtime cycle на одном наборе подписанных app/XCTest binaries: +| Scheme / запуск | Passed | Failed | Skipped | Результат | +|---|---:|---:|---:|---| +| CPM Integration Tests — ON | 8 | 0 | 0 | PASS | +| CPM Integration Tests - Fixes Disabled — OFF | 0 | 6 | 0 | Все шесть functional failures совпали с ожидаемыми симптомами | +| CPM Integration Tests — ON повторно, без сборки | 8 | 0 | 0 | PASS | + +OFF действительно отключает production flag для соответствующего сценария: install/upgrade/slow-wake потеряли первый ответ, P2 не дождался same-document recovery после фактического error 6, late install/upgrade не дождались automatic first-document recovery. `expectedFailures` в XCTest — 0: OFF остаётся явным красным контрольным запуском, а не ignored CI failure. Fixture setup/host crash/skips не засчитаны как воспроизведение. SHA256 app dylib и XCTest executable совпали до OFF, после OFF и после повторного ON. Бинарники собраны на sync head `d0922bb277`; финальный test-branch commit `3f4d755511` меняет только README. + +CI snapshot `08866c7eda` на 16:19 UTC: 31 SUCCESS, 12 SKIPPED, 3 QUEUED, 5 IN_PROGRESS; failures отсутствуют. SwiftLint, macOS/iOS pixel validation и Danger — SUCCESS. Полный CI ещё не объявлен зелёным: оставшиеся unit/UI/release jobs были pending/running. + +Артефакты этого прогона: **`/private/tmp/cpm-pr7379-review-fixes-20261016/`**. `red-tests.log` — red-before-fix; `unit-final.log`, `lint-final.log`, `production-build-final.log`, `ios-module.log` — final validation. Отдельные `app-on*`, `app-off*`, `app-on-restored*` содержат xcresult summaries и exported evidence. SHA256 app/XCTest сохранены до OFF и после каждого последующего run; review/PR/Danger/CI snapshots и `validation-summary.json` находятся там же. + +Это не новая декларация воспроизведения всех production причин. Ограничения прежнего исследования P3/P5 и iOS runtime сохраняются. Точные два новых navigation/cancellation failures сначала воспроизведены deterministic shared tests; восемь app methods проверяют реальные WebKit/app пути существующих install/upgrade, P1/P2 и late recovery сценариев. В ON evidence P2 снова записан фактический **`WKWebExtensionContextErrorDomain:6`**; late install/upgrade завершили первый navigation примерно за **5.18 / 5.10 секунды**, затем получили отдельный recovery reload, без увеличения navigation timeout.