[2026-10-16] eagle: personal/plans/balda-callee-prism-plan.md personal/projects/balda/execution-broker.md personal/projects/virfield.md 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:
Alexey Martemyanov committed 2026-10-16 21:03:05 +06:00
1 parent e4b1607d24
commit a7f1b3587a
6 files changed
+91 -10

No files matched your search

@@ -195,3 +195,18 @@ Contract regression default — **4500 ms** worker delay при прежнем *
Пять новых dailyAndCount pixels различают install readiness, upgrade readiness, idle background wake, error-6 background retry и late document reload. `background_ready` — факт успешного WK callback после использованного navigation wait (для error-6 retry — любого успешного retry), не доказательство initResp; `reload_started` — принятый WK reload; `response_received` — однозначно атрибутированный dashboard response после reload, не ACK content script. App tests отдельно требуют настоящий page initResp. macOS names заканчиваются `_macos`, iOS — стандартные platform/form-factor suffixes. Только outcome, appVersion и стандартные platform parameters, без URL/tab ID/form values/raw error.
На данном этапе: targeted unit suite **178 PASS**, strict lint **17 Swift / 0 violations**, pixel definitions + wide-event consistency/immutability validators обеих платформ PASS. Подписанная app-сборка и реальные install/upgrade 8000 ms regression runs ещё не завершены; over-budget failure пока НЕ объявлен исправленным. Новые артефакты: `/private/tmp/cpm-late-recovery-20261016/`.
## Итог late background recovery и fix instrumentation — 16 октября 2026
Актуальный стейт: checkpoint **`dff29dfb1e`** сохранён до новых изменений; новый код/tests/pixels в `alex/cpm-fix-p1-p2` остаются **незакоммиченными**. Новый flag **`webExtensions.cpmLateBackgroundDocumentRecovery` default disabled**, динамически проверяется до попытки и после async safety check; remote config не менялась. Navigation cap по-прежнему **5 s**.
Новый `CPMBackgroundReadinessRecovery.swift` в shared Autoconsent получает startup UUID manager, commit/failure/response/navigation events monitor и зарегистрированный GET WKWebView от platform tabs. Документ должен commit во время известного unfinished startup; только genuine missing-response timeout вместе с successful public background callback допускают одну GET-перезагрузку в пределах 30 s startup. Изменённый/loading/closed/failed document, main-document form edits/contenteditable, background app state, flag OFF и context replacement запрещают reload. Идентичность проверяется после async JS. Результат — replacement document на том же URL, сохранённый extension context; P2 background-only recovery исходного документа остаётся отдельным механизмом. Safety check использует настоящий async WK API label `contentWorld:`; ранние красные app runs поймали ошибочный callback overload с Void, и вся история сохранена.
Пять отдельных dailyAndCount pixels с prefix `web_extension_cpm_`: `install_readiness`, `upgrade_readiness`, `background_wake`, `background_load_retry`, `late_document_reload`. macOS suffix `_macos`, iOS standard suffixes. Первые четыре: `background_ready` после использованного slow navigation wait (для P2 любого successful retry), без page-ACK claim; последний: `reload_started` и однозначный dashboard `response_received` после replacement navigation. Ответ исходного документа во время safety check не получает credit. Только outcome и стандартные параметры, без URL/tab IDs/field values/raw errors. Injection + PixelKitMock adapter test, definitions/validators обеих платформ PASS. Existing episode contract сохранён; document reload даёт `failed_tab_response`, extension `reload_state=none`.
**Проверено на одной финальной подписанной сборке:** общий набор **8/8 PASS** (7 app/WebKit scenarios + adapter test); новые 8-second install/upgrade **2/2 PASS**, затем **10/10 repetitions PASS**; новый flag OFF **2/2 функционально FAIL**, 0 skips/expected failures/teardown errors. Во всех 14 positive over-budget executions первая загрузка **5.085–5.328 s**, затем ровно один reload, настоящий page initResp + native dashboard, URL/context сохранены. Edit-veto app test PASS; прежние P1/P2/install/upgrade PASS. Targeted units **179 PASS** (9 новых recovery; всего 18 новых unit methods в ветке), lint **17 files / 0 violations**, новый recovery без compiler warnings. Shared iOS Simulator и FeatureFlags-iOS builds PASS; полный iOS app/runtime не запускался.
Code entry points: manager background startup callback/typed fix marker; monitor `backgroundReadinessRecovery` и `registerReadinessRecoveryDocument`; macOS PrivacyDashboardTabExtension weak view + real initiating request method; iOS TabViewController main-frame GET tracking; platform factories dedicated provider; PixelFiring adapters + platform JSON5 definitions. Все 8 app methods остаются в существующем CPM file/scheme; SharedPackages files подхватывает SwiftPM без pbxproj изменений.
Все facts/history/guards/pixel semantics: [[cpm-status-2026-10-15]], `/private/tmp/cpm-late-recovery-20261016/validation-summary.json`. Source/app/test binary hashes стабильны; bundled ZIP равен checkpoint; package pin side effect убран; scratch/#7379 не менялись. Это opt-in bounded GET recovery, не универсальное исправление permanent background failures/unsafe documents. Прежние P3/P5 и natural-production/iOS suspension ограничения не сняты; 22 historical research methods отдельно.
+49
View File
@@ -962,3 +962,52 @@ Negative controls конкретно: P2 — timeout ожидания восст
Первый кандидат дал **0/2 PASS / 2 functional FAIL** (`late-smoke.xcresult`); диагностический повтор install — **0/1 PASS** (`late-trace.xcresult`). Документ действительно оставался без native dashboard/page initResp после 5 s release и WK callback 8.1–8.5 s. Это не infrastructure failure: reload не начинался. Логи подтвердили armed candidate, GET/history identity и включённый flag, но safety check всегда false. Установлена конкретная ошибка Swift overload: `evaluateJavaScript(..., in: nil, in: .defaultClient)` выбирал synchronous callback overload, возвращающий Void; cast к Bool всегда false. SDK async overload имеет label `contentWorld:`. Вызов исправлен; аналогичный вызов edit-veto app test тоже переведён на настоящий async API. Локальные decision logs оставлены на debug level, без URL/field values.
На исправленном исходнике **2/2 app PASS** (`late-fixed.xcresult`): 8000 ms worker delay; первая загрузка install **5.230188 s**, upgrade **5.141589 s**, каждая до готовности background; ровно **2 document finishes** (первый + один automatic reload), тот же URL/context, настоящий native dashboard и page initResp. Pixels: соответствующий install/upgrade `background_ready`, затем late-document `reload_started` и `response_received`. Episode закрывается `failed_tab_response` / `reload_state=none`: reload здесь относится к документу, не extension context. Targeted unit **179 PASS**, 0 failures/skips; strict lint **17 files / 0 violations**; shared iOS Simulator + iOS FeatureFlags builds PASS. Полный app run из 8 методов, repeated runs и disabled-new-flag controls ещё выполняются/ожидают очереди. Предыдущие красные artifacts сохранены, assertions не ослаблены.
## Итог: opt-in recovery первого документа за пределами 5 s + fix pixels — 16 октября 2026
Это актуальный результат поверх предыдущих progress-записей. Checkpoint прежнего проверенного состояния — **`dff29dfb1ec7240ee4e2694191a7385dc32dd782`** (`Fix CPM background wake and installation readiness`). HEAD остался на нём; **новые recovery/pixels/tests НЕ закоммичены**. Ветка/worktree: `alex/cpm-fix-p1-p2`, `/Users/admin/DuckDuckGo/apple-browsers.git/alex/cpm-fix-p1-p2`. #7379 не изменялся и не закрывался.
**Новый независимый remote flag:** `webExtensions.cpmLateBackgroundDocumentRecovery`, **default disabled** на macOS и iOS; remote configuration не менялась. Tests явно включают его. Старые gate/recovery flags и **navigation timeout 5 s** сохранены. Восстановление работает независимо от diagnostics flag.
`CPMBackgroundReadinessRecovery` получает точный startup UUID от manager и события реального health monitor. Документ привязывается к startup, только если commit произошёл до успешной готовности background. Нужны оба факта: реальный missing-dashboard timeout и успешный public WK background callback. Затем допускается одна GET-перезагрузка в пределах 30 s от начала startup. Проверяются тот же navigation/document и history item, отсутствие загрузки/изменённых main-document form fields/contenteditable, foreground app state и runtime flag; флаг/идентичность проверяются повторно после async JS safety check. Смена/закрытие/ошибка навигации и context replacement отменяют candidate. Healthy late response отменяет reload; ответ исходного документа во время safety check не получает recovery credit. Повторные callbacks не создают цикл.
Это **новый документ на том же URL после одного reload**, с сохранённым WKWebExtensionContext. Исходный потерянный init не пересылается. P2 по-прежнему восстанавливает именно исходный документ background-only retry; его механизм не заменён этим reload.
| Финальная проверка | Проверенный результат |
|---|---|
| Signed общий app-набор | **8/8 PASS**, 0 skips/expected failures, 0 teardown/deallocation errors — `enabled-all.xcresult` |
| Новые over-budget install + upgrade, первый зелёный прогон | **2/2 PASS** — `late-fixed.xcresult` |
| Те же два over-budget метода, по 5 повторов | **10/10 executions PASS**, 2 уникальных метода — `late-repeat.xcresult` |
| Только новый flag OFF, те же binaries | **0/2 PASS, 2 functional FAIL**, expectedFailures=0, exit 65, без teardown errors — `late-disabled.xcresult` |
| Targeted shared unit suites | **179 PASS**, 0 failures/skips: manager 48, lifecycle 31, background-load diagnostics 13, health monitor 78, новый recovery 9 |
| Strict SwiftLint | **17 Swift files, 0 violations**; compiler warnings нового recovery отсутствуют после исправления async API |
| Pixel definitions, formatting, wide-event consistency + immutability | **PASS macOS + iOS**; generated schemas не менялись |
| Shared WebExtensions + FeatureFlags-iOS для iOS Simulator | **BUILD SUCCEEDED**; полный iOS app/runtime не запускался |
| Подписи | Apple Development: Alexey Martemyanov (9SAT8X9S84); strict verify app debug dylib и загружаемого Integration Tests.xctest PASS |
Восемь методов — **7 реальных app/WebKit scenarios + 1 PixelKitMock adapter test**: прежние P1, P2, install, upgrade; два новых 8000 ms install/upgrade; запрет reload изменённой формы; проверка пяти имён/prefix/frequency/parameters через production adapter. Новые 9 unit methods проверяют success/failure prerequisites, once-only, healthy late reply, stale/closed/failed/replaced navigation, runtime flag/background checks, flag OFF→ON, expiry/unsafe veto, ответ во время safety check и отдельные pixel metadata. От checkpoint добавлены 4 app methods и 9 unit methods; всего в чистой ветке 8 app methods и 18 новых unit methods относительно исходной telemetry branch. Исторические 22 research methods не подменяются этим счётом.
Во всех **14 положительных over-budget executions** (2 initial + 2 combined + 10 repeat) worker delay **8000 ms**, первый document finish **5.085–5.328 s**, раньше ответа фона; finish count строго **2** (первая загрузка + один reload), URL/context те же, настоящий native dashboard и page `initResp` получены. Test допускает 6.5 s на 5 s gate + loopback document load. Новый флаг OFF оставляет обе страницы без ответа после public background readiness; оба fail именно на ожидании автоматического recovery. Это проверяет чувствительность регрессий. P1 остаётся healthy без failure episode; P2 получает настоящую error 6, сохраняет context и доставляет исходному документу `initResp` без навигации. Проверка изменённого поля сохраняет один finish и отсутствие reload pixels; последующая ручная навигация healthy.
### Пиксели пойманных fix cases
Общий prefix `web_extension_cpm_`; **macOS добавляет `_macos`**, iOS использует стандартные platform/form-factor suffixes. Каждый case — отдельный pixel, frequency **dailyAndCount**:
| Case | outcome и точный смысл |
|---|---|
| `install_readiness` | `background_ready`: успешный медленный WK callback после использования navigation wait при install |
| `upgrade_readiness` | `background_ready`: такой же callback именно replacement context при upgrade |
| `background_wake` | `background_ready`: медленный shared wake после использования navigation wait (P1) |
| `background_load_retry` | `background_ready`: успешный public background retry после настоящей error 6 (P2), включая быстрый callback |
| `late_document_reload` | `reload_started`: WK принял reload; `response_received`: monitor однозначно атрибутировал dashboard response после начала replacement navigation |
`background_ready` не означает page ACK. `response_received` — dashboard evidence, без доказательства причинности reload или initResp/all-tab recovery; настоящий page ACK отдельно проверяет app harness. Daily считает affected devices по имени, count/stage позволяет различать фактические операции; daily dedup не разделён по outcome. Параметры: outcome + стандартные appVersion/pixelSource/(macOS channel), без URL/tab ID/form values/raw errors. Пять definitions присутствуют на обеих платформах; adapters используют injected PixelKit sink. Существующий episode pixel/schema сохранён: для document reload observed `failed_tab_response` / `reload_state=none`, поскольку reload_state относится к extension context.
### Артефакты и границы
`/private/tmp/cpm-late-recovery-20261016/validation-summary.json` содержит группы прогонов, timings, source/binary SHA256 и ограничения; рядом все `.xcresult`, summaries, JSON attachments, build/unit/lint/pixel/signing logs и `summarize.py`. Красные `late-smoke` (2 fail) и `late-trace` (1 fail) сохранены: они выявили неверно выбранный Void callback overload; async label исправлен на `contentWorld:`. Assertions не ослаблялись. Финальные source hashes и app/XCTest binary hashes стабильны во всех зелёных/повторных/disabled runs.
Bundled ZIP равен checkpoint, SHA256 `ff98a2b0c07819b2ee5ee6de67d6dd8d28696363c08c9fbc2c32255e9d9efa94`; задержка/DOM observation добавляются только в extracted test copy. Реальные AppDelegate, tabs/windows, lifecycle coordinator, handler, health monitor и системный WebKit; нет искусственного отвязывания табов, фиктивных ответов или scoped drops. P2 останавливает только свой background PID и гарантированно возобновляет его. Побочный SwiftPM package pin diff сохранён в artifacts и убран; зависимости не изменены. Исходный research scratch не редактировался.
Старое ограничение «over-budget first response loss не исправлен» снято **для этого opt-in GET recovery в описанных условиях**. Постоянный/неответивший background, unsafe/edited/POST documents и startup за пределами recovery window этим механизмом не исправляются. Натуральные причины всех production cohorts, P3, старые P5-ограничения и реальный iOS suspension/resume этой новой проверкой не установлены и не закрыты.
@@ -283,3 +283,18 @@ Worktree `cpm-e2e-init`, HEAD всё ещё `46f25175c7c42766cab23ea39f447f075c7
Пять новых dailyAndCount pixels различают install readiness, upgrade readiness, idle background wake, error-6 background retry и late document reload. `background_ready` — факт успешного WK callback после использованного navigation wait (для error-6 retry — любого успешного retry), не доказательство initResp; `reload_started` — принятый WK reload; `response_received` — однозначно атрибутированный dashboard response после reload, не ACK content script. App tests отдельно требуют настоящий page initResp. macOS names заканчиваются `_macos`, iOS — стандартные platform/form-factor suffixes. Только outcome, appVersion и стандартные platform parameters, без URL/tab ID/form values/raw error.
На данном этапе: targeted unit suite **178 PASS**, strict lint **17 Swift / 0 violations**, pixel definitions + wide-event consistency/immutability validators обеих платформ PASS. Подписанная app-сборка и реальные install/upgrade 8000 ms regression runs ещё не завершены; over-budget failure пока НЕ объявлен исправленным. Новые артефакты: `/private/tmp/cpm-late-recovery-20261016/`.
## Итог late background recovery и fix instrumentation — 16 октября 2026
Актуальный стейт: checkpoint **`dff29dfb1e`** сохранён до новых изменений; новый код/tests/pixels в `alex/cpm-fix-p1-p2` остаются **незакоммиченными**. Новый flag **`webExtensions.cpmLateBackgroundDocumentRecovery` default disabled**, динамически проверяется до попытки и после async safety check; remote config не менялась. Navigation cap по-прежнему **5 s**.
Новый `CPMBackgroundReadinessRecovery.swift` в shared Autoconsent получает startup UUID manager, commit/failure/response/navigation events monitor и зарегистрированный GET WKWebView от platform tabs. Документ должен commit во время известного unfinished startup; только genuine missing-response timeout вместе с successful public background callback допускают одну GET-перезагрузку в пределах 30 s startup. Изменённый/loading/closed/failed document, main-document form edits/contenteditable, background app state, flag OFF и context replacement запрещают reload. Идентичность проверяется после async JS. Результат — replacement document на том же URL, сохранённый extension context; P2 background-only recovery исходного документа остаётся отдельным механизмом. Safety check использует настоящий async WK API label `contentWorld:`; ранние красные app runs поймали ошибочный callback overload с Void, и вся история сохранена.
Пять отдельных dailyAndCount pixels с prefix `web_extension_cpm_`: `install_readiness`, `upgrade_readiness`, `background_wake`, `background_load_retry`, `late_document_reload`. macOS suffix `_macos`, iOS standard suffixes. Первые четыре: `background_ready` после использованного slow navigation wait (для P2 любого successful retry), без page-ACK claim; последний: `reload_started` и однозначный dashboard `response_received` после replacement navigation. Ответ исходного документа во время safety check не получает credit. Только outcome и стандартные параметры, без URL/tab IDs/field values/raw errors. Injection + PixelKitMock adapter test, definitions/validators обеих платформ PASS. Existing episode contract сохранён; document reload даёт `failed_tab_response`, extension `reload_state=none`.
**Проверено на одной финальной подписанной сборке:** общий набор **8/8 PASS** (7 app/WebKit scenarios + adapter test); новые 8-second install/upgrade **2/2 PASS**, затем **10/10 repetitions PASS**; новый flag OFF **2/2 функционально FAIL**, 0 skips/expected failures/teardown errors. Во всех 14 positive over-budget executions первая загрузка **5.085–5.328 s**, затем ровно один reload, настоящий page initResp + native dashboard, URL/context сохранены. Edit-veto app test PASS; прежние P1/P2/install/upgrade PASS. Targeted units **179 PASS** (9 новых recovery; всего 18 новых unit methods в ветке), lint **17 files / 0 violations**, новый recovery без compiler warnings. Shared iOS Simulator и FeatureFlags-iOS builds PASS; полный iOS app/runtime не запускался.
Code entry points: manager background startup callback/typed fix marker; monitor `backgroundReadinessRecovery` и `registerReadinessRecoveryDocument`; macOS PrivacyDashboardTabExtension weak view + real initiating request method; iOS TabViewController main-frame GET tracking; platform factories dedicated provider; PixelFiring adapters + platform JSON5 definitions. Все 8 app methods остаются в существующем CPM file/scheme; SharedPackages files подхватывает SwiftPM без pbxproj изменений.
Все facts/history/guards/pixel semantics: [[cpm-status-2026-10-15]], `/private/tmp/cpm-late-recovery-20261016/validation-summary.json`. Source/app/test binary hashes стабильны; bundled ZIP равен checkpoint; package pin side effect убран; scratch/#7379 не менялись. Это opt-in bounded GET recovery, не универсальное исправление permanent background failures/unsafe documents. Прежние P3/P5 и natural-production/iOS suspension ограничения не сняты; 22 historical research methods отдельно.