Skip to content

Capture anonymous core capability use - #5316

Closed
brsbl wants to merge 16 commits into
bb/tipsfrom
bb/telemetry-automation-split-view-thr_gqshddt6w2
Closed

brsbl wants to merge 16 commits into
bb/tipsfrom
bb/telemetry-automation-split-view-thr_gqshddt6w2

Conversation

@brsbl

@brsbl brsbl commented Oct 10, 2026 •

Copy link
Copy Markdown
Collaborator

Human comments

What was wrong

Core actions lack a shared usage contract, making coverage inconsistent across entry points.

What changed

  • Add one strict feature_used contract with fixed capability, interaction, and trigger categories.
  • Capture shared server actions and explicit split, file, review, and search opens.
  • Preserve opt-out and exclude polling, invalid requests, and restored layouts.

How you verified

  • Remote CI passed at 9cd045a7.
  • Cumulative review covered the stack at 654570f7; no unresolved P0/P1 findings.
  • Exact-head app → server → local capture verified a settings action as feature_used with person/web attribution. Production PostHog traffic was intercepted locally.

BB-Thread: Retention measurement

BB-Thread-ID: thr_gqshddt6w2

AGENT GENERATED

Adds automation_created (trigger, mode, origin) and split_view_opened
(pane count after opening, 2-8) to the client telemetry allow-list.
Automations emits from its server create path through the plugin SDK's
system.experimental_recordTelemetryEvent, so the RPC and CLI paths report
once each and failures never affect creation. The app reports split view
from one watcher on the split layout, so every surface that adds a pane
reports it and restoring a saved layout does not. The server still drops
both when usage data sharing is off. Privacy copy, configuration docs, the
API audit entry, and the Automations overview list the new events.
Plugin SDK 0.6.40.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@brsbl
brsbl added this pull request to stack #5232 October 10, 2026 02:40
brsbl and others added 2 commits October 9, 2026 19:50
Automations' service receives a narrow ServiceApi, so the telemetry helper
and that type now name system.experimental_recordTelemetryEvent explicitly,
and the hand-built test SDKs stub it. Formats the PR's files with oxfmt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brsbl
brsbl removed this pull request from stack #5232 October 12, 2026 21:28
@brsbl
brsbl added this pull request to stack #5398 October 12, 2026 21:28
SawyerHood and others added 13 commits October 12, 2026 14:28
…5387)

## Human comments

## What was wrong

Plugins had no supported way to render a multi-line block inside an
assistant reply. `messageDirective` is single-line leaf syntax and stays
literal until it closes, so a plugin that wanted generative UI had to
scrape rendered `pre > code` elements and overlay its own UI (#5268).
Separately, the built-in `inline-vis` plugin showed HTML in a fixed
224px card and Markdown in a box that scrolled inside the thread.

## What changed

**New slot: `app.slots.experimental_codeFenceRenderer({ id, languages,
component })`.** A plugin claims fence languages and renders those
fenced code blocks in assistant and nested-agent message Markdown. The
first two commits are @ComicBit's prototype from #5268 (registration
validation, slot store, plugin guide card, test harness support). The
third commit rebuilds the rendering side, and the contract differs from
the issue's proposal:

- `status: "streaming" | "closed" | "unclosed"` replaces `complete`, so
a renderer can tell a block that is still being written from one the
reply never closed.
- The component for a fence is mounted once and kept for the whole
reply; there is no remount when the fence closes or the reply finishes.
The Markdown tree renders a placeholder, and a host around the message's
Markdown (`CodeFenceRendererHost`) owns the component and portals it
into a container that follows the placeholder from the streaming tail to
the settled region. Where the browser has `Element.moveBefore`, an
iframe inside the component is not reloaded by that move; elsewhere
component state survives and the iframe reloads once.
- A fence is identified by the source offset of its opening delimiter,
the same way images are, so the settled text is not re-parsed to number
fences. `index` (ordinal among fences of the same language) is computed
at the message level.
- A language claimed by two plugins renders BB's code block and logs a
warning, matching `messageDirective`.
- A throw affects one fence only, and BB tries the component again when
that fence's `code` or `status` changes, so a renderer that fails on a
half-streamed body recovers on the next chunk. `PluginSlotMount` gains
`crashResetKey` for this; slots that do not pass it behave as before.
- `mermaid` stays a core special case inside `Original`, because it
renders on every Markdown surface and this slot is scoped to messages.

`@get-bb/plugin-sdk` goes to 0.6.40. The plugin guide card, the
authoring skill references, `bb-guide-plugins.md`, and the
`docs/api_to_audit.md` entry describe the new contract and list what to
audit before stabilizing. No server/daemon wire fields change.

**inline-vis** (fourth commit):

- An HTML file shown with `::inline-vis{file="…"}` is now a borderless
sandboxed frame on the thread background that fits the page's height and
follows bb's theme variables live, with a hover action to open the file.
`preparePreview` returns the file's `content` and `sha256` for this.
- A fenced `inline-vis` code block whose body is an HTML page renders
the same way through the new slot, with no file. A status line shows
while the block streams, and a hover action reveals the source.
- A Markdown file shows in a card with its file name, copy and open
actions, and a preview that expands in place ("Show more") instead of
scrolling inside the card.
- The bundled skill teaches both forms, the layout rules, and the theme
variables.

Behaviour changes for existing users of the directive:

- An HTML page used to get a fixed 224px frame; it now fits its content
and `height` is a cap.
- `height` accepts 80–2000 (was 120–1200). For Markdown it is the
preview height, 256px by default (was a 224px scrolling box).
- The header toggle that hid a Markdown card, and its remembered
`bb.inline-vis.collapsed` preference, are removed.

## How you verified

- `pnpm exec turbo run typecheck lint --filter='...[origin/main]'
--continue`: 137 tasks pass.
- `pnpm exec turbo run test` for `@bb/app`, `@get-bb/plugin-sdk`,
`bb-plugin-inline-vis`, `bb-plugin-plugin-api-docs`, `@bb/templates`,
`@bb/domain`, `bb-plugin-bb-guide`: all pass (5,731 app tests, 369 SDK,
51 inline-vis, 73 plugin guide, 47 templates, 230 domain, 7 bb-guide).
- Server plugin suites (`builtin-registry`, `plugin-app-bundle`,
`bb-official-generator`, `sdk-compat`, `plugin-authoring-docs`): pass.
- `node apps/app/scripts/check-bundle-budget.mjs` after building
`@bb/app`, `node .github/workflows/check-plugin-sdk-version.mjs`, and
`node packages/plugin-sdk/scripts/check-npm-version-guard.mjs`: pass.
- New tests in `markdown-code-fence-renderers.test.tsx` cover: one
component instance and its state kept from the first streamed line
through the tail-to-settled move to the finished reply; `index` across
the two streaming regions; `status` for unclosed, closed, list-nested,
blockquoted, tilde, and over-indented fences; a crash isolated to one
fence and retried when its code changes; a contested language falling
back to BB's code block; and claims surviving the sanitized HTML
pipeline.
- Live, in a worktree dev app with a Claude Haiku thread: a reply
containing an `inline-vis` block, an HTML file directive, and Markdown
file directives rendered in light and dark themes and at phone width.
During a streamed reply the status line showed, the page's iframe was
inserted once, moved from the streaming tail to the settled region
without being disconnected, and kept its document to the end of the
reply.

Not verified: Safari and the mobile WebView (no `moveBefore`, so an
iframe reloads once when its block settles), and clicking the copy and
open-in-sidebar actions in the live app (tests cover both).

Fixes #5268

🤖 Generated with [Claude Code](https://claude.com/claude-code)

> AGENT GENERATED

---------

Co-authored-by: Leandro Piccione <ileocorp@gmail.com>
Co-authored-by: Claude Code <noreply@anthropic.com>
🚨 **SLOP COP** 🚨 · `new-issue-autopilot`

## Human comments

## What was wrong

Detached checkout of a short Git branch name triggers Git's implicit
local-branch creation when the branch exists only under origin after
cloning. Git rejects that combination before BB reads the marketplace
manifest. Reproduced on trusted main in two clean checkouts:
https://get-bb.github.io/reports/issues/5373.html.

## What changed

- Resolve the requested ref to a verified commit, with an origin
remote-tracking fallback, then detach at that commit.
- Add real-Git regression coverage for a non-default branch,
origin-qualified ref, annotated tag, commit hash, and branch refresh.
- Keep the existing clone strategy and public interfaces unchanged; no
dependency, protocol, schema, migration, or stored-data change.
- Changed-line count against origin/main: **82** (75 additions + 7
deletions), across **2 files** in the existing plugin-catalog subsystem.

## How you verified

- Before the fix, the focused regression fails for the short branch with
Git exit 128; the other three cases pass. Repeated on a second clean
checkout of the same trusted main commit.
- After the fix, all four focused cases pass. Eight relevant catalog
suites pass: **149 tests**, including existing default-branch lifecycle
coverage.
- `pnpm exec turbo run test --filter=@bb/server --
test/services/plugin-catalog/third-party-marketplaces.test.ts -t 'reads
the selected catalog commit'`
- Relevant suites run through Turbo with the eight test file paths under
`test/services/plugin-catalog`, excluding the unrelated official
generator suite.
- `pnpm exec turbo run typecheck --filter=@bb/server`, focused `oxfmt
--check`, and `git diff --check` pass; no binary changes.
- A broader catalog-directory run has one pre-existing
official-generator timestamp expectation failure: Git emits `+00:00`
rather than `Z`. The same failure occurs on unchanged trusted main; it
does not exercise the modified materializer and is not changed here.

Fixes #5373

> AGENT GENERATED

<!-- slopcop:rule=new-issue-autopilot run=run_pndur7immv53ds7l
sha=issue-5373 kind=summary -->

Co-authored-by: SawyerHood <sawyerjhood@gmail.com>
## Human comments

## What was wrong

A git marketplace could only keep `marketplace.json` at the repository
root. `materializeGit` cloned the repository and read
`<checkout>/marketplace.json`, with no way to name another directory. A
repository that holds plugins for several agent tools could not keep its
bb files together in one folder (#5372).

## What changed

`bb marketplace add git:<url>[@<ref>] --subdirectory <path>` reads
`marketplace.json` and relative icons from that directory of the
checkout.

- **Server:** `plugin_marketplaces` gains a nullable
`source_git_subdirectory` column (migration 0142). The add route accepts
an optional `subdirectory`, and every refresh reuses the stored value.
The path follows the rules of `bb plugin install --subdirectory`:
relative, no `..`, no `.git`, and no symlink out of the checkout. A
subdirectory on an https or `path:` source is refused.
- **Contract and SDK:** `PluginMarketplace` gains `subdirectory: string
| null`, and `plugins.marketplaces.add` accepts `subdirectory`. The
contract change alters the plugin SDK's bundled types, so the SDK
version moves to 0.6.41.
- **CLI:** `bb marketplace add --subdirectory <path>`. `bb marketplace
list` shows a Subdirectory column when a marketplace has one.
- **Settings:** a Subdirectory field appears under the source field once
the source starts with `git:`, and each marketplace row shows its
subdirectory.
- **Docs:** the CLI guide, the bb-cli and plugin-authoring skill
references, and `docs/configuration.md`.

Deviations from the issue's proposal:

- Relative screenshot URLs are still skipped for git marketplaces, as
they are for every non-https source. Only icons resolve next to the
manifest.
- `marketplace.json` and icons must resolve inside the subdirectory, not
only inside the checkout.
- `source` stays `git:<url>@<ref>` and the subdirectory is a separate
field, matching `bb plugin install --subdirectory`, instead of a
`#<path>` suffix.

`source.git.subdir` in catalog entries stays relative to the repository
root. No `HOST_DAEMON_PROTOCOL_VERSION` change: nothing crosses the
server/daemon wire.

## How you verified

- New server tests against a real git repository: add and refresh from a
nested subdirectory, the root still read when no subdirectory is given,
seven refused paths, a symlink out of the checkout (skipped on Windows),
and a subdirectory on https and `path:` sources. Each failure leaves no
staged checkout behind.
- New route, CLI output, and Settings component tests for the request
body, the list column, and the Subdirectory field.
- `pnpm exec turbo run typecheck lint --continue
--filter='...[origin/main]'`
- `pnpm exec turbo run test` for `@bb/server` (plugin-catalog suites),
`@bb/db`, `@bb/sdk`, `@bb/server-contract`, `@bb/templates`,
`@bb/domain`, `@bb/cli` (marketplace output), and `@bb/app` (settings).
- `node packages/plugin-sdk/scripts/check-npm-version-guard.mjs` passes
with the version bump; it failed before the bump.
- Against a dev server with a local repository that keeps its catalog in
`bb/`: `bb marketplace add git:<repo>@main --subdirectory bb`, `bb
marketplace list`, `bb marketplace refresh` after a new commit, the icon
served from `bb/icons/`, and an add through Settings → Plugin
marketplaces.

Fixes #5372

🤖 Generated with [Claude Code](https://claude.com/claude-code)

> AGENT GENERATED

Co-authored-by: Claude Code <noreply@anthropic.com>
…dd a Help menu with License and Uninstall (#5384)

## Human comments

## What was wrong

Google denied getbb.app's free-desktop-software certification twice.
Four of its written requirements were unmet. The site never named the
company that publishes bb. The privacy page said bb receives no data
from your server, though the app sends anonymous usage events by
default. There were no uninstall instructions. And the app had no link
to its license.

## What changed

- Every getbb.app page's footer now reads "© 2026 Terragon Labs, Inc."
The year is computed.
- The privacy page no longer says bb receives nothing from your server.
A new paragraph says the app sends anonymous usage events through
PostHog, why (to see how bb is used and decide what to improve), what
they carry, that PostHog records IP and approximate location, and how to
turn it off.
- The privacy page's contact is now support@terragonlabs.com.
- New /uninstall page: quit bb, remove the app on Mac, Windows, or
Linux, and optionally delete `~/.bb`. It's `noindex`, not in the
sitemap, and not blocked in robots.txt.
- The desktop app has a new Help menu with "View License" (opens the MIT
LICENSE, as VS Code, Cursor, and Zed do) and "How to Uninstall bb"
(opens the uninstall page).

## How you verified

- Chrome for Testing (Browser Automation) at 1440 wide on the branch
site: footer, privacy paragraph and contact, and the uninstall page
render as shown. The uninstall page carries `<meta name="robots"
content="noindex">` and is absent from /sitemap.xml.
- The privacy paragraph matches the code: the events and fields in
apps/server/src/services/system/telemetry.ts, the opt-outs in
apps/server/src/routes/system.ts and packages/config/src/env-vars.ts,
and IP capture confirmed in the PostHog project settings.
- Packaged desktop build of this branch (`pnpm desktop:worktree`): the
menu bar reads Apple, bb, File, Edit, View, Window, Help, and Help
contains "View License" and "How to Uninstall bb" (read through macOS
accessibility). No screenshot of the open menu: the capture couldn't
take focus from the host app.
- Remote CI: passed.

### QA (qa-agent): PASS at `db6c4ac5e5`

- Chrome for Testing 154.0.8037.92 (Browser Automation) and real Safari
26.5.2 on macOS.
- Both at 1440×900 and 390×844, light and dark. In Safari, dark means
the site's own `dark` class: the site sets it from
`prefers-color-scheme`, and the system theme wasn't changed.
- /privacy: the usage paragraph renders, and the contact is
support@terragonlabs.com.
- Footer: "© 2026 Terragon Labs, Inc."; Privacy and Software License
links only.
- /uninstall: three steps and `noindex`. It's absent from /sitemap.xml,
and robots.txt allows it.
- No horizontal overflow, and no console errors in Chrome.
- Packaged desktop build of this head, launched with
`--use-mock-keychain`: Help lists "View License" and "How to Uninstall
bb". Captured below with the menu open.

### Screenshots

Before: `3912f4aaef` (merge base) · After: `db6c4ac5e5` · Chrome for
Testing, full window, captured at 2×

| Screen / state | Viewport | Before | After |
| --- | --- | --- | --- |
| Privacy · 1. The bb apps | Desktop · 1440×900 · light | ![Before:
privacy](https://github.com/user-attachments/assets/46a10f98-025c-4caa-bbef-5ecd1e033fe3)
| ![After:
privacy](https://github.com/user-attachments/assets/ebddf2a3-6726-4e25-a429-c866ab2b8a11)
|
| Footer | Desktop · 1440×900 · light | ![Before:
footer](https://github.com/user-attachments/assets/c5337603-f700-4111-896b-f65fc421a473)
| ![After:
footer](https://github.com/user-attachments/assets/ee7b51b6-378c-4ac9-a54e-f869cb8e38ca)
|
| /uninstall | Desktop · 1440×900 · light | Not Found | ![After:
uninstall](https://github.com/user-attachments/assets/17d09e5c-8fcb-4646-b6ec-01e4677aa180)
|
| Footer | Phone · 390×844 · dark | — | ![After: footer, phone,
dark](https://github.com/user-attachments/assets/1a8a80e3-12d1-44ac-9c2f-00e172d9e798)
|
| Privacy (real Safari) | Desktop · 1440×900 · light | — | ![After:
Safari
privacy](https://github.com/user-attachments/assets/ebb096f2-7afc-4bec-a3c8-190acef71b02)
|
| Footer (real Safari) | Phone · 390 · dark | — | ![After: Safari
footer, phone,
dark](https://github.com/user-attachments/assets/846dac6f-8fa3-4878-9e1e-4b96f3b53c4f)
|
| Desktop app · Help menu open (macOS, packaged build of this head) |
Window 1280×900 + menu bar | No Help menu | ![After: Help
menu](https://github.com/user-attachments/assets/7faafb05-44b7-4812-aa2e-b097f699d9d1)
|

BB-Thread: [🔥 𝒃𝒃 landing pages &
guides](https://brsbl.getbb.app/projects/proj_khiw2za95v/threads/thr_46gxq5dyzh)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

> AGENT GENERATED

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Human comments

## What was wrong

Threads spawned by another thread were called "children", "child" or
nothing at all depending on the surface, and they shared a generic
person icon with other assignment events. The archived filter,
archive/delete confirmations, mention pills and the thread header each
used different wording for the same thing.

## What changed

- One copy helper (`apps/app/src/lib/child-thread-copy.ts`) for "child
thread(s)" and its count, used by the archive/delete dialogs, the
archive toast and thread actions.
- A two-person `ChildThread` icon (shared-ui icon registry) for
assignment events and the mention pill; mention pills read "child
thread".
- Archived threads filter: All threads / Threads / Child threads.
- Archive and delete confirmations name the child thread count; the
archive button reads "Archive".
- The child thread header no longer shows a "child" pill; the parent
picker drops its redundant heading; the settings copy says "child
threads".

UI copy only; data, API, SDK and CLI names are unchanged.

## How you verified

CI.

### Screenshots

Before: `d011a88bc1` · After: `c4b144a85a` · Captured at 2×

| Screen / state | Viewport | Before | After |
| --- | --- | --- | --- |
| Child thread view: no "child" header pill | Desktop · 1280×720 |
![Before: Child thread view: no "child" header
pill](https://github.com/user-attachments/assets/6e23cf0d-fd54-4917-be47-fbe4d616b6b3)
| ![After: Child thread view: no "child" header
pill](https://github.com/user-attachments/assets/5c50db16-a668-40c0-b32d-f7034b01da51)
|
| @ mention from a parent: "child thread" pill | Desktop · 1280×720 |
![Before: @ mention from a parent: "child thread"
pill](https://github.com/user-attachments/assets/888bc7fb-69bd-4ff3-8fcd-af40391a03b0)
| ![After: @ mention from a parent: "child thread"
pill](https://github.com/user-attachments/assets/9f099c2e-a050-43f5-8d2e-cdc558674137)
|
| Parent picker: no redundant heading | Desktop · 1280×720 | ![Before:
Parent picker: no redundant
heading](https://github.com/user-attachments/assets/b3c0c8b2-cac6-4d9b-b8f4-461e54614ad0)
| ![After: Parent picker: no redundant
heading](https://github.com/user-attachments/assets/673de641-2032-4d58-90af-01f4dbbaeb9f)
|
| Archived threads: filter and badge | Desktop · 1280×720 | ![Before:
Archived threads: filter and
badge](https://github.com/user-attachments/assets/0b080e43-7f2d-4286-80c6-b7aebfb8fb5d)
| ![After: Archived threads: filter and
badge](https://github.com/user-attachments/assets/955060f4-66c1-4272-b7b7-dcf8755ff73b)
|
| Archive confirmation | Desktop · 1280×720 | ![Before: Archive
confirmation](https://github.com/user-attachments/assets/54d89f82-120c-45f4-9443-e27f7f206db5)
| ![After: Archive
confirmation](https://github.com/user-attachments/assets/27bbe9a2-6df4-42e5-8c2b-e9c213e76ec8)
|
| Delete confirmation | Desktop · 1280×720 | ![Before: Delete
confirmation](https://github.com/user-attachments/assets/df3ca147-3ac3-4f80-ad0f-35ccf4f72ebb)
| ![After: Delete
confirmation](https://github.com/user-attachments/assets/e4dce1cf-7a27-496f-82e6-f6ad2d128a64)
|
| Settings: archive confirmation copy | Desktop · 1280×720 | ![Before:
Settings: archive confirmation
copy](https://github.com/user-attachments/assets/0cfdee83-62bb-462e-84f4-81d7d6b8e7b7)
| ![After: Settings: archive confirmation
copy](https://github.com/user-attachments/assets/31ae5c81-5472-4a9f-a971-c4b269d73686)
|

BB-Thread: [Redesign child
threads](https://brsbl.getbb.app/projects/proj_khiw2za95v/threads/thr_7xmbr7vsqz)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

> AGENT GENERATED

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Human comments

## What was wrong

A parent's Info panel listed its forks but not its child threads, so
there was no place outside the composer banner to see them.

## What changed

- The Info panel shows a collapsible **Child threads** section above
Forks (`RelatedThreadsSection`), using the ChildThread icon for idle
child threads.
- Its collapsed state saves under the `childThreads` section id, added
to `docs/configuration.md` and the bb-cli app-settings reference.

## How you verified

CI.

### Screenshots

Before: `c4b144a85a` · After: `bad3b3f27d` · Captured at 2×

| Screen / state | Viewport | Before | After |
| --- | --- | --- | --- |
| Info panel: Child threads section | Desktop · 1280×720 | ![Before:
Info panel: Child threads
section](https://github.com/user-attachments/assets/4eac1d5c-7f2b-433f-8892-9ee793a4d70d)
| ![After: Info panel: Child threads
section](https://github.com/user-attachments/assets/3cdaa010-6191-4a27-8e93-727bd8d46512)
|
| Info panel: section collapsed from its heading (no section before) |
Desktop · 1280×720 | ![Before: Info panel: section collapsed from its
heading (no section
before)](https://github.com/user-attachments/assets/9f01e550-ef44-4d9a-95c9-9a90e2959e0f)
| ![After: Info panel: section collapsed from its heading (no section
before)](https://github.com/user-attachments/assets/77ec0577-b9ac-412b-bf81-015d40e17a33)
|

BB-Thread: [Redesign child
threads](https://brsbl.getbb.app/projects/proj_khiw2za95v/threads/thr_7xmbr7vsqz)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

> AGENT GENERATED

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
## Human comments

## What was wrong

Setup progress, agent readiness, sign-in results and rejected new-thread
submissions were not observable in anonymous telemetry.

## What changed

- Record anonymous setup progress, readiness, sign-in outcomes and
new-thread submission outcomes through the opt-out-controlled telemetry
route.
- Accept fixed enums, booleans and explicit unknown values, without
identifying fields or free-text error details.
- Expose `useSetupComplete` and the experimental SDK method, and update
configuration documentation.
- Describe collection by usage category in Settings and the privacy
page, while retaining purpose, identifiers, system details and opt-out
instructions.

Supersedes #5394. Independently based on main; no shared-component
dependency.

## How you verified

- [PR CI](https://github.com/get-bb/bb/actions/runs/38328259479) passed
on `3bd09c3262585b764d77cca6761fc2328a21c3bd`. [Full
CI](https://github.com/get-bb/bb/actions/runs/38328255967) also passed
after retrying the Windows provider-replay job.
- Scoped review has no P0/P1 findings; the subsequent copy-only change
preserves the reviewed telemetry implementation.
- Focused exact-head QA PASS: Chrome for Testing 154.0.8037.92, Settings
and privacy, desktop and phone widths; real Safari 26.5.2, privacy.
- Initial rendering, settled layout, hard reload and client navigation
passed. Chrome reported no page or console errors during disclosure
checks.
- Exact-head telemetry delivery passed through the production-mode
sender to an isolated local sink; the HogQL query parsed and ran.

<details>
<summary>Exact-head telemetry delivery QA</summary>

Chrome for Testing 154.0.8037.92 exercised the branch web app at
`3bd09c3262585b764d77cca6761fc2328a21c3bd` with fresh app data,
telemetry enabled and the real production-mode server sender.

- The sink received each action once: all four steps reached,
Agent/Devices completed, Projects/Plugins skipped, and setup finished.
- Readiness was observed from real installed agents. Checking again
emitted no duplicate readiness event.
- A real Codex sign-in command opened its sign-in guide; cancelling
emitted one `started` and one `cancelled` outcome.
- Temporarily disabling the selected provider before forwarding an
unchanged submit request produced a real `409 provider_disabled`; the
draft remained intact.
- Re-enabling the provider produced `201`, one accepted outcome and a
real Claude Code reply of “OK”. Each submission emitted one started
outcome.
- Captured payloads contained only the random install ID, standard
system properties and the expected event fields; no identifying fields
or free text.

The default `0.0.0-dev` version intentionally disables the sender. This
pass used `0.0.0-qa-onboarding-3bd09c3` and a transport-only preload
redirecting the unchanged capture body to a loopback sink. That version
is not excluded by the dashboard's exact dev-version filter, so no test
events were sent to PostHog. Product source and event handlers were
unchanged.

Growth analytics independently executed the
reached/ready/signed-in/submitted HogQL query against PostHog with no
errors or warnings. This establishes query/schema compatibility;
new-event ingestion after release remains unverified. Completing a new
provider authentication was outside this pass: the real attempt was
cancelled, and submission used an already-ready provider.

</details>

<details>
<summary>Retained boundary checks and follow-up</summary>

The unchanged implementation retains earlier API checks accepting
allowed enum/null values and rejecting unknown enums, identifying extra
fields and free text. Earlier sign-in startup-failure coverage used
fixtures and was not a delivery check. Known P2 follow-up: abandonment
during pending sign-in startup may be counted as failed when terminal
creation later rejects.

</details>

Fresh full-viewport screenshots compare merge base
`d34a3d219193d37bf4bb31b6b345dd113800c3f1` with exact head
`3bd09c3262585b764d77cca6761fc2328a21c3bd`, using the same isolated
fixture, routes and scroll anchors. Desktop: 1440 × 900 CSS pixels;
phone: 390 × 844; both at 2×.

| Surface | Before | After |
| --- | --- | --- |
| Usage-data setting / desktop | ![Before: Usage-data setting /
desktop](https://github.com/user-attachments/assets/30ad0b6c-e32e-4cea-bd30-0c00b90c50f3)
| ![After: Usage-data setting /
desktop](https://github.com/user-attachments/assets/e5757348-cdd8-4bf8-a4a6-69a366e3e506)
|
| Privacy policy / desktop | ![Before: Privacy policy /
desktop](https://github.com/user-attachments/assets/211c0d04-93f5-4efc-a32e-949a438dc40f)
| ![After: Privacy policy /
desktop](https://github.com/user-attachments/assets/e11db241-1f89-4106-b780-292adbbad6c5)
|
| Usage-data setting / phone | ![Before: Usage-data setting /
phone](https://github.com/user-attachments/assets/82a061ce-2c34-4a67-9668-7d4dcc615efb)
| ![After: Usage-data setting /
phone](https://github.com/user-attachments/assets/4b05e6ca-5755-4adb-9c7d-a739209897c8)
|
| Privacy policy / phone | ![Before: Privacy policy /
phone](https://github.com/user-attachments/assets/e605967b-1680-4a45-b1d6-b89b15dddcfc)
| ![After: Privacy policy /
phone](https://github.com/user-attachments/assets/54736d8e-10d1-499c-a3bd-41c781471b2c)
|

The user approved the simplified disclosure screenshots at `3bd09c3` via
Growth. Merge approval remains separate.

BB-Thread-ID: thr_gt5eeahuym

BB-Thread:
[Onboarding](https://brsbl.getbb.app/projects/proj_khiw2za95v/threads/thr_gt5eeahuym)


> AGENT GENERATED
@brsbl brsbl changed the title Report anonymous automation-created and split-view-opened events Capture anonymous core capability use Oct 13, 2026
@brsbl

brsbl commented Oct 13, 2026

Copy link
Copy Markdown
Collaborator Author

Superseded by #5437 on main-based native stack #5440. The replacement preserves this implementation and review history without depending on Tips. Replacement CI is green at 47582e7, and both dependent replacements are verified. This PR is closed without merging; its branch and history remain.

@brsbl brsbl closed this Oct 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants