cmux NEXT Home: Chiefs show their picked character, not CH

TE
4d ago
+92-22

Leo, 2026-11-01:

also im not seeing chiefs with the selected avatar appearance for some reason

What was wrong

Since d1562beff34b (Home's iMessage-style CH monogram, Lawrence 2026-10-30: "no profile pic by default"), every Home fallback read only the Chief's uploaded picture (AppServices.wornUpload(of:)). A character picked in the Chief Settings popover, Settings > Chiefs or the config file was never read there, so every Chief showed CH.

The fix

ChiefPetSettingsRows.chosenPicture(of:) returns the worn upload, else the character the Chief was explicitly given, else nil:

  • the default Chief: home.chiefPetMascot when the config file sets it (SettingsController.fileRoot), not the schema default;
  • another Chief: its own pick (ChiefMascotPicks, by participant id).

A Chief nobody picked for keeps Lawrence's CH monogram, so the 2026-10-30 design stands; only a real pick now shows. Home's list rows, header, group bubbles, New Message recipient and agent-chat Chief faces all read it (AppServices.chosenPicture(of:), which replaces the now-unused characterPicture(of:); no new App lines). The sidebar's Chief item is unchanged: Lawrence chose a plain glyph there on 2026-10-31.

Test

ChiefDefaultAvatarTests/aPickedCharacterIsTheChiefsHomePicture: a picked character is the Home picture, an unpicked Chief keeps the monogram, one Chief's pick never shows on another, and the default Chief's pick counts only when the file sets it.

  • Red at 89ba15109c3e (test only): it doesn't compile because chosenPicture doesn't exist on base; base has no path that reads a pick.
  • Green at the head: see the fleet run below.

Observed / Not run

  • Observed: the prepush gate passes. Fleet package-test-lane.sh suite Packages/macOS/CmuxNext ChiefDefaultAvatarTests,ChiefAvatarUploadWiringTests results are posted in a comment.
  • Not run: a fresh-home launch and a DEV build check of Home's list; both are posted as comments before landing.

Prior art: d1562beff34b and 32f1c059a928 (lawrencecchen) kept as designed; #30243 (the sidebar's Chief avatar on chat rows) reads Home's chiefFaces, so it picks this up with no overlap in files.

Risk: normal. Chief area (CmuxNextChiefPetWiring): it only reads, with no write and no change to persistence.

Changelog

Fixed: Home shows each Chief's chosen character instead of the CH monogram.

No capture: native list rows. A DEV build check follows.

Agent session: agent session

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.


Summary by cubic

Fixes Chiefs in cmux NEXT Home showing the CH monogram instead of the character they picked.

Home's avatar fallback read only each Chief's worn upload, so a character chosen in the Chief Settings popover, Settings > Chiefs, or the config file was never shown. AppServices.chosenPicture(of:) now returns the worn upload, else the explicitly picked character, else nil (the monogram). A Chief nobody picked for still keeps the CH monogram, so the 2026-10-30 no-profile-pic design is preserved.

The list, bubbles, and New Message fall back to the CH monogram for any Chief missing from chiefFaces, so the default Chief's pick or upload never shows on another Chief's row; the default Chief is always in chiefFaces, so its own row still wears its pick.

Home's list rows, header, group bubbles, New Message recipient, and agent-chat Chief faces all use the new lookup. The sidebar's Chief item is unchanged.

  • ChiefMascotPicks.picked(of:in:) returns the default Chief's character only when the config file sets home.chiefPetMascot, and each other Chief's own pick.
  • The header's redraw state now tracks whether the character was picked, so picking the default character (orb) on a Chief that wore it only by default shows orb instead of CH.
  • characterPicture(of:) is replaced; no new App wiring lines added.
  • Adds ChiefDefaultAvatarTests/aPickedCharacterIsTheChiefsHomePicture and PerChiefPetTests/homeDrawsEachChiefsPickAndNoOneElses covering picked, unpicked, and cross-Chief cases.