[2026-10-20] eagle: work/projects/cpm-status-2026-10-15.md
This commit is contained in:
1 parent
df63bced64
commit
5b8f6bc510
1 file changed
+122
-54
@@ -6,30 +6,13 @@ tags:
|
||||
- cpm
|
||||
- status
|
||||
---
|
||||
> **Актуально — 19 октября 2026, error-6/P4 finding закрыт в опубликованном PR.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) **`8275bcce36`**, база #7376 **`39fe56af4c`**, содержит fix **`fc124938e0`** + 2 штатные регрессии. **201 shared PASS**, strict lint **4 files / 0 violations**. Signed app: **ON 9 PASS → OFF 6 ожидаемых functional FAIL → restored ON 9 PASS**, 0 SKIP, те же бинарники; первый restored attempt **7 PASS / 2 FAIL** (teardown timeout / SIGINT) сохранён, повтор выполнен без изменений и отключения проверок. CI завершён: **43 SUCCESS / 17 SKIPPED**, failures/pending нет. Harness **`6d04496882`** содержит production head и ровно **12 review-only paths**; 38 новых shared regressions относительно базы. Проверенный shipping scope: P1/P2 и независимый P4 detection; late reload остаётся default **OFF**, формы не менялись. Прежние открытые findings ниже — история до fix.
|
||||
# CPM Web Extension: единый статус
|
||||
|
||||
> **История ревью — 19 октября 2026, до исправления error-6/P4 в `fc124938e0`.** Проверен опубликованный после rebase **`a00dc4afeb`** / база #7376 **`c7adf28e12`**, 7 commits / 22 paths. Остаётся **1 P2: error-6 startup может ошибочно попасть в P4 detection после позднего callback успешного retry**. На текущем head: **196 существующих shared tests PASS + 2 дополнительных probes PASS / 1 новый probe FAIL**. Проверочная однострочная правка только в изолированной копии даёт **199 PASS**; в PR она не внесена. Pixel validators обеих платформ PASS. CI завершён: **53 SUCCESS / 25 SKIPPED**, failures и pending нет; повторный probe подтвердил тот же незакрытый дефект. Предыдущие 197 unit и app 9→6→9 относятся к `fc87237a47`; новая база убрала один retired-telemetry тест. Подробности и границы воспроизведения — в разделе «Полное ревью после P4 detection — error-6 attribution». История ниже сохранена.
|
||||
**Сверено 20 октября 2026, 11:40–11:45 Бишкек (05:40–05:45 UTC): опубликованные heads, состояния PR, exact-head CI и исходники.** Актуальны §1–9; короткие прежние обновления перенесены в §9а, подробные журналы ниже сохраняют результаты своих дат и ревизий.
|
||||
|
||||
> **Актуально — 19 октября 2026, P4 detection без reload опубликована и проверена.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`fc87237a47`**, 7 commits / 22 paths; review-only harness **`475095b335`**, 12 paths вне main. Новый dailyAndCount `web_extension_cpm_startup_response_missing` считает P4 candidates независимо от late recovery flag, без reload и safety JavaScript. **197 unit PASS**, signed macOS и iOS app builds PASS, pixel validators PASS, strict lint 6 production + 2 harness / 0. На одних подписанных app/XCTest binaries: **ON 9 PASS → OFF 6 ожидаемых functional FAIL → ON 9 PASS**, без skips/expected failures, SHA256 совпали. Новый detection-only case дважды подтвердил detection = 1 / finishCount = 1 / late recovery OFF / no late reload outcomes; оба late OFF controls также дали по detection = 1. CI нового head: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. Формы не менялись, late reload flag default disabled. PR steps и все три документа актуализированы; worktree возвращён на чистую production branch. Более ранние heads/results сохранены как история.
|
||||
|
||||
> **Актуально — 19 октября 2026, uninstall fix опубликован.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`e970e8c90e`**, 6 commits / 22 paths; отдельный review-only harness **`e380cf98f7`**, 12 paths вне main. Удаление активного CPM context отменяет pending late-document recovery; удаление старой upgrade-версии и ошибка unload сохраняют recovery. **190 unit PASS**, red-before-fix 2 PASS / 1 FAIL, signed macOS и iOS Simulator builds PASS, strict lint 11 / 0. На новом app head проверено на одних подписанных бинарниках: **ON 8 PASS → OFF 6 ожидаемых functional FAIL → ON 8 PASS**, без skips/expected failures; все app/XCTest SHA256 совпали. CI `e970e8c90e`: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. PR description и reviewer flag steps актуализированы с сохранением ручных правок. Формы оставлены в прежнем виде; late reload flag default disabled. Предыдущие heads/results ниже — история.
|
||||
|
||||
> **Актуально — 19 октября 2026, полный повторный review #7379.** Проверен локальный `5708197362` против #7376: 22 changed paths, **187 существующих тестов PASS + 1 новый probe FAIL**. Новый P2: uninstall активного CPM context не отменяет pending late-document recovery. Общий launch→navigation deadline и привязка recovery pixel к точной WKNavigation исправлены локально и прошли повторные регрессии; усиление защиты форм явно отложено пользователем, исходная проверка сохранена за default-disabled флагом. В GitHub пока `08866c7eda` (CI: 48 SUCCESS / 21 SKIPPED), новые production commits не опубликованы. Локальный review-only harness `4308751d59` синхронизирован; его новый ON/OFF/ON ещё не запускался. Подробности — в конце; прежние heads/results ниже относятся к истории.
|
||||
|
||||
> **Актуально — 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 больше не актуальны.
|
||||
|
||||
> **Актуальный итог — 16 октября 2026, после force push.** [PR #7379](https://github.com/duckduckgo/apple-browsers/pull/7379) теперь поверх **#7376** (`alex/cpm-messaging-readiness-telemetry`), head **`aec5be9a83`**, ровно **3 коммита / 32 файла**. Старый worktree `cpm-fix-init-loss` удалён; текущая директория `alex/cpm-fix-p1-p2` теперь на ветке `alex/cpm-fix-init-loss`. Checkpoint **`367759cbc1`** и backup старой истории сохранены. Проверка через production feature flags **без создания/переключения коммитов**: signed app **8/8 PASS ON**, **6/6 функциональных FAIL OFF**, unit **179 PASS**, strict lint **27 / 0**, pixel validators обеих платформ PASS. Новый late-reload flag **default disabled**. Описание PR/шаги и local-only `to-be-disabled before merge` annotations обновлены; GitHub CI ещё не объявляется green. Подробная финальная сверка — в конце документа. **Ниже сохранена датированная история: прежние «не закоммичено», старые head/base и over-budget limitation не являются текущим статусом.**
|
||||
|
||||
> **Итог замены #7379 — 16 октября 2026 (Бишкек).** В `alex/cpm-fix-p1-p2` исправлены оба замечания: ожидание конкретного нового context при install/upgrade и background guard независимо от diagnostics flag. Финальный signed app-набор **4/4 PASS**, install/upgrade **10+10 PASS**, targeted unit **170 PASS**, strict lint **16 files / 0 violations**, общий WebExtensions module для iOS Simulator **BUILD SUCCEEDED**. На тех же бинарниках с выключенными flags **4/4 функциональных negative controls FAIL**, без deallocation/infrastructure errors. Коммитов нет, scratch не изменён, ZIP/schema/dependencies не менялись. Сохраняется исходный cap **5 s**: startup fixture 5000 ms с WK overhead даёт callback после cap и может потерять первый ответ; этот режим остаётся воспроизводимым известным пределом. Подробности, история красных прогонов и machine summary — в конце [[cpm-status-2026-10-15]].
|
||||
|
||||
> **Отдельная ветка P1/P2 — финал 16 Oct, 13:33 UTC.** Новый worktree `alex/cpm-fix-p1-p2` от текущего `alex/cpm-messaging-readiness-telemetry` (`01d4a0ec22`): только P1/P2-кандидаты и необходимые тесты. Новых методов **2 app + 4 unit**; **22 — полный старый research app-набор**. На новой signed app-сборке **2/2 PASS**, unit **165 PASS**, strict lint 0; те же два app-теста при выключенных flags дают ожидаемые функциональные FAIL. Текущая база использует episode contract: P2 `failed_measurement_response`, `reload_state=none`, плюс реальная доставка initResp в тот же документ без навигации. История исправленного test teardown сохранена. Коммитов нет; scratch не изменён; подробности и артефакты — в конце документа.
|
||||
**#7376 закрыт без мержа** 20 октября в 03:30 Бишкек (19 октября 21:30 UTC), head `5d1cb4abd2`; CI зелёный и review APPROVED не означают, что изменение попало в релиз. macOS #7484 открыт на старом контракте и конфликтует с базой. Текущий состав episode report — [[cpm-pr0-episode-telemetry-summary-2026-10-16]]. Ни один из этих статусов не доказывает rollout.
|
||||
|
||||
|
||||
# CPM Web Extension: единый статус, обновление 16 октября 2026
|
||||
|
||||
> **Актуальный локальный итог P1/P2 — 16 октября, 12:30 UTC / 18:30 Бишкек.** В `cpm-e2e-init` добавлены точечные production-кандидаты и две app-регрессии: **22/22 текущих app methods PASS**, 0 failed/skipped/expected failures в positive runs; P2 same-document повторён дважды. С выключенными фиксами обе новые регрессии красные по функциональным причинам. Пакет: 806 tests, 14 skipped, 0 failures; strict SwiftLint — 0 нарушений. **P2 в окончательном варианте повторяет только background load и сохраняет context; full-context prototype отвергнут как нестабильный.** Подробный итог и ограничения — раздел «Окончательный итог точечных P1/P2-кандидатов». Это macOS с управляемыми fault conditions, не доказательство natural iOS production cause. Коммитов/PR изменений нет; прежние разделы и красные прогоны сохранены.
|
||||
|
||||
@@ -41,17 +24,32 @@ tags:
|
||||
|
||||
## 1. Коротко
|
||||
|
||||
- **App integration, 16 октября: 20/20 PASS, 0 failed/skipped/expected failures**, на одной signed build в группах **18 + 1 P5 + 1 cache**. Отдельные тесты slow load, one-navigation recovery, persistent one-tab, several-tabs/one-window и all-windows реализованы и прошли. Реальные app/WebKit пути, полный реестр, отрицательный P3, ограничение app P5 и сохранённые красные прогоны — [[#Финальный app-hosted итог — 16 октября 2026]]. Коммитов нет.
|
||||
- Фикс **B** (падение Network-процесса) проверен локально и красным прогоном на CI. **Основание в данных есть, но неполное:** обогащение в stuck есть, а доказать, что строки это именно мёртвый worker, нельзя (не хватает `network_replaced_since_view`).
|
||||
- Фикс **A** (первая загрузка посреди сессии) реален, но мелкий: около 1% stuck на iOS, на macOS почти не виден, чаще самоизлечивается.
|
||||
- Три самые крупные production-группы фиксами A и B **не закрыты**: пробуждение после idle, error 6 (iOS), «нет background view» на запуске (iOS). В новых signed app integration tests macOS теперь проверены рычаги P1 (slow idle wake) и P2 (остановка worker → настоящий WebKit error 6 около 30 s). P3 на 20 000 cacheable ресурсов не воспроизведён. Это локальные macOS-механизмы, а не доказательство причин iOS production-групп (§13).
|
||||
- **P5/tab_in_context=false, macOS:** найден browser→WebKit путь — закрываемое окно по-прежнему возвращает общий pinned tab, а WebKit внутри `didCloseWindow` удаляет его регистрацию. На системном WebKit получены точная цепочка, два failure и actual stuck; прямой `didCloseTab` тест не вызывает. Это продолжает ручное наблюдение 10 сентября из [[cpm-web-extension-breakage-findings]], но теперь подтверждены текущий source contract и автоматический сценарий (§11–12).
|
||||
- **P6, macOS:** подтверждён условный путь через реальный `WebExtensionFeatureFlagHandler`: true → false → true главного `webExtensions` создаёт новый manager/controller, существующий WKWebView остаётся со старым controller. Реальность такого переключения в выбранных production-сессиях не доказана; обычное обновление config или только embedded flag не равны этому условию.
|
||||
- **Проверки P5/P6:** все 14 текущих методов имеют pass по последним соответствующим логам; единый финальный прогон всех 14 не выполнялся. Пакет: 478 XCTest, 28 opt-in skipped, 0 failures; strict SwiftLint восьми изменённых Swift-файлов — 0 нарушений. Зелёный characterization-тест подтверждает ожидаемый сбой/контроль, а не исправление CPM.
|
||||
- **Осталось неизвестным:** естественная утрата runtime listener metadata, P5 при tab_in_context=true, реальный iOS suspend/resume и естественный P6 без доказанного main-flag transition. Ограничение прежних SPM-тестов сохранено: их app callbacks/delegates реализованы harness по исходникам. Новый app-hosted suite (§13) выполняет настоящие AppDelegate/WindowsManager/MainWindowController/Tab и macOS native providers; app P5 ограничен одной потерянной навигацией, persistent P5/stuck доказан отдельно SPM.
|
||||
- Телеметрия PR0 пока в виде, вызвавшем вопросы о склейке пикселей. Решение по правкам не принято (раздел 8). #7384/#7385 имеют красный Danger, #7381 — красный Non-Sandbox; текущие heads и ограничения — раздел 2.
|
||||
- **Телеметрия #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** теперь содержит install/upgrade readiness, P1 wake, P2 retry и независимый P4 detection; default late-document reload OFF. Текущий CI красный в BrowserServicesKit: один crashed XCTest (§2). Исторические зелёные app-прогоны не отменяют этот gate.
|
||||
- **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** исправляет shared-pinned window close, CI зелёный; это один доказанный механизм, не вся P5-когорта.
|
||||
- **Полная диагностика Others и отсечение всех ложных срабатываний ещё не обеспечены.** Нет page ACK/последнего подтверждённого этапа, конечного исхода изначально pending load и `network_replaced_since_view` в episode report (§6). `reason=other` — контекст навигации, не историческая причинная группа Others.
|
||||
- **Production `bg_events` действительно терял начало.** В срезе 14 октября исходный `load` отсутствует у 40.86% iOS и 61.62% macOS stuck.daily; это нижняя оценка, не точная частота всех обрезаний. Новый маркер показывает потерю, но общий бюджет может вытеснить весь initial snapshot (§6).
|
||||
- P1/P2, P5/tab=false и условный P6 подтверждены контролируемыми macOS tests. Это не устанавливает их долю среди реальных iOS failures. Естественные listener-metadata loss, P5/tab=true, iOS suspend/resume и occurrence main-flag transitions остаются открытыми. Все прежние отрицательные проверки и красные прогоны сохранены в журналах.
|
||||
|
||||
## 2. Цепочки PR (все в `duckduckgo/apple-browsers`, задачи Asana в телах PR; не читать)
|
||||
## 2. PR и quality gates
|
||||
|
||||
Сверка 20 октября 2026, 05:40–05:45 UTC. «Зелёный CI» означает success всех четырёх итоговых checks (iOS, macOS, BSK, DBP), Danger success, без failing/pending на указанном head; skipped jobs не считаются выполненными тестами. Задачи Asana из тел PR в этой сверке не читались.
|
||||
|
||||
- [#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`, **`674bb809f2`** → `alex/cpm-messaging-readiness-telemetry`: OPEN, **CI FAIL**. BSK report: 3710 tests, 3696 passed, 13 skipped, 1 failed; annotation — `ConfigurationFetcherTests.testFetchAllWhenAssetsAreModifiedThenAllFetchedConfigurationsAreReturned`, **Crashed: xctest**. Это наблюдаемый failed gate, не установленная причина crash и не доказанная flaky-ошибка. iOS/macOS/DBP aggregates и Danger success. Production worktree `alex/cpm-fix-init-loss-production`; harness отдельно, `codex/cpm-fix-init-loss-integration-tests`. Старые 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`, **`574e9288ae`** → **`release/macos/1.213.0`**: OPEN, CI зелёный (61 entries), mergeable. Default-ON failsafe `webExtensionSharedPinnedTabWindowClose`; PR сообщает девять app integration scenarios. Он таргетит macOS release напрямую.
|
||||
- Старые ветки: [#7378 harness](https://github.com/duckduckgo/apple-browsers/pull/7378) **CLOSED, не merged** (`dfb9627919`); [#7384 baseline](https://github.com/duckduckgo/apple-browsers/pull/7384) **CLOSED, не merged** (`99ecf8b127`). [#7385 init progress](https://github.com/duckduckgo/apple-browsers/pull/7385) OPEN (`46f25175c7`), всё ещё на ветке закрытого #7384; [privacy-extension #3727](https://github.com/duckduckgo/duckduckgo-privacy-extension/pull/3727) OPEN (`b00cc22711`), не merged. Их старые Danger/review результаты не перепроверялись как текущие gates.
|
||||
- Старый [#7381](https://github.com/duckduckgo/apple-browsers/pull/7381) OPEN, `39f94e12ea` → `alex/cpm-fix-init-loss`; его прежнюю Network implementation не путать с актуальным #7459. Native GitHub stack удалён по решению пользователя; обычные base-branch зависимости сохранены.
|
||||
|
||||
Таким образом, #7379/#7459/#7493 всё ещё ссылаются на ветку закрытого #7376. Закрытие PR не удалило эту ветку и не включило её изменения в release. Worktree большого telemetry rewrite `alex/cpm-episode-telemetry` — альтернативный prototype, не состав #7376.
|
||||
|
||||
### Исторический реестр PR — 15–19 октября
|
||||
|
||||
Следующий реестр сохранён для истории heads, красных прогонов и прежних решений; его OPEN/CI/«локально не опубликовано» не являются текущим статусом.
|
||||
|
||||
**Телеметрия:**
|
||||
|
||||
@@ -132,23 +130,50 @@ tags:
|
||||
|
||||
## 6. Телеметрия
|
||||
|
||||
### Диагностическое покрытие Others — проверка 19 октября 2026
|
||||
### Диагностическое покрытие Others — проверка 20 октября 2026
|
||||
|
||||
**Текущих данных недостаточно для полного объяснения Others CPM failures.** Проверены #7376 `39fe56af4c` и дополнения #7379 `8275bcce36`. #7376 помогает отличать состояния загрузки background и связывает первый сбой с наблюдаемым исходом эпизода. #7379 отдельно измеряет выбранные случаи первой загрузки и срабатывания recovery. Причины оставшихся внешне здоровых сбоев эти данные однозначно не разделяют.
|
||||
**#7376 `5d1cb4abd2` улучшает измерение исходов, но не обеспечивает полное объяснение Others.** Он объединяет сведения об одном эпизоде без соединения отдельных failure/recovery events. Сравнивать новые episode counts напрямую со старыми отдельно deduplicated failure/stuck/recovery totals нельзя: нужен новый baseline. `reason=other` означает обычную навигацию вне restoration/crash/reload; это не причинная группа Others из §3–5.
|
||||
|
||||
`reason=other` означает обычную навигацию вне restoration/crash/reload. Это не историческая диагностическая группа Others из §3–5.
|
||||
**Что реально различается.** `stuck=false-one/false-many/true-one/true-many` объединяет persistence и число разных tabs с наблюдавшимися timeouts. Только последующая eligible non-restoration navigation, начатая после первого failure, может дать true; concurrent/restoration failures увеличивают one/many, но сами не подтверждают persistence. Одна вкладка может дать true-one после повторной навигации. false не означает ровно один timeout или false positive. one не доказывает здоровье остальных tabs; many не доказывает смерть всех tabs или всего окна. Активного all-tabs/window probe в PR нет.
|
||||
|
||||
**Три пробела и необходимые измерения — предложения, отсутствующие в проверенных ревизиях:**
|
||||
`outcome=failed_measurement_response` вместе с `reload_state=none` выделяет поздний native ответ на ту же measurement без reload. `failed_tab_response` — ответ более поздней measurement в одной из failing tabs; `other_tab_response` не доказывает восстановление failing tab. `no_response_before_deadline` с false-* означает, что persistence не подтверждён; отсутствие следующей eligible navigation тоже возможно. Срок наблюдения — не доказательство постоянной поломки.
|
||||
|
||||
- **Последний подтверждённый этап обмена и доставка `initResp`.** При готовом background остаются возможными потеря init-запроса, задержка native settings, потеря ответа странице и потеря dashboard-подтверждения при уже полученном страницей ответе. Нужны ограниченный enum последнего подтверждённого этапа и свидетельство получения ответа страницей. В исследовательском harness эти случаи различались через `init_stage`; в текущих PR такого параметра и page ACK нет. Dashboard-ответ не доказывает получение `initResp`.
|
||||
**Ложные срабатывания отфильтровываются только частично.** Страница могла получить `initResp` и работать, а dashboard-подтверждение до native monitor не дошло. Даже true-* не исключает этот случай; он воспроизведён контролируемо. Ни dashboard response, ни успешный background load не являются page ACK.
|
||||
|
||||
- **Конечный результат первоначально pending-загрузки.** Снимок фиксируется при первом timeout: если тогда записано `pending`, а на 30-й секунде приходит error 6, итоговый отчёт сохраняет `pending` и не включает позднюю ошибку, в том числе в `bg_events`. Это закреплено штатным тестом `testWhenContextChangesAfterFailureThenPixelKeepsFailureTimeDiagnostics`. Нужен конечный исход той же попытки загрузки, условно для эпизодов с исходным `pending`, без второго полного снимка или новой цепочки событий.
|
||||
**Три недостающих измерения:**
|
||||
|
||||
- **Замена Network process относительно текущего background view.** `network_restarted` больше не передаётся; `network_replaced_since_view` отсутствует. Поэтому этот механизм нельзя надёжно отделить от остальных внешне здоровых сбоев, а старую классификацию Others нельзя напрямую повторить по новому payload. Нужен локально вычисляемый boolean смены Network process с момента создания текущего view; сами PID отправлять не нужно.
|
||||
- **Последний подтверждённый этап обмена и page ACK.** Чтобы разделить init loss, задержку native settings, потерю ответа странице и потерю dashboard confirmation, нужны изменения extension JS **и** native handler/локальной агрегации. Одной записи в `bg_events` или только extension-side change недостаточно. #7385/#3727 — старые отдельные предложения; в #7376 нет `init_stage`, `cpmInitProgress` или page ACK.
|
||||
- **Конечный исход первоначально pending load.** Четыре load-поля и восемь boolean facts заморожены при первом failure. Поздняя error 6 теперь может попасть в `bg_events` между failure и первым stuck; она не обновляет `bg_ready_after`/`bg_load_error_*`. У non-stuck episodes continuation не отправляется; после первого stuck она больше не собирается в payload. Явного final-load outcome той же попытки и нового ready-completion token нет. Это частичное закрытие прежнего пробела, не его полное устранение.
|
||||
- **`network_replaced_since_view` в episode.** Поля нет; старый `network_restarted` удалён из payload. Отдельный applied pixel #7459 считает выполненные background restarts при наблюдаемой смене PID относительно watched view, но не все crashes, не untreated failures и не успешные CPM recoveries. Unknown/нулевой baseline, недоступный текущий PID, исчезнувший view/context или выключенный flag оставляют ненаблюдаемые случаи. Поэтому он не воспроизводит старую causal cohort classification и не заменяет этот diagnostic gap.
|
||||
|
||||
Дополнения следует собирать локально в рамках эпизода и передавать только для целевых сигнатур как ограниченные enum/boolean в одном terminal report, сохраняя daily+count. Не добавлять идентификаторы, URL, точное время или дополнительную последовательность событий. Различимость сочетаний с сохранённым `bg_events` требует отдельной проверки; отсутствие идентификаторов само по себе её не гарантирует.
|
||||
Healthy load/wake baseline (#7384 закрыт) и targeted startup/no-view `app_state`/`open_tabs` тоже отсутствуют в #7376; `loading_tabs` не добавлен. Graveyard treatment исключён по решению пользователя, mitigation не менялась.
|
||||
|
||||
Текущий контракт: [[cpm-pr0-episode-telemetry-summary-2026-10-16]]. Подтверждение границ: [состав отправляемого payload](https://github.com/duckduckgo/apple-browsers/blob/39fe56af4c35bf034d570f04dd58f59bd41eb2b6/SharedPackages/WebExtensions/Sources/WebExtensions/Pixels/WebExtensionPixelFiring.swift#L115-L146), [тест сохранения первого снимка после поздней error 6](https://github.com/duckduckgo/apple-browsers/blob/39fe56af4c35bf034d570f04dd58f59bd41eb2b6/SharedPackages/WebExtensions/Tests/WebExtensionsTests/CPMMessagingHealthMonitorTests.swift#L1330-L1362). Исследовательские проверки этапов обмена описаны ниже в разделе «Core suite завершён: 10/10, signed, штатный Vault».
|
||||
### bg_events: что отправляется и что теряется
|
||||
|
||||
В #7376 `5d1cb4abd2` initial history на первом failure отделяется `;` от событий после него до **первого** stuck confirmation. Continuation замораживается до вызова его automatic recovery; последующие события в неё не попадают. У non-stuck episodes отправляется только initial history. Начальные ages считаются от первого failure, последующие — от stuck confirmation.
|
||||
|
||||
Обе фазы делят **12 событий / 255 символов** вместе с separators/markers. Standalone `...` в начале фазы означает отброшенные старые события. Текущая политика сначала выбрасывает oldest initial entries, затем oldest continuation entries: **достаточно длинное продолжение может полностью вытеснить initial snapshot**. Отдельной квоты или приоритета «важных» событий нет. Резервирование бюджета для каждой фазы обсуждалось как улучшение, **не реализовано**.
|
||||
|
||||
Общего удаления дубликатов нет: initial snapshot повторно не добавляется в continuation, но новые одинаковые tokens сохраняются, даже если age bucket совпадает. Только одинаковые последовательные load-error notifications в пределах одной секунды подавляются recorder. Циклы view/dealloc/view диагностически значимы.
|
||||
|
||||
Parser должен разделять по **`,` и `;`**, игнорировать пустые entries и standalone `...`. Старый comma-only parser неверно прочитает границу. Отсутствие error/death token в обрезанном таймлайне не доказывает отсутствие события.
|
||||
|
||||
**Обрезание уже было в production — проверен срез 14 октября UTC.** Daily attribution reports, iOS major=7/minor≥240, macOS major=1/minor≥210, `pixel_id=debug` и соответствующие agents:
|
||||
|
||||
- iOS init: 1,103,215 reports с bg_events; 192,070 (17.41%) содержат 12 событий; **166,327 (15.08%) без исходного load**.
|
||||
- iOS stuck: 169,115; 79,217 (46.84%) содержат 12 событий; **69,097 (40.86%) без load**.
|
||||
- macOS init: 41,462; 20,328 (49.03%) содержат 12 событий; **19,561 (47.18%) без load**.
|
||||
- macOS stuck: 13,992; 8,924 (63.78%) содержат 12 событий; **8,622 (61.62%) без load**.
|
||||
|
||||
В shipped tags `7.240.0+ios` / `1.210.0+macos` context load сбрасывает recorder и записывает load, snapshot сохраняет последние 12 и ограничивает строку 255 символами. Поэтому отсутствие load — свидетельство потери начала, **нижняя оценка**, не точная доля всех обрезаний: более ранний extension_updated может исчезнуть при ещё сохранённом load. Число строк ровно 255 символов также не измеряет всю character truncation: удаляются целые entries. Максимальная длина iOS 255, macOS init 252 / stuck 253. Запрос агрегатный, individual reports не выгружались. SQL, filters и агрегаты: `/private/tmp/cpm-bg-events-truncation-20261019/{query.sql,aggregates.json,summary.json}`; ключевые результаты сохранены здесь, так как tmp не постоянное хранилище.
|
||||
|
||||
### Privacy и границы согласованного контракта
|
||||
|
||||
Нет новых URL, tab/document/context IDs, PID или точных timestamps. Идентификаторы measurements и tabs связываются только локально; на сервер уходят allowlisted enums/booleans и bucketed ages. Один terminal report устраняет необходимость склеивать **разные lifecycle events**, но daily+count первого эпизода всё равно отправляет два одинаковых payload. `bg_events` и сочетания полей могут быть редкими: daily deduplication не даёт гарантии некоррелируемости или анонимности.
|
||||
|
||||
Переданный пользователем privacy-triage summary перечислял `was_stuck`; последний wire contract использует **`stuck` из четырёх значений**, а формат `bg_events` теперь двухфазный с `...`. Эти изменения нужно учитывать в review контракта; отдельное подтверждение их privacy approval в этом проходе не получено. Метка/прежний approval не подменяет проверку различимости новой комбинации. Анализ уникальности ниже относится к старому payload и не является оценкой нового.
|
||||
|
||||
Полный contract, частоты, 11 retired pixels и 9 удалённых полей: [[cpm-pr0-episode-telemetry-summary-2026-10-16]]. Источник текущей сериализации: [WebExtensionPixelFiring.swift на 5d1cb4abd2](https://github.com/duckduckgo/apple-browsers/blob/5d1cb4abd2f5e16d23a19f0c43c7017a52e9c9b6/SharedPackages/WebExtensions/Sources/WebExtensions/Pixels/WebExtensionPixelFiring.swift); [bg_events encoder](https://github.com/duckduckgo/apple-browsers/blob/5d1cb4abd2f5e16d23a19f0c43c7017a52e9c9b6/SharedPackages/WebExtensions/Sources/WebExtensions/Autoconsent/CPMMessagingDiagnostics.swift).
|
||||
|
||||
### Историческая оценка до перехода на единый эпизод
|
||||
|
||||
@@ -193,27 +218,29 @@ tags:
|
||||
|
||||
Связность стека: #7384 добавляет ещё 5 измерений на те же 8 failure-пикселей (`context_load_to_background_view`, `cpm_low_power_mode`, `cpm_thermal_state`, `cpm_lockdown_mode`, `cpm_resume_age`); оценку склейки надо повторять и по нему. `background_restart` срабатывает вместе с первым `initialization_failed`: общий ключ `bg_ready_after`.
|
||||
|
||||
## 7. Критерии успеха и опровержения
|
||||
## 7. Как оценивать результат изменений
|
||||
|
||||
- **B** подтверждается, если после релиза падают доля «Network заменён» среди stuck и `reload_failed`, `background_restart` показывает восстановление, а у таких stuck `init_stage=none`.
|
||||
- **A** подтверждается, если сокращается когорта «мид-сессионная первая загрузка» (`context_load_cause`). Если нет, основание слабое.
|
||||
- Остаток P1/P3: гипотеза «медленный старт, а не потеря» подтверждается, если `bg_ready_after` у упавших заметно хуже базлайна здоровых загрузок и `recovery_document=failed_navigation`.
|
||||
- Для #7376 построить **новый episode baseline**: daily — installations с законченным эпизодом, count — законченные episodes. Разрезы `stuck`/`outcome`/`reload_state` относятся к одному report; частоты старых раздельных пикселей напрямую с ними не сравниваются. Незаконченные episodes теряются при уничтожении monitor/process.
|
||||
- Для P1/P2/P4 #7379 различать background_ready, reload_started и response_received. Последний — attributed dashboard response, не page ACK; независимый startup_response_missing измеряется и при выключенном late reload.
|
||||
- Для B/#7459 applied_count показывает применение restart, applied_daily — installations с применением. Снижение CPM failures в treatment требует отдельного denominator/control и сопоставимых версий; applied сам по себе не показывает success rate. Нельзя соединять два самостоятельных daily reports как доказанную пару одного пользователя.
|
||||
- Для P3/#7493 подтверждено устранение лишней origin migration в контролируемой среде. Уменьшение production no-view/startup failures ещё нужно измерить; полного P3 repro нет.
|
||||
- Для P5/#7473 оценивать доказанный shared-pinned-window mechanism, не приписывать ему всю P5-когорту. Для P6 сначала установить реальный main-flag transition.
|
||||
- Полную causal attribution Others не считать готовой до закрытия трёх пробелов §6. Отсутствующие поля и здоровый baseline не считать уже доступными измерениями.
|
||||
|
||||
## 8. Открытые решения и следующие шаги
|
||||
## 8. Открытые вопросы реализации и публикации
|
||||
|
||||
1. **Правки PR0** (ждут вашего «да»): скаляры вместо `bg_events`, `context_load_cause`, `stuck_after`, `network_replaced_since_view`, мелкие корзины `app_launch_age`, убрать `loading_tabs`, константы только на `initialization_failed`, `open_tabs` грубо, `bg_load_error_*` только при error 6; после этого ребейз #7384 и #7385. Альтернатива «оставить `bg_events`» требует ответа ревьюеру без утверждения «хуже не будет» и обязательства перемерить после релиза.
|
||||
2. **Ответ ревьюеру** (публично, **без цифр**): JA1 (init_failed daily-only; stuck daily+count с одинаковыми параметрами; recovered несут только `recovery_*`), JA2 (медленные поля повторяются, быстрые различаются; планируется сократить набор), JA3 (background view = скрытый `WKWebView`, в котором WebKit запускает фоновый скрипт расширения; выгружается через около 30 с простоя и пересоздаётся при пробуждении). Обязательство: перемерить различимость строк после первого релиза.
|
||||
3. **Запушить фикс B** (`f1085846e7`): красный прогон подтверждён, ждёт зелёного.
|
||||
4. **Судьба фикса A:** слабое основание в данных, не совпадает с названием задачи; решить, сливать ли без зелёного измерения эффекта через `first_load_wait`.
|
||||
5. **P3:** довести стабильный `baseURL` (ограничить встроенными расширениями без `web_accessible_resources`, прогнать harness, перенести на свежий `main`), проверить номер сборки ОС с фиксом 318756@main.
|
||||
6. **Локальные repro для P1–P3 и новые P5/P6** находятся в `alex/cpm-web-extension-remaining-failures`; отдельный PR без фиксов ещё не создавался. В этом worktree весь базовый класс gated `CPM_REPRO=1`, новые 14 методов дополнительно `CPM_REPRO_P5_P6=1`; `requireLocalRun` относится к выделенному PR-harness. Не путать opt-in и ветки при переносе.
|
||||
7. **iOS:** воспроизведение error 6 на реальном устройстве. Для Mac P5/tab=false найден и проверен путь shared pinned window → didCloseWindow → внутренний didCloseTab WebKit; для P6 проверен условный путь цикла главного flag (§11). Не установлены P5/tab=true, iOS lifecycle и реальность flag-transition в P6-сессиях.
|
||||
8. Блокеры по свежей сверке: #7376/#7378 и JS #3727 ждут ревью; #7384/#7385 стоят на #7376 и имеют failing Danger; #7381 остаётся на красном remote head без локального fix B.
|
||||
9. **Найденный P5 tab lifecycle:** проверить исправление полного window-close контракта, а не только списка явных didCloseTab. Направления — исключить сохраняемые shared tabs из delegate закрываемого окна либо восстановить регистрацию после window callback. Это варианты для отдельной реализации и проверки, не выполненный фикс. Контроли: закрытие второго/последнего окна, merge, перемещение и новые/существующие документы.
|
||||
10. **P5 с исправной регистрацией и P6 attribution:** естественная потеря listener metadata и фактический main-flag transition остаются без доказательства. Задержка main actor, длинный документ и один пропуск listener не заменяют такое доказательство; результаты отрицательных проверок сохранены в §10–12.
|
||||
1. #7376 закрыт без merge; зависимые #7379/#7459/#7493 по-прежнему основаны на его ветке. Это незавершённая публикация, а не shipped telemetry.
|
||||
2. macOS #7484 нужно синхронизировать с текущим episode contract и устранить release-base conflict; сейчас его payload отличается. В этом документационном проходе код и PR не менялись.
|
||||
3. Красный BSK gate #7379 остаётся открытым; crash annotation приведена в §2 без предположения о причине.
|
||||
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.
|
||||
7. Реальное iOS error-6/lifecycle воспроизведение, P5/tab=true, естественная потеря listener metadata и P6 production transitions всё ещё не доказаны. Исторические результаты controlled tests и отрицательных проверок ниже сохранены.
|
||||
|
||||
## 9. Методика и инструменты
|
||||
|
||||
**SQL ниже — историческая классификация старых production pixels за 12–14 октября.** Он использует удалённые из episode поля и прежний comma-only timeline. Для нового payload его нельзя применять без адаптации; актуальные ограничения и parser — §6. Live PR/CI evidence этой сверки: `/private/tmp/cpm-merge-readiness-20261019/`; точные heads и существенные результаты сохранены в §2.
|
||||
|
||||
- Доступ: `~/Developer/grafana-data-tools` (Grafana → ClickHouse `metrics.pixels`, read-only; авторизация через `grafana-auth`). Ad-hoc SQL запускался отдельным раннером через `~/DuckDuckGo/grafana-dashboards/tools/grafana-query/read-dashboard.py`. Сканы по `pixel LIKE` без фильтра по дате, агенту и `pixel_id='debug'` превышают лимит строк. Временные запросы лежали в папке сессии и могут пропасть; ключевая классификация ниже.
|
||||
- Версии с диагностикой: iOS 7.240+, macOS 1.210+. Окно: 12–14 октября (3 полных дня). Ограничения: сигнатуры эвристические; `network_restarted` только прокси; устройства нельзя проследить от init до stuck, сравниваются только доли; доля не равна пользовательскому эффекту.
|
||||
|
||||
@@ -230,6 +257,47 @@ multiIf(
|
||||
-- параметры: network_restarted, context_errors, bg_view_creations, tab_has_ext_scripts, bg_events (decodeURLComponent)
|
||||
```
|
||||
|
||||
## 9а. Архив прежних кратких обновлений и плана
|
||||
|
||||
Все «актуально», «осталось», CI counts и worktree states в этом архиве относятся к моменту записи и указанным heads, а не к 20 октября. Актуальный статус — §1–9.
|
||||
|
||||
> **Актуально — 19 октября 2026, error-6/P4 finding закрыт в опубликованном PR.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) **`8275bcce36`**, база #7376 **`39fe56af4c`**, содержит fix **`fc124938e0`** + 2 штатные регрессии. **201 shared PASS**, strict lint **4 files / 0 violations**. Signed app: **ON 9 PASS → OFF 6 ожидаемых functional FAIL → restored ON 9 PASS**, 0 SKIP, те же бинарники; первый restored attempt **7 PASS / 2 FAIL** (teardown timeout / SIGINT) сохранён, повтор выполнен без изменений и отключения проверок. CI завершён: **43 SUCCESS / 17 SKIPPED**, failures/pending нет. Harness **`6d04496882`** содержит production head и ровно **12 review-only paths**; 38 новых shared regressions относительно базы. Проверенный shipping scope: P1/P2 и независимый P4 detection; late reload остаётся default **OFF**, формы не менялись. Прежние открытые findings ниже — история до fix.
|
||||
|
||||
> **История ревью — 19 октября 2026, до исправления error-6/P4 в `fc124938e0`.** Проверен опубликованный после rebase **`a00dc4afeb`** / база #7376 **`c7adf28e12`**, 7 commits / 22 paths. Остаётся **1 P2: error-6 startup может ошибочно попасть в P4 detection после позднего callback успешного retry**. На текущем head: **196 существующих shared tests PASS + 2 дополнительных probes PASS / 1 новый probe FAIL**. Проверочная однострочная правка только в изолированной копии даёт **199 PASS**; в PR она не внесена. Pixel validators обеих платформ PASS. CI завершён: **53 SUCCESS / 25 SKIPPED**, failures и pending нет; повторный probe подтвердил тот же незакрытый дефект. Предыдущие 197 unit и app 9→6→9 относятся к `fc87237a47`; новая база убрала один retired-telemetry тест. Подробности и границы воспроизведения — в разделе «Полное ревью после P4 detection — error-6 attribution». История ниже сохранена.
|
||||
|
||||
> **Актуально — 19 октября 2026, P4 detection без reload опубликована и проверена.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`fc87237a47`**, 7 commits / 22 paths; review-only harness **`475095b335`**, 12 paths вне main. Новый dailyAndCount `web_extension_cpm_startup_response_missing` считает P4 candidates независимо от late recovery flag, без reload и safety JavaScript. **197 unit PASS**, signed macOS и iOS app builds PASS, pixel validators PASS, strict lint 6 production + 2 harness / 0. На одних подписанных app/XCTest binaries: **ON 9 PASS → OFF 6 ожидаемых functional FAIL → ON 9 PASS**, без skips/expected failures, SHA256 совпали. Новый detection-only case дважды подтвердил detection = 1 / finishCount = 1 / late recovery OFF / no late reload outcomes; оба late OFF controls также дали по detection = 1. CI нового head: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. Формы не менялись, late reload flag default disabled. PR steps и все три документа актуализированы; worktree возвращён на чистую production branch. Более ранние heads/results сохранены как история.
|
||||
|
||||
> **Актуально — 19 октября 2026, uninstall fix опубликован.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`e970e8c90e`**, 6 commits / 22 paths; отдельный review-only harness **`e380cf98f7`**, 12 paths вне main. Удаление активного CPM context отменяет pending late-document recovery; удаление старой upgrade-версии и ошибка unload сохраняют recovery. **190 unit PASS**, red-before-fix 2 PASS / 1 FAIL, signed macOS и iOS Simulator builds PASS, strict lint 11 / 0. На новом app head проверено на одних подписанных бинарниках: **ON 8 PASS → OFF 6 ожидаемых functional FAIL → ON 8 PASS**, без skips/expected failures; все app/XCTest SHA256 совпали. CI `e970e8c90e`: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. PR description и reviewer flag steps актуализированы с сохранением ручных правок. Формы оставлены в прежнем виде; late reload flag default disabled. Предыдущие heads/results ниже — история.
|
||||
|
||||
> **Актуально — 19 октября 2026, полный повторный review #7379.** Проверен локальный `5708197362` против #7376: 22 changed paths, **187 существующих тестов PASS + 1 новый probe FAIL**. Новый P2: uninstall активного CPM context не отменяет pending late-document recovery. Общий launch→navigation deadline и привязка recovery pixel к точной WKNavigation исправлены локально и прошли повторные регрессии; усиление защиты форм явно отложено пользователем, исходная проверка сохранена за default-disabled флагом. В GitHub пока `08866c7eda` (CI: 48 SUCCESS / 21 SKIPPED), новые production commits не опубликованы. Локальный review-only harness `4308751d59` синхронизирован; его новый ON/OFF/ON ещё не запускался. Подробности — в конце; прежние heads/results ниже относятся к истории.
|
||||
|
||||
> **Актуально — 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 больше не актуальны.
|
||||
|
||||
> **Актуальный итог — 16 октября 2026, после force push.** [PR #7379](https://github.com/duckduckgo/apple-browsers/pull/7379) теперь поверх **#7376** (`alex/cpm-messaging-readiness-telemetry`), head **`aec5be9a83`**, ровно **3 коммита / 32 файла**. Старый worktree `cpm-fix-init-loss` удалён; текущая директория `alex/cpm-fix-p1-p2` теперь на ветке `alex/cpm-fix-init-loss`. Checkpoint **`367759cbc1`** и backup старой истории сохранены. Проверка через production feature flags **без создания/переключения коммитов**: signed app **8/8 PASS ON**, **6/6 функциональных FAIL OFF**, unit **179 PASS**, strict lint **27 / 0**, pixel validators обеих платформ PASS. Новый late-reload flag **default disabled**. Описание PR/шаги и local-only `to-be-disabled before merge` annotations обновлены; GitHub CI ещё не объявляется green. Подробная финальная сверка — в конце документа. **Ниже сохранена датированная история: прежние «не закоммичено», старые head/base и over-budget limitation не являются текущим статусом.**
|
||||
|
||||
> **Итог замены #7379 — 16 октября 2026 (Бишкек).** В `alex/cpm-fix-p1-p2` исправлены оба замечания: ожидание конкретного нового context при install/upgrade и background guard независимо от diagnostics flag. Финальный signed app-набор **4/4 PASS**, install/upgrade **10+10 PASS**, targeted unit **170 PASS**, strict lint **16 files / 0 violations**, общий WebExtensions module для iOS Simulator **BUILD SUCCEEDED**. На тех же бинарниках с выключенными flags **4/4 функциональных negative controls FAIL**, без deallocation/infrastructure errors. Коммитов нет, scratch не изменён, ZIP/schema/dependencies не менялись. Сохраняется исходный cap **5 s**: startup fixture 5000 ms с WK overhead даёт callback после cap и может потерять первый ответ; этот режим остаётся воспроизводимым известным пределом. Подробности, история красных прогонов и machine summary — в конце [[cpm-status-2026-10-15]].
|
||||
|
||||
> **Отдельная ветка P1/P2 — финал 16 Oct, 13:33 UTC.** Новый worktree `alex/cpm-fix-p1-p2` от текущего `alex/cpm-messaging-readiness-telemetry` (`01d4a0ec22`): только P1/P2-кандидаты и необходимые тесты. Новых методов **2 app + 4 unit**; **22 — полный старый research app-набор**. На новой signed app-сборке **2/2 PASS**, unit **165 PASS**, strict lint 0; те же два app-теста при выключенных flags дают ожидаемые функциональные FAIL. Текущая база использует episode contract: P2 `failed_measurement_response`, `reload_state=none`, плюс реальная доставка initResp в тот же документ без навигации. История исправленного test teardown сохранена. Коммитов нет; scratch не изменён; подробности и артефакты — в конце документа.
|
||||
|
||||
### План до перехода на episode report — история
|
||||
|
||||
## 8. Открытые решения и следующие шаги
|
||||
|
||||
1. **Правки PR0** (ждут вашего «да»): скаляры вместо `bg_events`, `context_load_cause`, `stuck_after`, `network_replaced_since_view`, мелкие корзины `app_launch_age`, убрать `loading_tabs`, константы только на `initialization_failed`, `open_tabs` грубо, `bg_load_error_*` только при error 6; после этого ребейз #7384 и #7385. Альтернатива «оставить `bg_events`» требует ответа ревьюеру без утверждения «хуже не будет» и обязательства перемерить после релиза.
|
||||
2. **Ответ ревьюеру** (публично, **без цифр**): JA1 (init_failed daily-only; stuck daily+count с одинаковыми параметрами; recovered несут только `recovery_*`), JA2 (медленные поля повторяются, быстрые различаются; планируется сократить набор), JA3 (background view = скрытый `WKWebView`, в котором WebKit запускает фоновый скрипт расширения; выгружается через около 30 с простоя и пересоздаётся при пробуждении). Обязательство: перемерить различимость строк после первого релиза.
|
||||
3. **Запушить фикс B** (`f1085846e7`): красный прогон подтверждён, ждёт зелёного.
|
||||
4. **Судьба фикса A:** слабое основание в данных, не совпадает с названием задачи; решить, сливать ли без зелёного измерения эффекта через `first_load_wait`.
|
||||
5. **P3:** довести стабильный `baseURL` (ограничить встроенными расширениями без `web_accessible_resources`, прогнать harness, перенести на свежий `main`), проверить номер сборки ОС с фиксом 318756@main.
|
||||
6. **Локальные repro для P1–P3 и новые P5/P6** находятся в `alex/cpm-web-extension-remaining-failures`; отдельный PR без фиксов ещё не создавался. В этом worktree весь базовый класс gated `CPM_REPRO=1`, новые 14 методов дополнительно `CPM_REPRO_P5_P6=1`; `requireLocalRun` относится к выделенному PR-harness. Не путать opt-in и ветки при переносе.
|
||||
7. **iOS:** воспроизведение error 6 на реальном устройстве. Для Mac P5/tab=false найден и проверен путь shared pinned window → didCloseWindow → внутренний didCloseTab WebKit; для P6 проверен условный путь цикла главного flag (§11). Не установлены P5/tab=true, iOS lifecycle и реальность flag-transition в P6-сессиях.
|
||||
8. Блокеры по свежей сверке: #7376/#7378 и JS #3727 ждут ревью; #7384/#7385 стоят на #7376 и имеют failing Danger; #7381 остаётся на красном remote head без локального fix B.
|
||||
9. **Найденный P5 tab lifecycle:** проверить исправление полного window-close контракта, а не только списка явных didCloseTab. Направления — исключить сохраняемые shared tabs из delegate закрываемого окна либо восстановить регистрацию после window callback. Это варианты для отдельной реализации и проверки, не выполненный фикс. Контроли: закрытие второго/последнего окна, merge, перемещение и новые/существующие документы.
|
||||
10. **P5 с исправной регистрацией и P6 attribution:** естественная потеря listener metadata и фактический main-flag transition остаются без доказательства. Задержка main actor, длинный документ и один пропуск listener не заменяют такое доказательство; результаты отрицательных проверок сохранены в §10–12.
|
||||
|
||||
## 10. Журнал воспроизведения P5/P6 — 15 октября 2026
|
||||
|
||||
Хронологический журнал первоначальных controlled экспериментов; дополнительные результаты с привязкой к production-путям и текущие ограничения — в §11.
|
||||
|
||||
Reference in new issue
Block a user