Claude Code Skills System
Sources: Session notes, 2026-04-03; 2026-04-04 Raw: ECC Shorthand Guide; Skills Format Migration; arXiv Digest System; Claude Code to VPS Updated: 2026-08-12
Overview
Claude Code skills (.claude/skills/<name>/SKILL.md) extend the older commands format (.claude/commands/*.md) with frontmatter-controlled features: disable-model-invocation, context: fork, supporting files, and dynamic context injection. The underlying mechanism is identical — official docs confirm “Custom commands have been merged into skills” — but the skills format adds capabilities that matter for vault automation.
Skills vs Commands: Key Differences
| Feature | commands/ | skills/ |
|---|---|---|
| Frontmatter | No | Yes |
disable-model-invocation | No | Yes |
context: fork (subagent) | No | Yes |
| Supporting files | No | Yes (skill directory) |
| Dynamic context injection | No | Yes (!`command`) |
Existing commands continue to work; migration is optional but recommended for skills with side effects.
Critical Frontmatter Options
disable-model-invocation: true — prevents Claude from auto-triggering the skill without explicit user invocation. Essential for any skill with side effects (file writes, commits, pushes, API calls). This option does not exist in the commands format.
context: fork — runs the skill in an independent context window (subagent). Recommended for long-running skills like arxiv-digest or research-vault that would otherwise fill the main context with intermediate processing output.
Dynamic context injection (!`command`) — executes a shell command at skill start and injects its output. More reliable than instructing Claude to “first run X command” in prose, since the injection happens before the LLM turn begins.
Vault Skill Gap Assessment
From the ECC Shorthand Guide audit of bot_vault:
| Category | Status | Gap |
|---|---|---|
| Skills | 7 existing | Need disable-model-invocation on side-effect skills |
| Hooks | 1 (TaskCompleted) | Missing: PostToolUse frontmatter validator, UserPromptSubmit URL detector |
| Subagents | 0 | Recommend adding arxiv-curator as a subagent |
| Vault CLAUDE.md | Absent | Would let skills skip repeated structure descriptions |
Context window management: Context7 MCP should be disabled by default and enabled only when querying documentation. Active tool count should stay below 80.
arXiv Digest Configuration
Fetch scope: cs.RO, cs.LG, cs.HC, cs.CV + cross-category LLM+robot/HRI keyword pairs + the single keyword “manipulation” (no pairing required for inclusion).
Format: Research Background / Technical Approach / Key Takeaway, max 200 words per paper, English titles preserved.
Schedule: weekly Sunday 09:00 UTC+8 (01:00 UTC), max 20 papers, deduplication via seen-arxiv-ids.txt.
Notification: post English-title summary of top 5 papers to Discord after each run.
Scheduler: Claude Code built-in /schedule (RemoteTrigger).
cs.HC filtering fix: apply a keyword gate (robot, hri, haptic) to cs.HC entries instead of per-category quota, to exclude dark patterns / educational tech / visualization papers that are irrelevant to the primary research interest.
VPS Deployment
~/.claude/ is the complete Claude Code “configuration brain” — rsync transfers ~90% of the environment including settings.json, CLAUDE.md, MCP configuration, skills, and memory.
Critical post-rsync step — hardcoded path correction:
# Replace all local-machine paths in settings.json
sed -i 's|/Users/lookoutking|/home/your_vps_user|g' ~/.claude/settings.json
# Verify clean
grep -r "lookoutking" ~/.claude/settings.jsonhooks, statusLine.command, and MCP server commands commonly embed absolute paths. OAuth tokens cannot be copied — run claude on the VPS to generate a new authorization URL.
VPS dependency stack:
curl -fsSL https://claude.ai/install.sh | bash # Claude Code
curl -fsSL https://bun.sh/install | bash # Discord plugin runtime
curl -LsSf https://astral.sh/uv/install.sh | sh # Python MCP server dependencies
# node, gh, jq: apt installMCP server local dependencies (node_modules, Python venv) are not in ~/.claude/ and must be reinstalled separately on the VPS.
Discord MCP parameter names (traps): reply uses text (not content); fetch_messages uses channel (not chat_id). Wrong parameter names fail silently at runtime, appearing as undefined.
Open Questions
- Which existing vault skills should get
disable-model-invocation: trueas a first priority? context: forkforarxiv-digestandresearch-vault— does this require the skill to self-report results back to the main session, or does the user see the subagent output directly?- VPS deployment: after rsync + path correction, what is the minimal smoke test to confirm the environment is functional before running a production skill?