diff --git a/work/projects/cpm-permanent-breakage-metric-tech-design-2026-11-10.md b/work/projects/cpm-permanent-breakage-metric-tech-design-2026-11-10.md index d091a966..9bedbca3 100644 --- a/work/projects/cpm-permanent-breakage-metric-tech-design-2026-11-10.md +++ b/work/projects/cpm-permanent-breakage-metric-tech-design-2026-11-10.md @@ -84,8 +84,8 @@ Measurements older than five minutes dropped; no minimum lifetime; tab process c |---|---|---| | 1, [#8025](https://github.com/duckduckgo/apple-browsers/pull/8025) | Remove ineffective recovery fixes and flags | pushed, in review | | 2, `alex/cpm-pixel-cleanup` | Remove diagnostics, trim the episode pixel | local, tests pass, not pushed | -| 3, `alex/cpm-breakage-metric` | This design, two commits: new pixels; removal of the old pixels | in progress | -| 4 | Marks and `last_stage` ([[cpm-wake-init-detection-tech-design-2026-11-10]]) plus extension #3727 | not started | +| 3, `alex/cpm-breakage-metric` (`fc73706152`) | This design: new pixels and removal of the old ones, one commit | local; package tests 1013 pass; both pixel validators pass; macOS app and tests build; iOS build running; not pushed | +| 4, `alex/cpm-init-marks` (`a0e27597f2`) | Marks and `last_stage` ([[cpm-wake-init-detection-tech-design-2026-11-10]]) | local; package tests 1023 pass; validators pass; not pushed. Extension: `alex/cpm-init-progress` has the new commit `908f9a62`, not pushed | ### Cons diff --git a/work/projects/cpm-wake-init-detection-tech-design-2026-11-10.md b/work/projects/cpm-wake-init-detection-tech-design-2026-11-10.md index e7f6bc5b..4e6177ae 100644 --- a/work/projects/cpm-wake-init-detection-tech-design-2026-11-10.md +++ b/work/projects/cpm-wake-init-detection-tech-design-2026-11-10.md @@ -44,7 +44,7 @@ Requirements: ## Problem Statement -For every document judged broken by the permanent breakage metric, record the furthest init step the extension reported for it, and use `initResp` delivery as healthy evidence. With that: +For every document judged broken by the permanent breakage metric, record the furthest init step the extension reported for it. With that: 1. Separate "init never reached the background" from "background stalled on its own storage or native round trip" from "answer could not be delivered to the page". 2. Join the result with `background` (woken, warm) so wake failures are split from the rest. @@ -54,7 +54,7 @@ Collect no page content, URLs or persistent identifiers. ## Recommended Approach -The extension reports **progress marks** for each main-frame init as fire-and-forget native notifications. The app keeps the furthest mark per document, treats `response_sent` as healthy evidence, treats `response_failed` as an immediate breakage, and adds `last_stage` to `web_extension_cpm_breakage`. +The extension reports **progress marks** for each main-frame init as fire-and-forget native notifications. The app keeps the furthest mark per document, reports the page at once on `response_failed`, and adds `last_stage` to `web_extension_cpm_breakage`. `response_sent` is recorded but not counted as the page's answer until it is verified against real WebKit. ### Marks @@ -74,7 +74,7 @@ Marks are best effort: they carry `{ tabId, url, stage }`, never wait and never - `AutoconsentWebExtensionMessageHandler` gets a `cpmInitProgress` method. Unknown stage names are ignored without an error, so a newer extension cannot make an older app answer with failures. - `CPMMessagingHealthEvent.initProgress` carries the mark; the monitor stores `lastStage` per document and clears it on a new navigation, a cancelled navigation and an extension reload. -- `response_sent` counts as healthy evidence for the document, like a dashboard response. `response_failed` judges a pending document at once. Healthy evidence is either the dashboard refresh or `response_sent`; the open question below asks whether `response_sent` should count before it is verified. +- Only the dashboard refresh counts as the page's answer. `response_sent` is recorded as a stage; `response_failed` reports a pending page at once. - The Debug "Simulate CPM Messaging Breakage" switch hides marks as well as dashboard responses. ### Pixel change @@ -83,7 +83,7 @@ Marks are best effort: they carry `{ tabId, url, stage }`, never wait and never | Parameter | Values | |---|---| -| `last_stage` | `none` (no mark reached the app), `page_init_sent`, `received`, `config_read`, `settings_checked`, `site_checked`. `response_sent` cannot appear on a breakage, because it is healthy evidence. `response_failed` appears when it was the reason. | +| `last_stage` | `none` (no mark reached the app), `page_init_sent`, `received`, `config_read`, `settings_checked`, `site_checked`. `response_sent` can appear: the page got `initResp` but no dashboard refresh was attributed. `response_failed` appears when it was the reason. | No new pixel. Names, frequency and the other parameters are unchanged. Both platforms' definitions and `params_dictionary.json5` get the parameter.