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

Featurecommands/skills/
FrontmatterNoYes
disable-model-invocationNoYes
context: fork (subagent)NoYes
Supporting filesNoYes (skill directory)
Dynamic context injectionNoYes (!`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:

CategoryStatusGap
Skills7 existingNeed disable-model-invocation on side-effect skills
Hooks1 (TaskCompleted)Missing: PostToolUse frontmatter validator, UserPromptSubmit URL detector
Subagents0Recommend adding arxiv-curator as a subagent
Vault CLAUDE.mdAbsentWould 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.json

hooks, 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 install

MCP 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: true as a first priority?
  • context: fork for arxiv-digest and research-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?

See Also