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 f7f4b997..6b78970d 100755 --- a/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md +++ b/work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md @@ -1,3 +1,5 @@ +> **Актуально — 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. Новый signed-app detection-only case и ON 9 → OFF 6 → ON 9 выполняются; app результат пока не заявлен. Формы не менялись, late reload flag default disabled. Подробные условия/ограничения и artifacts — в разделе «19 октября 2026 — P4 detection независимо от late-document reload». Более ранние 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 ниже относятся к истории. @@ -428,3 +430,30 @@ OFF failure reasons проверены по xcresult: install/upgrade/slow-wake CI опубликованного **`e970e8c90e` завершён: 48 SUCCESS / 21 SKIPPED**, failures/pending нет. GitHub readback подтвердил оба remote heads, прежнюю базу #7376 / `713d67419a` и точное сохранённое PR body. Production worktree возвращён на `alex/cpm-fix-init-loss`, tracked/untracked diff пуст; обе ветки up to date. Новых production изменений после validation нет. Формы оставлены как согласовано; independent late-recovery flag default disabled. Артефакты `/private/tmp/cpm-pr7379-uninstall-fix-20261019/`: `validation-summary.json`, три `app-*-summary.json` и `.xcresult`, exported attachment folders, `app-on-evidence-summary.json`, три `hashes-*.json`, `pr-final.json`, `remote-heads.txt`. Прежние промежуточные snapshots выше сохранены как история. + +## 19 октября 2026 — P4 detection независимо от late-document reload + +**Запрос:** считать затронутые документы/установки при выключенном `webExtensions.cpmLateBackgroundDocumentRecovery`, без автоматической перезагрузки страницы. + +**Опубликовано:** production `alex/cpm-fix-init-loss` / **`fc87237a476cca58a17fde69b3091b8e99602e03`** в [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379), база #7376 / `713d67419a`, 7 commits / 22 changed paths. Отдельный review-only harness `codex/cpm-fix-init-loss-integration-tests` / **`475095b33535467f9d63eda6d593cf95242d0449`**, по-прежнему 12 harness-only paths вне main. Обе ветки опубликованы обычным fast-forward push. Ручные правки PR description сохранены; reviewer steps обновлены на **9 PASS → 6 ожидаемых functional FAIL → 9 PASS**. + +### Что именно считается + +Новый `web_extension_cpm_startup_response_missing` (macOS: `web_extension_cpm_startup_response_missing_macos`), частота **dailyAndCount**, без custom parameters. Daily оценивает число затронутых установок за день; count — число подходящих документов. Это не число уникальных людей за всё время. + +Сигнал возникает **один раз на документ**, если HTTP(S)-документ закоммичен во время известного ещё незавершённого **первого monitored background startup данного embedded context**, ожидание CPM dashboard response завершилось timeout, а WebKit startup callback успешно завершился в пределах 30 секунд от начала startup. Порядок callback и timeout не важен. Обычные последующие idle wakes того же context, здоровые/сменившиеся/отменённые документы, invalidated context, failed startup и истёкшее 30-секундное окно исключаются. Это **P4 candidate signature**, не доказательство потери именно initResp и не доказательство единственной первопричины; исторические P4/P6 и bg_events наблюдения ниже остаются в силе. + +Детекция **не зависит от late recovery flag**, GET/form reload eligibility и нахождения приложения на переднем плане. Она не запускает safety JavaScript, reload или дополнительную WebKit background load. URL, tab ID, значения форм и raw errors в pixel не передаются. First-startup identity учитывается слабым набором WKWebExtensionContext; проверено, что WKWebExtensionContext использует NSObject identity equality. Это отдельный счётчик, а не переименование `late_document_reload/response_received`: прежние recovery pixels продолжают означать действия/результат восстановления. + +Возможность reload по-прежнему проверяет flag и условия безопасности. Для документа, отслеживаемого при выключенном флаге, позднее включение флага не разрешает retroactive reload. Navigation wait limit не увеличен. Исходный form predicate не изменён, ранее отложенное усиление защиты форм не добавлялось; default late recovery flag остаётся **disabled**. + +### Проверки production и app fixture + +- **197 shared unit tests PASS / 0 failures**: 13 diagnostics + 20 recovery + 78 monitor + 35 lifecycle + 51 manager. В этом изменении добавлено 7 regression methods; всего 36 новых shared regressions относительно базы. +- Покрыты OFF без preflight/reload closure, обе очередности timeout/readiness, once-per-document и несколько табов, idle wake exclusion, healthy/navigation/cancel/invalidate/failed/expired exclusions, независимость detection/recovery outcomes и PIIFree daily/count metadata. +- Production strict lint: **6 изменённых Swift files / 0 violations**; harness strict lint: **2 / 0**. macOS/iOS pixel definitions и обе wide-event validation/schema immutability проверки **PASS**. +- Полные **signed macOS** и **iOS Simulator app builds PASS**. Обычная Apple Development signing сохранена. +- App fixture: новый `CPMBackgroundRecoveryIntegrationTests.testLateStartupIsDetectedWithRecoveryDisabledWithoutReload` явно выключает production late recovery flag, задерживает реальный background startup на 8 секунд, требует реальный dashboard timeout, detection count = 1, один finish исходного документа, отсутствие recovery outcomes и здоровую следующую ручную навигацию. P1/P2 fixture также проверяет, что idle wake не увеличивает P4 counter; pixel adapter проверяет имя/частоту/параметры. +- **App ON/OFF/ON: выполняется; результат ещё не заявлен.** Normal scheme содержит 9 методов; OFF scheme — прежние шесть функциональных recovery controls. Новый detection-only positive case исполняется normal scheme с late recovery flag OFF. Setup/host errors не считаются ожидаемыми functional failures. + +Локальные artifacts: `/private/tmp/cpm-p4-detection-20261019/`: `unit.log`, `unit-evidence.json` (96 production source files byte-identical), `lint.log`, `harness-lint.log`, четыре pixel validation logs, `mac-build.log`, `ios-build.log`, `context-identity.log`, `heads.json`, `pr-body.md`, app result bundles. Исторические результаты предыдущего head `e970e8c90e` (190 / 8→6→8) выше/ниже сохранены и не являются результатами нового head. diff --git a/work/projects/cpm-status-2026-10-15.md b/work/projects/cpm-status-2026-10-15.md index 97e05884..186c14c3 100755 --- a/work/projects/cpm-status-2026-10-15.md +++ b/work/projects/cpm-status-2026-10-15.md @@ -6,6 +6,8 @@ tags: - cpm - status --- +> **Актуально — 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. Новый signed-app detection-only case и ON 9 → OFF 6 → ON 9 выполняются; app результат пока не заявлен. Формы не менялись, late reload flag default disabled. Подробные условия/ограничения и artifacts — в разделе «19 октября 2026 — P4 detection независимо от late-document reload». Более ранние 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 ниже относятся к истории. @@ -64,7 +66,7 @@ tags: |---|---|---|---|---| | [#7378](https://github.com/duckduckgo/apple-browsers/pull/7378) | `alex/cpm-repro-harness` | main | harness (только тесты); 4 быстрых теста в CI около 3 с, остальное локально через `CPM_REPRO=1` | OPEN, head `dfb96279196d`; 37 success / 18 skipped, без failure/pending; REVIEW_REQUIRED. Предыдущее Danger-предупреждение о 1570 строках сохранено как историческое; в ветке есть коммит другой сессии «Require initResp in the page…» | | [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) | `alex/cpm-fix-init-loss` | harness | фикс A: ожидание первой загрузки background после установки/апгрейда посреди сессии | OPEN, head `7ad771e227bb`; 35 success / 20 skipped, без failure/pending; прежние красный и зелёный прогоны сохраняются | -| [#7379 — актуально 19 Oct](https://github.com/duckduckgo/apple-browsers/pull/7379) | `alex/cpm-fix-init-loss`, worktree `alex/cpm-fix-p1-p2`; local/remote `e970e8c90e` | **#7376 / telemetry** | install/upgrade + P1/P2 + late GET recovery, 5 fix pixels; 29 новых shared regressions, 190 PASS; общий launch/navigation deadline, точная WKNavigation attribution и отмена pending reload при active-context uninstall; формы отложены | OPEN, 6 commits / 22 files; normal push выполнен, macOS/iOS builds и lint PASS. Review-only harness local/remote `e380cf98f7`, 12 paths вне main; на одних signed binaries ON 8 PASS → OFF 6 functional FAIL → ON 8 PASS; CI 48 SUCCESS / 21 SKIPPED, завершён | +| [#7379 — актуально 19 Oct](https://github.com/duckduckgo/apple-browsers/pull/7379) | `alex/cpm-fix-init-loss`, worktree `alex/cpm-fix-p1-p2`; local/remote `fc87237a47` | **#7376 / telemetry** | install/upgrade + P1/P2 + late GET recovery, 5 fix pixels + independent P4 candidate daily/count; 36 новых shared regressions, 197 PASS; detection при late flag OFF без reload/safety JS; формы отложены | OPEN, 7 commits / 22 paths; normal push выполнен, macOS/iOS builds, pixels/lint PASS. Review-only harness `475095b335`, 12 paths вне main; signed-app ON 9 → OFF 6 → ON 9 выполняется | | [#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 | @@ -1234,3 +1236,30 @@ OFF failure reasons проверены по xcresult: install/upgrade/slow-wake CI опубликованного **`e970e8c90e` завершён: 48 SUCCESS / 21 SKIPPED**, failures/pending нет. GitHub readback подтвердил оба remote heads, прежнюю базу #7376 / `713d67419a` и точное сохранённое PR body. Production worktree возвращён на `alex/cpm-fix-init-loss`, tracked/untracked diff пуст; обе ветки up to date. Новых production изменений после validation нет. Формы оставлены как согласовано; independent late-recovery flag default disabled. Артефакты `/private/tmp/cpm-pr7379-uninstall-fix-20261019/`: `validation-summary.json`, три `app-*-summary.json` и `.xcresult`, exported attachment folders, `app-on-evidence-summary.json`, три `hashes-*.json`, `pr-final.json`, `remote-heads.txt`. Прежние промежуточные snapshots выше сохранены как история. + +## 19 октября 2026 — P4 detection независимо от late-document reload + +**Запрос:** считать затронутые документы/установки при выключенном `webExtensions.cpmLateBackgroundDocumentRecovery`, без автоматической перезагрузки страницы. + +**Опубликовано:** production `alex/cpm-fix-init-loss` / **`fc87237a476cca58a17fde69b3091b8e99602e03`** в [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379), база #7376 / `713d67419a`, 7 commits / 22 changed paths. Отдельный review-only harness `codex/cpm-fix-init-loss-integration-tests` / **`475095b33535467f9d63eda6d593cf95242d0449`**, по-прежнему 12 harness-only paths вне main. Обе ветки опубликованы обычным fast-forward push. Ручные правки PR description сохранены; reviewer steps обновлены на **9 PASS → 6 ожидаемых functional FAIL → 9 PASS**. + +### Что именно считается + +Новый `web_extension_cpm_startup_response_missing` (macOS: `web_extension_cpm_startup_response_missing_macos`), частота **dailyAndCount**, без custom parameters. Daily оценивает число затронутых установок за день; count — число подходящих документов. Это не число уникальных людей за всё время. + +Сигнал возникает **один раз на документ**, если HTTP(S)-документ закоммичен во время известного ещё незавершённого **первого monitored background startup данного embedded context**, ожидание CPM dashboard response завершилось timeout, а WebKit startup callback успешно завершился в пределах 30 секунд от начала startup. Порядок callback и timeout не важен. Обычные последующие idle wakes того же context, здоровые/сменившиеся/отменённые документы, invalidated context, failed startup и истёкшее 30-секундное окно исключаются. Это **P4 candidate signature**, не доказательство потери именно initResp и не доказательство единственной первопричины; исторические P4/P6 и bg_events наблюдения ниже остаются в силе. + +Детекция **не зависит от late recovery flag**, GET/form reload eligibility и нахождения приложения на переднем плане. Она не запускает safety JavaScript, reload или дополнительную WebKit background load. URL, tab ID, значения форм и raw errors в pixel не передаются. First-startup identity учитывается слабым набором WKWebExtensionContext; проверено, что WKWebExtensionContext использует NSObject identity equality. Это отдельный счётчик, а не переименование `late_document_reload/response_received`: прежние recovery pixels продолжают означать действия/результат восстановления. + +Возможность reload по-прежнему проверяет flag и условия безопасности. Для документа, отслеживаемого при выключенном флаге, позднее включение флага не разрешает retroactive reload. Navigation wait limit не увеличен. Исходный form predicate не изменён, ранее отложенное усиление защиты форм не добавлялось; default late recovery flag остаётся **disabled**. + +### Проверки production и app fixture + +- **197 shared unit tests PASS / 0 failures**: 13 diagnostics + 20 recovery + 78 monitor + 35 lifecycle + 51 manager. В этом изменении добавлено 7 regression methods; всего 36 новых shared regressions относительно базы. +- Покрыты OFF без preflight/reload closure, обе очередности timeout/readiness, once-per-document и несколько табов, idle wake exclusion, healthy/navigation/cancel/invalidate/failed/expired exclusions, независимость detection/recovery outcomes и PIIFree daily/count metadata. +- Production strict lint: **6 изменённых Swift files / 0 violations**; harness strict lint: **2 / 0**. macOS/iOS pixel definitions и обе wide-event validation/schema immutability проверки **PASS**. +- Полные **signed macOS** и **iOS Simulator app builds PASS**. Обычная Apple Development signing сохранена. +- App fixture: новый `CPMBackgroundRecoveryIntegrationTests.testLateStartupIsDetectedWithRecoveryDisabledWithoutReload` явно выключает production late recovery flag, задерживает реальный background startup на 8 секунд, требует реальный dashboard timeout, detection count = 1, один finish исходного документа, отсутствие recovery outcomes и здоровую следующую ручную навигацию. P1/P2 fixture также проверяет, что idle wake не увеличивает P4 counter; pixel adapter проверяет имя/частоту/параметры. +- **App ON/OFF/ON: выполняется; результат ещё не заявлен.** Normal scheme содержит 9 методов; OFF scheme — прежние шесть функциональных recovery controls. Новый detection-only positive case исполняется normal scheme с late recovery flag OFF. Setup/host errors не считаются ожидаемыми functional failures. + +Локальные artifacts: `/private/tmp/cpm-p4-detection-20261019/`: `unit.log`, `unit-evidence.json` (96 production source files byte-identical), `lint.log`, `harness-lint.log`, четыре pixel validation logs, `mac-build.log`, `ios-build.log`, `context-identity.log`, `heads.json`, `pr-body.md`, app result bundles. Исторические результаты предыдущего head `e970e8c90e` (190 / 8→6→8) выше/ниже сохранены и не являются результатами нового head. 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 b368560e..009e5255 100755 --- a/work/projects/cpm-web-extension-code-guide-2026-10-09.md +++ b/work/projects/cpm-web-extension-code-guide-2026-10-09.md @@ -6,6 +6,8 @@ tags: - cpm - webkit --- +> **Актуально — 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. Новый signed-app detection-only case и ON 9 → OFF 6 → ON 9 выполняются; app результат пока не заявлен. Формы не менялись, late reload flag default disabled. Подробные условия/ограничения и artifacts — в разделе «19 октября 2026 — P4 detection независимо от late-document reload». Более ранние 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 ниже относятся к истории. @@ -34,8 +36,8 @@ tags: | `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` — историческая строка; worktree удалён 16 Oct | `alex/cpm-fix-init-loss`; `7ad771e227bb` | PR #7379: A, первые init при install/upgrade mid-session; красное/зелёное доказательство отдельно от remaining-failures | -| **`alex/cpm-fix-p1-p2` — актуально 19 Oct** | **`alex/cpm-fix-init-loss`; local/remote `e970e8c90e`** | PR #7379 / база #7376: 6 commits / 22 paths, 29 новых shared tests, 190 PASS. Launch deadline, WKNavigation attribution и uninstall/preflight race исправлены и опубликованы; формы отложены, late reload flag default disabled; builds/lint PASS | -| — (отдельная ветка, без своего worktree) | **`codex/cpm-fix-init-loss-integration-tests`; local/remote `e380cf98f7`** | Синхронизирована с production `e970e8c90e`, README: 29 новых shared tests; 8 app methods, ON/OFF schemes, PBX + 3 DEBUG app hooks; 12 paths вне main. На одних signed binaries ON 8 PASS → OFF 6 functional FAIL → ON 8 PASS; SHA256 совпали | +| **`alex/cpm-fix-p1-p2` — актуально 19 Oct** | **`alex/cpm-fix-init-loss`; local/remote `fc87237a47`** | PR #7379 / база #7376: 7 commits / 22 paths, 36 новых shared tests, 197 PASS. Independent P4 candidate detection при late flag OFF без reload/safety JS; deadline/attribution/uninstall fixes сохранены; формы отложены, late flag default disabled; builds/pixels/lint PASS | +| — (отдельная ветка, без своего worktree) | **`codex/cpm-fix-init-loss-integration-tests`; local/remote `475095b335`** | Синхронизирована с production `fc87237a47`, README: 36 новых shared tests; 9 app methods, включая detection-only с late flag OFF; ON/OFF schemes, PBX + 3 DEBUG app hooks; 12 paths вне main. Signed-app ON 9 → OFF 6 → ON 9 выполняется | | `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 | @@ -518,3 +520,30 @@ OFF failure reasons проверены по xcresult: install/upgrade/slow-wake CI опубликованного **`e970e8c90e` завершён: 48 SUCCESS / 21 SKIPPED**, failures/pending нет. GitHub readback подтвердил оба remote heads, прежнюю базу #7376 / `713d67419a` и точное сохранённое PR body. Production worktree возвращён на `alex/cpm-fix-init-loss`, tracked/untracked diff пуст; обе ветки up to date. Новых production изменений после validation нет. Формы оставлены как согласовано; independent late-recovery flag default disabled. Артефакты `/private/tmp/cpm-pr7379-uninstall-fix-20261019/`: `validation-summary.json`, три `app-*-summary.json` и `.xcresult`, exported attachment folders, `app-on-evidence-summary.json`, три `hashes-*.json`, `pr-final.json`, `remote-heads.txt`. Прежние промежуточные snapshots выше сохранены как история. + +## 19 октября 2026 — P4 detection независимо от late-document reload + +**Запрос:** считать затронутые документы/установки при выключенном `webExtensions.cpmLateBackgroundDocumentRecovery`, без автоматической перезагрузки страницы. + +**Опубликовано:** production `alex/cpm-fix-init-loss` / **`fc87237a476cca58a17fde69b3091b8e99602e03`** в [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379), база #7376 / `713d67419a`, 7 commits / 22 changed paths. Отдельный review-only harness `codex/cpm-fix-init-loss-integration-tests` / **`475095b33535467f9d63eda6d593cf95242d0449`**, по-прежнему 12 harness-only paths вне main. Обе ветки опубликованы обычным fast-forward push. Ручные правки PR description сохранены; reviewer steps обновлены на **9 PASS → 6 ожидаемых functional FAIL → 9 PASS**. + +### Что именно считается + +Новый `web_extension_cpm_startup_response_missing` (macOS: `web_extension_cpm_startup_response_missing_macos`), частота **dailyAndCount**, без custom parameters. Daily оценивает число затронутых установок за день; count — число подходящих документов. Это не число уникальных людей за всё время. + +Сигнал возникает **один раз на документ**, если HTTP(S)-документ закоммичен во время известного ещё незавершённого **первого monitored background startup данного embedded context**, ожидание CPM dashboard response завершилось timeout, а WebKit startup callback успешно завершился в пределах 30 секунд от начала startup. Порядок callback и timeout не важен. Обычные последующие idle wakes того же context, здоровые/сменившиеся/отменённые документы, invalidated context, failed startup и истёкшее 30-секундное окно исключаются. Это **P4 candidate signature**, не доказательство потери именно initResp и не доказательство единственной первопричины; исторические P4/P6 и bg_events наблюдения ниже остаются в силе. + +Детекция **не зависит от late recovery flag**, GET/form reload eligibility и нахождения приложения на переднем плане. Она не запускает safety JavaScript, reload или дополнительную WebKit background load. URL, tab ID, значения форм и raw errors в pixel не передаются. First-startup identity учитывается слабым набором WKWebExtensionContext; проверено, что WKWebExtensionContext использует NSObject identity equality. Это отдельный счётчик, а не переименование `late_document_reload/response_received`: прежние recovery pixels продолжают означать действия/результат восстановления. + +Возможность reload по-прежнему проверяет flag и условия безопасности. Для документа, отслеживаемого при выключенном флаге, позднее включение флага не разрешает retroactive reload. Navigation wait limit не увеличен. Исходный form predicate не изменён, ранее отложенное усиление защиты форм не добавлялось; default late recovery flag остаётся **disabled**. + +### Проверки production и app fixture + +- **197 shared unit tests PASS / 0 failures**: 13 diagnostics + 20 recovery + 78 monitor + 35 lifecycle + 51 manager. В этом изменении добавлено 7 regression methods; всего 36 новых shared regressions относительно базы. +- Покрыты OFF без preflight/reload closure, обе очередности timeout/readiness, once-per-document и несколько табов, idle wake exclusion, healthy/navigation/cancel/invalidate/failed/expired exclusions, независимость detection/recovery outcomes и PIIFree daily/count metadata. +- Production strict lint: **6 изменённых Swift files / 0 violations**; harness strict lint: **2 / 0**. macOS/iOS pixel definitions и обе wide-event validation/schema immutability проверки **PASS**. +- Полные **signed macOS** и **iOS Simulator app builds PASS**. Обычная Apple Development signing сохранена. +- App fixture: новый `CPMBackgroundRecoveryIntegrationTests.testLateStartupIsDetectedWithRecoveryDisabledWithoutReload` явно выключает production late recovery flag, задерживает реальный background startup на 8 секунд, требует реальный dashboard timeout, detection count = 1, один finish исходного документа, отсутствие recovery outcomes и здоровую следующую ручную навигацию. P1/P2 fixture также проверяет, что idle wake не увеличивает P4 counter; pixel adapter проверяет имя/частоту/параметры. +- **App ON/OFF/ON: выполняется; результат ещё не заявлен.** Normal scheme содержит 9 методов; OFF scheme — прежние шесть функциональных recovery controls. Новый detection-only positive case исполняется normal scheme с late recovery flag OFF. Setup/host errors не считаются ожидаемыми functional failures. + +Локальные artifacts: `/private/tmp/cpm-p4-detection-20261019/`: `unit.log`, `unit-evidence.json` (96 production source files byte-identical), `lint.log`, `harness-lint.log`, четыре pixel validation logs, `mac-build.log`, `ios-build.log`, `context-identity.log`, `heads.json`, `pr-body.md`, app result bundles. Исторические результаты предыдущего head `e970e8c90e` (190 / 8→6→8) выше/ниже сохранены и не являются результатами нового head.