Repository navigation
fix(free-time): give the chooser the companion's identity so free time is not always rest - #625
Merged
Merged
Conversation
…e is not always rest Every live free-time block on every companion ended at the chooser with companion_rested and zero turns. The chooser's background call saw only the companion's name, a near-empty menu, and a "never manufacture activity" rule, so a model with no persona or interests always picked rest, which then silenced the lane for the quiet period. The chooser now receives the authoritative identity prompt (the same source reflection deliberation uses) first, followed by its rules. The wander option says what free time can be spent on, and the anti-activity line is gone while rest stays valid. With no identity yet it rests as identity_unavailable without persisting silence. Bead: psfn-framework-ggki4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… exists yet A companion with no default turn since start has no captured identity prompt, and resting in that case would keep the quietest companions out of free time indefinitely. The chooser now returns defer_to_block: the block runs on the default private session through the ordinary full-persona agent turn, where she decides whether to do anything (silent still ends it), and that turn captures the identity for later chooser calls. Bead: psfn-framework-ggki4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
axAilotl
marked this pull request as ready for review
October 9, 2026 22:47
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.
Summary
Free time never ran. Live logs from all three companions over 28h show every free-time block ending at the chooser with
restReason: companion_rested(plus onechooser_timeout) andturnsUsed: 0.The free-time chooser is a tool-less background call that decides rest / wander / resume before the block starts. Its system prompt held only the companion's name: no persona, no interests, nothing about what they can do. It also carried a "never manufacture activity" rule, and the menu was just "rest" and "unstructured private time". A model with no identity always picked rest, and rest then silenced the lane for 180 minutes.
Changes
resolveIdentityPromptport is wired toSubstrateAgent.getCurrentAuthoritativeSystemPrompt(), the same canonical identity/policy prompt reflection deliberation already uses. That prompt goes first, and the chooser rules follow under[Free-time choice].defer_to_block. A companion with no default turn since start has no captured identity prompt. The chooser now skips its model call and lets the block run on the default private session. That turn goes through the ordinary full-persona agent loop, the companion can still end it with the silent reply, and it captures the identity prompt for later chooser calls. No silence is persisted. This covers a companion that has had zero turns since restart (one live companion right now).Change-budget exception
This is a small, self-contained fix for a live behavior bug: free time is completely non-functional for every companion. Padding or delaying it to reach 800 lines would not help anyone.
Validation
viteston free-time-chooser, free-time-chooser-wiring, free-time-lane, and free-time: 83 passedtsc --noEmit,verify:hardcoded-settings: passgate:pre-prviapr:publishAfter deploy
chooserDeadlineMsis 8s and one timeout already happened with the tiny prompt. IfrestReason: chooser_timeoutshows up, raisesocialAutonomy.freeTimeChooser.chooserDeadlineMsin the livescheduler.json.turnsUsed > 0, or theFree-time chooser deferred to the blocklog line.Bead: psfn-framework-ggki4
🤖 Generated with Claude Code