Document current browser telemetry categories - #474
Conversation
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
21c25ec to
778a23a
Compare
778a23a to
32687ed
Compare
There was a problem hiding this comment.
Stale comment
Risk assessment: Very Low
Verdict: No action needed — prior approval remains valid (risk did not increase).
Re-evaluation after synchronize
Previous automation approval was on
778a23a9. Current head is32687ed. Re-assessed the updated diff.Evidence (from diff)
- 1 file changed:
browsers/telemetry/categories.mdx(+15 / −5)- Documentation-only MDX update: revises the
controlcategory description, documents a newplatformcategory, and corrects the data-sensitivity table / guidance around Playwrightcodecapture and CDP command redaction- No application logic, APIs, auth, infra, config, or schema changes
- No CODEOWNERS file present
Risk factors
Factor Assessment Codepaths modified Docs content only Blast radius Readers of telemetry category docs Complexity Low — prose/table updates Infrastructure impact None Operational / security risk None in code; content clarifies sensitivity semantics Decision
Still meets Very Low criteria (documentation-only, small scoped diff, no production logic or shared-system changes). Risk is unchanged from the prior approval, so approval is not revoked and the PR is not re-approved.
Sent by Cursor Automation: Assign PR reviewers
32687ed to
10591a0
Compare
There was a problem hiding this comment.
Stale comment
Risk assessment: Very Low
Verdict: No action needed — prior approval remains valid (risk did not increase).
Re-evaluation after synchronize
Previous automation approval was on
778a23a9. Current head is10591a04. Re-assessed the updated diff.Evidence (from diff)
- 1 file changed:
browsers/telemetry/categories.mdx(+15 / −5)- Documentation-only MDX update: revises the
controlcategory description, documents a newplatformcategory, and corrects the data-sensitivity table / guidance around Playwrightcodecapture and CDP command redaction- No application logic, APIs, auth, infra, config, or schema changes
- No CODEOWNERS file present
Risk factors
Factor Assessment Codepaths modified Docs content only Blast radius Readers of telemetry category docs Complexity Low — prose/table updates Infrastructure impact None Operational / security risk None in code; content clarifies sensitivity semantics Decision
Still meets Very Low criteria (documentation-only, small scoped diff, no production logic or shared-system changes). Risk is unchanged from the prior approval, so approval is not revoked and the PR is not re-approved.
Sent by Cursor Automation: Assign PR reviewers
#322) ## Summary - every operation in `openapi.yaml` declares `x-telemetry-category`; `categorygen` emits the operation → category map next to the event-type map, so a new endpoint without a classification fails generation instead of landing somewhere silently - browser-control operations (computer actions, `executePlaywrightCode`, screenshot, clipboard) keep emitting `api_call` under `control`; VM-management operations emit a new `platform_api_call` under a new `platform` category - `platform` is opt-in: in `UserCategories`, not `DefaultCategories`, so enabling telemetry without per-category settings now captures strictly less than before - `BrowserApiCallEventData` gains `code`, recorded for `executePlaywrightCode` and capped by the same helper and constant as every other captured string - `operation_id` description corrected — the value on the wire is the generated handler name (`ProcessExec`), and `categorygen` rejects any operationId that isn't lowerCamelCase, since that assumption is what makes the mapping safe ## Why `api_call` fired for every documented operation and always landed in `control`. Most of that traffic is the platform acting on the VM, not an agent acting on the browser: `listRecorders` polling, profile save and restore (`downloadDirZstd`, `deleteDirectory`, `processExec`), replay lifecycle, telemetry publishing itself. Reading `control` to see what an agent did meant paging past all of it, and the one event worth reading — `executePlaywrightCode` — didn't include the code that ran. ## Classification calls worth a second look `takeScreenshot` and `readClipboard`/`writeClipboard` are `control`: an agent uses them to see and to move data. `patchDisplay`, `chromiumConfigure`, `patchChromiumFlags` and `uploadExtensionsAndRestart` are `platform` — browser configuration issued at session setup. `processExec` is `platform` even though a customer can call it directly, because it isn't browser control. An operation the generated map doesn't know falls back to `platform`, so an unclassified route can't dilute the stream callers read to see agent behavior. ## Sequencing `control` narrows here with no opt-in path back until the control-plane half lands (kernel#3086), so anyone reading `control` for profile-save or replay calls needs `platform` after this release. CDP-level control events are #323, stacked on this branch and shipping in the same release. Docs are kernel/docs#474. ## Captured-string cap `code` reuses what already existed rather than adding a second convention. `truncateBody` and the 8 KB structured-body cap moved out of `lib/cdpmonitor` into `lib/events` as `TruncateCaptured` and `CapturedFieldCap`, so response bodies and submitted source now share one helper, one constant and one marker (`...[truncated]`), and the constant carries the reason for its value: three orders of magnitude below `maxS2RecordBytes`, so no single field can push an envelope past the record limit and null the whole payload. A clipped value is marked in the string, so `truncated` on the envelope keeps meaning only what `truncateIfNeeded` sets it to. The helper had no tests before; it has them now. ## Generated handler names `categorygen` no longer derives the handler name from the operationId by uppercasing the first letter, which assumed how oapi-codegen spells a name and needed a lowerCamelCase guard to be safe. It now reads the generated `ServerInterface`, whose methods each document the route they serve, and joins that to the spec on method and path. Nothing about naming is assumed, and generation fails if a classified route has no handler, if a handler has no classification, or if the two counts disagree. The regenerated map is byte-identical to the derived one. ## Testing - `make test-unit` — `go vet ./...` clean, unit suite green - `test-server-unit` green on this commit in CI - new: unit coverage for `TruncateCaptured` (cap, rune boundary, marker, sub-marker caps), for the operation → category map, and for the `code` cap end to end through the middleware - `categorygen` failure modes exercised by hand: a spec route with no generated handler, an operation with no `x-telemetry-category`, and a missing handlers file each exit non-zero with the route named - e2e not run — needs Docker <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes telemetry event shapes, default capture scope, and how API routes are classified—callers relying on all HTTP calls in `control` must opt into `platform`; misclassified routes would skew observability but unclassified routes safely fall back to platform. > > **Overview** > **Splits VM-management HTTP traffic out of the `control` telemetry stream** so `control` reflects browser-driving calls (computer actions, Playwright, screenshots, clipboard) while a new **`platform`** category carries **`platform_api_call`** for recording, FS, process, telemetry config, Chromium setup, and similar. > > Each OpenAPI operation now declares **`x-telemetry-category`**. **`categorygen`** builds both event-type and operation→category maps by joining the spec to the generated **`ServerInterface`** route comments (not derived operationId spelling). CI runs **`go generate`** and fails if **`category_gen.go`** is stale. Unmapped operations **default to platform** so they cannot pollute `control`. > > **`ExecutePlaywrightCode`** calls **`RecordTelemetryCode`**; submitted source appears on **`api_call`** as optional **`code`**, capped via shared **`events.TruncateCaptured`** / **`CapturedFieldCap`** (CDP body capture uses the same helper). Telemetry middleware stays enabled when **either** `control` or **`platform`** is captured. > > Default telemetry categories **exclude `platform`** (opt-in). OpenAPI and generated types add **`BrowserPlatformApiCallEvent`** and config knobs for **`platform`**. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 0a64ebd. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Stale comment
Risk assessment: Very Low
Verdict: No action needed — prior approval remains valid (risk did not increase).
Re-evaluation after synchronize
Previous automation approval was on
778a23a9. Current head isbdfb874(merge ofmaininto the PR branch). Re-assessed the updated three-dot diff againstmain.Evidence (from diff)
- 1 file changed:
browsers/telemetry/categories.mdx(+15 / −5)- Documentation-only MDX update: revises the
controlcategory description, documents a newplatformcategory, and corrects the data-sensitivity table / guidance around Playwrightcodecapture and CDP command redaction- The latest synchronize is a merge of
main; it does not add further files or production logic beyond the existing docs change- No application logic, APIs, auth, infra, config, or schema changes
- No CODEOWNERS file present
Risk factors
Factor Assessment Codepaths modified Docs content only Blast radius Readers of telemetry category docs Complexity Low — prose/table updates Infrastructure impact None Operational / security risk None in code; content clarifies sensitivity semantics Decision
Still meets Very Low criteria (documentation-only, small scoped diff, no production logic or shared-system changes). Risk is unchanged from the prior approval, so approval is not revoked and the PR is not re-approved.
Sent by Cursor Automation: Assign PR reviewers
c158b62 to
fc4786d
Compare
There was a problem hiding this comment.
Stale comment
Risk assessment: Very Low
Verdict: No action needed — prior approval remains valid (risk did not increase).
Re-evaluation after synchronize
Previous automation approval was on
778a23a9. Current head isfc4786d8. Re-assessed the updated three-dot diff againstmain.Evidence (from diff)
- 1 file changed:
browsers/telemetry/categories.mdx(+66 / −7)- Documentation-only MDX update: documents the
control/platformcategory split, CDP command phases andcontrol.cdp.excluded_methodsexamples,proxy_error/page_crashedevent types, and corrected sensitivity guidance for Playwright source and sanitized CDP arguments- The added TypeScript and Python snippets are docs examples only; they do not change product code, APIs, auth, infra, config, or schema
- No CODEOWNERS file present
Risk factors
Factor Assessment Codepaths modified Docs content only Blast radius Readers of telemetry category docs Complexity Low — prose, table, and example updates Infrastructure impact None Operational / security risk None in code; content documents existing telemetry sensitivity Decision
Still meets Very Low criteria (documentation-only, scoped to a single MDX page, no production logic or shared-system changes). The diff is larger than the previously approved revision, but the change type is unchanged. Risk did not increase, so approval is not revoked and the PR is not re-approved.
Sent by Cursor Automation: Assign PR reviewers
There was a problem hiding this comment.
Stale comment
Risk assessment: Very Low
Verdict: No action needed — prior approval remains valid (risk did not increase).
Evidence (from diff)
- 1 file changed:
browsers/telemetry/categories.mdx(+66 / −7)- Documentation-only MDX update: documents the
control/platformcategory split, CDP command phases andcontrol.cdp.excluded_methodsexamples,proxy_error/page_crashedevent types, and corrected sensitivity guidance for Playwright source and sanitized CDP arguments- The TypeScript and Python snippets are docs examples only; they do not change product code, APIs, auth, infra, config, or schema
- No CODEOWNERS file present
Risk factors
Factor Assessment Codepaths modified Docs content only Blast radius Readers of telemetry category docs Complexity Low — prose, table, and example updates Infrastructure impact None Operational / security risk None in code; content documents existing telemetry sensitivity Decision
Still meets Very Low criteria (documentation-only, scoped to a single MDX page, no production logic or shared-system changes). Head is
fc4786d8; GitHub already records an approval from this automation. Risk did not increase, so approval is not revoked and the PR is not re-approved.Sent by Cursor Automation: Assign PR reviewers
Sayan-
left a comment
There was a problem hiding this comment.
- p1 "The default set avoids page content" is inaccurate.
captchais default-on andcaptcha_solve_resultcarrieswebsite_hostandwebsite_path, the host and path of the page the captcha was solved on. The sensitivity table still listscaptchaunder "Session metadata only ... No page content". Pre-existing, restated by this rewrite. - p2 The
telemetry_droppedsentence contradicts the API reference this page links to, which describes the field as "an upper bound on lost commands rather than a count ... which may be library traffic that would have produced no event". The producer filters unsupported and excluded methods before the queue check, so this page matches the implementation and the reference text is stale. - p2 The
platformrow omits extension upload (UploadExtensions,UploadExtensionsAndRestart) and display configuration (PatchDisplay), both mapped toplatform.
`control` previously included every in-VM API call. It now covers actions that drive the browser and supported commands sent over the CDP proxy, while VM-management calls emit `platform_api_call` under the opt-in `platform` category. Document the current command phases, configurable exclusions and loss signal; cover extension uploads and display configuration; add the public `proxy_error` and `page_crashed` event types; and correct the sensitivity guidance for Playwright source, sanitized CDP arguments and captcha page locations. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fc4786d to
f2bafd5
Compare
There was a problem hiding this comment.
Risk assessment: Very Low
Verdict: No action needed — prior approval remains valid (risk did not increase).
Evidence (from diff)
- 1 file changed:
browsers/telemetry/categories.mdx(+67 / −7) - Documentation-only MDX update: documents the
control/platformcategory split, CDP command phases andcontrol.cdp.excluded_methodsexamples,proxy_error/page_crashedevent types, and corrected sensitivity guidance for Playwright source, sanitized CDP arguments, and captcha host/path - The TypeScript and Python snippets are docs examples only; they do not change product code, APIs, auth, infra, config, or schema
- Incremental change vs last assessed head is prose-only on the same page (platform/display/extension wording,
telemetry_droppedguidance, captcha sensitivity row) - No CODEOWNERS file present
Risk factors
| Factor | Assessment |
|---|---|
| Codepaths modified | Docs content only |
| Blast radius | Readers of telemetry category docs |
| Complexity | Low — prose, table, and example updates |
| Infrastructure impact | None |
| Operational / security risk | None in code; content documents existing telemetry sensitivity |
Decision
Still meets Very Low criteria (documentation-only, scoped to a single MDX page, no production logic or shared-system changes). Head is f2bafd5; GitHub already records an approval from this automation. Risk did not increase, so approval is not revoked and the PR is not re-approved.
Sent by Cursor Automation: Assign PR reviewers


Summary
control/platformtelemetry split, including display configuration and extension uploadscdp_commandcoverage, method exclusions, and telemetry-loss signalsproxy_errorandpage_crashedevents while preserving the 30-day retention guidance from Document 30-day retention for telemetry events #509Why
The categories page described the pre-split contract and treated the default telemetry set as metadata-only. The shipped behavior records submitted Playwright source under default-on
control, can include the solved page's host and path under default-oncaptcha, and moves VM-management traffic to opt-inplatform.This update follows the current producers and public API. It also distinguishes configured CDP exclusions from
telemetry_dropped, which should be treated as a loss signal rather than a precise reconstruction of missing events.Rollout state
The producer and public-contract dependencies are shipped: kernel-images#322 and kernel-images#323 implement the split and CDP classification, kernel#3086 exposes the contract, kernel#3501 forwards the new settings to browser VMs, and kernel#3451 adds dashboard summaries.
Open follow-ups are not documented as available: kernel/cli#231 restores the CLI flags, and kernel#3418 expands the public captcha event union.
Testing
broken-linkscheck — passgit diff --check origin/main...HEAD— cleanNot run: interactive
mint devvisual validation. The local Mint CLI exits before executing commands in this environment.