[2026-09-21] eagle: work/projects/cpm-web-extension-breakage-validation.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-21 14:12:38 +06:00
1 parent 9b193d257d
commit aea04a3e35
1 file changed
+4 -6
@@ -6,7 +6,7 @@
Есть два независимых класса проблем:
- **All-tabs:** после смерти background WebContent process CPM может перестать работать во всех вкладках. Нужна последовательность telemetry → production validation → bounded graveyard → A/B.
- **All-tabs:** после смерти background WebContent process CPM может перестать работать во всех вкладках. Нужна последовательность telemetry → production validation gate → bounded graveyard → A/B.
- **Per-tab:** ошибки lifecycle заставляют WebKit забыть ещё живую вкладку. Исправляются независимо от graveyard.
## Статус гипотез
@@ -14,7 +14,7 @@
| Проблема | Статус | Результат |
|---|---|---|
| Forced death background process → persistent all-tabs CPM outage | **Подтверждено воспроизведением** | Kill background PID ломает CPM; reload и новая вкладка не помогают, Fire восстанавливает. |
| Natural crash / memory / CPU termination в production | **Не проверено** | Механизм доказан, реальная частота и связь с outage требуют M3/M4. |
| Natural crash / memory / CPU termination в production | **Не проверено** | Механизм доказан, реальная частота и связь с outage требуют M3 и последующей production validation. |
| Close Other Tabs forget-ит retained tab | **Подтверждено и исправлено в M1** | Сохраняется тот же экземпляр Tab без ложного didCloseTab. |
| Duplicate Tab из popup переносит original | **Подтверждено и исправлено в M1** | В main window уходит копия, source остаётся отдельным объектом. |
| Pin/unpin/reorder/move/merge теряют lifecycle tab | **Подтверждено и исправлено в M1** | Tab сохраняет identity; WebKit получает `didMoveTab` с old index/window вместо ложных close/open. Pinned tabs имеют корректный flattened index. |
@@ -39,7 +39,6 @@
| M1 tab lifecycle | `codex/cpm-tab-lifecycle-fixes` — `/Users/admin/DuckDuckGo/apple-browsers.git/cpm-tab-lifecycle-fixes` | **PR открыт:** [#6827](https://github.com/duckduckgo/apple-browsers/pull/6827), reviewer `@dus7`, commit `3df78ebfb2`. Close Other Tabs, popup duplicate, pin/unpin, reorder, cross-window/new-window move, merge, pinned indices и shared pinned при закрытии окна. Проверки: 229/229 targeted unit, 10/10 pinned-tabs integration, SwiftLint 0 violations. Широкий macOS unit run: 6708/6710 pass, 30 skipped; 2 failures воспроизводятся изолированно в неизменённых тестах из-за их собственного teardown (`AIChatSelectionActionPageContextTests`, `AutoClearHandlerTests`). Старый `CBRCompileTimeReporterTests` отдельно не запускается в широком gate: его dry-run pixel expectations системно timeout-ятся и не относятся к M1. |
| M2 stable base URL | `codex/cpm-stable-base-url` — `/Users/admin/DuckDuckGo/apple-browsers.git/cpm-stable-base-url` | **Готово:** 11/11 tests; iOS/macOS builds проходят. |
| M3 attribution telemetry | `codex/cpm-failure-telemetry` — `/Users/admin/DuckDuckGo/apple-browsers.git/cpm-failure-telemetry` | **Готово к PR:** passive PII-free facts, forwarding proxy, runtime kill switch; 23/23 tests; schemas iOS/macOS валидны. |
| M4 production validation | `codex/cpm-production-validation` — `/Users/admin/DuckDuckGo/apple-browsers.git/cpm-production-validation` | **Ожидает production data:** runbook готов; начинать после одного telemetry release. |
| M5 graveyard mitigation | `codex/cpm-graveyard-mitigation` — `/Users/admin/DuckDuckGo/apple-browsers.git/cpm-graveyard-mitigation` | **Готово к PR, выключено по умолчанию:** максимум один WKWebView, bounded 3 s hold, unload/reload cleanup, runtime disable; 18/18 tests; iOS/macOS builds проходят. |
| M6 graveyard A/B | `codex/cpm-graveyard-ab` — `/Users/admin/DuckDuckGo/apple-browsers.git/cpm-graveyard-ab` | **Готово к PR:** control/treatment, stable cohort, denominator/outcome pixels, bounded pending queue; 30/30 tests; iOS/macOS builds и pixel validators проходят. |
@@ -57,16 +56,15 @@
```
M3 telemetry
├── M4 production validation gate
└── M5 graveyard mitigation
└── M6 A/B experiment
```
Поскольку коммитов пока нет, refs зависимых branches указывают на тот же base SHA, а зависимость представлена накопленным dirty diff. При оформлении: commit M3 → перенести/перебазировать M5 на M3 → M6 на M5. M4 фиксирует Go/No-Go после production данных.
Поскольку коммитов пока нет, refs зависимых branches указывают на тот же base SHA, а зависимость представлена накопленным dirty diff. При оформлении: commit M3 → перенести/перебазировать M5 на M3 → M6 на M5. Production validation — rollout gate после M3, а не отдельная ветка или PR.
## Rollout gates
- M3: privacy review, schema review, затем один production release.
- M4: отдельно по iOS/macOS проверить termination reason → initialization failure/stuck и долю per-tab failures.
- После production rollout M3 отдельно по iOS/macOS проверить termination reason → initialization failure/stuck и долю per-tab failures.
- M5: включать только если M4 подтверждает process-death hypothesis; kill switch и graveyard по умолчанию выключены.
- M6: internal/review → небольшой 50/50 sample → проверить cohort balance, denominator/outcome coverage и crash/retention guardrails.