From e23f74ef2c7861f2ee28182fcfed01a3636af9b7 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Fri, 16 Oct 2026 20:26:45 +0600 Subject: [PATCH] [2026-10-16] 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 --- ...diness-telemetry-tech-design-2026-10-15.md | 11 +++++++++ work/projects/cpm-status-2026-10-15.md | 24 +++++++++++++++++++ ...cpm-web-extension-code-guide-2026-10-09.md | 15 ++++++++++++ 3 files changed, 50 insertions(+) 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 b5cb8fc1..398a7fd1 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 @@ +> **Итог замены #7379 — 16 октября 2026 (Бишкек).** В `alex/cpm-fix-p1-p2` исправлены оба замечания: ожидание конкретного нового context при install/upgrade и background guard независимо от diagnostics flag. Финальный signed app-набор **4/4 PASS**, install/upgrade **10+10 PASS**, targeted unit **170 PASS**, strict lint **16 files / 0 violations**, общий WebExtensions module для iOS Simulator **BUILD SUCCEEDED**. На тех же бинарниках с выключенными flags **4/4 функциональных negative controls FAIL**, без deallocation/infrastructure errors. Коммитов нет, scratch не изменён, ZIP/schema/dependencies не менялись. Сохраняется исходный cap **5 s**: startup fixture 5000 ms с WK overhead даёт callback после cap и может потерять первый ответ; этот режим остаётся воспроизводимым известным пределом. Подробности, история красных прогонов и machine summary — в конце [[cpm-status-2026-10-15]]. + > **Изолированная ветка фиксов — 16 Oct, 13:33 UTC.** `alex/cpm-fix-p1-p2` (`/Users/admin/DuckDuckGo/apple-browsers.git/alex/cpm-fix-p1-p2`) создана от текущего `alex/cpm-messaging-readiness-telemetry` / `01d4a0ec22`. Выделены P1 navigation wake wait (cap 5 s) и P2 same-context background retry по реальной error 6, с существующими gate/recovery flags и ограничением частоты. Только **2 app-регрессии + 4 новых lifecycle unit-теста**; прежние 22 — весь research-набор. Signed app **2/2 PASS**, unit **165 PASS**, strict lint 0. На тех же бинарниках оба disabled-flag контроля функционально FAIL; deallocation guard в финальном positive run PASS после test-only autorelease fix. База уже использует `cpmMessagingEpisode`: P2 outcome `failed_measurement_response`, reload_state `none`; доставка page initResp и неизменность context проверяются отдельно. Добавлен только read-only recorder `isApplicationInBackground` для guard, без изменения telemetry schema/ZIP/dependencies. Более поздние baseline/init-progress PR не перенесены. Нет коммитов, исходный scratch сохранён. Артефакты `/private/tmp/cpm-p1-p2-clean-20261016/validation-summary.json`; история и границы macOS injected-fault доказательства в [[cpm-status-2026-10-15]]. > **Final local P1/P2 validation — 16 Oct, 12:30 UTC.** Current background-only candidate: 22/22 unique app methods PASS across 2+19+1+1 runs (P2 repeated); both disabled-fix controls fail functionally. P2 restores native dashboard **and page initResp on the same failed document without navigation or context replacement**, with recovered_without_extension_reload / failed_navigation. The full-context-reload prototype was rejected after repeated page-delivery loss. Package: 806 tests, 14 skips, 0 failures; strict lint: 0 violations. No commits, PR mutations or telemetry schema changes. P1's 5 s bound, macOS injected-fault scope, unresolved natural iOS/P3/P5 limits and nonfatal owned-cache SQLite cleanup warning remain explicit in [[cpm-status-2026-10-15]]. Earlier pending/20-method statements are dated history. @@ -173,3 +175,12 @@ Current versions of the formerly failed selections passed again: 18+1+1 methods, The first P2 full-context-reload prototype was rejected: a repeated real error-6 test lost the existing page's initResp despite a successful native dashboard. The current local candidate preserves WKWebExtensionContext and retries the public background-load API after the actual load-error notification. Its app regression requires recovery of the **same failed document without navigation or context replacement**, with both native dashboard and page initResp; the observed pixel is recovered_without_extension_reload / recovery_document=failed_navigation / recovery_after=30s_to_2m. The existing confirmed-hang M4 remains the full-reset fallback. P1 prepares background on each main-frame web navigation with a real 5 s bound/cancellation; the imposed 8 s startup now yields a healthy first document. This neither accelerates worker execution nor establishes a universal fix for longer delays. P1/P2 point cases initially passed 2/2; the package passed 806 tests with 14 opt-in skips, 0 failures. Full final app matrix, disabled-fix controls and limits remain in [[cpm-status-2026-10-15]] and `/private/tmp/cpm-p1-p2-fixes-20261016/`. No telemetry schema change, commit, PR mutation or iOS production attribution is implied. + + +## Проверенный контракт замены #7379 — 16 октября 2026 + +`alex/cpm-fix-p1-p2` объединяет ID-specific install/upgrade wait, P1 idle wake и P2 background retry. Новый context фиксируется при install до удаления старого; навигация захватывает именно этот object. `isApplicationInBackground` теперь отдельный input менеджера, iOS factory читает `UIApplication` напрямую и не зависит от `cpmDiagnosticsRecorder`. Diagnostics getter прежнего кандидата удалён. Retry отвергает superseded context и повторно проверяет flag/background перед WK call. + +Contract regression default — **4500 ms** worker delay при прежнем **5 s** cap, строгие native dashboard + page initResp assertions. **4/4 app PASS**, install/upgrade **10/10 + 10/10 PASS**, **170 PASS** unit, lint 16 files / 0 violations; iOS shared module SDK build PASS. На той же сборке gate/recovery OFF дают **4/4 ожидаемых функциональных FAIL**, без teardown errors. Это не новые unique cases: повторяются 2 метода; всего в ветке 4 app + 9 новых unit methods. + +Граничная конфигурация **5000 ms** через `CPM_APP_INTEGRATION_INSTALL_DELAY_MS` сохраняет известный failure: реальные WK callbacks 5.150336/5.184716 s приходят после cap, upgrade ранее FAIL 6/10. Этот режим не исправлен, timeout не увеличен, assertions не ослаблены. Реальный iOS app suspension/resume не запускался. Все результаты, включая красную историю: `/private/tmp/cpm-p1-p2-replacement-20261016/validation-summary.json`, [[cpm-status-2026-10-15]]. Source hashes стабильны, ZIP/schema/dependencies и scratch не изменены, коммитов нет. diff --git a/work/projects/cpm-status-2026-10-15.md b/work/projects/cpm-status-2026-10-15.md index b30a4626..21a8b284 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 --- +> **Итог замены #7379 — 16 октября 2026 (Бишкек).** В `alex/cpm-fix-p1-p2` исправлены оба замечания: ожидание конкретного нового context при install/upgrade и background guard независимо от diagnostics flag. Финальный signed app-набор **4/4 PASS**, install/upgrade **10+10 PASS**, targeted unit **170 PASS**, strict lint **16 files / 0 violations**, общий WebExtensions module для iOS Simulator **BUILD SUCCEEDED**. На тех же бинарниках с выключенными flags **4/4 функциональных negative controls FAIL**, без deallocation/infrastructure errors. Коммитов нет, scratch не изменён, ZIP/schema/dependencies не менялись. Сохраняется исходный cap **5 s**: startup fixture 5000 ms с WK overhead даёт callback после cap и может потерять первый ответ; этот режим остаётся воспроизводимым известным пределом. Подробности, история красных прогонов и machine summary — в конце [[cpm-status-2026-10-15]]. + > **Отдельная ветка P1/P2 — финал 16 Oct, 13:33 UTC.** Новый worktree `alex/cpm-fix-p1-p2` от текущего `alex/cpm-messaging-readiness-telemetry` (`01d4a0ec22`): только P1/P2-кандидаты и необходимые тесты. Новых методов **2 app + 4 unit**; **22 — полный старый research app-набор**. На новой signed app-сборке **2/2 PASS**, unit **165 PASS**, strict lint 0; те же два app-теста при выключенных flags дают ожидаемые функциональные FAIL. Текущая база использует episode contract: P2 `failed_measurement_response`, `reload_state=none`, плюс реальная доставка initResp в тот же документ без навигации. История исправленного test teardown сохранена. Коммитов нет; scratch не изменён; подробности и артефакты — в конце документа. @@ -920,3 +922,25 @@ Targeted unit suites: **170 PASS**, включая 5 новых manager tests (` - `lint-final.log`: strict lint 16 Swift files, 0 violations. Подписи Apple Development и strict проверка фактически загружаемого XCTest и app debug dylib успешны. Финальные source hashes записаны в `final-source-hashes.json` перед повторами/общим прогоном и сверены: drift отсутствует, включая README и unchanged ZIP. Побочный SwiftPM pin diff сохранён и удалён из worktree. Начат `disabled-final.xcresult` на **тех же бинарниках**, выключающий gate для P1/install/upgrade и recovery flag для P2. Его результат ещё ожидается. Случай 5000 ms + WK overhead выше остаётся красным известным выходом за бюджет; он не был исправлен и не выдаётся за PASS. + +### Завершение замены #7379 — финальный проверенный результат + +Оба запрошенных изменения реализованы в прежнем новом worktree `alex/cpm-fix-p1-p2`, base/HEAD `01d4a0ec22b4702ca9f9ea37757e060772ec7fa9`. `trackEmbeddedBackgroundStartup(identifier:)` отслеживает новый context, waiter захватывает его; fallback учитывает порядок installation store, а retry игнорирует superseded context. iOS factory передаёт самостоятельный `isApplicationInBackground` provider из `UIApplication`; `cpmDiagnosticsRecorder=OFF` больше не выключает safety guard. Provider и recovery flag повторно проверяются перед queued retry. Прежний diagnostics getter удалён; telemetry schema не менялась. + +Два сценария #7379 перенесены в app-hosted suite с исходными method names; worker delay default 4500 ms. Требования не ослаблены: первый документ должен получить native dashboard + page initResp без first failure. Upgrade показывает сосуществование old/new context sets `[0,1,2,1]` и новый identifier. Это семантическая замена production-фикса #7379 с тем же 5 s bound, плюс P1 idle wake и P2 same-context retry. Сам PR #7379 не менялся и не закрывался. + +| Финальная проверка | Результат | +|---|---| +| Общий signed app run: install, upgrade, P1, P2 | **4/4 PASS**, 0 skips/failures (`enabled-final.xcresult`) | +| Повторы install/upgrade на той же сборке | **20/20 executions PASS**: install 10/10, upgrade 10/10; 2 уникальных метода (`install-upgrade-final-repeat.xcresult`) | +| Targeted unit suites | **170 PASS**, 0 skips/failures: lifecycle 31, manager 48, остальные связанные 91 | +| Общий WebExtensions для iOS Simulator | **BUILD SUCCEEDED** (`ios-module-final-visible.log`); это не полный iOS app/runtime run | +| Strict lint | **16 Swift files, 0 violations** | +| Gate/recovery OFF на тех же бинарниках | **0 PASS / 4 functional FAIL**, expectedFailures=0, exit 65 (`disabled-final.xcresult`) | +| Подписи / project structure | Apple Development + strict app debug dylib / загружаемый XCTest PASS; plutil PASS | + +Negative controls конкретно: P2 — timeout ожидания восстановления того же документа после настоящей error 6; install/upgrade и P1 — отсутствующие своевременные native dashboard/page initResp и настоящий first-failure snapshot. Ошибок `TestRunHelper` deallocation в финальных positive/negative runs нет. Это намеренно красный контроль чувствительности, а не четыре нерешённых инфраструктурных падения. + +**Сохранённое ограничение:** исходный gate cap не увеличен, 5 s. Искусственная 5000 ms startup-пауза вместе с overhead WebKit даёт callbacks 5.150336/5.184716 s уже после release; upgrade в этом режиме ранее потерял первый ответ в 6/10. Этот конкретный over-budget режим **не исправлен** и не считается PASS. Он воспроизводится через `CPM_APP_INTEGRATION_INSTALL_DELAY_MS=5000`; строгие contract regression cases используют 4500 ms, а bounded/cancellation unit cases отдельно требуют release без callback. Натуральный production trigger и реальный iOS suspension/resume не доказаны этими macOS тестами. + +Артефакты: `/private/tmp/cpm-p1-p2-replacement-20261016/validation-summary.json`, `final-source-hashes.json`, `enabled-final-evidence/`, `disabled-final-evidence/`, `install-upgrade-final-repeat-evidence/`, все первоначальные failing/timing runs. Всего в ветке **4 новых app + 9 новых unit methods**; прежние 22 research app-кейса остаются отдельно. Хэши финальных исходников не изменились во время всех финальных прогонов; bundled ZIP равен HEAD; исходный scratch сверён с прежними hash и не изменён. Побочный generated package pin diff сохранён/убран. HEAD не сдвинут, commitsCreated=0. 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 ea6964a1..c92fa946 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 @@ -257,3 +257,18 @@ Worktree `cpm-e2e-init`, HEAD всё ещё `46f25175c7c42766cab23ea39f447f075c7 - Четыре новых метода `WebExtensionLifecycleCoordinatorTests`: wake после launch, bounded non-cancellable callback, cancellation, disabled flag. Всего 6 новых test methods; 22 — весь прежний app-набор. Текущая база уже перешла на episode contract. Test-only diagnostics proxy фиксирует реальный first-failure вызов, не синтезируя monitor events. P2 требует terminal `failed_measurement_response` / `reload_state=none` плюс page initResp исходного документа до другой навигации и ту же context identity. Signed app 2/2 PASS; unit 31+134=165 PASS; strict lint 14 files / 0 violations. Оба disabled-flag контроля на той же сборке функционально FAIL. Test autorelease pools исправили deallocation guard без отключения проверок. Source hashes и исходный scratch неизменны; schemas/ZIP/dependencies в diff не менялись. Артефакты и полная история: `/private/tmp/cpm-p1-p2-clean-20261016/validation-summary.json`, [[cpm-status-2026-10-15]]. Границы P1 cap / macOS injection / неустановленного natural iOS trigger сохраняются. + + +## Объединение #7379 с P1/P2 и независимый lifecycle guard — 16 октября 2026 + +Текущий `alex/cpm-fix-p1-p2` семантически заменяет #7379 в пределах прежнего navigation timeout 5 s: + +- `WebExtensionManager+EmbeddedExtensions.installEmbeddedExtension` вызывает `trackEmbeddedBackgroundStartup(identifier:)` именно для вновь установленного embedded context. +- Manager сохраняет preferred context, а `prepareEmbeddedBackgroundForNavigation` захватывает конкретный context object. Fallback учитывает append-порядок installation store и не выбирает произвольный context при неизвестном порядке нескольких версий. `loadEmbeddedExtensionBackgroundContent(in:)` coalesces job на тот же object. +- `recoverEmbeddedBackgroundLoadFailure` игнорирует superseded context. Состояние background приходит через самостоятельный `isApplicationInBackground` provider; iOS factory читает `UIApplication.shared.applicationState` независимо от diagnostics flag. Старый diagnostics getter удалён. Перед queued retry повторно проверяются flag/background. +- Два install/upgrade-теста #7379 адаптированы в `CPMBackgroundRecoveryIntegrationTests` рядом с P1/P2. Реальный upgrade даёт context sets `[0,1,2,1]`; assertions требуют native dashboard + page initResp первого документа, а не просто загрузку context. Default delay 4500 ms. +- Пять новых manager unit tests проверяют coexistence/newest selection, fallback после удаления replacement, diagnostics=nil + background→foreground, runtime kill switch и отказ retry старого context. Вместе с четырьмя lifecycle tests в ветке 9 новых unit methods. + +Финальная валидация: общий signed app **4/4 PASS**; install/upgrade **10/10 + 10/10 PASS** на той же сборке; targeted unit **170 PASS**, strict lint 16 files / 0 violations; WebExtensions generic iOS Simulator module **BUILD SUCCEEDED**. Все 4 disabled-flag controls функционально FAIL без teardown errors. Коммитов и изменений scratch/ZIP/schema/dependencies нет. + +Локальные `[CPM Background]` logs показывают медленный WK callback (>=1 s) и release gate по deadline. Они подтвердили предел: fixture 5000 ms даёт фактическую готовность после 5 s cap и может потерять первый upgrade document (6/10 ранее). Этот over-budget режим не исправлен и сохраняется через `CPM_APP_INTEGRATION_INSTALL_DELAY_MS=5000`; здоровые contract regression cases проверяют 4500 ms. Это не доказательство всех natural production causes и не реальный iOS suspension/resume run. Артефакты и история: `/private/tmp/cpm-p1-p2-replacement-20261016/validation-summary.json`, [[cpm-status-2026-10-15]].