When a skill loaded by [SkillToolset] has no scripts/ directory, run_skill_script is still exposed as a callable tool. When confirmtool (or any expected next-step tool) is unavailable, adk hallucinates a reason to call run_skill_script repeatedly, entering a new infinite loop.
To reproduce:
Same setup as Issue 1. After load_skill_resource successfully loads all 4 reference files, the LLM attempts confirmtool, fails to find it, then calls run_skill_script in a loop with fabricated arguments.
Expected behavior:
run_skill_script should only be included in the tool list if the activated skill actually has a scripts/ directory with at least one file.
Actual behavior:
[ADK_EVENT] content=[FunctionCall: load_skill_resource] (×4) ← success
[ADK_EVENT] content=[FunctionCall: run_skill_script] ← hallucinated
[ADK_EVENT] content=[FunctionCall: run_skill_script] ← loop
[ADK_EVENT] content=[FunctionCall: run_skill_script]
... repeats indefinitely
When a skill loaded by [SkillToolset] has no scripts/ directory, run_skill_script is still exposed as a callable tool. When confirmtool (or any expected next-step tool) is unavailable, adk hallucinates a reason to call run_skill_script repeatedly, entering a new infinite loop.
To reproduce:
Same setup as Issue 1. After load_skill_resource successfully loads all 4 reference files, the LLM attempts confirmtool, fails to find it, then calls run_skill_script in a loop with fabricated arguments.
Expected behavior:
run_skill_script should only be included in the tool list if the activated skill actually has a scripts/ directory with at least one file.
Actual behavior:
[ADK_EVENT] content=[FunctionCall: load_skill_resource] (×4) ← success
[ADK_EVENT] content=[FunctionCall: run_skill_script] ← hallucinated
[ADK_EVENT] content=[FunctionCall: run_skill_script] ← loop
[ADK_EVENT] content=[FunctionCall: run_skill_script]
... repeats indefinitely