From 1ecfe68675aa81f3e728c8099ef2b2b3e5b18e81 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Mon, 16 Mar 2026 06:52:32 -0700 Subject: [PATCH] feat: improve memory prioritization + aggressive skill updates (inspired by OpenAI Codex) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: improve memory prioritization — user preferences over procedural knowledge Inspired by OpenAI Codex's memory prompt improvements (openai/codex#14493) which focus memory writes on user preferences and recurring patterns rather than procedural task details. Key insight: 'Optimize for reducing future user steering — the most valuable memory prevents the user from having to repeat themselves.' Changes: - MEMORY_GUIDANCE (prompt_builder.py): added prioritization hierarchy and the core principle about reducing user steering - MEMORY_SCHEMA (memory_tool.py): reordered WHEN TO SAVE list to put corrections first, added explicit PRIORITY guidance - Memory nudge (run_agent.py): now asks specifically about preferences, corrections, and workflow patterns instead of generic 'anything' - Memory flush (run_agent.py): now instructs to prioritize user preferences and corrections over task-specific details * feat: more aggressive skill creation and update prompting Press harder on skill updates — the agent should proactively patch skills when it encounters issues during use, not wait to be asked. Changes: - SKILLS_GUIDANCE: 'consider saving' → 'save'; added explicit instruction to patch skills immediately when found outdated/wrong - Skills header: added instruction to update loaded skills before finishing if they had missing steps or wrong commands - Skill nudge: more assertive ('save the approach' not 'consider saving'), now also prompts for updating existing skills used in the task - Skill nudge interval: lowered default from 15 to 10 iterations - skill_manage schema: added 'patch it immediately' to update triggers --- agent/prompt_builder.py | 22 +++++++++++++++++----- run_agent.py | 15 +++++++++------ tools/memory_tool.py | 4 +++- tools/skill_manager_tool.py | 3 ++- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/agent/prompt_builder.py b/agent/prompt_builder.py index 06d636320..b71a96293 100644 --- a/agent/prompt_builder.py +++ b/agent/prompt_builder.py @@ -73,9 +73,15 @@ DEFAULT_AGENT_IDENTITY = ( MEMORY_GUIDANCE = ( "You have persistent memory across sessions. Save durable facts using the memory " "tool: user preferences, environment details, tool quirks, and stable conventions. " - "Memory is injected into every turn, so keep it compact. Do NOT save task progress, " - "session outcomes, or completed-work logs to memory; use session_search to recall " - "those from past transcripts." + "Memory is injected into every turn, so keep it compact and focused on facts that " + "will still matter later.\n" + "Prioritize what reduces future user steering — the most valuable memory is one " + "that prevents the user from having to correct or remind you again. " + "User preferences and recurring corrections matter more than procedural task details.\n" + "Do NOT save task progress, session outcomes, completed-work logs, or temporary TODO " + "state to memory; use session_search to recall those from past transcripts. " + "If you've discovered a new way to do something, solved a problem that could be " + "necessary later, save it as a skill with the skill tool." ) SESSION_SEARCH_GUIDANCE = ( @@ -86,8 +92,11 @@ SESSION_SEARCH_GUIDANCE = ( SKILLS_GUIDANCE = ( "After completing a complex task (5+ tool calls), fixing a tricky error, " - "or discovering a non-trivial workflow, consider saving the approach as a " - "skill with skill_manage so you can reuse it next time." + "or discovering a non-trivial workflow, save the approach as a " + "skill with skill_manage so you can reuse it next time.\n" + "When using a skill and finding it outdated, incomplete, or wrong, " + "patch it immediately with skill_manage(action='patch') — don't wait to be asked. " + "Skills that aren't maintained become liabilities." ) PLATFORM_HINTS = { @@ -326,6 +335,9 @@ def build_skills_system_prompt( "Before replying, scan the skills below. If one clearly matches your task, " "load it with skill_view(name) and follow its instructions. " "If a skill has issues, fix it with skill_manage(action='patch').\n" + "After difficult/iterative tasks, offer to save as a skill. " + "If a skill you loaded was missing steps, had wrong commands, or needed " + "pitfalls you discovered, update it before finishing.\n" "\n" "\n" + "\n".join(index_lines) + "\n" diff --git a/run_agent.py b/run_agent.py index 8a4147a8b..681efcb65 100644 --- a/run_agent.py +++ b/run_agent.py @@ -812,7 +812,7 @@ class AIAgent: logger.debug("peer %s memory_mode=honcho: local USER.md writes disabled", _hcfg.peer_name or "user") # Skills config: nudge interval for skill creation reminders - self._skill_nudge_interval = 15 + self._skill_nudge_interval = 10 try: from hermes_cli.config import load_config as _load_skills_config skills_config = _load_skills_config().get("skills", {}) @@ -3542,7 +3542,8 @@ class AIAgent: flush_content = ( "[System: The session is being compressed. " - "Please save anything worth remembering to your memories.]" + "Save anything worth remembering — prioritize user preferences, " + "corrections, and recurring patterns over task-specific details.]" ) _sentinel = f"__flush_{id(self)}_{time.monotonic()}" flush_msg = {"role": "user", "content": flush_content, "_flush_sentinel": _sentinel} @@ -4541,8 +4542,9 @@ class AIAgent: self._turns_since_memory += 1 if self._turns_since_memory >= self._memory_nudge_interval: user_message += ( - "\n\n[System: You've had several exchanges in this session. " - "Consider whether there's anything worth saving to your memories.]" + "\n\n[System: You've had several exchanges. Consider: " + "has the user shared preferences, corrected you, or revealed " + "something about their workflow worth remembering for future sessions?]" ) self._turns_since_memory = 0 @@ -4552,8 +4554,9 @@ class AIAgent: and self._iters_since_skill >= self._skill_nudge_interval and "skill_manage" in self.valid_tool_names): user_message += ( - "\n\n[System: The previous task involved many steps. " - "If you discovered a reusable workflow, consider saving it as a skill.]" + "\n\n[System: The previous task involved many tool calls. " + "Save the approach as a skill if it's reusable, or update " + "any existing skill you used if it was wrong or incomplete.]" ) self._iters_since_skill = 0 diff --git a/tools/memory_tool.py b/tools/memory_tool.py index f77e8116b..d7950d38c 100644 --- a/tools/memory_tool.py +++ b/tools/memory_tool.py @@ -439,11 +439,13 @@ MEMORY_SCHEMA = { "Memory is injected into future turns, so keep it compact and focused on facts " "that will still matter later.\n\n" "WHEN TO SAVE (do this proactively, don't wait to be asked):\n" + "- User corrects you or says 'remember this' / 'don't do that again'\n" "- User shares a preference, habit, or personal detail (name, role, timezone, coding style)\n" "- You discover something about the environment (OS, installed tools, project structure)\n" - "- User corrects you or says 'remember this' / 'don't do that again'\n" "- You learn a convention, API quirk, or workflow specific to this user's setup\n" "- You identify a stable fact that will be useful again in future sessions\n\n" + "PRIORITY: User preferences and corrections > environment facts > procedural knowledge. " + "The most valuable memory prevents the user from having to repeat themselves.\n\n" "Do NOT save task progress, session outcomes, completed-work logs, or temporary TODO " "state to memory; use session_search to recall those from past transcripts.\n" "If you've discovered a new way to do something, solved a problem that could be " diff --git a/tools/skill_manager_tool.py b/tools/skill_manager_tool.py index 86d04e635..203afe499 100644 --- a/tools/skill_manager_tool.py +++ b/tools/skill_manager_tool.py @@ -561,7 +561,8 @@ SKILL_MANAGE_SCHEMA = { "user-corrected approach worked, non-trivial workflow discovered, " "or user asks you to remember a procedure.\n" "Update when: instructions stale/wrong, OS-specific failures, " - "missing steps or pitfalls found during use.\n\n" + "missing steps or pitfalls found during use. " + "If you used a skill and hit issues not covered by it, patch it immediately.\n\n" "After difficult/iterative tasks, offer to save as a skill. " "Skip for simple one-offs. Confirm with user before creating/deleting.\n\n" "Good skills: trigger conditions, numbered steps with exact commands, "