feat: step buddy per refresh, with configurable step rate - #15
Merged
Conversation
wall-clock ticks fell between host refreshes, never seen. frame counter now. also prunes retired buddyStyle key. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
wall-clock gate around the per-refresh frame bump: advance at most once per stepSeconds, stamped in buddy.lastStepAt. 0/absent/invalid = every refresh (unchanged default). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
/eridian:buddy 2 = at most one pose step per 2s; 0 restores per-refresh default; no arg prints current. Setting lives in buddy.stepSeconds. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Rocky looked frozen. Animation poses were keyed to wall-clock ticks (0.5–2s), but Claude Code only re-runs the statusline every ~8–11s during activity (measured by instrumenting the wrapper). Sub-2s ticks sampled every ~10s = coin-flip pose changes at best, fully frozen when idle. The fast moods (reacting 600ms, celebrating 500ms) played entire cycles between refreshes — invisible.
Fix
buddy.framecounter in state;statusline.jsbumps it once per invocation (skipped when mode is off), merged into the sameupdate()as the milestone stamp.renderBuddykeys arm poses, gait, and dance beats off the frame counter — every host refresh now visibly changes the pose. Mood windows and quip rotation stay wall-clock.armsTick/fastGait/tickconfig removed — per-mood speed differences were meaningless at ~10s sampling.readState()prunes the retiredbuddyStylekey (left behind by a97d039); next write self-cleans old state files.Step rate setting (new)
Per-refresh stepping can look frantic during fast refresh bursts, so "how often Rocky steps" is now configurable:
buddy.stepSecondsin state throttles the frame bump: advance at most once per that many seconds, stamped inbuddy.lastStepAt.0/absent/invalid = every refresh (default, unchanged behavior)./eridian:buddy <seconds>command (scripts/buddy-speed.js+commands/buddy.md, mirrorsmode.js): set,0to reset, no arg prints current, rejects garbage/negatives.Verification
/eridian:buddy 2, three rapid refreshes hold the frame and a refresh after 2.1s advances it; reset restores per-refresh stepping.🤖 Generated with Claude Code