skill-review
Skill Review & Gardening
Automated and manual processes for keeping the 51+ joelclaw skills accurate and healthy. ADR-0179.
Canonical Contract
- Source of truth:
~/Code/joelhooks/joelclaw/skills/(repo, fully git-tracked) - Home dir consumers (symlink IN to repo):
~/.agents/skills/<name>→~/Code/joelhooks/joelclaw/skills/<name>~/.pi/agent/skills/<name>→~/Code/joelhooks/joelclaw/skills/<name>
- Never put skill content in dot directories (
.agents/,.pi/,.claude/). Those are symlink consumers. - Third-party skill packs (axiom-*, marketing, etc.) live in
~/.agents/skills/as external installs — NOT in the repo.
Automated Garden (Inngest)
The skill-garden function runs daily at 6am PT and checks:
Daily (structural + patterns)
- Broken symlinks — dead links in
~/.agents/skills/,~/.pi/agent/skills/ - Non-canonical REAL DIRs — directories in home skill dirs that should be symlinks
- Missing frontmatter — skills without SKILL.md or required frontmatter (name, description)
- Stale patterns — skills referencing known-dead infrastructure:
- legacy lightweight-k8s distro terms → replaced by Talos on Colima
- retired vector DB terms → replaced by Typesense vector search
- launchctl commands targeting worker labels → worker runs in k8s
- old standalone worker clone paths → monorepo
packages/system-bus/ - old standalone CLI repo paths/aliases → CLI is
packages/cli/+joelclaw
- Orphans — skills in repo with no symlink from any home dir
Monthly (1st of month, LLM deep review)
- Reads current
AGENTS.mdas ground truth - Compares each skill's content against system reality via
piinference - Flags outdated workflows, wrong versions, missing capabilities
- Produces structured report
Triggers
# On-demand via event
joelclaw send "skill-garden/check"
joelclaw send "skill-garden/check" --data '{"deep": true}' # force LLM review
# Daily cron: 0 6 * * * (automatic)
Output
- OTEL event:
skill-garden.findings - Gateway notification when issues found (zero noise on clean days)
- Structured JSON report with findings by type
Manual Review Process
When the automated garden flags issues, or for periodic deep review:
1. Run the audit
joelclaw send "skill-garden/check" --data '{"deep": true}'
2. Check for structural issues
# Broken symlinks
find ~/.agents/skills/ ~/.pi/agent/skills/ -maxdepth 1 -type l ! -exec test -e {} \; -print
# REAL DIRs that should be symlinks
for dir in ~/.agents/skills ~/.pi/agent/skills; do
find "$dir" -maxdepth 1 -type d ! -type l | while read d; do
name=$(basename "$d")
[ -d ~/Code/joelhooks/joelclaw/skills/"$name" ] && echo "NON-CANONICAL: $d"
done
done
# Orphan skills (in repo, no home dir symlink)
for skill in ~/Code/joelhooks/joelclaw/skills/*/; do
name=$(basename "$skill")
[ ! -L ~/.agents/skills/"$name" ] && [ ! -L ~/.pi/agent/skills/"$name" ] && echo "ORPHAN: $name"
done
3. Fix structural issues
# Canonical repair path for repo-local skills
joelclaw skills ensure <name>
# Or explicitly from another repo root
joelclaw skills ensure <name> --source-root /abs/repo
If joelclaw skills ensure fails because a consumer target is a real file/dir instead of a symlink, fix that conflict manually, then rerun the command.
4. Fix stale content
When a skill references outdated architecture:
- Read the skill:
read skills/<name>/SKILL.md - Cross-reference with
AGENTS.mdand current system state - Update the skill with current facts
- Commit:
git add skills/<name> && git commit -m "skill(<name>): update for current architecture"
5. Adding a new skill
mkdir -p skills/<name>
# Write SKILL.md with frontmatter: name, description, version, author, tags
# Symlink from home dirs:
ln -s ~/Code/joelhooks/joelclaw/skills/<name> ~/.agents/skills/<name>
ln -s ~/Code/joelhooks/joelclaw/skills/<name> ~/.pi/agent/skills/<name>
git add skills/<name>
git commit -m "skill(<name>): add new skill"
See the add-skill skill for the full idiomatic process.
Stale Pattern Registry
Keep this list updated as infrastructure changes. The Inngest function reads these patterns.
| Pattern | What it means | Current reality |
|---|---|---|
| legacy k8s distro token | Old k8s distribution reference | Talos v1.12.4 on Colima |
| legacy vector DB token | Old vector store reference | Typesense with vector search |
| launchctl worker command token | Old worker deploy mode | k8s Deployment |
| standalone worker clone path token | Old worker path | packages/system-bus/ in monorepo |
| standalone CLI path token | Old CLI path | packages/cli/ in monorepo |
| short CLI alias token | Old CLI name | joelclaw CLI |
When infrastructure changes, update this table AND the exact regex list in STALE_PATTERNS inside skill-garden.ts.
Required Frontmatter
Every skill MUST have:
---
name: skill-name
description: "What this skill does and when to use it"
---
Recommended additional fields:
version: 1.0.0
author: Joel Hooks
tags: [relevant, tags]
displayName: Human Readable Name
Key Paths
| What | Path |
|---|---|
| Repo skills (canonical) | ~/Code/joelhooks/joelclaw/skills/ |
| Inngest function | packages/system-bus/src/inngest/functions/skill-garden.ts |
| ADR | ~/Vault/docs/decisions/0179-automated-skill-gardening.md |
| Home dir: agents | ~/.agents/skills/ |
| Home dir: pi | ~/.pi/agent/skills/ |
| Stale patterns | STALE_PATTERNS in skill-garden.ts |
More from joelhooks/joelclaw
cli-design
Design and build agent-first CLIs with HATEOAS JSON responses, context-protecting output, and self-documenting command trees. Use when creating new CLI tools, adding commands to existing CLIs (joelclaw, slog), or reviewing CLI design for agent-friendliness. Triggers on 'build a CLI', 'add a command', 'CLI design', 'agent-friendly output', or any task involving command-line tool creation.
129k8s
>-
88docker-sandbox
Create, manage, and execute agent tools (claude, codex) inside Docker sandboxes for isolated code execution. Use when running agent loops, spawning tool subprocesses, or any task requiring process isolation. Triggers on "sandbox", "isolated execution", "docker sandbox", "safe agent execution", or when working on agent loop infrastructure.
86joel-writing-style
Joel's writing voice and style guide for joelclaw.com content. Use when writing, editing, or reviewing any blog post, essay, book chapter, or prose content for joelclaw.com. Also use when asked to 'write like Joel,' 'match Joel's voice,' 'draft a post,' 'write content for the blog,' or 'review this for voice.' This skill captures Joel's specific writing patterns derived from ~90,000 words of published content spanning 2012–2026. Cross-reference with copy-editing and copywriting skills for marketing-specific copy.
81task-management
Manage Joel's task system in Todoist. Triggers on: 'add a task', 'create a todo', 'what's on my list', 'today's tasks', 'what do I need to do', 'remind me to', 'inbox', 'complete', 'mark done', 'weekly review', 'groom tasks', 'what's next', or when actionable items emerge from other work. Also triggers when Joel mentions something he needs to do in passing — capture it.
54nextjs-static-shells
Static-first Next.js 16 architecture patterns: cached shells with dynamic slots, provider islands, 'use cache' boundaries, and link preloading strategy. Use when building or refactoring Next.js routes to maximize static rendering, implementing 'use cache' with dynamic personalization, splitting entry vs static renderers, scoping client providers, or tuning prefetch behavior. Triggers on 'static shell', 'use cache pattern', 'dynamic slots', 'provider island', 'prefetch strategy', 'static first', 'cache boundary', 'route goes dynamic unexpectedly', or any Next.js architecture work involving mixed static/dynamic rendering.
48