Skip to content

Add a Tips plugin with a fresh feed of contextual tips under the new-thread composer - #4991

Open
brsbl wants to merge 29 commits into
bb/checklist-led-home-notification-opt-in-onboardin-thr_7xet9fqq42from
bb/tips
Open

brsbl wants to merge 29 commits into
bb/checklist-led-home-notification-opt-in-onboardin-thr_7xet9fqq42from
bb/tips

Conversation

@brsbl

@brsbl brsbl commented Oct 6, 2026 •

Copy link
Copy Markdown
Collaborator

Human comments

Stack

Stacked on #5222 (setup checklist, onboarding telemetry allow-list): this PR targets bb/checklist-led-home-notification-opt-in-onboardin-thr_7xet9fqq42 and is registered as GitHub stack #5232 (#5222 → #4991). #5222's branch was merged in, not rebased; the diff against it is Tips work only.

What was wrong

bb ships faster than release notes, Twitter, and Discord can teach it. Feedback from Sep 7–Oct 4 shows people missing features that already exist (connecting Desktop to another server, Account Pooler fixing repeated Claude logouts, provider handoff), and features that help people keep using bb, like child threads, queued follow-ups, multiple providers, building a plugin, and mobile, have no in-product nudge.

What changed

  • New built-in Tips plugin (bb--tips), bundled, with a Show tips setting. On desktop it shows a calm feed of three rows under the new-thread composer: one bg-background container with border-border-hairline, shadow-xs, and hairline dividers between rows. Each row has a 64px line illustration on the left (ink tones, one small tone accent, no background) and a title and one-sentence body on the right. There is no section label (screen readers hear "Tips").
  • A feed that stays fresh: each new visit (a fresh mount at least 10 minutes after the last) adds one tip at the top and drops the oldest. The engine cycles through every eligible tip, unseen first, before repeating any. A clicked tip is left out of the next visit and returns only after the rest of the library has shown. Tips for features already in use retire for good. Tips are ordered by tier first, based on which early behaviors go with people sticking with bb: tier 1 (child threads, the mobile app, a second agent on the same task, asking the agent to build a plugin), then unranked tips placed by judgment with automations first, then tier 2 (bb connect, the bb CLI, more than one agent), then tier 3 (queued follow-ups), which shows only after every higher-tier tip has been shown. Inside a tier, contextual boosts (threads waiting on you, Account Pooler after a rate limit) and priority decide. State lives in plugin storage.
  • Bottom fade: a theme-independent mask fades the bottom of the feed. It lifts while the last row is hovered or focused, so that row stays readable and its focus ring isn't clipped.
  • Hover animation: each illustration is still at rest and plays once while its row is hovered or focused, holding the end state. Reduced motion turns this off.
  • The whole row is the button: hover adds bg-surface-raised. Every click marks the tip used and announces the result in a status line. Tips use one of five action types, implemented once in plugins/tips/actions.ts:
    • prompt fills the composer, moves any existing draft into the prompt's trailing Task: slot, and focuses it with the caret at the end. Hovering or focusing a prompt row previews the prompt as the composer placeholder.
    • open-page opens a core Settings route.
    • run-command runs palette.open, thread.search, or settings.open.
    • open-plugin opens a built-in plugin's detail page.
    • learn-more opens an https:// link using the person's browser preference.
  • New tips: a second agent on the same task (prompt, with two or more agents), adding a second agent (opens Settings → Providers, with one agent), bb connect (opens the built-in plugin), and the bb CLI (prompt to script bb), each with a diagram-kit illustration and hover animation.
  • Typed tip schema: each tip has id, title (≤45 characters), body (one sentence, ≤110), illustration, tone, action, source (changelog, blog, guide, or feature, with a ref and optional version), addedAt, reviewedAt, optional expiresAt and held, and eligible, retireWhen, and boost predicates. Expired tips never show, and an expired tip fails CI against CATALOG_REVIEWED_THROUGH. Tests check that every illustration exists, that open-plugin targets are built-in plugins, and that open-page targets are real Settings routes.
  • Diagram kit: every illustration is built from plugins/tips/diagram-kit.tsx, which has 30 primitives (Panel, Window, Rule, Dot, ListLine, Node, Branch, ProgressBar, Toggle, Slider, Button, CheckMark, Check, Cursor, Phone, Envelope, Keycap, SearchGlyph, Magnifier, ChartAxes, Bar, CardStack, Arrow, Sparkle, Bubble, Clock, CalendarGrid, Wrench, Pill, Highlight) and 16 named hover animations with a stagger prop. Ladle stories plugins/Tips → Illustrations and Diagram kit show them.
  • Authoring: plugins/tips/AUTHORING.md covers fields, voice, actions, illustration rules, and a checklist. A repo-local skill, .bb/skills/tips-authoring, walks an agent through adding a tip.
  • Easy dismiss: a low-key Hide tips × button above the feed (with a tooltip) turns tips off. An inline Undo explains that Show tips in the plugin settings turns them back on.
  • On by default for new installs only: the setting has no fixed default. The first time Tips runs, it classifies the install once as new when it has no threads or none older than two weeks (installs with more than 200 threads count as existing). It saves that decision in plugin storage and writes the setting on for new installs and off for existing ones. An explicit choice always wins, and the saved decision never flips.
  • Only after setup: Tips never appears while bb's setup banner sits above the composer. Until the checklist is finished or dismissed, the section renders nothing and makes no RPC calls, so nothing counts as shown. The new-user default and desktop-only rules are unchanged.
  • Anonymous tip events: with usage data sharing on, Tips reports tip_shown once per tip per visit and tip_used on click through sdk.system.experimental_recordTelemetryEvent. Both are on Ask for notifications from a sidebar card, refocus setup checklist content, and record onboarding events #5222's strict allow-list with only tip_id (an enum of catalog ids), position (1–3), and action (prompt, open-page, run-command, open-plugin, learn-more). Unknown ids, positions, actions, or extra properties get a 400. The server drops the events when sharing is off (Settings toggle or BB_TELEMETRY=false); the plugin does not check the setting itself. The tip id enum lives in @bb/server-contract (TIP_TELEMETRY_IDS) and the plugin's TIP_IDS; the catalog's tip() helper only accepts TipId, the SDK call only type-checks with allow-listed ids, and tests fail if the catalog, TIP_IDS, and the allow-list differ. The Settings privacy description, docs/configuration.md telemetry list, getbb.app /privacy, and the Tips overview now describe these events and the opt-out.
  • Spacing: the feed sits about 130px below the composer's controls row, with no scrollbar at 1280×720 or 1280×860.
  • No tips on mobile or compact layouts: the plugin renders nothing on phones, below a 768px viewport, or when its section is narrower than 520px, and makes no RPC calls there. No core layout changes.
  • CLI and SDK: bb tips [--all] [--json] (marks the tips in the feed, newest first, and says how to turn tips on when they are off), bb tips hide [--undo], bb tips dismiss <id>, bb tips reset, with matching plugin RPC methods. Documented in the configuration guide, guide template, and plugin skill.
  • Core, generic and experimental (each with a docs/api_to_audit.md entry and a Plugin Guide surface; plugin SDK 0.6.35):
    • Home-screen sections receive an optional experimental_setupComplete prop. Core derives it once in useSetupChecklist from the same state that renders the setup banner, and passes it through RootComposeSecondaryContent to PluginHomepageSections. It is false before onboarding finishes, while any item is open, and while setup data loads. No Tips-specific core code.
    • useComposer().experimental_setPlaceholderPreview(text | null) sets a temporary placeholder on the composer; it clears when the caller unmounts, and the accessible label keeps bb's own placeholder.
    • useBbNavigate().experimental_openAppRoute(path) accepts in-app paths only. Absolute URLs, protocol-relative paths, backslashes, control characters, and /api routes are refused.
    • useBbNavigate().experimental_runAppCommand(id) accepts only palette.open, thread.search, and settings.open.
    • Homepage sections may omit title; older hosts are protected by engines.bbPluginSdk >=0.6.35.

Owner decisions

How you verified

  • Tests cover the per-visit feed (the 10-minute debounce, insert at the top, clicked tips replaced on the next visit, cycling the library), retirement and dismissal, contextual ordering, held and expired tips, the tip schema and catalog targets, every action type and its announcement, new vs existing classification, explicit setting overrides, the persisted decision not flipping, Hide tips with Undo, compact and mobile hiding, the placeholder preview API, the CLI, and both navigation APIs.
  • Tests also cover the setup gate (useSetupChecklist().setupComplete is false while the banner shows, while setup loads, and before onboarding finishes, and true after dismissing or finishing every item; homepage sections receive it; Tips renders nothing and makes no calls until it is true) and telemetry (the route accepts both tip events and rejects other ids, positions, actions, and extra properties; the allow-list matches the catalog; Tips sends each shown tip once per visit and each click with position and action, and nothing for unknown ids).
  • Setup gate: branch web dev app at the merge of Ask for notifications from a sidebar card, refocus setup checklist content, and record onboarding events #5222 28d23b0 (banner-only checklist), fresh mktemp -d data dir with a small seeded project and finished threads, Chrome for Testing via Browser Automation, 1280×860 at 2×. After first-run onboarding was skipped, the setup banner showed above the composer and Tips rendered nothing and wrote no plugin state. After the banner was dismissed, the feed appeared with the orbital project selected. The seed archives its threads, so they were unarchived in that QA database first; because they are old, Tips classified the install as existing and left the switch off, so it was turned on with bb plugin config bb--tips set enabled true.
Setup unfinished: banner, no tips After dismissing setup: tips feed
Setup banner above the composer and no tips Tips feed under the composer after the setup banner is dismissed
  • Feed per visit (earlier pass, same branch web app, demo-app selected; later visits simulated by moving the feed's last-visit time back 11 minutes in plugin storage):

After: on the next visit a new tip is at the top and the clicked tip is gone

  • Hover (same setup-gate session): the row plays its illustration and previews its prompt in the composer.

After: hovering the second-agent tip previews its prompt

Known follow-ups (not in this PR):

  • "Hide for today" uses the server's time zone.
  • The feed follows the composer's project only when the project is in the URL.
  • The feed and its visit clock are shared across clients.

BB-Thread: Brainstorm BB feature for sharing tips and
BB-Thread-ID: thr_rtj958b9wf

AGENT GENERATED

🤖 Generated with Claude Code

@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 and others added 4 commits October 5, 2026 22:20
Add two experimental BbNavigate methods so plugin UI can send people to
bb's own pages and commands without plugin-specific core code:

- experimental_openAppRoute(path) navigates to a same-origin in-app route
  (query and hash kept) and refuses absolute, protocol-relative,
  backslash, control-character, and /api paths.
- experimental_runAppCommand(commandId) dispatches a built-in app command
  such as palette.open or thread.search through the normal handler chain
  and returns false for unknown or plugin ids.

PluginHomepageSectionRegistration.title becomes optional; the host skips
the heading when it is absent so a section that renders nothing leaves no
orphan heading. The SDK test harness records both intents, and the SDK
version moves to 0.6.24.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…page

Tips renders a single quiet tip below the new-thread composer, picked from
a typed catalog of bb core features, built-in plugins, and "ask bb to..."
workflows. Each tip has a priority, a one-sentence body, an optional
one-click action (fill the composer, open a bb page, or run an app
command), and an eligibility predicate over local signals: thread and
finished-thread counts, child and automation threads, providers in use,
installed and enabled plugins, the app version, the client surface and OS,
and observed rate limits and queued follow-ups.

At most one new tip appears per day. Dismissing retires a tip for good; a
tip also retires once its action is taken, once its feature is seen in
use, or after two shown days. What's new shows once per version after an
upgrade. State and shown/dismissed/acted counts live in plugin kv storage;
nothing is sent anywhere.

bb tips [--all] [--json], bb tips dismiss <id>, and bb tips reset mirror
the current/dismiss/act/list/reset plugin RPC methods. The plugin is
bundled and enabled by default with a Show tips switch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rename the bundled Tips plugin to bb--tips under the bundled-plugin prefix
reservation, and accept only palette.open, thread.search, and settings.open
in experimental_runAppCommand so plugins cannot run state-changing commands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…view

Tips now shows a desktop gallery of three tiles under the root composer:
each tile has a small theme-token scene that rests on its end state and
replays on hover or focus, a title, one line of copy, and its outcome
("Adds prompt" or the destination label). Hovering a prompt tip previews
its prompt as the composer placeholder; clicking fills the composer,
moves any existing draft into the prompt's trailing "Task: " slot, and
focuses the caret at the end. One "More ideas" button rotates the set
and one menu hides tips for today or turns them off. The section renders
nothing on phones, in the compact layout, or when the page is too narrow
for three tiles.

The engine picks three eligible tips per day, ordered by threads waiting
on the user, a recent rate limit for Account Pooler, and per-project
subthread and automation usage, then by fewest shown days and priority.
More ideas rotates through unseen tips before wrapping. Tips without an
action are gone. `bb tips` marks the three showing today and gains
`more` and `hide [--undo]` for parity with the UI.

Adds the experimental `useComposer().experimental_setPlaceholderPreview`
SDK API, scoped to the calling surface and released on unmount, with
audit, Plugin Guide, and harness coverage. The prototype stories move
into the plugin as visual coverage of the production gallery.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brsbl and others added 2 commits October 5, 2026 22:29
Account Pooler's tip no longer filters by provider id, which the
provider-literal ratchet forbids outside provider plugins: it shows after
any rate limit or heavy use while Account Pooler is installed but off.
The reset RPC handler returns a literal `ok: true`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brsbl brsbl changed the title Add a Tips plugin with one contextual tip on the new-thread page Add a Tips plugin with three contextual tips under the new-thread composer Oct 6, 2026
brsbl and others added 12 commits October 5, 2026 22:53
…tories

Tiles lose their "Adds prompt", destination, and "In composer" rows; the
whole tile stays the button and its accessible name still says what it
does ("Adds prompt to composer", "Opens settings: Get the app"). The tile
is shorter, and the section sits a further mt-6 below the composer so it
reads as its own section. The gallery header and grid are exported so
the new Ladle stories can compose two written-tip explorations (a quiet
tip line above the header, or the tip as the header) next to the
production layout, rendered under the real new-thread composer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The scene graphics are gone: each card is just a title and a muted body,
with generous padding and a hover/focus fill, still one button with its
action in the accessible name. Long tip bodies are tightened so they fit
in three lines. The "Try with bb" label is removed; the section is named
"Tips" for assistive tech, and More ideas plus the menu sit right-aligned
in a slim row below the cards, sharing it with the status line. The
plugin's scene-only story is deleted, and the app story now compares the
production cards with a borderless text-only exploration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every catalog tip now carries a bb icon name, returned in the tip view
and rendered in a small muted chip above the title. Cards sit on the
raised surface token with the hairline border and the theme's xs shadow,
stepping to the sm shadow on hover or focus (transition only when motion
is allowed). The borderless Ladle exploration is gone; the Control story
renders the production cards.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The homepage section slot sits in a content column that does not fill the
page height, so a plugin cannot anchor itself to the bottom of the empty
area. Tips instead takes a larger fixed gap (mt-28 on top of the host's
mt-6, about 136px), which keeps the cards in the lower half of the
composer area without adding a scrollbar at 1280x720 through 1440x1000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cards use the page background, like the composer, with the hairline
border and xs shadow, and take the raised surface fill only on hover or
focus. The icon chip steps down from muted to the recessed surface tint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two Ladle-only variants of the New thread tips render a small living
diorama at the top of each card, in the same layout as production: cut
paper on kraft stock, or polished objects on a lit stage. Scenes cover
subthreads, setup, phone, split panes, the morning digest, and Browser
Automation, with slow idle motion and pointer parallax that stop under
reduced motion. Production cards are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Story C drops the card chrome: each tip is a small neutral object
standing on the page with a soft contact shadow, title and body beneath,
and the whole column as the button with a hover fill and focus ring.
Objects are still at rest and play a short settle with light parallax
only on hover or focus, static under reduced motion, with at most one
small accent each. Production cards are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every catalog tip now carries a tone (blue, green, amber, orange, or
rose), returned in the tip view. The icon chip takes a 14% tint of that
theme accent and the icon mixes the hue with ink, keeping icon contrast
above 5:1 in light and dark; rose is a muted blend of the destructive
and timeline accents so it never reads as an error. The cards are
otherwise unchanged. Ladle keeps both candidates (tinted chips, and
tinted chips with a corner wash) next to the production story.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each catalog tip now draws its own 44px inline SVG, a tiny product
sketch of the idea (subthreads branching, a settings panel, a phone
thread list, split panes, an envelope digest, decision buttons, and so
on), in one line-and-wash style with ink strokes and a single small
accent from the tip's tone. The tinted chip and the Hugeicons icon field
are gone. The illustrations are decorative and static. Ladle drops the
chip candidates and adds a sheet of every tip's illustration.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The three tips now stack as rows in one hairline-divided container under
the composer, each with its illustration on the left and title and body on
the right; the whole row is the button and keeps the hover fill, prompt
preview, and click-to-fill. "More ideas", the overflow menu, the more RPC,
and `bb tips more` are gone; the daily set still rotates unseen tips first.
A low-key "Hide tips" button above the feed turns tips off with an inline
Undo that points to the Show tips setting.

The Show tips setting no longer has a fixed default. The first time Tips
runs it classifies the install once, as new when it has no threads or none
older than two weeks, saves that in plugin storage, and writes the setting
on for new installs and off for existing ones. An explicit choice always
wins, and the saved decision never flips. `bb tips` says when tips are off
and how to turn them on.

The illustrations render at 64px with lighter strokes and more fill, and
Run work in parallel, Build a tool, and Command palette are redrawn to read
clearly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brsbl brsbl changed the title Add a Tips plugin with three contextual tips under the new-thread composer Add a Tips plugin with a feed of three contextual tips under the new-thread composer Oct 6, 2026
brsbl and others added 3 commits October 6, 2026 04:16
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At rest every illustration is unchanged and still. Hovering or
keyboard-focusing a row acts out its tip in one short pass (bars fill,
toggles flip and the slider glides, a new row slides into the phone,
panes light up, the digest rises, the cursor taps and checks, the clock
hand turns, the palette key presses and results appear, bars grow, the
tool snaps in, the sparkle twinkles) and holds the end state; leaving
eases back. Only the hovered row moves, everything is CSS transforms
and opacity, and reduced motion turns it off. The Illustrations story
plays each drawing on hover or focus.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each new visit to the New thread page adds one tip at the top and drops
the oldest, cycling the eligible library unseen-first. Clicked tips skip
the next visit; tips for features already in use retire. The feed fades
at the bottom.

Tips now follow a validated schema with a source, version, review, and
expiry fields, and a closed set of action types run from one module.
Illustrations are built from a shared diagram kit with named hover
animations, shown in new Ladle stories. AUTHORING.md and a repo-local
tips-authoring skill describe how to add a tip.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brsbl brsbl changed the title Add a Tips plugin with a feed of three contextual tips under the new-thread composer Add a Tips plugin with a fresh feed of contextual tips under the new-thread composer Oct 6, 2026
Branch's from prop collided with the kit's animation from offset, so its
endpoints are now start and end. The server tests now expect a refill
at the top of the feed and check per-project eligibility on a first
visit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
brsbl and others added 2 commits October 8, 2026 14:02
Stacks Tips on #5222. Keeps both sides of the useBbNavigate API
(experimental_openAppRoute, experimental_runAppCommand, and
experimental_openTerminal), their docs and audit entries, and takes the
base's plugin SDK version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Home-screen sections now receive experimental_setupComplete, derived in
useSetupChecklist from the same state that renders the setup checklist
and banner. Tips renders nothing and makes no calls until it is true.

Adds tip_shown and tip_used to the telemetry allow-list with an enum of
catalog tip ids, a 1-3 position, and the action type. Tips reports each
tip shown once per visit and each click; the server drops both when
usage data sharing is off. Privacy copy, configuration docs, and the
Tips overview now describe these events. Plugin SDK 0.6.33.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@brsbl
brsbl changed the base branch from main to bb/checklist-led-home-notification-opt-in-onboardin-thr_7xet9fqq42 October 8, 2026 21:15
@brsbl
brsbl added this pull request to stack #5232 October 8, 2026 21:15
brsbl and others added 4 commits October 8, 2026 14:35
…metry fake

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in #5222 after #5228 removed the welcome page and checklist card
and #5229 removed the navigation plugin. experimental_setupComplete still
comes from useSetupChecklist, which drives the remaining setup banner.
Plugin SDK moves to 0.6.35, one above the base's 0.6.34.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Renames the subthreads tip to child-threads and uses "child threads" in
its copy, prompt, illustration, telemetry allow-list, docs, and tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each tip now has a tier: 1, 2, 3, or unranked, based on which early
behaviors go with people sticking with bb. The feed shows tier 1, then
unranked, then tier 2, then tier 3; boosts and priority only reorder
tips inside a tier, and tier 3 appears only after higher tiers have all
been shown. Automations lead the unranked tips.

Adds tips for a second agent on the same task, adding a second agent,
bb connect, and the bb CLI, with illustrations from the diagram kit.

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

This branch has not been deployed

No deployments
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.

1 participant