[2026-10-08] eagle: work/projects/cpm-web-extension-repro-and-fix-2026-10-08.md

This commit is contained in:
Alexey Martemyanov committed 2026-10-08 21:48:20 +06:00
1 parent 49a7c60dd9
commit 4e72823c60
1 file changed
+16
@@ -246,6 +246,22 @@ cd SharedPackages/WebExtensions && CPM_REPRO=1 swift test --filter CPMReproBackg
Не измерить без extension: восстановление уже открытых документов (монитор меряет только навигации) и причину смерти worker'а при живом Network-процессе.
### Фаза 1 реализована — worktree `alex/cpm-messaging-readiness-telemetry` (от `main` 92e09cdbbc, 8 октября, не закоммичено)
Только телеметрия, поведение детектора не меняется.
- На `initialization_failed_*` и `messaging_stuck_*` (iOS + macOS):
- `bg_ready_after` — `none` / `pending` / `failed` / `under_1s` … `over_30s`. Источник — completion у `loadBackgroundContent`. Он вызывается один раз на следующем шаге run loop после `didCreateBackgroundWebView`: view уже есть, поэтому вызов лишь присоединяется к идущей загрузке и ничего не будит. Отключается тем же флагом, что и delegate proxy (`cpmBackgroundDelegateProxy`). Код — `CPMBackgroundReadinessObserver.swift`.
- `bg_view_age` — `under_4s` / `4s_to_8s` / `8s_to_30s` / `30s_to_2m` / `over_2m`.
- `app_state` — состояние приложения в момент сбоя.
- `open_tabs` — размер `context.openTabs`, бакетами; `loading_tabs` — сколько из них в `isLoading`.
- Перенесены из worktree B: `bg_load_error_app_state` и `bg_load_error_after` (error 6).
- На `recovered_without/after_extension_reload`:
- `recovery_document` — `failed_navigation` (опоздавший ответ), `later_navigation`, `unattributed`;
- `recovery_after` — время от первого сбоя эпизода.
- Проверено на реальном WebKit (harness, медленный старт worker'а 5 с на пробуждении): сбой ушёл с `bg_ready_after=pending`, `bg_view_age=4s_to_8s`, а восстановление — с `recovery_document=failed_navigation`, `recovery_after=under_4s`.
- Пакет: 677 тестов зелёные. SwiftLint чистый. `validate-pixel-defs` проходит на iOS и macOS.
- Замечание по harness: `network_restarted` там иногда `true` без падения Network-процесса; вероятная причина — тестовый процесс перезапускает Network-процесс между загрузкой контекста и сбоем (не проверено). К продовой телеметрии это не относится, но в тестах этот флаг для классификации не годится.
## Тесты
Папка `Tests/WebExtensionsTests/CPMRepro/`, запуск из `SharedPackages/WebExtensions`: