ea4310e76c
Bot Chats break the "new sessions come often" assumption behind build-once system prompts: capability edits used to sit invisible until /new or compression, and the frozen birth date became misinformation. - tools/bot_mode_probe.py: capability_fingerprint() hashes the profile's capability surface (disabled skills, toolset pins, MCP config, SOUL.md, installed skills, Bot-Mode roster); Bot Chat prompts embed the 12-hex epoch stamp - agent/conversation_loop.py restore path: stored Bot Chat prompt whose epoch mismatches disk → ONE rebuild (through a cleared skills-prompt cache so new installs appear), persisted so the next turn reuses the new bytes verbatim. Prompts without a stamp — every non-Bot-Chat session — never take the branch; probe failure fails closed to reuse - agent/system_prompt.py: Bot Chat prompts are timeless — the "Conversation started:" date is dropped (timezone kept); no ticking fields in an eternal session - tui_gateway: _sync_bot_capabilities at turn start rebuilds the live agent (tool definitions are construction-baked) when the fingerprint moves, same session id/history, with a user-visible notice Cache stance: this is the /model exception applied to capabilities — a loud, user-initiated, once-per-change prefix break. Unchanged state hashes identically and stored bytes are reused verbatim (E2E-proven). Validation: 9 probe unit tests incl. per-axis fingerprint changes; E2E v3 against the real restore path (fresh build → verbatim reuse → skill install → single refresh w/ new skill in index → verbatim reuse; regular sessions dated, unstamped, never refreshed); tests/agent/ 4647/4647.