a451766d97
Main's load_skill tool was deleted during the SDK migration along with the prompt-mutation pattern it relied on. Re-add the capability without the mutation: load_skill(skills=[...]) now returns the skill markdown bodies as a tool result, so the content lands in conversation history as in-context reference rather than as patched-in system prompt content. Same source of truth (load_skills + skill files), same validation (validate_requested_skills) as create_agent. Tool result format is plain markdown (## Skill: <name> headers joined with ---), not the <specialized_knowledge> XML wrapping used at agent-build time. The XML framing was deliberately reserved for prompt-level privileged context; tool-loaded skills are honestly labelled as just-fetched reference material. Close the discovery loop by surfacing the full skill catalog in the system prompt. Without it the model could only guess skill names — discovering them via validation errors on misses. Now every agent sees a categorised <available_skills> block right after the <specialized_knowledge> block with a short hint pointing at create_agent / load_skill. Skills module: factored _iter_user_skill_files() so get_all_skill_names (set, for validation) and get_available_skills (dict by category, for the prompt) share one source of truth on what counts as user-selectable. Internal categories (scan_modes, coordination) stay excluded from both. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>