From a807c4189c70a2deaca66b8b0be64749401591a5 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Thu, 15 Oct 2026 22:46:01 +0600 Subject: [PATCH] [2026-10-15] eagle: work/projects/cpm-status-2026-10-15.md --- work/projects/cpm-status-2026-10-15.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/work/projects/cpm-status-2026-10-15.md b/work/projects/cpm-status-2026-10-15.md index 3abe180c..c7d77a96 100755 --- a/work/projects/cpm-status-2026-10-15.md +++ b/work/projects/cpm-status-2026-10-15.md @@ -81,7 +81,7 @@ tags: | **P2. «Пробуждение → error 6»**, циклы | `proxy_on>dealloc>view>proxy_on>error_E:6` (23.6k), `error>dealloc>view>proxy_on>error` (5.7k), после `died_crash` (1.5k) | iOS; macOS 118 | macOS: заморозка нового процесса на ≥30 с даёт error 6, корзина 25–35 с. iPhone: 4 сценария безуспешно. Главный iOS-хвост **без** `unresponsive` (в воспроизведении он есть) | корень в WebKit (`wakeUpBackgroundContentIfNecessary` взводит 30-секундный таймер до загрузки worker'а). Гипотеза: перезагрузка расширения при возврате на передний план | | **P3. Контекст загружен, view нет** | `load` / `load>base_url_changed` | 17.1k + 0.9k / 162 + 81 | задержка очистки при смене `baseURL` воспроизведена на macOS при большом кэше (около 10 минут заполнения); iOS-гонка запуска (`bg_view_creations=0`, восстановление сессии, первые 30 с) не воспроизведена: холодный старт в harness'е отвечает за миллисекунды | кандидат: стабильный `baseURL` (ветка `cpm-stable-base-url`: не доведён, меняет URL всем расширениям, не прогнан через harness, старая база). Фикс WebKit 318756@main, номер сборки ОС не проверен | | **P4. Первая загрузка** | `load>view>proxy_on` | 6.8k + 2.3k / 570 | да (фикс A) | фикс A | -| **P5. Фон выгружен в момент сбоя** | `proxy_on>dealloc>view>proxy_on>dealloc` | 1.9k / 494 | да для test-only потери регистрации живой вкладки; другие гипотезы проверяются (§10) | кандидат для tab_in_context=false: восстановить корректный tab lifecycle; естественный вход не доказан | +| **P5. Фон выгружен в момент сбоя** | `proxy_on>dealloc>view>proxy_on>dealloc` | 1.9k / 494 | да: test-only потеря регистрации живой вкладки и пустые runtime listener metadata с первого старта; долгий документ и пауза main actor P5 не дали (§10) | кандидаты: корректный tab lifecycle; при пустых metadata explicit loadBackgroundContent после восстановления listener. Естественный вход не найден | | **P6. macOS: вкладка без расширения** | `load>view>proxy_on>dealloc` / `load>view>proxy_on`; варианты с `extension_updated` отдельно | iOS ≈0 / 627 + 235 | до idle воспроизведено отсутствием controller; полный прогон см. §10 | гипотеза: view создана без текущего controller или сохраняет controller прежнего менеджера; естественный вход не найден | | **Network заменён** | | см. раздел 4 | да (краш, worker мёртв при том же view) | фикс B | | **«Здоровый» остаток, other** | | iOS 12.5%, macOS 22% | нет | нет гипотезы | @@ -262,3 +262,27 @@ Watcher больше не удерживает WKWebView через await, а id Повтор пяти тестов завершён: четыре зелёных, один красный исключительно из-за ранее описанного сравнения bucket со строкой «3» (исправлено). Начат финальный прогон оставшихся сценариев и исправленного assertion: `p5-p6-final-regressions-and-stall.log`. Добавлен десятый эксперимент `testMainActorStallDelaysActualFailureSnapshots`: после реального initResp искусственно теряется dashboard, затем test host main actor дважды блокируется на 35 с при ожидающем production timeout. Тест требует actual failures/stuck и восстановления; совпадение P5 отдельно записывается как `matchesP5`, а не предполагается. Это исследование задержанного выполнения host callbacks, **не реальная iOS suspend/resume**. + +### Задержка host main actor: P5 не получен + +`testMainActorStallDelaysActualFailureSnapshots` — зелёный, 71.027 с; результат классификации `matchesP5=false`. При двух блокировках main actor на 35 с реальные failure-пиксели пришли через 35.42 и 70.68 с, второй дал stuck. В обоих снимках view=true, creations=1, хвост остаётся `load>view>proxy_on`, context/tab/controller/scripts=true, errors=none, network_restarted=false. InitResp пришёл в документы до пауз; dashboard терялся намеренно. После снятия инъекции новая вкладка работает. + +Это подтверждает задержку deadline, но в проверенном порядке callbacks **не воспроизводит P5**. Настоящие iOS suspend/resume и остановка всего процесса не проверялись; блокировка main actor не подменяет их. + +Финальный прогон также повторно подтвердил replacement-manager P6 (9.167 с) и P5 с забытым live tab (72.737 с) после устранения удержания view watcher'ом. + +### Итог локальных repro-проверок + +Финальный прогон шести сценариев — **зелёный: 6 тестов, 0 failures, 262.676 с**. Исправленный one-wake listener-тест зелёный (62.633 с). P6 до/после idle повторно зелёные (8.569 / 38.543 с). + +С учётом четырёх зелёных независимых проверок из предыдущего прогона **все 10 актуальных методов добавленного класса имеют зелёный результат**. Это проверено несколькими запусками; единого прогона всех десяти после последних добавлений не было. Сводка по каждому методу и исходному логу: `/private/tmp/cpm-p5-p6-20261015/results.json`, генератор `summarize.py`. + +**Что воспроизведено:** +- P6: отсутствующий controller до и после idle; сохранённый controller существующего WKWebView после replacement manager. Reload контекста не исправляет такую вкладку; новая вкладка работает. +- P5: потеря WebKit-регистрации сохранившейся живой вкладки; отсутствие runtime listener metadata с первого старта. Совпадают хвост, actual stuck и диагностические признаки; после адресного снятия инъекции работа восстанавливается. + +**Что P5 не дало на macOS 26.7.1:** однократная потеря listener на wake после здорового старта, два действительно долгих документа, две задержки main actor на 35 с. Потеря dashboard при дошедшем initResp даёт диагностический stuck с живой view. + +**Ограничения:** все положительные воспроизведения требуют test-only условия; естественные production-триггеры отсутствующего controller/утраты listener metadata не найдены. Настоящая iOS suspension не проверена. Фиксы поведения приложения этим исследованием не добавлялись. + +Запущен обычный пакетный прогон `swift test --disable-automatic-resolution --skip-build` без repro-флагов; результат будет записан ниже. Финальный strict SwiftLint семи изменённых файлов: 0 нарушений (`--no-cache`). SHA-1 существующего dirty Package.resolved не изменился: `7ccce20acd452656c9bf2d2fa186d044e4a8185f`.