slaude Docs

Field notes

2026-05-11 — skill evolution

  • Skill-evolution shipped. New SDK MCP server slaude_skills mounted alongside slaude_slack per session via the existing McpResolver. Tools: list_skills, read_skill, write_skill, delete_skill. Slug regex ^[a-z0-9][a-z0-9-]{0,63}$ plus a path.relative(skillsRoot, dir) === slug check sandboxes writes to $SLAUDE_HOME/skills/<slug>/ and rejects traversal (.., /, ., empty). Frontmatter values JSON-quoted so : / " / newlines in name/description can't break the yaml block. Hot-reload is free — discoverSkills() already runs on every inbound Slack message in adapter.ts, so a write_skill in turn N is invocable as /<slug> in turn N+1 without restart.
  • Permission gate auto-allows mcp__slaude_skills__list_skills and mcp__slaude_skills__read_skill (read-only — silent self-introspection is the whole point). write_skill and delete_skill are NOT auto-allowed; the baseline soul now mandates mcp__slaude_slack__request_approval with category: '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 skillHandlers export so tests can invoke them directly without spinning up an McpServer. skillOps is the pure-IO layer used by both the handlers and tests. Coverage on src/skills/mcp-tools.ts: 100% func / 99.31% line. Full suite: 160 pass.