diff --git a/work/projects/cpm-background-graveyard-experiment-definition.md b/work/projects/cpm-background-graveyard-experiment-definition.md index 73d07190..50049ea9 100755 --- a/work/projects/cpm-background-graveyard-experiment-definition.md +++ b/work/projects/cpm-background-graveyard-experiment-definition.md @@ -8,6 +8,12 @@ updated: '2026-09-22' --- # CPM Background Graveyard — Experiment Definition +> **Контекст актуализирован 15 октября 2026:** [[cpm-status-2026-10-15]]; архитектурные ограничения — [[cpm-service-worker-architecture-and-diagnostics]]. Определение эксперимента, задачи и readiness ниже сохранены как документ от 22 сентября; их текущий rollout/approval статус этим проходом не переутверждался. +> +> Новые P5/P6 проверки не являются доказательством пользы graveyard: P5/shared-window теряет tab routing после нормального idle, P6 сохраняет неправильный controller после main-flag cycle. Оба механизма отличаются от terminated-background retention. Для пустых listener metadata естественный production-trigger всё ещё не найден. Полная матрица, scopes и отрицательные контроли — основной статус §10–12. Эксперимент, cohorts, enrollment, metrics и flags этим обновлением не менялись. + + + > Status: **ready for review; not posted to Asana** > Updated: 2026-09-22 > Code milestone: M6 `alex/cpm-graveyard-ab` diff --git a/work/projects/cpm-extension-health-pixels-privacy-triage.md b/work/projects/cpm-extension-health-pixels-privacy-triage.md index 92c53663..236ff9ab 100755 --- a/work/projects/cpm-extension-health-pixels-privacy-triage.md +++ b/work/projects/cpm-extension-health-pixels-privacy-triage.md @@ -1,5 +1,11 @@ # Privacy Triage: Apple - CPM Extension Health Pixels +> **Исторический draft; контекст сверён 15 октября 2026.** Текущая реализация/атрибуция failure, stuck и recovery, PR/CI и новые P5/P6 tests описаны в [[cpm-status-2026-10-15]]. Таблица и поля draft ниже сохранены; это обновление не отправляет privacy review и не утверждает новую схему. +> +> Actual failure/stuck из новых tests — существующие production monitor events. Healthy page initResp проверяется отдельно от dashboard refresh; source-linked P5/P6 не добавляют новых pixels/params и не доказывают prevalence. См. также [[cpm-m3-telemetry-privacy-triage]] и [[cpm-readiness-telemetry-tech-design-2026-10-15]]. + + + Status: **DRAFT** **Name:** Alex M diff --git a/work/projects/cpm-m3-telemetry-privacy-triage.md b/work/projects/cpm-m3-telemetry-privacy-triage.md index 06e177fa..6bc303b1 100755 --- a/work/projects/cpm-m3-telemetry-privacy-triage.md +++ b/work/projects/cpm-m3-telemetry-privacy-triage.md @@ -1,5 +1,11 @@ # TD: Pixel Definition: CPM Failure Diagnostics (macOS/iOS) +> **Internal status context — 2026-10-15:** [[cpm-status-2026-10-15]] is the current source for production cohort evidence, PR stack and local reproduction results. The merge/rollout statement below is the historical September 23 record; it must not hide the subsequently collected diagnostic data for iOS 7.240+ and macOS 1.210+. +> +> Current P5/shared-window and conditional P6/main-flag tests exercise the existing diagnostics; they add no pixel/schema changes. Reproducing a mechanism does not establish its production share, a flag transition, or page delivery from dashboard-only telemetry. Latest readiness proposal and unresolved privacy/review choices are separate: [[cpm-readiness-telemetry-tech-design-2026-10-15]], main status §6–8. + + + **Author:** Alex M **Reviewer:** Michal **Stakeholders:** Michal, Konrad, Russell (from the first Tech Design; confirm for this proposal) @@ -7,7 +13,7 @@ **Previous Tech Design:** [CPM breakage pixels](https://app.asana.com/1/137249556945/task/1218005985662983) **Tech Design:** [Asana](https://app.asana.com/1/137249556945/task/1218619301158188) **Privacy Triage:** [Asana](https://app.asana.com/1/137249556945/task/1218627883499612) -**Status:** [PR #6844](https://github.com/duckduckgo/apple-browsers/pull/6844) merged 2026-09-23; CI green. Merge commit `2d58ad8cf4fae728a92e2aae0d3ec6073ddf49f2`. Production rollout not yet confirmed. +**Historical status (2026-09-23):** [PR #6844](https://github.com/duckduckgo/apple-browsers/pull/6844) merged 2026-09-23; CI green. Merge commit `2d58ad8cf4fae728a92e2aae0d3ec6073ddf49f2`. Production rollout not yet confirmed. ## Background & Requirements 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 21270e62..118903e3 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,5 +1,13 @@ # TD: Pixel Definition: CPM Readiness Telemetry (macOS/iOS) +> **Internal documentation update — 2026-10-15, 17:26 UTC.** Current evidence, unresolved review decisions and PR stack: [[cpm-status-2026-10-15]]. This update does not approve or implement the proposed schema changes. +> +> PR #7376 is OPEN at `619869ee84c6`, review required, with no failing/pending checks; #7384/#7385 remain open and each has a failing Danger status. Their skipped checks are not completed tests. JS #3727 is open, checks successful, review required. +> +> Source-linked P5/shared-window loss and conditional P6/main-flag replacement are now reproduced; natural metadata loss, P5/tab=true and actual production flag transitions remain unproven. The main status contains the full 14-test matrix, page-receipt controls, cold Network PID caveat, 494/499 denominator distinction and pending telemetry simplification decision. No new pixel or parameter was added by those tests. Internal ClickHouse figures stay in Obsidian, not public PR comments or issues. + + + **Author:** Alex M **Reviewer:** TBD (previous reviewer: Michal) **Stakeholders:** Michal, Konrad, Russell (from the previous Tech Designs; confirm for this proposal) @@ -7,7 +15,7 @@ **Task:** [Improve telemetry](https://app.asana.com/1/137249556945/project/1202406491309510/task/1219531810004069) **Previous Tech Designs:** [CPM breakage pixels](https://app.asana.com/1/137249556945/task/1218005985662983) · [CPM Failure Diagnostics](https://app.asana.com/1/137249556945/task/1218619301158188) ([[cpm-m3-telemetry-privacy-triage]]) **Privacy Triage:** not requested yet; see Privacy below. -**Status:** [PR #7376](https://github.com/duckduckgo/apple-browsers/pull/7376) open; CI running at the time of writing. Not merged, not shipped. +**Status (checked 2026-10-15, 17:26 UTC):** [PR #7376](https://github.com/duckduckgo/apple-browsers/pull/7376) OPEN at `619869ee84c6`; REVIEW_REQUIRED; no failing/pending published checks (39 success, 18 skipped entries). Not merged; this check does not establish shipping. **Analysis this builds on:** [[cpm-web-extension-public-attribution-2026-10-05]], [[cpm-web-extension-breakage-session-summary-2026-10-07]], [[cpm-web-extension-code-guide-2026-10-09]] (section 3). ## Background & Requirements diff --git a/work/projects/cpm-service-worker-architecture-and-diagnostics.md b/work/projects/cpm-service-worker-architecture-and-diagnostics.md index 24f9c986..4800b7a3 100755 --- a/work/projects/cpm-service-worker-architecture-and-diagnostics.md +++ b/work/projects/cpm-service-worker-architecture-and-diagnostics.md @@ -1,5 +1,16 @@ # CPM Service Worker — architecture, diagnostics, failure gaps +> **Follow-up evidence — 2026-10-15.** Current status, test outcomes and scope: [[cpm-status-2026-10-15]] (§10–12); current worktree map: [[cpm-web-extension-code-guide-2026-10-09]] (§0). The source audit below remains the September 25 baseline; its bundle version and worktree/milestone readiness are historical. +> +> - The October harness uses bundled extension **2026.9.29**, real production manager/coordinator/monitor/recorder/native handler and system WebKit on macOS 26.7.1. A temporary extracted bundle copy carries trace and DOM initResp marks; the production zip is unchanged. It does not run the entire browser app/AppKit. +> - Browser window lifecycle is now tied to a measured WebKit side effect: the closing window still exposes a shared pinned tab, so didCloseWindow internally forgets it despite the browser filtering explicit didCloseTab calls. Subsequent messages fail tab resolution before wake; exact P5/tab=false/stuck is reproduced. This does not explain P5/tab=true or iOS. +> - Main webExtensions flag cycling through the production handler recreates the controller and produces P6 on the old view. Actual production flag transitions remain unproven; repeated true and embedded-only cycling preserve controller identity. Embedded reinstall can still lose its first message before ready (known A); the healthy binding control explicitly waits for background readiness. +> - The no-listener-from-first-start experiment produces P5 with healthy-looking tab flags, but only under test-only suppression. One lost registration on a later wake recovered after restoring the script. The current bundled bootstrap creates MessageRouter and its runtime listener synchronously before its trailing Promise.all diagnostics; failure of those later async diagnostics alone is not evidence that listener registration was skipped. +> - Two slow 35-second documents receive initResp; report/eval at finish wake the background again. Suppressing dashboard delivery yields actual detector stuck despite page receipt, with a live background. Two 35-second **host main-actor** stalls delay failure snapshots but also leave a live view; this is not a background-worker busy loop or real iOS suspension. +> - All 14 current P5/P6 methods have passing outcomes across separate runs; no single final 14-test run. Latest ordinary package: 478 XCTest / 28 opt-in skipped / 0 failures. Priorities involving real iOS lifecycle, stable-origin teardown, natural metadata loss, request cancellation and stale-document replies are not closed by these checks. Native `init_stage` and its JS counterpart remain open PRs (#7385 / privacy-extension#3727), not assumed shipped. + + + > **2026-09-25 · source audit, not a new device reproduction.** Start with §4: the five validation priorities. > Current assessment supersedes the architecture/diagnostics assumptions in [[cpm-web-extension-breakage-findings]]. Milestone status remains in [[cpm-web-extension-breakage-validation]]. > @@ -7,7 +18,7 @@ ## 1. What the Service Worker is in CPM -The bundled extension is MV3, version **2026.9.2**. Its classic service worker is `public/js/background-embedded.js`; `public/js/content-scripts/cpm.js` runs at document start in an isolated world in all matching frames. A background worker is shared by the tabs using that extension context; it is not one worker per tab and not necessarily one across every profile/data store. +The bundle audited on September 25 was MV3, version **2026.9.2**; the October 15 harness uses **2026.9.29**. Its classic service worker is `public/js/background-embedded.js`; `public/js/content-scripts/cpm.js` runs at document start in an isolated world in all matching frames. A background worker is shared by the tabs using that extension context; it is not one worker per tab and not necessarily one across every profile/data store. It is the extension's background JavaScript environment: message router, native-settings/configuration access, CPM rule selection and replies. It has a worker global, not the page DOM. CPM uses extension messaging—not the website Service Worker fetch/offline-cache path. @@ -170,4 +181,4 @@ App evidence is in `SharedPackages/WebExtensions/Sources/WebExtensions/`: Additional source: [extension workers are not persisted](https://github.com/WebKit/WebKit/blob/0c7e7ad97b9c50e549387914d31ecc2908ae0171/Source/WebCore/workers/service/server/SWServerWorker.cpp#L561). -**Validation status:** source tracing and bundle/Swift contract comparison completed. No new device reproduction, build, unit test or app-code change was performed for this documentation audit. +**Validation status of the September 25 audit:** source tracing and bundle/Swift contract comparison completed. No new device reproduction, build, unit test or app-code change was performed for this documentation audit. diff --git a/work/projects/cpm-status-2026-10-15.md b/work/projects/cpm-status-2026-10-15.md index 28cdf068..40fded45 100755 --- a/work/projects/cpm-status-2026-10-15.md +++ b/work/projects/cpm-status-2026-10-15.md @@ -9,37 +9,47 @@ tags: # CPM Web Extension: единый статус на 15 октября 2026 -Внутренний документ. **Цифры из ClickHouse, в публичные PR, комментарии и issues не переносить** (репозитории `duckduckgo/apple-browsers` и `duckduckgo/duckduckgo-privacy-extension` публичные). Заменяет заметку `cpm-telemetry-data-requirements-2026-10-15` (теперь ссылка сюда). Старые документы с устаревшими числами: [[cpm-web-extension-public-attribution-2026-10-05]], [[cpm-web-extension-data-analysis-summary-2026-10-08]], [[cpm-web-extension-repro-and-fix-2026-10-08]], [[cpm-web-extension-code-guide-2026-10-09]] (карта «большого» worktree, **больше не актуальна**: всё нарезано на PR ниже). +Внутренний документ. **Цифры из ClickHouse, в публичные PR, комментарии и issues не переносить** (репозитории `duckduckgo/apple-browsers` и `duckduckgo/duckduckgo-privacy-extension` публичные). Заменяет заметку `cpm-telemetry-data-requirements-2026-10-15` (теперь ссылка сюда). Исторические срезы с собственными датами и знаменателями: [[cpm-web-extension-public-attribution-2026-10-05]], [[cpm-web-extension-data-analysis-summary-2026-10-08]], [[cpm-web-extension-repro-and-fix-2026-10-08]]. Актуальная карта worktree и точек входа добавлена в [[cpm-web-extension-code-guide-2026-10-09]]; её прежние разделы сохранены как карта на 9 октября. + +**Актуализировано 15 октября, 17:26 UTC / 23:26 Бишкек.** Разделы 1–9 — сводный статус; §10–11 — сохранённая хронология экспериментов, где «пока», «не найдено» и красные ожидания относятся к моменту записи. Текущий итог всех 14 P5/P6-проверок, границы доказательства и команды — §12. PR/CI сверены read-only через GitHub; результаты локальных тестов сверены с существующими логами и исходниками, в этом документационном проходе тесты и ClickHouse-запросы заново не запускались. ## 1. Коротко - Фикс **B** (падение Network-процесса) проверен локально и красным прогоном на CI. **Основание в данных есть, но неполное:** обогащение в stuck есть, а доказать, что строки это именно мёртвый worker, нельзя (не хватает `network_replaced_since_view`). - Фикс **A** (первая загрузка посреди сессии) реален, но мелкий: около 1% stuck на iOS, на macOS почти не виден, чаще самоизлечивается. - Три самые крупные группы сбоев фиксами A и B **не закрыты**: пробуждение после idle, error 6 (iOS), «нет background view» на запуске (iOS). Механизмы воспроизведены локально на macOS, но проверенного рычага в приложении нет. -- Телеметрия PR0 пока в виде, вызвавшем вопросы о склейке пикселей. Решение по правкам не принято (раздел 8). +- **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. Полный AppKit/browser flow в новых SPM-тестах не выполнялся: app callbacks/delegates реализованы harness по исходникам; production shared code и системный WebKit выполнялись. +- Телеметрия PR0 пока в виде, вызвавшем вопросы о склейке пикселей. Решение по правкам не принято (раздел 8). #7384/#7385 имеют красный Danger, #7381 — красный Non-Sandbox; текущие heads и ограничения — раздел 2. ## 2. Цепочки PR (все в `duckduckgo/apple-browsers`, задачи Asana в телах PR; не читать) **Телеметрия:** +Статусы ниже проверены через GitHub 15 октября в 17:26 UTC. Все семь перечисленных PR открыты; это не означает merge или shipped release. «CI зелёный» означает отсутствие failing/pending среди опубликованных checks; skipped jobs отдельно не считаются выполненными. Счётчики — записи GitHub statusCheckRollup, а не число уникальных тестов: имена checks из разных workflows могут повторяться. + | PR | Ветка | База | Что | Статус | |---|---|---|---|---| -| #7376 (PR0) | `alex/cpm-messaging-readiness-telemetry` | main | параметры готовности и тайминга на failure/recovery пикселях (без новых пикселей) | CI зелёный, нужен ревью. Ревьюер по пикселям задал вопросы JA1–JA3 о склейке, ответ не отправлен | -| #7384 (0b) | `alex/cpm-readiness-baseline` | #7376 | ежедневные базлайн-пиксели `cpm_background_ready_{context_load,wake}`, нагрузка устройства, возраст возобновления | CI в основном зелёный | -| #7385 (0c) | `alex/cpm-init-progress-native` | #7384 | `init_stage` на failure-пикселях (нужен JS из privacy-extension#3727) | CI в основном зелёный | -| privacy-extension #3727 | `alex/cpm-init-progress` | | уведомления `cpmInitProgress` из встроенного расширения | открыт, нужен ревью | +| [#7376 (PR0)](https://github.com/duckduckgo/apple-browsers/pull/7376) | `alex/cpm-messaging-readiness-telemetry` | main | параметры готовности и тайминга на failure/recovery пикселях (без новых пикселей) | OPEN, head `619869ee84c6`; CI: 39 success / 18 skipped, без pending/failure; REVIEW_REQUIRED. JA1–JA3 и неотправленный ответ — прежняя запись сессии; новые review comments в этой сверке не перечитывались | +| [#7384 (0b)](https://github.com/duckduckgo/apple-browsers/pull/7384) | `alex/cpm-readiness-baseline` | #7376 | ежедневные базлайн-пиксели `cpm_background_ready_{context_load,wake}`, нагрузка устройства, возраст возобновления | OPEN, head `99ecf8b12787`; 36 success / 23 skipped / 1 failure: **Danger**; pending нет. Причина Danger здесь не устанавливалась | +| [#7385 (0c)](https://github.com/duckduckgo/apple-browsers/pull/7385) | `alex/cpm-init-progress-native` | #7384 | `init_stage` на failure-пикселях (нужен JS из privacy-extension#3727) | OPEN, head `46f25175c7c4`; 36 success / 23 skipped / 1 failure: **Danger**; pending нет. Причина Danger здесь не устанавливалась | +| [privacy-extension #3727](https://github.com/duckduckgo/duckduckgo-privacy-extension/pull/3727) | `alex/cpm-init-progress` | main | уведомления `cpmInitProgress` из встроенного расширения | OPEN, head `b00cc227112d`; 32 success, без skipped/failure/pending; REVIEW_REQUIRED | **Harness и фиксы** (красный коммит, затем зелёный; не ребейзить и не форс-пушить, иначе пропадёт доказательство красного прогона): | PR | Ветка | База | Что | Статус | |---|---|---|---|---| -| #7378 | `alex/cpm-repro-harness` | main | harness (только тесты); 4 быстрых теста в CI около 3 с, остальное локально через `CPM_REPRO=1` | CI зелёный, нужен ревью. Danger: 1570 добавленных строк (предупреждение). В ветке есть коммит другой сессии «Require initResp in the page…» | -| #7379 | `alex/cpm-fix-init-loss` | harness | фикс A: ожидание первой загрузки background после установки/апгрейда посреди сессии | красный прогон и зелёный: CI зелёный | -| #7381 | `alex/cpm-fix-network-crash` | фикс A | фикс B: перезапуск background при замене Network-процесса и мёртвом worker'е | **красный прогон подтверждён** (падает `testNetworkProcessCrashKeepsEveryTabWorking`, 3 ретрая, Non-Sandbox). Фикс-коммит `f1085846e7` **локально, не запушен** | +| [#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; прежние красный и зелёный прогоны сохраняются | +| [#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 | Локальные проверки фикса A: на коде без фикса оба repro-теста красные (5 из 5 итераций), с фиксом 0 из 10 потерь, 761 тест пакета зелёный. Фикс B: на `main` красные тесты падения Network-процесса и смерти worker'а, 5 из 5 итераций. +**Новые P5/P6 тесты остаются локально** в `alex/cpm-web-extension-remaining-failures`; в PR #7378/#7379/#7381 они не переносились. Весь `CPMRepro/` этого worktree untracked, поэтому одного HEAD недостаточно для восстановления тестов. Нужны сами файлы (§12 и актуальная карта кода). + Недоделано в harness и CI: CI гоняет тесты с `-test-iterations 3 -retry-tests-on-failure`, красный тест должен падать стабильно; тесты WebExtensions идут внутри схем `macOS Browser` и `iOS Browser` на `osx-tahoe-27`. Медленные эксперименты (заморозка 45 с, заполнение кэша около 10 минут, медленный старт worker'а) локальные и не для коммита. ## 3. Данные (ClickHouse, 12–14 октября, версии iOS 7.240+ и macOS 1.210+) @@ -86,6 +96,10 @@ tags: | **Network заменён** | | см. раздел 4 | да (краш, worker мёртв при том же view) | фикс B | | **«Здоровый» остаток, other** | | iOS 12.5%, macOS 22% | нет | нет гипотезы | +**Сверка определения P5:** строка выше сохраняет исходные 494 macOS. Повторная выборка 14 октября по хвосту P5 без error 6, network_restarted=true и scripts=false дала 1953 iOS / 499 macOS (§10). Разница 494/499 не устранена сверкой всех дополнительных фильтров: эти знаменатели не подменяют друг друга. В этом повторном Mac-срезе 68 снимков имеют tab_in_context=false, 374 — все три tab-флага true, 57 — неполную/неразрешённую диагностику вкладки. На iOS 646 снимков имеют все три tab-флага true, у 1299 вкладка не разрешилась, ещё 8 имеют неизвестный tab_in_context. Найденный shared-window механизм применим к сигнатуре Mac/tab=false, но происхождение всех 68 событий не доказано. Неразрешённая вкладка не тождественна tab_in_context=false. + +**P6 не равен P4 по одному хвосту:** `load>view>proxy_on` при controller/scripts=false — P6, при корректной привязке и потерянном раннем init может быть A/P4. 235 событий P6 — хвост без dealloc, а не группа extension_updated. В 468/627 и 234/235 P6-снимках запуск моложе двух минут. Поэтому main-flag cycle проверяет достижимость, но его частоту и соответствие раннему запуску нужно подтвердить отдельно. + Размер группы не равен возможности её починить: P1 и P3 в основном опаздывающие ответы, а часть «сбоев» это срабатывание детектора («нет ответа за 4 с», опоздавший ответ тоже считается). iOS-когорта «other» на самом деле тот же рисунок P1, но со view старше 30 секунд. ## 6. Телеметрия @@ -142,9 +156,11 @@ tags: 3. **Запушить фикс B** (`f1085846e7`): красный прогон подтверждён, ждёт зелёного. 4. **Судьба фикса A:** слабое основание в данных, не совпадает с названием задачи; решить, сливать ли без зелёного измерения эффекта через `first_load_wait`. 5. **P3:** довести стабильный `baseURL` (ограничить встроенными расширениями без `web_accessible_resources`, прогнать harness, перенести на свежий `main`), проверить номер сборки ОС с фиксом 318756@main. -6. **Локальные repro для P1–P3** отдельным PR без фиксов (по образцу harness'а, `requireLocalRun`), чтобы гонять после релизов WebKit. +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 ждут ревью; #7384/#7385 стоят на #7376. +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. ## 9. Методика и инструменты @@ -393,3 +409,100 @@ Embedded-контроль **красный, 6.119 с, 3 assertions**: controller ```sh CPM_REPRO=1 CPM_REPRO_P5_P6=1 swift test --disable-automatic-resolution --filter 'CPMReproProductionFlagTests|CPMReproLifecycleHypothesisTests/testClosing' ``` + +## 12. Актуальный итог P5/P6: доказательства, полный реестр и повторение + +### Границы доказательства и сигнатуры + +| Механизм | Что проверено | Чего это не доказывает | +|---|---|---| +| P5: закрытие окна с общим pinned tab | Browser call chain прочитан в текущем worktree и tag `1.210.0+macos`; production listener и системный WebKit исполнены. После window callback tab сохраняется в другом window delegate, но tab_in_context становится false; два failure → stuck с нужным хвостом | Полное приложение/AppKit в SPM не запускались; неизвестно, какая доля production P5 связана с этим действием. Не объясняет P5/tab=true или iOS | +| P5: нет runtime listener metadata | При подавлении регистрации с первого старта, двух настоящих idle-выгрузках и explicit load между ними получен P5 с исправными tab/controller/scripts | Это test-only исходное условие. Естественное исчезновение metadata и подходящий production caller не найдены | +| P6: главный flag меняет manager | Реальные handler/uninstall/load/context, существующая view при загрузке replacement context; прежний controller сохраняется и воспроизводит P6 | Смена состояния flag задаётся тестом; события false→true в production-выборке не установлены. Default главного flag enabled на обеих платформах | +| P6: nil controller | До и после idle контекст знает tab, но scripts отсутствуют; context reload не исправляет конфигурацию созданного WKWebView | Это controlled construction. Синхронный manager до state restoration уже есть с февраля 2026; обычный ранний startup сам по себе причиной не оказался | +| Длинные документы / потерянный dashboard / задержка main actor | Требуется отдельно смотреть page initResp, native arrival и actual failure snapshot. Длинные здоровые документы работают; lost dashboard/stall дают stuck при живой view | Ни один из этих сценариев не воспроизвёл P5 на проверенной macOS. Host main-actor stall не равен настоящему iOS suspend/resume | + +Две положительные сигнатуры: +- P5: `load>view>proxy_on>dealloc>view>proxy_on>dealloc`; creations=2, view=false, context=true, errors=none, network_restarted=false. Shared-window/прямой didCloseTab: tab=false, controller/scripts=true. Отсутствие listener с первого старта: tab/controller/scripts=true. +- P6: `load>view>proxy_on` (view=true) либо `load>view>proxy_on>dealloc` (view=false); creations=1, context/tab=true, controller/scripts=false, errors=none, network_restarted=false. Main-flag source-linked тест проверяет вариант с живой view; вариант после idle проверен с nil controller. + +`tab_controller_match=false` означает nil **или** другой controller: recorder требует ненулевую identity-совместимость. `tab_in_context` проверяет identity tab среди `context.openTabs`; `tab_has_ext_scripts` ищет user scripts в content world текущего UUID контекста. Эти поля не являются взаимозаменяемыми и не доказывают page receipt. + +### Все 14 текущих P5/P6-проверок + +Все результаты ниже извлечены из локальных логов; название без суффикса файла — метод XCTest. Первые 12 находятся в `CPMReproLifecycleHypothesisTests.swift`, последние 2 — в `CPMReproProductionFlagTests.swift`. + +| Метод | Последний результат, с | Наблюдённый смысл pass | Исходный лог | +|---|---:|---|---| +| `testCurrentControllerBeforeContextLoadRemainsHealthy` | pass, 1.190 | Контроль P6: correct controller до context-load → initResp, 0 failures | `p5-refined-and-controls.log` | +| `testTabWithoutControllerMatchesP6BeforeIdleUnload` | pass, 8.569 | Инъекция nil controller → P6, view=true; новая вкладка работает | `p5-p6-final-regressions-and-stall.log` | +| `testTabWithoutControllerMatchesP6AfterIdleUnload` | pass, 38.543 | nil controller → P6 после idle; context reload не чинит эту view | `p5-p6-final-regressions-and-stall.log` | +| `testExistingTabKeepsPreviousManagerController` | pass, 9.167 | Прямой controlled replacement → P6; прежние view/controller сохранены | `p5-p6-final-regressions-and-stall.log` | +| `testClosingWindowForgetsSharedPinnedTabThroughWebKitAndMatchesP5` | pass, 73.033 | Browser callback → WebKit: shared-window close → P5/tab=false; восстановление и healthy новая вкладка | `production-window-close.log` | +| `testClosingUnrelatedWindowPreservesRegisteredTab` | pass, 1.205 | Контроль window close: без общей вкладки initResp и 0 failures | `production-window-close.log` | +| `testMainActorStallDelaysActualFailureSnapshots` | pass, 71.027 | Две паузы host main actor по 35 с → actual stuck, но matchesP5=false; view жива | `p5-p6-final-regressions-and-stall.log` | +| `testForgottenLiveTabDoesNotWakeBackgroundAndMatchesP5` | pass, 72.737 | Прямой test-only didCloseTab → P5/tab=false; didOpenTab восстанавливает | `p5-p6-final-regressions-and-stall.log` | +| `testMissingRuntimeListenerOnOneWakeRecoversAfterNextIdle` | pass, 62.633 | Один wake без listener после здорового старта → следующий wake здоровый, stuck=0 | `p5-p6-final-regressions-and-stall.log` | +| `testNoRuntimeListenerMetadataFromFirstStartupMatchesP5` | pass, 70.149 | Test-only отсутствие listener с первого старта; два idle и explicit load между ними → P5/all tab flags=true | `p5-refined-and-controls.log` | +| `testSlowHealthyDocumentsWakeBackgroundAgainAtFinishWithoutFailure` | pass, 70.683 | Два 35-секундных image → initResp, report/eval снова будят background на finish, 0 failures | `p5-refined-and-controls.log` | +| `testSlowDocumentsWithLostDashboardDoNotMatchP5` | pass, 80.181 | Два 35-секундных image + потеря dashboard → initResp и stuck с живой view; не P5 | `p5-refined-and-controls.log` | +| `testMainFeatureFlagCycleRecreatesManagerAndMatchesP6` | pass, 9.252 | Production flag handler true→false→true → P6; true→true controller не меняет | `production-flag-cycle-final.log` | +| `testEmbeddedFeatureFlagCycleKeepsControllerAfterBackgroundBecomesReady` | pass, 0.985 | Embedded-only cycle сохраняет controller; initResp после explicit background-ready wait | `production-flag-cycle-final.log` | + +Зелёный тест с ожидаемым сбоем означает воспроизведение механизма; зелёный negative control означает отсутствие предполагаемой сигнатуры в проверенных условиях. Исходные неудачные ожидания, ошибки harness и их исправления не удалены из §10–11. Единого итогового запуска всех 14 не было: green подтверждён раздельными группами. 478 XCTest обычного пакета включают **28 пропущенных opt-in**; они не заменяют выполненные длительные repro. + +### Среда, исходники и устройство harness + +- Worktree: `/Users/admin/DuckDuckGo/apple-browsers.git/alex/cpm-web-extension-remaining-failures`, HEAD `a0717cf098cd1cbd32d5bc9d19aa7db0fab2399f`; новые тесты untracked, поэтому checkout одного commit их не восстановит. +- macOS **26.7.1 (25G241)**, Xcode **27.1 (27A9275)**, системный WebKit; bundled embedded extension **2026.9.29**. Проверка source: `/Users/admin/Downloads/WebKit_sparse`, HEAD `99051d5d08cd9f19ec76ce599f7539d070b1ae09`. Этот checkout не доказывает, что весь его код соответствует shipped binary; нужный эффект отдельно проверен на system WebKit. +- Harness запускает production extension manager/coordinator, recorder, health monitor и native autoconsent handler, реальные WKWebView и WKWebExtension contexts. Host window/tab delegates и callbacks flag enable/disable собраны по исходникам macOS, не импортированы из целого приложения. +- База Options: startup navigation gate и M4 включены. **В P5/P6-тестах M4 выключен**, чтобы actual stuck не был сразу затёрт automatic reload; navigation gate остаётся включён. Перед context load прогревается Network-процесс default data store. Без прогрева PID=0→ненулевой может дать network_restarted=true без crash; это было причиной первого несовпадения. +- Временная распакованная копия bundled extension содержит test prelude/DOM marks и trace. Production zip не менялся. В source-linked window/flag сценариях listener не подавляется, dashboard не теряется намеренно, background startup не задерживается. Это не byte-identical bundle без instrumentation. +- Отдельные controlled сценарии используют: nil/старый controller, suppressed runtime listener, suppressed native dashboard method, задержанный image через WKURLSchemeHandler или блокировку main actor. Их нельзя выдавать за найденный естественный production-trigger. +- Content marks требуют `initresp` для здоровых контролей; native dashboard arrival отдельно измеряет production detector. Trace не должен удерживать view: watcher исправлен, чтобы strong reference не пересекал 50-мс await. Idle-helper требует одновременно `context._backgroundWebView == nil` и `backgroundWebViewAlive == false` в recorder. +- Долгие image имеют уникальный URL на каждую навигацию, иначе второй документ берётся из cache. `adoptTab` восстанавливает navigationDelegate после teardown предыдущего harness. Счётчик 3 view в pixel — bucket `3_to_5`; raw assertion использует `backgroundWebViewCreateCount == 3`. +- Три новых файла: `CPMReproLifecycleHypothesisTests.swift`, `CPMReproDelayedResource.swift`, `CPMReproProductionFlagTests.swift`. Пять дополненных: `CPMReproHarness.swift`, `CPMReproTabs.swift`, `CPMReproSupport.swift`, `CPMReproPrelude.swift`, `CPMReproTestCase.swift`. Существующая dirty telemetry/Package.resolved не включалась в эту работу; тестовыми изменениями production поведение не исправлялось. + +### Артефакты и история красных прогонов + +Все перечисленные файлы находились в `/private/tmp/cpm-p5-p6-20261015/` на момент документирования. Папка временная: долговечная сводка значимых исходов, причин красных assertions и ограничений сохранена здесь и в §10–11; сами raw logs могут исчезнуть. + +| Файл | Результат и как его читать | +|---|---| +| `build-and-p6-before-idle.log` | P6 получен, но network_restarted=true из-за холодного PID attribution; не полное совпадение | +| `p6-fast.log` | 2 теста / 1 failure: перенос старой view упёрся в снятый navigationDelegate; исправлен test adoptTab. P6 до idle уже green | +| `p5-p6-full.log` | 7 тестов / 11 failing assertions, 273.808 с: one-wake listener сам восстановился; finish длинного документа разбудил background; повторный image был cached. Эти результаты разделены на отрицательные выводы и ошибку постановки, а не скрыты | +| `p5-refined-and-controls.log` | 5 тестов / 1 failure, 289.130 с: 4 green, оставшийся assertion ожидал строку «3» вместо bucket «3_to_5». Исправлен raw count assertion и повторён | +| `p5-p6-final-regressions-and-stall.log` | 6 тестов / 0 failures, 262.676 с; задержка main actor даёт matchesP5=false | +| `production-window-close.log` | 2 теста / 0 failures, 74.238 с; source-linked P5 и unrelated-window control | +| `production-flag-cycle.log` | 2 теста / 3 assertions, 15.363 с: main flag P6 green; embedded-only first init потерян до worker activate — известный A/P4, не P6 | +| `production-flag-cycle-final.log` | 2 теста / 0 failures, 10.237 с; embedded control проверен после explicit ready wait | +| `package-tests.log` | Промежуточный пакет: 474 XCTest, 24 skipped, 0 failures, 11.344 с | +| `package-tests-production-paths.log` | Последний пакет: 478 XCTest, 28 skipped, 0 failures, 10.469 с | +| `summarize.py`, `results.json` | Сводка последних результатов 14 текущих методов, имена исходных логов и SHA-256 source файлов; это не лог одного общего прогона | + +Контрольные суммы актуальных тестов: +- `CPMReproLifecycleHypothesisTests.swift`: `60c2f3081c08a40cfc0244e023652013f0abf939151a63c14addc400a40ed413`. +- `CPMReproProductionFlagTests.swift`: `240c3828e3fac13357c6e80a954f3d07fc5dd26376d36308258ecc984bfd860e`. +- Существующий dirty `Package.resolved`, SHA-1: `7ccce20acd452656c9bf2d2fa186d044e4a8185f`. + +### Команды повторения и границы следующей работы + +Из `/Users/admin/DuckDuckGo/apple-browsers.git/alex/cpm-web-extension-remaining-failures/SharedPackages/WebExtensions`: + +```sh +# Все 14 P5/P6 методов; эта общая команда дана для повторения, единым прогоном ещё не выполнялась. +CPM_REPRO=1 CPM_REPRO_P5_P6=1 swift test --disable-automatic-resolution --filter 'CPMReproLifecycleHypothesisTests|CPMReproProductionFlagTests' + +# Только четыре новых source-linked метода. +CPM_REPRO=1 CPM_REPRO_P5_P6=1 swift test --disable-automatic-resolution --filter 'CPMReproProductionFlagTests|CPMReproLifecycleHypothesisTests/testClosing' + +# Обычные тесты после актуальной сборки: repro без флагов пропускаются. +swift test --disable-automatic-resolution --skip-build +``` + +Strict SwiftLint запускался для восьми перечисленных Swift-файлов из корня worktree: `mint run swiftlint lint --strict --force-exclude --no-cache `, 0 violations. `--no-cache` нужен, чтобы не писать во внешний SwiftLint cache; это не пропуск правил. + +Карта P1–P3/A/B/init-progress, file names, параметры тяжёлых экспериментов и актуальные worktree — [[cpm-web-extension-code-guide-2026-10-09]]. Нельзя предполагать, что один worktree содержит все эксперименты или что HEAD включает локальные untracked файлы. + +Эта актуализация — документация. Новые app/WebKit fixes, telemetry/schema changes, commit/push/PR, сообщения ревьюерам, переключения remote flags и новые iOS/device проверки не выполнялись. Старые результаты до исправления ожиданий сохраняются, а causal attribution production-групп не повышена до доказанной. diff --git a/work/projects/cpm-telemetry-data-requirements-2026-10-15.md b/work/projects/cpm-telemetry-data-requirements-2026-10-15.md index 49eac27b..546d4d39 100755 --- a/work/projects/cpm-telemetry-data-requirements-2026-10-15.md +++ b/work/projects/cpm-telemetry-data-requirements-2026-10-15.md @@ -10,3 +10,6 @@ tags: # Перенесено Содержимое этой заметки (требования к телеметрии из гипотез, когорты ClickHouse, паттерны событий, список невоспроизведённых картин, анализ `bg_events`, SQL) сведено в единый документ со статусом: [[cpm-status-2026-10-15]]. + + +Актуальный статус на 15 октября после исследования P5/P6: в основном документе §1–9 — сводка PR/CI/данных/решений, §10–11 — полная хронология, §12 — все 14 текущих test results, positive/negative controls, ограничения, исходники, команды и логи. Карта всех CPM worktree и suites актуализирована в [[cpm-web-extension-code-guide-2026-10-09]] (§0). Source-linked P5/tab=false подтверждён; P6 main-flag path условный, occurrence в production не установлен. diff --git a/work/projects/cpm-web-extension-breakage-findings.md b/work/projects/cpm-web-extension-breakage-findings.md index d456b9d7..3faed777 100755 --- a/work/projects/cpm-web-extension-breakage-findings.md +++ b/work/projects/cpm-web-extension-breakage-findings.md @@ -10,6 +10,16 @@ tags: --- # CPM Web Extension Breakage Findings +> **Текущий статус — 15 октября 2026:** [[cpm-status-2026-10-15]] (§1–5, §10–12); текущая карта файлов/worktree — [[cpm-web-extension-code-guide-2026-10-09]] (§0). Следующие сентябрьские выводы, ручные проверки и отозванные гипотезы сохранены как история, а не новый verdict. +> +> - Shared pinned window close, вручную наблюдавшийся 10 сентября ниже, теперь воспроизведён автоматическим SPM-тестом на system WebKit/macOS 26.7.1. Текущие browser source и tag `1.210.0+macos` уже фильтруют сохраняемые tabs перед **явными** didCloseTab, но последующий didCloseWindow всё ещё заставляет WebKit закрыть каждый tab из delegate tabs(for:). Получен P5: два failure → stuck, view=false, tab=false, controller/scripts=true, errors=none, network_restarted=false. AppKit целиком тестом не загружался; browser call chain прочитан, shared production listener и WebKit исполнялись. +> - Старые Close Other Tabs/popup duplicate нарушения не переносить на release 1.210 как неисправленные: исправления уже в коде. Незакрытый эффект didCloseWindow отличается от этих исправленных явных callbacks. Новые tests подтверждают shared-window callback; исторические merge/Fire/manual recovery варианты здесь заново не гонялись. +> - P6 теперь достигается через реальный WebExtensionFeatureFlagHandler при заданном true→false→true главного flag: новый manager, старая WKWebView/controller. Это не отменяет историческую проверку стабильного production config от 9 сентября: фактический false→true у пользователей по-прежнему не доказан. true→true не меняет manager; embedded-only toggle сохраняет controller и после readiness wait работает. +> - Отсутствие runtime listener с первого старта даёт P5 с исправными tab flags только при test-only suppression. Один пропуск listener на wake восстанавливается; долгие документы и две 35-секундные паузы host main actor P5 не дали. Native dashboard можно потерять при уже доставленном initResp. +> - Все 14 текущих P5/P6 методов имеют green по отдельным логам; пакет 478/28 skipped/0 failures. Ни один новый app fix, public post или production rollout этими тестами не выполнен. Полная матрица, красные прогоны и ограничения сохранены в основном статусе. + + + > **Current architecture/source audit — 2026-09-25:** [[cpm-service-worker-architecture-and-diagnostics]]. Read it for Service Worker architecture, measured/missing diagnostics and five prioritized validation gaps. The investigation below is historical evidence, not a current readiness verdict. In particular: extension workers use the host process’s main thread; their generic SW heartbeat is disabled; dashboard “healthy” does not prove page receipt; and M2’s stable origin requires revalidating reload/Fire recovery. No new device reproduction was performed on September 25. > Investigation summary as of 2026-09-08. This note distinguishes confirmed code paths from hypotheses that still need production evidence. diff --git a/work/projects/cpm-web-extension-breakage-session-summary-2026-10-07.md b/work/projects/cpm-web-extension-breakage-session-summary-2026-10-07.md index d2a3b351..a4264ef5 100755 --- a/work/projects/cpm-web-extension-breakage-session-summary-2026-10-07.md +++ b/work/projects/cpm-web-extension-breakage-session-summary-2026-10-07.md @@ -1,11 +1,19 @@ # CPM Web Extension breakage — полное summary сессии +> **Текущее продолжение — 15 октября 2026:** [[cpm-status-2026-10-15]]; актуальная карта worktree — [[cpm-web-extension-code-guide-2026-10-09]] (§0). Разделы 1–9 ниже относятся к 7 октября, §10 — к 9 октября; они не являются последним статусом. +> +> Добавлены 14 P5/P6 tests, все текущие методы имеют green в раздельных запусках. Найдены и проверены пути browser window-close → WebKit forgetTab → P5/tab=false и условный main-feature-flag handler cycle → replacement controller → P6. Для P5/tab=true, естественной потери metadata, actual iOS suspend/resume и production main-flag transitions доказательств нет. Полный AppKit flow не запускался; browser source contract прочитан, production shared classes и system WebKit исполнены. +> +> Пакет: 478 XCTest / 28 opt-in skipped / 0 failures; strict SwiftLint — 0. Ранние красные ожидания, проблемы постановки и отрицательные результаты не удалены: см. основной статус §10–12. Состояния PR/CI и нарезка worktree теперь проверены отдельно; прежнее «всё локально» относится к датированной части. + + + **Дата:** 7 октября 2026 **Охват:** public-attribution после релиза iOS 7.240 / macOS 1.210, исходный код Browser и WebKit, release bundle CPM, WebKit tracker и upstream regression tests. ## Короткий вывод -> Разделы 1–9 — состояние на 7 октября. Актуальный статус и находки после воспроизведения — **раздел 10**. +> Разделы 1–9 — состояние на 7 октября; раздел 10 — продолжение на 9 октября. Текущий статус — [[cpm-status-2026-10-15]]. Главный production-сигнал — не доказанная потеря `initResp`, а отсутствие в течение 4 секунд native-вызова `refreshCpmDashboardState` после завершения навигации. Поэтому большая группа, где native-снимок выглядит здоровым, означает: WebKit controller/context/scripts могли существовать, но CPM не прислал или native не сопоставил ожидаемый dashboard refresh. Она не доказывает, что extension вообще не загрузился. diff --git a/work/projects/cpm-web-extension-breakage-validation.md b/work/projects/cpm-web-extension-breakage-validation.md index c1fc2800..724a6395 100755 --- a/work/projects/cpm-web-extension-breakage-validation.md +++ b/work/projects/cpm-web-extension-breakage-validation.md @@ -1,8 +1,24 @@ # CPM Web Extension Breakage — статус и проверка причин -> **Актуальный отчёт за завершённый 5 октября 2026 UTC:** [[cpm-web-extension-public-attribution-2026-10-05]]. Он сверяет все `init failure.daily`, диагностические группы, соседние события, тренды до релиза и восстановление после stuck. Исторические internal-testing проверки и PR-план ниже сохранены как архив. +> **Актуализировано 15 октября 2026.** Текущий реестр PR/CI, данные 12–14 октября, исходы и ограничения всех новых P5/P6 tests — [[cpm-status-2026-10-15]]. Worktree/команды — [[cpm-web-extension-code-guide-2026-10-09]] (§0). Таблицы milestones, готовность M2/M5/M6 и «Network restart отвергнут» ниже — исторические оценки сентября; они не являются текущим статусом. -## Текущий статус — только после публикации release tag +## Текущая проверка — 15 октября + +- P5/tab=false: source-linked shared-pinned window close → WebKit внутренний didCloseTab → tab-not-found до wake. Exact stuck-сигнатура воспроизведена; unrelated-window control здоров. Только browser contract + shared classes/system WebKit, не полный AppKit E2E. +- P6: main flag true→false→true через production handler воспроизводит wrong-controller/no-scripts; факт переключения в production не установлен. nil-controller варианты остаются controlled. Обычный startup с correct controller здоров, embedded-only cycle сохраняет controller. +- Embedded-only sync до background ready потерял первый init (первый red control), что соответствует известному A/P4. После explicit ready wait тот же binding control здоров; это не фиксация production-поведения. +- Listener metadata с первого старта — controlled P5, естественный вход неизвестен. Один пропуск listener, длинные документы и main-actor stall P5 не дали. Реальный iOS suspend/resume и происхождение P5/tab=true остаются непроверенными. +- 14 актуальных методов green по нескольким прогонам; последние обычные tests: 478 XCTest, 28 skipped, 0 failures, 10.469 с; strict SwiftLint 8 файлов — 0. Исторические счётчики tests ниже относятся к иным bases/worktrees и не являются этим прогоном. +- Текущая сверка GitHub: #7376/#7378/#7379 и JS #3727 без failing/pending checks; #7384/#7385 — Danger=FAILURE; #7381 — красный remote head `39f94e12eaa4`, локальный fix `f1085846e7ff` не запушен. Все эти PR OPEN; подробности в основном статусе. +- M1-фильтрация явных callbacks уже есть в `1.210.0+macos`, но не предотвращает закрытие shared tabs внутри didCloseWindow. M2 stable-base-url остаётся старым экспериментом без нужного полного integration прогона. B/Network crash воспроизведён позднее сентябрьского отрицательного прогона; прежнее «отвергнуто» не универсально. + +Дальнейшие app fixes, telemetry changes, commit/push или remote flags этим обновлением не менялись. Ниже сохранены исходные датированные срезы, тесты и планы. + + + +> **Исторический отчёт за завершённый 5 октября 2026 UTC:** [[cpm-web-extension-public-attribution-2026-10-05]]. Он сверяет все `init failure.daily`, диагностические группы, соседние события, тренды до релиза и восстановление после stuck. Исторические internal-testing проверки и PR-план ниже сохранены как архив. + +## Исторический срез 5 октября — только после публикации release tag - Основной сигнал: 6 624 iOS и 1 377 macOS `initialization.failed.after.*.daily`; группы и контрольные суммы — в [[cpm-web-extension-public-attribution-2026-10-05]]. - На macOS есть 77 `init failure.daily` и 35 `stuck.daily` с controller mismatch и отсутствующими scripts **после** публикации tag; **до** публикации таких строк нет. Пиксели не содержат channel, поэтому отдельное событие нельзя строго назвать public-user report. 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 84597aa9..4c996664 100755 --- a/work/projects/cpm-web-extension-code-guide-2026-10-09.md +++ b/work/projects/cpm-web-extension-code-guide-2026-10-09.md @@ -9,6 +9,83 @@ tags: # CPM Web Extension — карта кода по worktree и строкам +> **Актуальная карта — 15 октября 2026.** Текущий статус PR/CI, данные и все 14 новых P5/P6 результатов: [[cpm-status-2026-10-15]] (§2, §5, §10–12). Датированные исходные разделы 1–4 ниже сохранены; их «ничего не закоммичено», номера строк и общий worktree описывают 9 октября, а не текущее состояние. + +## 0. Текущая карта worktree и запусков + +Корень: `/Users/admin/DuckDuckGo/apple-browsers.git/`. Проверены `git worktree list`, HEAD и наличие тестовых файлов. **Единого worktree со всеми suites нет.** Общая база в истории не включает local dirty/untracked файлы; особенно это относится к remaining-failures и scratch init-progress E2E. + +| Worktree | Ветка / текущий HEAD | Назначение и границы | +|---|---|---| +| `alex/cpm-web-extension-remaining-failures` | та же; `a0717cf098cd` | Основное расследование без A/B watchdog: P1 (3 wake), P2 (9 load failure), P3 (2 cache/cleanup), новые P5/P6 (12 lifecycle + 2 flag). Все 28 repro opt-in; `CPMRepro/` untracked. Production dirty telemetry — прежняя копия, не переносить вместе с тестами | +| `cpm-repro-harness` | `alex/cpm-repro-harness`; `dfb96279196d` | PR #7378: базовый harness, быстрые CI-контроли, медленные сценарии и raw WebKit characterization; без новых P5/P6 | +| `cpm-fix-init-loss` | `alex/cpm-fix-init-loss`; `7ad771e227bb` | PR #7379: A, первые init при install/upgrade mid-session; красное/зелёное доказательство отдельно от remaining-failures | +| `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 | +| `cpm-readiness-baseline` | `alex/cpm-readiness-baseline`; `99ecf8b12787` | #7384 поверх PR0: baseline readiness; Danger=FAILURE | +| `cpm-init-progress-native` | `alex/cpm-init-progress-native`; `46f25175c7c4` | #7385 поверх baseline: `init_stage`, 11 CPMInitProgress unit tests; Danger=FAILURE. Нужен JS privacy-extension#3727 | +| `cpm-e2e-init` | `scratch/cpm-e2e-init`; `46f25175c7c4` | Scratch harness поверх native init-progress: 3 `CPMReproInitProgressE2ETests` и базовые suites; наличие HEAD, совпадающего с #7385, не означает наличие scratch файлов в PR | +| `alex/cpm-web-extension-ready-handshake` | та же; `a0717cf098cd` | Старый объединённый локальный A/B harness и slow-wake-with-fixes; архив сравнения. Текущие PR A/B нарезаны в worktree выше | +| `cpm-stable-base-url` | `alex/cpm-stable-base-url`; `570c2f8ef479` | Старый M2 experiment: меняет baseURL всем extensions, не доведён и не прогнан через нужный integration harness. Прежнее «production-ready» в старых планах не является актуальным итогом | + +CI статусы — read-only snapshot GitHub 15 октября, 17:26 UTC. Подробные head/base/checks и все оговорки — основной статус; локальные воспроизведения не дают зелёного CI незапушенному коду. + +### 0.1. Файлы remaining-failures и полный охват + +Путь тестов — `SharedPackages/WebExtensions/Tests/WebExtensionsTests/CPMRepro/`. + +| Файл | Что искать | +|---|---| +| `CPMReproLifecycleHypothesisTests.swift:30` | 12 методов: nil/previous controller, startup healthy control, source-linked shared-window close + unrelated-window control, forgotten live tab, listener metadata, long documents/dashboard loss, host main-actor stall | +| `CPMReproProductionFlagTests.swift:30` | 2 метода: главный flag true→false→true даёт P6; true→true не меняет manager; embedded-only cycle сохраняет controller и работает после explicit ready wait | +| `CPMReproBackgroundLoadFailureTests.swift:31` | 9 методов P2: ≥30-секундный медленный запуск, 10-секундный контроль, file/script/bindings ошибки и четыре отрицательных process/load проверки | +| `CPMReproExtensionLoadCleanupTests.swift:36` | 2 метода P3: relaunch и reload при большом Network cache и смене baseURL | +| `CPMReproWakeExperimentTests.swift:25` | 3 метода P1: 5/12-секундный wake и сравнение readiness signals | +| `CPMReproTestCase.swift:37` | Базовый opt-in `CPM_REPRO=1`, Options, cleanup. `existingTabs` (68) предоставляет сохранённые view до load нового context | +| `CPMReproHarness.swift:258,269,296` | open/close additional window через production eventsListener; adopt existing view. `:175` watcher без strong reference через await; `:365` content marks | +| `CPMReproTabs.swift:29,148,165` | Реальные WKWebView, navigation gate/monitor callbacks, window/tab delegates и multiple-window provider | +| `CPMReproDelayedResource.swift:26` | Реальный 35-секундный image subresource; URL уникален на каждую навигацию | +| `CPMReproPrelude.swift` | DOM init/initResp marks, trace всех autoconsent payloads, startup/listener test seams | +| `CPMReproSupport.swift:43,92,175,213` | Pixel recorder; optional native-method suppression; temporary instrumented extension copy; WebKit process SPI | + +**Результаты:** все 14 новых методов P5/P6 имеют pass по нескольким запускам; последние обычные tests — 478 XCTest / 28 skipped / 0 failures (10.469 с), strict SwiftLint восьми изменённых файлов — 0. P1/P2/P3 в этом продолжении заново не запускались. Таблица всех 14, начальные красные результаты, log paths и SHA-256 — основной статус §12. + +### 0.2. Browser → WebKit paths + +**P5:** `MainWindowController.windowWillClose` (611–640) фильтрует сохраняемые tabs только для явных `didCloseTab`, затем unregister и `didCloseWindow`. `MainWindowController+WKWebExtensionWindow.tabs(for:)` (31) всё ещё возвращает loaded pinned + regular tabs. `WindowControllersManager.unregister` (178) не очищает closing-window collections. WebKit внутри `WebExtensionContext::didCloseWindow` сам вызывает `didCloseTab` для каждого delegate tab; тот попадает в `forgetTab`. `runtimeSendMessage` возвращает tab-not-found **до** wake. Проверены текущий browser worktree и macOS tag `1.210.0+macos`; shared-window effect исполнен на системном WebKit. + +**P6:** `AppDelegate.setupWebExtensions/initializeWebExtensions` (2153–2166, 2209–2221) и shared `FeatureFlag/WebExtensionFeatureFlagHandler.swift`: main disable → uninstall + clear references; enable при manager=nil → новый manager/controller без пересоздания старых WKWebView. `WebExtensionTab::webView` отвергает неправильный controller. Только test-controlled main-flag cycle доказан; исторические данные не подтверждают такой production transition. Default main flag enabled; повторный true и embedded-only toggle не заменяют controller. + +WebKit source checkout: `/Users/admin/Downloads/WebKit_sparse`, HEAD `99051d5d08cd9f19ec76ce599f7539d070b1ae09`: +- `Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm:1351,1419`; +- `Source/WebKit/UIProcess/Extensions/Cocoa/API/WebExtensionContextAPIRuntimeCocoa.mm:129`; +- `Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionTabCocoa.mm:339`. + +Это карта source contract и system-WebKit проверки, не утверждение о полном совпадении checkout с shipped binary. В SPM исполняются production shared classes и WebKit, а app-side host callbacks/delegates реализованы harness. + +### 0.3. Команды и предусловия + +Из `alex/cpm-web-extension-remaining-failures/SharedPackages/WebExtensions`: + +```sh +CPM_REPRO=1 CPM_REPRO_P5_P6=1 swift test --disable-automatic-resolution --filter 'CPMReproLifecycleHypothesisTests|CPMReproProductionFlagTests' +CPM_REPRO=1 CPM_REPRO_P5_P6=1 swift test --disable-automatic-resolution --filter 'CPMReproProductionFlagTests|CPMReproLifecycleHypothesisTests/testClosing' +CPM_REPRO=1 swift test --disable-automatic-resolution --filter CPMReproWakeExperimentTests +CPM_REPRO=1 swift test --disable-automatic-resolution --filter CPMReproBackgroundLoadFailureTests +swift test --disable-automatic-resolution --skip-build +``` + +Первая команда всех 14 дана для повторения: в текущей сессии 14 методов проверялись раздельными группами. `--skip-build` применим после актуальной сборки. Для P3 нужны `CPM_REPRO_CACHE_URL` (server `/fill.html?n=N`) и `CPM_REPRO_CACHE_ENTRIES` (default 20000; заполнение порядка 10 минут), затем filter `CPMReproExtensionLoadCleanupTests`. + +Выделенный PR-harness в `cpm-repro-harness` имеет быстрые tests без общего opt-in и `requireLocalRun` для тяжёлых; raw WebKit characterization требует также `CPM_REPRO_WEBKIT=1`. Новые P5/P6 живут только в remaining-failures и в PR-harness ещё не переносились. + +Environment P5/P6: macOS 26.7.1 (25G241), Xcode 27.1 (27A9275), embedded bundle 2026.9.29. M4 в этих 14 tests выключен, gate включён, Network PID прогрет до context-load; production bundle zip не правился, temporary copy содержит trace/DOM instrumentation. Нативные flags в production не переключались. + +--- + +**Архив карты на 9 октября.** Все следующие разделы сохранены для старых source line references и истории экспериментов; текущие точки входа и статус — выше. + Контекст: [[cpm-web-extension-breakage-session-summary-2026-10-07]] (раздел 10), [[cpm-web-extension-repro-and-fix-2026-10-08]]. Номера строк — на 9 октября. **Ничего не закоммичено.** Корень всех worktree — `/Users/admin/DuckDuckGo/apple-browsers.git/`; пути ниже даны от корня worktree. `SP` = `SharedPackages/WebExtensions/Sources/WebExtensions`, `TP` = `SharedPackages/WebExtensions/Tests/WebExtensionsTests`. | Worktree | Ветка, база | Что внутри | diff --git a/work/projects/cpm-web-extension-data-analysis-summary-2026-10-08.md b/work/projects/cpm-web-extension-data-analysis-summary-2026-10-08.md index 63b5899a..138f99f7 100755 --- a/work/projects/cpm-web-extension-data-analysis-summary-2026-10-08.md +++ b/work/projects/cpm-web-extension-data-analysis-summary-2026-10-08.md @@ -10,6 +10,14 @@ tags: # CPM Web Extension failures: what the data shows +> **Current status — 2026-10-15:** [[cpm-status-2026-10-15]] (§3–5, §10–12). The October 8 data and denominators below are retained; use the main status for the October 12–14 cohort snapshot and the October 14 P5/P6 selection. These are different cuts, not interchangeable totals. +> +> New causal evidence is narrower than a whole production cohort: shared-window closure reproduces P5/tab=false through production listener + system WebKit; a main-flag cycle through the real handler reproduces P6, but actual production flag changes remain unproven. This does not retract the earlier observation that the normal remote flag was stable. P5/tab=true, natural listener metadata loss and real iOS lifecycle are still unexplained. +> +> Controlled long documents and host main-actor stalls did not match P5. Lost dashboard delivery can produce detector stuck even when the page receives initResp. The 14 current methods are green across separate local runs; this is mechanism/control evidence, not an estimate of prevalence or shipped-fix impact. The main status preserves 494 vs 499 P5 denominator differences, 627 + 235 P6 patterns, attribution limits and all red/negative results. + + + ## Context Cookie Pop-up Management (CPM) runs in the iOS and macOS browsers as a built-in web extension. It has two parts: diff --git a/work/projects/cpm-web-extension-public-attribution-2026-10-05.md b/work/projects/cpm-web-extension-public-attribution-2026-10-05.md index dbb22f40..591d3932 100755 --- a/work/projects/cpm-web-extension-public-attribution-2026-10-05.md +++ b/work/projects/cpm-web-extension-public-attribution-2026-10-05.md @@ -1,5 +1,11 @@ # CPM Web Extension: attribution и сравнение релизов — 5 октября 2026 +> **Исторический отчёт за 5 октября; контекст обновлён 15 октября.** Таблицы, release-tag cutoffs и контрольные суммы этого дня сохранены без пересчёта. Текущие когорты 12–14 октября, PR/CI и P5/P6 tests — [[cpm-status-2026-10-15]]; переносить новые числа в прежние знаменатели нельзя. +> +> Дополнительная проверка показала: фильтр сохранённых tabs перед явным didCloseTab уже присутствует в release 1.210, однако последующий didCloseWindow заставляет WebKit снова закрыть shared pinned tabs, которые возвращает delegate. Этот путь воспроизвёл P5/tab=false; наличие исходного M1 fix не доказывает устранение всего window-close контракта. Условный main-flag cycle воспроизводит P6, но его occurrence в этом или более позднем production-срезе не доказан. Полная область объяснения и контроли — основной статус §11–12. + + + **Статус:** первый завершённый UTC-день с данными версий iOS 7.240.0 и macOS 1.210.0. Главный сигнал — `initialization.failed.after.*.daily`; `messaging.stuck.*.daily` проверен отдельно как более поздний, менее точный сигнал. Выгрузка сделана 6 октября из Grafana ClickHouse `metrics.pixels`, интервал `[2026-10-05 00:00, 2026-10-06 00:00) UTC`, `agent` и `appVersion` зафиксированы. **Основные таблицы ниже включают только события после публикации release tag каждой платформы**; отдельный раздел сохраняет всё попавшее в выгрузку до публикации. [Dashboard](https://grafana.duckduckgo.com/d/dfon7whlilnggb/cpm-weird-error-investigation?orgId=1). **Вывод:** после публикации macOS tag есть **77** первых init failures и **35** stuck с несовпадающим controller вкладки и отсутствующими extension scripts; **до публикации таких строк нет**. iOS session restoration по-прежнему даёт 952 первых сбоя, из них 604 со совпадающим controller, но без scripts и background view; у macOS после публикации таких session-restoration сбоев 68, из них 12 с той же сигнатурой. **Крупнейшая группа с «исправным native-снимком» не доказывает нормальную загрузку или потерю `initResp`: health monitor измеряет отдельный вызов background → native `refreshCpmDashboardState`.** После reload этот вызов вновь наблюдается гораздо чаще, но восстановление фактического `initResp` из пикселей не следует. Эффект исправлений tab lifecycle в совокупном тренде не выделяется. diff --git a/work/projects/cpm-web-extension-repro-and-fix-2026-10-08.md b/work/projects/cpm-web-extension-repro-and-fix-2026-10-08.md index 449ca22d..d7ad91cf 100755 --- a/work/projects/cpm-web-extension-repro-and-fix-2026-10-08.md +++ b/work/projects/cpm-web-extension-repro-and-fix-2026-10-08.md @@ -10,6 +10,14 @@ tags: # CPM Web Extension — воспроизведение и фикс +> **Текущий статус — 15 октября 2026:** [[cpm-status-2026-10-15]]. Актуальная карта файлов и worktree — [[cpm-web-extension-code-guide-2026-10-09]] (§0). «Ничего не закоммичено», общий ready-handshake worktree и counts ниже относятся к состоянию 8–9 октября; A/B/telemetry уже разделены на PR, их актуальные heads/CI проверены в основном статусе. +> +> Новое продолжение в `alex/cpm-web-extension-remaining-failures`: 14 P5/P6 методов с green по отдельным логам, включая shared-window callback → system WebKit → P5/tab=false и условный main-flag handler cycle → P6. Факт flag-transition у пользователей и естественный вход P5/tab=true/listener metadata неизвестны. Контроли не дали P5 при длинных документах, одном missing-listener wake или host main-actor stall. Embedded-only first-init loss относится к A; после explicit ready wait controller остаётся correct. +> +> Последний обычный пакет этого worktree: 478 XCTest, 28 skipped, 0 failures; 14 slow repro выполнялись отдельно. Цифры 490/677/761 в других branches описывают иные тестовые базы, не этот прогон. Все исходные красные эксперименты и ограничения сохранены в основном статусе §10–12; этот отчёт ниже сохранён как историческая цепочка расследования. + + + Продолжение [[cpm-web-extension-breakage-session-summary-2026-10-07]] (§8 «План точного воспроизведения»). Среда: macOS 26.7.1 (25G241), system WebKit, production embedded extension 2026.9.29. Код: worktree `alex/cpm-web-extension-ready-handshake`, пакет `SharedPackages/WebExtensions`. **Ничего не закоммичено.** diff --git a/work/projects/cpm-web-extension-repro-and-fixes-summary-2026-10-08.md b/work/projects/cpm-web-extension-repro-and-fixes-summary-2026-10-08.md index bf6fef29..f417ec24 100755 --- a/work/projects/cpm-web-extension-repro-and-fixes-summary-2026-10-08.md +++ b/work/projects/cpm-web-extension-repro-and-fixes-summary-2026-10-08.md @@ -10,6 +10,14 @@ tags: # CPM Web Extension failures: reproduction and fixes +> **Current status — 2026-10-15:** [[cpm-status-2026-10-15]]; current code/worktree map: [[cpm-web-extension-code-guide-2026-10-09]] (§0). The October 8 summary below is retained as history. Its “all code local / none in review” statement is no longer current: harness #7378, A #7379, B #7381 and telemetry #7376/#7384/#7385 plus JS #3727 are open PRs. B's local fix is still absent from its red remote head. +> +> New evidence: closing a window that still reports a shared pinned tab makes system WebKit forget the surviving tab and reproduces exact P5/tab=false. Cycling the main flag through the production handler reproduces P6 on a view retaining the previous controller; occurrence of that flag transition in production remains unproven. Browser callbacks/delegates are modeled from source in the harness; this is not a full browser-app E2E run. +> +> All 14 current P5/P6 methods pass across separate runs; ordinary package 478 XCTest / 28 skipped / 0 failures. No natural trigger is proven for empty listener metadata, P5/tab=true, or iOS lifecycle. Long documents and host stalls did not produce P5. Page initResp receipt is asserted in healthy controls; dashboard receipt alone still does not prove it in production. Temporary test copies may include instrumentation/fault preludes; the production bundled zip is unchanged. Full results, original red runs and commands are preserved in the main status. + + + ## Context Cookie Pop-up Management (CPM) runs in the iOS and macOS browsers as a built-in web extension: a content script in every page plus a shared background service worker that WebKit starts on demand and unloads after about 30 seconds of inactivity.