Field notes
2026-05-11 — skill evolution
- Skill-evolution shipped. New SDK MCP server
slaude_skillsmounted alongsideslaude_slackper session via the existingMcpResolver. Tools:list_skills,read_skill,write_skill,delete_skill. Slug regex^[a-z0-9][a-z0-9-]{0,63}$plus apath.relative(skillsRoot, dir) === slugcheck sandboxes writes to$SLAUDE_HOME/skills/<slug>/and rejects traversal (..,/,., empty). Frontmatter values JSON-quoted so:/"/ newlines inname/descriptioncan't break the yaml block. Hot-reload is free —discoverSkills()already runs on every inbound Slack message inadapter.ts, so awrite_skillin turn N is invocable as/<slug>in turn N+1 without restart. - Permission gate auto-allows
mcp__slaude_skills__list_skillsandmcp__slaude_skills__read_skill(read-only — silent self-introspection is the whole point).write_skillanddelete_skillare NOT auto-allowed; the baseline soul now mandatesmcp__slaude_slack__request_approvalwithcategory: 'skills'before either. Defense in depth: even if the persona drops the directive, the permission gate prompts the user (Block Kit Approve / Deny) on the raw tool call. - "Auto-detect when to evolve" is implemented as a baseline-soul directive, not a runtime hook: at the end of every non-trivial turn (≥1 tool call, or a procedure plausibly worth repeating) the agent is required to (1) list_skills if unsure, (2) capture new procedures as new slugs, (3) refine existing skills with read_skill→write_skill, (4) write nothing if neither applies. Explicit guidance: one-off facts go in memory, not skills.
- Handlers refactored into a named
skillHandlersexport so tests can invoke them directly without spinning up an McpServer.skillOpsis the pure-IO layer used by both the handlers and tests. Coverage onsrc/skills/mcp-tools.ts: 100% func / 99.31% line. Full suite: 160 pass.