The speech bubble keeps showing an old reaction long after the moment that produced it, which reads as frozen/placeholder text rather than a live pet.
Observed
A Claude Code session displayed commit message is... a choice. in the bubble. Checking that session's state file: the reaction was 31 minutes old and still rendering. The same string had also been visible in an unrelated earlier screenshot, reinforcing the "stuck placeholder" impression.
The string itself is legitimate curated content (it lives in the commit pool in server/hooks/reaction-data.ts next to *nods* ship it. and another commit, another 3 am.) — the bug is lifetime, not authorship.
Root cause
statusline/buddy-status.sh reads reactionTTL from config with a default of 0:
_ttl=$(jq -r '.reactionTTL // 0' "$CONFIG_FILE" 2>/dev/null || echo 0)
With 0 meaning "never expire", the last reaction persists indefinitely until another hook happens to fire. A session that goes quiet keeps the same bubble for hours.
Asks
- Default
reactionTTL to a sane non-zero value (suggest 5–10 minutes) so a stale reaction expires and the bubble renders empty (or a neutral idle line) rather than replaying old content. Keep 0 available as an explicit "never expire" opt-in, documented in the README config table.
- Consider an idle line: when no fresh reaction exists, render nothing rather than the last one — an empty bubble beats a lying one.
- Prune per-session state files.
~/.config/claude/buddy-state/ accumulates reaction.<sid>.json, .last_reaction.<sid>, .last_mood.<sid>, .session_start.<sid> per session forever (29 files on this machine, several from sessions that ended hours ago). Sweep entries older than a day on hook run or statusline render, the way the substatus temp sweep already does.
Related content note
While reviewing the pool, commit message is... a choice. is weak in isolation — it reads like an unfinished thought without the context of a bad commit message. Worth a pass over the commit pool for lines that don't stand alone.
Environment: @ramarivera/coding-buddy@0.8.0, Claude Code 2.1.219, macOS.
🤖 Created with the help of AI (Claude Fable 5).
The speech bubble keeps showing an old reaction long after the moment that produced it, which reads as frozen/placeholder text rather than a live pet.
Observed
A Claude Code session displayed
commit message is... a choice.in the bubble. Checking that session's state file: the reaction was 31 minutes old and still rendering. The same string had also been visible in an unrelated earlier screenshot, reinforcing the "stuck placeholder" impression.The string itself is legitimate curated content (it lives in the commit pool in
server/hooks/reaction-data.tsnext to*nods* ship it.andanother commit, another 3 am.) — the bug is lifetime, not authorship.Root cause
statusline/buddy-status.shreadsreactionTTLfrom config with a default of0:With
0meaning "never expire", the last reaction persists indefinitely until another hook happens to fire. A session that goes quiet keeps the same bubble for hours.Asks
reactionTTLto a sane non-zero value (suggest 5–10 minutes) so a stale reaction expires and the bubble renders empty (or a neutral idle line) rather than replaying old content. Keep0available as an explicit "never expire" opt-in, documented in the README config table.~/.config/claude/buddy-state/accumulatesreaction.<sid>.json,.last_reaction.<sid>,.last_mood.<sid>,.session_start.<sid>per session forever (29 files on this machine, several from sessions that ended hours ago). Sweep entries older than a day on hook run or statusline render, the way the substatus temp sweep already does.Related content note
While reviewing the pool,
commit message is... a choice.is weak in isolation — it reads like an unfinished thought without the context of a bad commit message. Worth a pass over the commit pool for lines that don't stand alone.Environment:
@ramarivera/coding-buddy@0.8.0, Claude Code 2.1.219, macOS.🤖 Created with the help of AI (Claude Fable 5).