Skip to content

feat(bestie): hourly check-ins from your Bestie - #2037

Open
rileycrane wants to merge 3 commits into
rileycrane/bestie-l4-private-channelsfrom
rileycrane/bestie-l3-check-ins
Open

rileycrane wants to merge 3 commits into
rileycrane/bestie-l4-private-channelsfrom
rileycrane/bestie-l3-check-ins

Conversation

@rileycrane

@rileycrane rileycrane commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

The Bestie tab gets Check-ins → Every hour. Turned on, it wakes your Bestie in your DM once an hour.

Why a local timer: a Bestie on this device is woken by a timer on this device, using the same Attention timers as the Watching plugin.

What changes

  • Every hour needs Remembers you. It is disabled while memory is off, and turning memory off turns it off too.
  • On:
    • Adds an Hourly upkeep section (buzz:bestie/checkin.hourly) to the instructions.
    • Saves an hourly Attention timer, watch/bestie-hourly-check-in, through agents.save; the timer wakes Bestie in your DM.
    • Turns on the agent's Attention.
  • Off removes the section and the timer. It leaves Attention on, because the agent's other watches may need it.
  • The timer runs while Buzz is open and Watching is on. While it can't run, the row says Paused. After a sleep it runs once, not once for each missed hour.

Design decisions

  • No controlAttention(). Turning Watching off still stops every agent's Attention, so Bestie doesn't take over a control the user can see. Rejected: having the plugin turn Attention on through controlAttention().
  • The timer is saved first, then the instructions, so a failed save leaves no section without a timer.

Try it (just dev, local Bestie with Remembers you on)

  1. Turn Every hour on. The Watching tab shows the timer watch/bestie-hourly-check-in, and Instructions has the Hourly upkeep section.
  2. Turn Remembers you off. Every hour turns off and is disabled.
  3. Turn memory back on, then check-ins on, then disable the Watching plugin. The row says it is paused.

Stack: each PR is based on the one before it: #2034 Bestie tab → #2035 Remembers you → #2036 private channels → #2037 check-ins (this PR) → #2039 Former Bestie → #2041 Remove as Bestie → #2047 Choose your bestie. #2040 (recent notes in Claude Code prompts) is separate and based on main.

Overlap: #1716 also changes features/agents/service.ts and tabs.tsx. Whichever lands second will rebase onto the other.

🤖 Generated with Claude Code

buzz-review-completed

rileycrane and others added 3 commits October 30, 2026 14:33
A Check-ins group under Remembers you has one row, Every hour, off by
default and unavailable while memory is off. On adds the Hourly upkeep
section to the agent's instructions, an Interest and an hourly Attention
timer delivered to the owner's 1:1 DM with the agent, and turns the
agent's Attention on, all in one save. Off, and turning memory off, remove
the section and the timer and leave Attention as it is. The Bestie plugin
now controls Attention, so the timer runs with Watching off.

The upkeep text is the Hourly upkeep of prompt.ts, woken by the timer and
using the local tools. Features can require another and carry a timer, so
another check-in kind is one more entry in the feature list.

A service test shows that an hourly timer runs once after the computer
sleeps through several hours, then an hour later.

Co-authored-by: eggboy <3986e5374b8c11a274f4a53fa9a68e1e18b53e712f8aa5218add2485bf5a2b09@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Riley Crane <rileycrane@squareup.com>
Save the timer before the instructions, so a failed second save leaves a
state that reads as off and toggles cleanly. Let one save run at a time
across the tab's switches, keep a check-in left on without memory
switchable off, and stop the upkeep steps from treating upkeep wakes as
messages to ignore.

Co-authored-by: eggboy <3986e5374b8c11a274f4a53fa9a68e1e18b53e712f8aa5218add2485bf5a2b09@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Riley Crane <rileycrane@squareup.com>
Bestie no longer calls controlAttention(), which turned Attention on for
every agent while Watching was off. Check-ins now run while the Watching
plugin is on, and the row says it is paused while watches aren't running.

Co-authored-by: eggboy <3986e5374b8c11a274f4a53fa9a68e1e18b53e712f8aa5218add2485bf5a2b09@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Riley Crane <rileycrane@squareup.com>

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket, Mantis and Groot lanes.

Reviewed head 0ae322732ddc6cb87733dbd22e2ea9d2b204fbec against base f68837125121e8dfb1360086b40cc7b8fdf5d1dd. Two P2 findings are inline: failed enable leaves a live timer behind an unchecked switch, and a timer paused individually in Attention still appears to be running in Bestie.

Optional: exercise keyboard focus during pending saves and error/retry. docs/design-system.md documents read-only, focusable pending switches; this tab disables all switches during a save. Actual Base UI/browser focus behavior was not verified, so this is a validation suggestion, not an asserted focus-loss defect.

Scope: all five changed files and relevant save, timer, wake, DM and shared-control consumers; public description (no image attachments) and three commit messages. No concrete public-material disclosure finding. The existing Attention owner is reused and the change is bounded; the two state/recovery defects prevent a clean correctness verdict.

Source-only: no tests, builds, app launches or PR code execution. Rendered themes/layout, keyboard/assistive-technology behavior, native wake delivery and human acceptance remain unverified. One hosted-check snapshot shows the later CI-required failure with WebKit 2/14 failing, after an earlier successful run; annotations only report exit 1, so cause and relation to this patch are unestablished. Windows validation was skipped. Added test execution cost was not measured. This COMMENT is not approval or merge authorization.

// Its timer runs only while the agent's Attention is on. Off leaves
// it on: the agent's other watches may need it.
...(timer && { attentionEnabled: true }),
});

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 P2 — Do not leave an enabled timer after the instruction save fails. This first save commits the hourly timer and enables the agent’s Attention before the following config save. A rejected/conflicting instruction revision leaves those effects in place, but featureOn reports unchecked because the Hourly upkeep section is absent. The scheduler (runner.ts:2012–2074) admits the saved timer independently of that section, so, with Watching on and destination membership confirmed, the failed enable can keep consuming tokens hourly. Clicking the unchecked switch retries On; it does not remove the live timer. Preserve the intended timer-first ordering by keeping staged work disabled until instructions are confirmed, or compensate the owned timer on failure and expose explicit partial-state cleanup. Do not enable unrelated watches until the operation succeeds. Cover instruction rejection and both retry/cancel recovery; reporting unchecked alone is not a safe recovery state.

blocked && required && !checked
? `Turn on ${required.title} first.`
: // Attention reads off while no plugin shows it, as when the
// Watching plugin is off, or while the agent's switch is off.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 P2 — Reflect a timer paused individually in Attention. After a successful setup, pause bestie-hourly-check-in using the existing Attention tab. That writes the timer’s value.enabled = false while leaving its object and agent.attentionEnabled present/true (watching/Tab.tsx:439–452). Here featureOn checks only existence, and this paused branch checks only agent-wide Attention, so Bestie still shows Every hour checked with the normal hourly-running description although the scheduler skips the timer. Include the individual timer’s enabled state in the status and give usable rearm guidance. Preserve a way to remove a paused timer; simply treating it as absent can hide Off. Add coverage for pausing in Attention and returning to Bestie.

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