[2026-10-19] eagle: work/projects/cpm-readiness-telemetry-tech-design-2026-10-15.md work/projects/cpm-status-2026-10-15.md work/projects/cpm-web-extension-code-guide-2026-10-09.md
This commit is contained in:
1 parent
b7ad0bd78e
commit
e70cc8550f
3 files changed
+81
-3
No files matched your search
@@ -1,3 +1,5 @@
|
||||
> **Актуально — 19 октября 2026, полное ревью #7379 после P4 detection.** Проверен опубликованный после rebase **`a00dc4afeb`** / база #7376 **`c7adf28e12`**, 7 commits / 22 paths. Найден **1 новый P2: error-6 startup может ошибочно попасть в P4 detection после позднего callback успешного retry**. На текущем head: **196 существующих shared tests PASS + 2 дополнительных probes PASS / 1 новый probe FAIL**. Проверочная однострочная правка только в изолированной копии даёт **199 PASS**; в PR она не внесена. Pixel validators обеих платформ PASS. CI snapshot: 31 SUCCESS / 14 SKIPPED / 4 IN_PROGRESS / 3 QUEUED, failures нет, CI ещё идёт. Предыдущие 197 unit и app 9→6→9 относятся к `fc87237a47`; новая база убрала один retired-telemetry тест. Подробности и границы воспроизведения — в разделе «Полное ревью после P4 detection — error-6 attribution». История ниже сохранена.
|
||||
|
||||
> **Актуально — 19 октября 2026, P4 detection без reload опубликована и проверена.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`fc87237a47`**, 7 commits / 22 paths; review-only harness **`475095b335`**, 12 paths вне main. Новый dailyAndCount `web_extension_cpm_startup_response_missing` считает P4 candidates независимо от late recovery flag, без reload и safety JavaScript. **197 unit PASS**, signed macOS и iOS app builds PASS, pixel validators PASS, strict lint 6 production + 2 harness / 0. На одних подписанных app/XCTest binaries: **ON 9 PASS → OFF 6 ожидаемых functional FAIL → ON 9 PASS**, без skips/expected failures, SHA256 совпали. Новый detection-only case дважды подтвердил detection = 1 / finishCount = 1 / late recovery OFF / no late reload outcomes; оба late OFF controls также дали по detection = 1. CI нового head: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. Формы не менялись, late reload flag default disabled. PR steps и все три документа актуализированы; worktree возвращён на чистую production branch. Более ранние heads/results сохранены как история.
|
||||
|
||||
> **Актуально — 19 октября 2026, uninstall fix опубликован.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`e970e8c90e`**, 6 commits / 22 paths; отдельный review-only harness **`e380cf98f7`**, 12 paths вне main. Удаление активного CPM context отменяет pending late-document recovery; удаление старой upgrade-версии и ошибка unload сохраняют recovery. **190 unit PASS**, red-before-fix 2 PASS / 1 FAIL, signed macOS и iOS Simulator builds PASS, strict lint 11 / 0. На новом app head проверено на одних подписанных бинарниках: **ON 8 PASS → OFF 6 ожидаемых functional FAIL → ON 8 PASS**, без skips/expected failures; все app/XCTest SHA256 совпали. CI `e970e8c90e`: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. PR description и reviewer flag steps актуализированы с сохранением ручных правок. Формы оставлены в прежнем виде; late reload flag default disabled. Предыдущие heads/results ниже — история.
|
||||
@@ -460,3 +462,27 @@ CI опубликованного **`e970e8c90e` завершён: 48 SUCCESS /
|
||||
- **CI production head `fc87237a47`: 48 SUCCESS / 21 SKIPPED, pending и failures нет.** PR head/base/description проверены чтением после публикации; `pr-final.json`. Worktree чистый и возвращён на `alex/cpm-fix-init-loss`; обе локальные ветки совпадают с origin.
|
||||
|
||||
Локальные 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, `detection-only-evidence.json`, `off-control-evidence.json`, `validation-summary.json`, три SHA256 snapshots, `pr-final.json`. Исторические результаты предыдущего head `e970e8c90e` (190 / 8→6→8) выше/ниже сохранены и не являются результатами нового head.
|
||||
|
||||
## Полное ревью после P4 detection — error-6 attribution (19 октября 2026)
|
||||
|
||||
Проверен полный diff [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) относительно #7376: manager/install/upgrade/uninstall/reload, общий launch/navigation deadline и cancellation, WebKit navigation identity, обе платформенные интеграции, runtime flags, P4/health-monitor evidence и pixel adapters/definitions, а также shared regressions и reviewer instructions. Ревью начато на `fc87237a47` / `713d67419a`; во время проверки опубликовано перебазирование на `a00dc4afeb95b3fbbbb95dc50ce450c49004f3e2` / `c7adf28e1254da79d788125033474db737b11b6d`. Затронутая логика manager/recovery/lifecycle не изменилась; замечание отдельно повторено на новом head. Полный diff по-прежнему 7 commits / 22 paths.
|
||||
|
||||
**Открытое замечание P2 — failed startup с error 6 не инвалидируется в P4 detector.** `WebExtensionManager.swift:319–320`: error notification завершает только manager startup task через `clearEmbeddedBackgroundStartup()`, сохраняя startup и его документы в `CPMBackgroundReadinessRecovery`. Если WebKit сохраняет pending load callbacks до удачного retry, старый callback приходит с `nil`; `backgroundCompleted(oldID, succeeded: true)` делает уже провалившийся first startup успешным для P4. При timeout документа и завершении retry до 30 секунд detector посылает `web_extension_cpm_startup_response_missing`. Это смешивает известный error-6 failure/retry с P4 candidates, вопреки заявленному исключению failed startups.
|
||||
|
||||
Порядок соответствует [upstream WebKit implementation](https://github.com/WebKit/WebKit/blob/main/Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm): `didFailLoadWithError` записывает error и выгружает background view, `recordError` асинхронно публикует notification; pending actions исполняются после успешной background load. Исходники сохранены вместе с review artifacts. Для исправления нужно инвалидировать данные именно провалившегося startup до освобождения его wait, а поздние callbacks этого startup игнорировать.
|
||||
|
||||
**Доказательство:** временный `CPMP4FullReviewTests.testError6FirstStartupMustNotBecomeP4WhenOldCallbacksCompleteAfterRetry` проходит через production manager, notification observer, реальный health monitor/timeout и pixel instrumentation. Публичные WebKit completions управляются в subclass context; известный error 6 вызывает production retry, затем retained callbacks завершаются с `nil`. На текущем head получен **detection count = 1 вместо 0**. Это детерминированный regression probe порядка public API, **не новый natural-trigger signed-app reproduction**. Предыдущие настоящие app 9→6→9 сохранены как отдельное доказательство на прежнем head и не подменяют этот probe.
|
||||
|
||||
В изолированной копии вставка `backgroundRecovery?.invalidate()` перед `clearEmbeddedBackgroundStartup()` в ветке совпадающего context устраняет дефект. На актуальном head весь выбранный набор с тремя probes: **199 PASS / 0 failures**. Затем проверочная production-правка из копии убрана; production worktree/PR не изменены, commit/push не делались. Это проверка причины, а не опубликованный fix.
|
||||
|
||||
### Проверки и artifacts
|
||||
|
||||
- Опубликованный прежний `fc87237a47`: **197 штатных shared tests PASS**; probes **2 PASS / 1 FAIL**; временный candidate fix **200 PASS**.
|
||||
- Актуальный `a00dc4afeb`: **196 штатных shared tests PASS**, probes **2 PASS / 1 FAIL**, всего **199 tests / 1 FAIL**. Разница 197→196 — удалённый retired-telemetry тест в обновлённой базе #7376, не потеря P1/P2/P4 регрессий.
|
||||
- Актуальный head с candidate fix только в копии: **199 PASS**. Два дополнительных positive probes подтверждают detection при late flag OFF + background app state и независимость текущего startup от failed callback предыдущего startup.
|
||||
- macOS/iOS pixel definitions, formatting, wide-event consistency и generated schema immutability **PASS**. `git diff --check` PASS; production worktree чистый. Исходники и штатные тесты копии сверены с текущим Git head (153 tracked paths); временный probe — единственный дополнительный test file.
|
||||
- Новый head CI на момент завершения проверки: **31 SUCCESS / 14 SKIPPED / 4 IN_PROGRESS / 3 QUEUED**, failures нет, завершение не заявлено. Старый green CI 48/21 относится к `fc87237a47`.
|
||||
- Review-only harness tracking head остаётся **`475095b335`**, содержит прежний production `fc87237a47` и 12 harness-only paths. App ON 9 PASS → OFF 6 functional FAIL → ON 9 PASS здесь повторно не запускался; после текущего rebase/correction точный новый head этими runs не объявляется проверенным.
|
||||
- Формы сохранены в ранее явно согласованном scope: исходная проверка и default-disabled late recovery flag. Отложенное усиление формы повторно не предъявлялось как новый finding. Других новых actionable дефектов по полному diff не подтверждено.
|
||||
|
||||
Artifacts: `/private/tmp/cpm-pr7379-after-p4-review-20261019/`: `review-summary.json`, `CPMP4FullReviewTests.swift`, `candidate-fix.diff`, `shared-tests.log`, `probes.log`, `probes-with-candidate-fix.log`, `rebased-head-with-probes.log`, `rebased-head-with-candidate-fix.log`, четыре pixel validation logs, snapshots WebKit implementation и `pr-final.json`. Исходная тестовая копия после проверки возвращена к production source; candidate patch сохранён отдельно.
|
||||
@@ -6,6 +6,8 @@ tags:
|
||||
- cpm
|
||||
- status
|
||||
---
|
||||
> **Актуально — 19 октября 2026, полное ревью #7379 после P4 detection.** Проверен опубликованный после rebase **`a00dc4afeb`** / база #7376 **`c7adf28e12`**, 7 commits / 22 paths. Найден **1 новый P2: error-6 startup может ошибочно попасть в P4 detection после позднего callback успешного retry**. На текущем head: **196 существующих shared tests PASS + 2 дополнительных probes PASS / 1 новый probe FAIL**. Проверочная однострочная правка только в изолированной копии даёт **199 PASS**; в PR она не внесена. Pixel validators обеих платформ PASS. CI snapshot: 31 SUCCESS / 14 SKIPPED / 4 IN_PROGRESS / 3 QUEUED, failures нет, CI ещё идёт. Предыдущие 197 unit и app 9→6→9 относятся к `fc87237a47`; новая база убрала один retired-telemetry тест. Подробности и границы воспроизведения — в разделе «Полное ревью после P4 detection — error-6 attribution». История ниже сохранена.
|
||||
|
||||
> **Актуально — 19 октября 2026, P4 detection без reload опубликована и проверена.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`fc87237a47`**, 7 commits / 22 paths; review-only harness **`475095b335`**, 12 paths вне main. Новый dailyAndCount `web_extension_cpm_startup_response_missing` считает P4 candidates независимо от late recovery flag, без reload и safety JavaScript. **197 unit PASS**, signed macOS и iOS app builds PASS, pixel validators PASS, strict lint 6 production + 2 harness / 0. На одних подписанных app/XCTest binaries: **ON 9 PASS → OFF 6 ожидаемых functional FAIL → ON 9 PASS**, без skips/expected failures, SHA256 совпали. Новый detection-only case дважды подтвердил detection = 1 / finishCount = 1 / late recovery OFF / no late reload outcomes; оба late OFF controls также дали по detection = 1. CI нового head: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. Формы не менялись, late reload flag default disabled. PR steps и все три документа актуализированы; worktree возвращён на чистую production branch. Более ранние heads/results сохранены как история.
|
||||
|
||||
> **Актуально — 19 октября 2026, uninstall fix опубликован.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`e970e8c90e`**, 6 commits / 22 paths; отдельный review-only harness **`e380cf98f7`**, 12 paths вне main. Удаление активного CPM context отменяет pending late-document recovery; удаление старой upgrade-версии и ошибка unload сохраняют recovery. **190 unit PASS**, red-before-fix 2 PASS / 1 FAIL, signed macOS и iOS Simulator builds PASS, strict lint 11 / 0. На новом app head проверено на одних подписанных бинарниках: **ON 8 PASS → OFF 6 ожидаемых functional FAIL → ON 8 PASS**, без skips/expected failures; все app/XCTest SHA256 совпали. CI `e970e8c90e`: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. PR description и reviewer flag steps актуализированы с сохранением ручных правок. Формы оставлены в прежнем виде; late reload flag default disabled. Предыдущие heads/results ниже — история.
|
||||
@@ -66,7 +68,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 `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 binaries ON 9 PASS → OFF 6 functional FAIL → ON 9 PASS; detection-only OFF 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 `a00dc4afeb` | **#7376 / telemetry `c7adf28e12`** | install/upgrade + P1/P2 + late recovery + independent P4 detection; 36 новых shared regressions, 196 штатных PASS; новый P2: error-6 startup ошибочно считается P4 после retained successful callback | OPEN, 7 commits / 22 paths; новый probe FAIL, candidate fix только в копии даёт 199 PASS. Pixels validators PASS, CI pending 31 success / 14 skipped / 4 running / 3 queued. Review-only harness `475095b335` и app 9→6→9 относятся к прежнему `fc87237a47`; forms scope сохранён |
|
||||
| [#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 |
|
||||
|
||||
@@ -1266,3 +1268,27 @@ CI опубликованного **`e970e8c90e` завершён: 48 SUCCESS /
|
||||
- **CI production head `fc87237a47`: 48 SUCCESS / 21 SKIPPED, pending и failures нет.** PR head/base/description проверены чтением после публикации; `pr-final.json`. Worktree чистый и возвращён на `alex/cpm-fix-init-loss`; обе локальные ветки совпадают с origin.
|
||||
|
||||
Локальные 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, `detection-only-evidence.json`, `off-control-evidence.json`, `validation-summary.json`, три SHA256 snapshots, `pr-final.json`. Исторические результаты предыдущего head `e970e8c90e` (190 / 8→6→8) выше/ниже сохранены и не являются результатами нового head.
|
||||
|
||||
## Полное ревью после P4 detection — error-6 attribution (19 октября 2026)
|
||||
|
||||
Проверен полный diff [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) относительно #7376: manager/install/upgrade/uninstall/reload, общий launch/navigation deadline и cancellation, WebKit navigation identity, обе платформенные интеграции, runtime flags, P4/health-monitor evidence и pixel adapters/definitions, а также shared regressions и reviewer instructions. Ревью начато на `fc87237a47` / `713d67419a`; во время проверки опубликовано перебазирование на `a00dc4afeb95b3fbbbb95dc50ce450c49004f3e2` / `c7adf28e1254da79d788125033474db737b11b6d`. Затронутая логика manager/recovery/lifecycle не изменилась; замечание отдельно повторено на новом head. Полный diff по-прежнему 7 commits / 22 paths.
|
||||
|
||||
**Открытое замечание P2 — failed startup с error 6 не инвалидируется в P4 detector.** `WebExtensionManager.swift:319–320`: error notification завершает только manager startup task через `clearEmbeddedBackgroundStartup()`, сохраняя startup и его документы в `CPMBackgroundReadinessRecovery`. Если WebKit сохраняет pending load callbacks до удачного retry, старый callback приходит с `nil`; `backgroundCompleted(oldID, succeeded: true)` делает уже провалившийся first startup успешным для P4. При timeout документа и завершении retry до 30 секунд detector посылает `web_extension_cpm_startup_response_missing`. Это смешивает известный error-6 failure/retry с P4 candidates, вопреки заявленному исключению failed startups.
|
||||
|
||||
Порядок соответствует [upstream WebKit implementation](https://github.com/WebKit/WebKit/blob/main/Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm): `didFailLoadWithError` записывает error и выгружает background view, `recordError` асинхронно публикует notification; pending actions исполняются после успешной background load. Исходники сохранены вместе с review artifacts. Для исправления нужно инвалидировать данные именно провалившегося startup до освобождения его wait, а поздние callbacks этого startup игнорировать.
|
||||
|
||||
**Доказательство:** временный `CPMP4FullReviewTests.testError6FirstStartupMustNotBecomeP4WhenOldCallbacksCompleteAfterRetry` проходит через production manager, notification observer, реальный health monitor/timeout и pixel instrumentation. Публичные WebKit completions управляются в subclass context; известный error 6 вызывает production retry, затем retained callbacks завершаются с `nil`. На текущем head получен **detection count = 1 вместо 0**. Это детерминированный regression probe порядка public API, **не новый natural-trigger signed-app reproduction**. Предыдущие настоящие app 9→6→9 сохранены как отдельное доказательство на прежнем head и не подменяют этот probe.
|
||||
|
||||
В изолированной копии вставка `backgroundRecovery?.invalidate()` перед `clearEmbeddedBackgroundStartup()` в ветке совпадающего context устраняет дефект. На актуальном head весь выбранный набор с тремя probes: **199 PASS / 0 failures**. Затем проверочная production-правка из копии убрана; production worktree/PR не изменены, commit/push не делались. Это проверка причины, а не опубликованный fix.
|
||||
|
||||
### Проверки и artifacts
|
||||
|
||||
- Опубликованный прежний `fc87237a47`: **197 штатных shared tests PASS**; probes **2 PASS / 1 FAIL**; временный candidate fix **200 PASS**.
|
||||
- Актуальный `a00dc4afeb`: **196 штатных shared tests PASS**, probes **2 PASS / 1 FAIL**, всего **199 tests / 1 FAIL**. Разница 197→196 — удалённый retired-telemetry тест в обновлённой базе #7376, не потеря P1/P2/P4 регрессий.
|
||||
- Актуальный head с candidate fix только в копии: **199 PASS**. Два дополнительных positive probes подтверждают detection при late flag OFF + background app state и независимость текущего startup от failed callback предыдущего startup.
|
||||
- macOS/iOS pixel definitions, formatting, wide-event consistency и generated schema immutability **PASS**. `git diff --check` PASS; production worktree чистый. Исходники и штатные тесты копии сверены с текущим Git head (153 tracked paths); временный probe — единственный дополнительный test file.
|
||||
- Новый head CI на момент завершения проверки: **31 SUCCESS / 14 SKIPPED / 4 IN_PROGRESS / 3 QUEUED**, failures нет, завершение не заявлено. Старый green CI 48/21 относится к `fc87237a47`.
|
||||
- Review-only harness tracking head остаётся **`475095b335`**, содержит прежний production `fc87237a47` и 12 harness-only paths. App ON 9 PASS → OFF 6 functional FAIL → ON 9 PASS здесь повторно не запускался; после текущего rebase/correction точный новый head этими runs не объявляется проверенным.
|
||||
- Формы сохранены в ранее явно согласованном scope: исходная проверка и default-disabled late recovery flag. Отложенное усиление формы повторно не предъявлялось как новый finding. Других новых actionable дефектов по полному diff не подтверждено.
|
||||
|
||||
Artifacts: `/private/tmp/cpm-pr7379-after-p4-review-20261019/`: `review-summary.json`, `CPMP4FullReviewTests.swift`, `candidate-fix.diff`, `shared-tests.log`, `probes.log`, `probes-with-candidate-fix.log`, `rebased-head-with-probes.log`, `rebased-head-with-candidate-fix.log`, четыре pixel validation logs, snapshots WebKit implementation и `pr-final.json`. Исходная тестовая копия после проверки возвращена к production source; candidate patch сохранён отдельно.
|
||||
@@ -6,6 +6,8 @@ tags:
|
||||
- cpm
|
||||
- webkit
|
||||
---
|
||||
> **Актуально — 19 октября 2026, полное ревью #7379 после P4 detection.** Проверен опубликованный после rebase **`a00dc4afeb`** / база #7376 **`c7adf28e12`**, 7 commits / 22 paths. Найден **1 новый P2: error-6 startup может ошибочно попасть в P4 detection после позднего callback успешного retry**. На текущем head: **196 существующих shared tests PASS + 2 дополнительных probes PASS / 1 новый probe FAIL**. Проверочная однострочная правка только в изолированной копии даёт **199 PASS**; в PR она не внесена. Pixel validators обеих платформ PASS. CI snapshot: 31 SUCCESS / 14 SKIPPED / 4 IN_PROGRESS / 3 QUEUED, failures нет, CI ещё идёт. Предыдущие 197 unit и app 9→6→9 относятся к `fc87237a47`; новая база убрала один retired-telemetry тест. Подробности и границы воспроизведения — в разделе «Полное ревью после P4 detection — error-6 attribution». История ниже сохранена.
|
||||
|
||||
> **Актуально — 19 октября 2026, P4 detection без reload опубликована и проверена.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`fc87237a47`**, 7 commits / 22 paths; review-only harness **`475095b335`**, 12 paths вне main. Новый dailyAndCount `web_extension_cpm_startup_response_missing` считает P4 candidates независимо от late recovery flag, без reload и safety JavaScript. **197 unit PASS**, signed macOS и iOS app builds PASS, pixel validators PASS, strict lint 6 production + 2 harness / 0. На одних подписанных app/XCTest binaries: **ON 9 PASS → OFF 6 ожидаемых functional FAIL → ON 9 PASS**, без skips/expected failures, SHA256 совпали. Новый detection-only case дважды подтвердил detection = 1 / finishCount = 1 / late recovery OFF / no late reload outcomes; оба late OFF controls также дали по detection = 1. CI нового head: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. Формы не менялись, late reload flag default disabled. PR steps и все три документа актуализированы; worktree возвращён на чистую production branch. Более ранние heads/results сохранены как история.
|
||||
|
||||
> **Актуально — 19 октября 2026, uninstall fix опубликован.** [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379): production **`e970e8c90e`**, 6 commits / 22 paths; отдельный review-only harness **`e380cf98f7`**, 12 paths вне main. Удаление активного CPM context отменяет pending late-document recovery; удаление старой upgrade-версии и ошибка unload сохраняют recovery. **190 unit PASS**, red-before-fix 2 PASS / 1 FAIL, signed macOS и iOS Simulator builds PASS, strict lint 11 / 0. На новом app head проверено на одних подписанных бинарниках: **ON 8 PASS → OFF 6 ожидаемых functional FAIL → ON 8 PASS**, без skips/expected failures; все app/XCTest SHA256 совпали. CI `e970e8c90e`: **48 SUCCESS / 21 SKIPPED**, pending/failures нет. PR description и reviewer flag steps актуализированы с сохранением ручных правок. Формы оставлены в прежнем виде; late reload flag default disabled. Предыдущие heads/results ниже — история.
|
||||
@@ -36,8 +38,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 `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 binaries ON 9 PASS → OFF 6 functional FAIL → ON 9 PASS; detection-only при late flag OFF PASS дважды; SHA256 совпали |
|
||||
| **`alex/cpm-fix-p1-p2` — актуально 19 Oct** | **`alex/cpm-fix-init-loss`; local/remote `a00dc4afeb`** | PR #7379 / база #7376 `c7adf28e12`: 7 commits / 22 paths, 36 новых shared regressions, 196 штатных PASS. Полное review: 1 открытый P2 error-6/P4 attribution, новый probe FAIL; candidate fix только в копии: 199 PASS. Флаги/формы не менялись |
|
||||
| — (отдельная ветка, без своего worktree) | **`codex/cpm-fix-init-loss-integration-tests`; tracking `475095b335`** | Harness содержит прежний production `fc87237a47`; 9 app methods, 12 paths вне main. Последний signed app ON 9 PASS → OFF 6 functional FAIL → ON 9 PASS, detection-only OFF PASS дважды, SHA256 совпали — на прежнем head. Новый rebase `a00dc4afeb` и review probe этими app runs не объявляются проверенными |
|
||||
| `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 |
|
||||
@@ -550,3 +552,27 @@ CI опубликованного **`e970e8c90e` завершён: 48 SUCCESS /
|
||||
- **CI production head `fc87237a47`: 48 SUCCESS / 21 SKIPPED, pending и failures нет.** PR head/base/description проверены чтением после публикации; `pr-final.json`. Worktree чистый и возвращён на `alex/cpm-fix-init-loss`; обе локальные ветки совпадают с origin.
|
||||
|
||||
Локальные 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, `detection-only-evidence.json`, `off-control-evidence.json`, `validation-summary.json`, три SHA256 snapshots, `pr-final.json`. Исторические результаты предыдущего head `e970e8c90e` (190 / 8→6→8) выше/ниже сохранены и не являются результатами нового head.
|
||||
|
||||
## Полное ревью после P4 detection — error-6 attribution (19 октября 2026)
|
||||
|
||||
Проверен полный diff [#7379](https://github.com/duckduckgo/apple-browsers/pull/7379) относительно #7376: manager/install/upgrade/uninstall/reload, общий launch/navigation deadline и cancellation, WebKit navigation identity, обе платформенные интеграции, runtime flags, P4/health-monitor evidence и pixel adapters/definitions, а также shared regressions и reviewer instructions. Ревью начато на `fc87237a47` / `713d67419a`; во время проверки опубликовано перебазирование на `a00dc4afeb95b3fbbbb95dc50ce450c49004f3e2` / `c7adf28e1254da79d788125033474db737b11b6d`. Затронутая логика manager/recovery/lifecycle не изменилась; замечание отдельно повторено на новом head. Полный diff по-прежнему 7 commits / 22 paths.
|
||||
|
||||
**Открытое замечание P2 — failed startup с error 6 не инвалидируется в P4 detector.** `WebExtensionManager.swift:319–320`: error notification завершает только manager startup task через `clearEmbeddedBackgroundStartup()`, сохраняя startup и его документы в `CPMBackgroundReadinessRecovery`. Если WebKit сохраняет pending load callbacks до удачного retry, старый callback приходит с `nil`; `backgroundCompleted(oldID, succeeded: true)` делает уже провалившийся first startup успешным для P4. При timeout документа и завершении retry до 30 секунд detector посылает `web_extension_cpm_startup_response_missing`. Это смешивает известный error-6 failure/retry с P4 candidates, вопреки заявленному исключению failed startups.
|
||||
|
||||
Порядок соответствует [upstream WebKit implementation](https://github.com/WebKit/WebKit/blob/main/Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm): `didFailLoadWithError` записывает error и выгружает background view, `recordError` асинхронно публикует notification; pending actions исполняются после успешной background load. Исходники сохранены вместе с review artifacts. Для исправления нужно инвалидировать данные именно провалившегося startup до освобождения его wait, а поздние callbacks этого startup игнорировать.
|
||||
|
||||
**Доказательство:** временный `CPMP4FullReviewTests.testError6FirstStartupMustNotBecomeP4WhenOldCallbacksCompleteAfterRetry` проходит через production manager, notification observer, реальный health monitor/timeout и pixel instrumentation. Публичные WebKit completions управляются в subclass context; известный error 6 вызывает production retry, затем retained callbacks завершаются с `nil`. На текущем head получен **detection count = 1 вместо 0**. Это детерминированный regression probe порядка public API, **не новый natural-trigger signed-app reproduction**. Предыдущие настоящие app 9→6→9 сохранены как отдельное доказательство на прежнем head и не подменяют этот probe.
|
||||
|
||||
В изолированной копии вставка `backgroundRecovery?.invalidate()` перед `clearEmbeddedBackgroundStartup()` в ветке совпадающего context устраняет дефект. На актуальном head весь выбранный набор с тремя probes: **199 PASS / 0 failures**. Затем проверочная production-правка из копии убрана; production worktree/PR не изменены, commit/push не делались. Это проверка причины, а не опубликованный fix.
|
||||
|
||||
### Проверки и artifacts
|
||||
|
||||
- Опубликованный прежний `fc87237a47`: **197 штатных shared tests PASS**; probes **2 PASS / 1 FAIL**; временный candidate fix **200 PASS**.
|
||||
- Актуальный `a00dc4afeb`: **196 штатных shared tests PASS**, probes **2 PASS / 1 FAIL**, всего **199 tests / 1 FAIL**. Разница 197→196 — удалённый retired-telemetry тест в обновлённой базе #7376, не потеря P1/P2/P4 регрессий.
|
||||
- Актуальный head с candidate fix только в копии: **199 PASS**. Два дополнительных positive probes подтверждают detection при late flag OFF + background app state и независимость текущего startup от failed callback предыдущего startup.
|
||||
- macOS/iOS pixel definitions, formatting, wide-event consistency и generated schema immutability **PASS**. `git diff --check` PASS; production worktree чистый. Исходники и штатные тесты копии сверены с текущим Git head (153 tracked paths); временный probe — единственный дополнительный test file.
|
||||
- Новый head CI на момент завершения проверки: **31 SUCCESS / 14 SKIPPED / 4 IN_PROGRESS / 3 QUEUED**, failures нет, завершение не заявлено. Старый green CI 48/21 относится к `fc87237a47`.
|
||||
- Review-only harness tracking head остаётся **`475095b335`**, содержит прежний production `fc87237a47` и 12 harness-only paths. App ON 9 PASS → OFF 6 functional FAIL → ON 9 PASS здесь повторно не запускался; после текущего rebase/correction точный новый head этими runs не объявляется проверенным.
|
||||
- Формы сохранены в ранее явно согласованном scope: исходная проверка и default-disabled late recovery flag. Отложенное усиление формы повторно не предъявлялось как новый finding. Других новых actionable дефектов по полному diff не подтверждено.
|
||||
|
||||
Artifacts: `/private/tmp/cpm-pr7379-after-p4-review-20261019/`: `review-summary.json`, `CPMP4FullReviewTests.swift`, `candidate-fix.diff`, `shared-tests.log`, `probes.log`, `probes-with-candidate-fix.log`, `rebased-head-with-probes.log`, `rebased-head-with-candidate-fix.log`, четыре pixel validation logs, snapshots WebKit implementation и `pr-final.json`. Исходная тестовая копия после проверки возвращена к production source; candidate patch сохранён отдельно.
|
||||
Reference in new issue
Block a user