fix(brain): tools nach auto_scaffold neu bauen — sonst halluziniert ARIA Tool-Tags

Beobachtung beim ersten Live-Test (00:58:33): Auto-Scaffold legte den
spotify-Skill mid-chat() an, all_skills + active_skills wurden refreshed,
ABER die `tools=`-Liste die an den Proxy/claude-CLI geschickt wird
nicht. Folge: ARIA sah im System-Prompt-Skills-Block dass `spotify`
existiert und wusste sie soll `run_spotify` nutzen — aber claude-CLI
kannte das Tool nicht weil dessen tool-schema noch ohne run_spotify
war. Sie hat dann <tool_call name="run_spotify">...</tool_call> als
XML in den Text geschrieben, das wurde nirgends ausgefuehrt (siehe
"Pausiert" / "Restricted & NIKSTER" Antworten waren halluziniert).

Fix in 4 Zeilen: nach scaffolded_any auch `tools = list(META_TOOLS) +
[_skill_to_tool(s) for s in active_skills]` neu bauen. Damit kennt der
CLI-Subprocess den frischen Skill-Tool sofort und kann ihn echt aufrufen.

Beim naechsten chat-Turn waere es eh richtig (Tools werden neu gebaut),
aber genau der erste Turn nach Auto-Scaffold ist der wichtigste —
da soll's klappen.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-30 01:03:21 +02:00
parent 210ce62ffe
commit 15f95ed196
+4
View File
@@ -990,6 +990,10 @@ class Agent:
# Skills-Liste refresh damit der frische Skill im Prompt sichtbar ist # Skills-Liste refresh damit der frische Skill im Prompt sichtbar ist
all_skills = skills_mod.list_skills(active_only=False) all_skills = skills_mod.list_skills(active_only=False)
active_skills = [s for s in all_skills if s.get("active", True)] active_skills = [s for s in all_skills if s.get("active", True)]
# WICHTIG: tools NEU bauen, sonst kennt der claude-CLI-
# Subprocess den frisch gescaffoldeten `run_<name>` NICHT
# und ARIA muss `<tool_call>`-Tags halluzinieren.
tools = list(META_TOOLS) + [_skill_to_tool(s) for s in active_skills]
_ah.invalidate_cache() _ah.invalidate_cache()
# Heuristik neu rechnen — die scaffold-targets sind jetzt weg # Heuristik neu rechnen — die scaffold-targets sind jetzt weg
hints = _ah.compute_hints(existing_skills=all_skills, force=True) hints = _ah.compute_hints(existing_skills=all_skills, force=True)