[CMUX Next] Chief pet: agent notices as a glass deck

Closed
TE
14d ago
+793-30

Summary

Second of four Chief pet PRs, stacked on #21728. The pet now pops up agent events as they arrive. They show as notice capsules above the pet, as Leo's pill-stack references draw them.

What shows

  • Anything that would alert on this Mac also appears over the pet. "Would alert" is the same NotificationPolicy decision a banner uses, so muted workspaces, quiet hours and notifications.desktop apply. It shows even when the poster asked for no banner.
  • The hook in NotificationCenterService is two lines: notifyChiefPet in deliver, and chiefPet?.read in acknowledge.

How it looks

  • Glass capsules, about 330 × 56 pt, with a bold title and one muted line of the banner's text. There's no status glyph, matching the references and Codex's "quiet" dock style from its unpushed follow-up.
  • The older notices peek out 8 pt below the front one, each 16 pt narrower per side, like a deck. They float 48 pt above the pet.
  • Under Reduce Transparency the capsules use the solid overlay surface.
  • A gold badge on the character counts notices that wait for you (questions, failures), as in reference fd383405.

Interaction

  • The rail's chevron unfolds the deck into a column of up to three capsules and flips to point down. With no notices, the chevron opens the Chief.
  • Clicking a capsule opens its tab, the same way a banner click does.

Motion and lifetime

  • One notice per tab. When the front notice gets identical content again, nothing redraws or animates.
  • The only motion is a single fade-in when the capsules first appear, and it follows Reduce Motion. Nothing loops or blinks.
  • A finished turn leaves after 8 s. A question or failure stays until its tab is read.

Reference

Matched: cmux-design-references/research/chief-chat-source-captures/d154d558-….png, at the same 1034 × 670 pixel size.

Folded:
folded

Unfolded with the chevron:
unfolded

The right side is a composite: the bundled mascot, the rail and the capsules drawn at this PR's point sizes at @2x. It is not a screen capture. The live look needs a dogfood build, since no Mac capture host is reachable from the Linux build host.

Testing

ChiefPetFeedTests (CmuxNextFloatingTests) covers:

  • the feed: ordering, one notice per tab, no re-animation, the deck limit keeping waiting notices, read, expiry and the badge count;
  • building a notice from a daemon notification;
  • the capsules redrawing only on change;
  • folded vs. unfolded click targets;
  • the reference deck heights;
  • the chevron unfolding the deck, and opening the Chief when there are no notices;
  • placement above or below the pet.

ChiefPetNoticeTests (CmuxNextAppTests) drives the real NotificationCenterService.deliver and acknowledge with a DaemonStore:

  • alerts reach the capsules and the badge counts them;
  • a capsule click opens its tab;
  • a read tab's notice leaves;
  • a non-alerting arrival stays off the pet;
  • the 8 s expiry, on a ManualClock.

These run in this PR's cmux-next CI lane. They were not run locally (Linux host). The App's source shrinks by 2 lines; the floating chat's tunable moved into CmuxNextFloating to pay for the hook.

Changelog

none (off by default behind a Debug Settings toggle)

🤖 Generated with Claude Code


Summary by cubic

The Chief pet now pops up agent events as glass notice capsules above it. Anything that would alert on this Mac appears over the pet, using the same NotificationPolicy decision a banner does—muted workspaces, quiet hours, and notifications.desktop apply—even when the poster asked for no banner.

  • Notices are ~330×56pt glass capsules with a bold title and one muted line (per the reference captures); older ones peek out behind as a deck, and the rail's chevron unfolds up to three into a column.
  • A gold badge on the character counts notices that wait for you (questions, failures); clicking a capsule opens its tab, and with no notices the chevron opens the Chief.
  • One notice per tab, identical content never redraws or animates, and the only motion is a fade-in on first appearance that follows Reduce Motion; finished turns leave after 8s, while questions and failures stay until read.
  • Wired via notifyChiefPet in NotificationCenterService.deliver and chiefPet?.read in acknowledge; off by default behind a Debug Settings toggle.