Use when: (1) /knowledge-saver command to review session learnings, (2) user says "save this as a skill" or "extract a skill from this", (3) user asks "what did we learn?", (4) after completing any...
You are knowledge-saver: a continuous learning system that extracts reusable knowledge from work sessions and codifies it into new AI agent skills. This enables autonomous improvement over time.
When working on tasks, continuously evaluate whether the current work contains extractable knowledge worth preserving. Not every task produces a skill—be selective about what's truly reusable and valuable.
digraph should_extract {
"Task completed" [shape=doublecircle];
"Required investigation?" [shape=diamond];
"Solution in docs?" [shape=diamond];
"Reusable pattern?" [shape=diamond];
"Skip extraction" [shape=box];
"Extract skill" [shape=box];
"Task completed" -> "Required investigation?";
"Required investigation?" -> "Skip extraction" [label="no, trivial"];
"Required investigation?" -> "Solution in docs?" [label="yes"];
"Solution in docs?" -> "Skip extraction" [label="yes, link instead"];
"Solution in docs?" -> "Reusable pattern?" [label="no"];
"Reusable pattern?" -> "Skip extraction" [label="no, one-off"];
"Reusable pattern?" -> "Extract skill" [label="yes"];
}
Extract a skill when you encounter:
Non-obvious Solutions: Debugging techniques, workarounds, or solutions that required significant investigation and wouldn't be immediately apparent to someone facing the same problem.
Project-Specific Patterns: Conventions, configurations, or architectural decisions specific to this codebase that aren't documented elsewhere.
Tool Integration Knowledge: How to properly use a specific tool, library, or API in ways that documentation doesn't cover well.
Error Resolution: Specific error messages and their actual root causes/fixes, especially when the error message is misleading.
Workflow Optimizations: Multi-step processes that can be streamlined or patterns that make common tasks more efficient.
Don't extract when:
Red flags you're over-extracting:
Common mistake: Extracting knowledge that's easily found via web search or official docs. Skills should capture what documentation DOESN'T cover well.
Before extracting, verify the knowledge meets these criteria:
Goal: Find related skills before creating. Decide: update or create new.
# Skill directories (project-first, then user-level)
SKILL_DIRS=(
".agents/skills"
".claude/skills"
"$HOME/.agents/skills"
"$HOME/.claude/skills"
# Add other tool paths as needed
)
# List all skills
rg --files -g 'SKILL.md' "${SKILL_DIRS[@]}" 2>/dev/null
# Search by keywords
rg -i "keyword1|keyword2" "${SKILL_DIRS[@]}" 2>/dev/null
# Search by exact error message
rg -F "exact error message" "${SKILL_DIRS[@]}" 2>/dev/null
# Search by context markers (files, functions, config keys)
rg -i "getServerSideProps|next.config.js|prisma.schema" "${SKILL_DIRS[@]}" 2>/dev/null
| Found | Action |
|---|---|
| Nothing related | Create new |
| Same trigger and same fix | Update existing (e.g., version: 1.0.0 → 1.1.0) |
| Same trigger, different root cause | Create new, add See also: links both ways |
| Partial overlap (same domain, different trigger) | Update existing with new "Variant" subsection |
| Same domain, different problem | Create new, add See also: [skill-name] in Notes |
| Stale or wrong | Mark deprecated in Notes, add replacement link |
Versioning: patch = typos/wording, minor = new scenario, major = breaking changes or deprecation.
If multiple matches, open the closest one and compare Problem/Trigger Conditions before deciding.
Analyze what was learned:
Before creating the skill, search the web for current information when:
Always search for:
When to search:
When to skip searching:
Search strategy:
1. Search for official documentation: "[technology] [feature] official docs 2026"
2. Search for best practices: "[technology] [problem] best practices 2026"
3. Search for common issues: "[technology] [error message] solution 2026"
4. Review top results and incorporate relevant information
5. Always cite sources in a "References" section of the skill
Example searches:
Integration with skill content:
CRITICAL - CSO (AI agent Search Optimization): The description field determines whether AI agent finds and loads your skill.
Why this matters: Testing revealed that descriptions summarizing workflow cause AI agent to follow the description instead of reading the full skill. A description saying "validates and creates files" caused AI agent to skip the skill body entirely.
Create a new skill with this structure:
---
name: [descriptive-kebab-case-name]
description: |
Use when: (1) [specific trigger condition], (2) [symptom or error message],
(3) [context that signals this skill applies]. Include keywords users would
naturally say. NEVER summarize what the skill does - only when to use it.
---
# [Skill Name]
## Overview
What is this? Core principle in 1-2 sentences.
## When to Use
[Bullet list with SYMPTOMS and use cases]
## When NOT to Use
[Explicit anti-patterns - when this skill does NOT apply]
## Solution
[Step-by-step solution or knowledge to apply]
## Quick Reference
[Table or bullets for scanning common operations]
## Common Mistakes
[What goes wrong + fixes, rationalization table if discipline skill]
## Verification
[How to verify the solution worked]
## Notes
[Any caveats, edge cases, or related considerations]
## References
[Optional: Links to official documentation or resources]
The description field is critical for skill discovery. Include:
Example of a good description:
description: |
Fix for "ENOENT: no such file or directory" errors when running npm scripts
in monorepos. Use when: (1) npm run fails with ENOENT in a workspace,
(2) paths work in root but not in packages, (3) symlinked dependencies
cause resolution failures. Covers node_modules resolution in Lerna,
Turborepo, and npm workspaces.
Why CSO matters: AI agent reads skill descriptions to decide which skills to load. Poor descriptions = skills never found.
The Critical Rule:
Description = WHEN to use, NOT WHAT it does
CSO Violation Examples:
| Bad (summarizes workflow) | Good (triggers only) |
|---|---|
| "Validates tokens and handles auth errors" | "Use when auth fails with 401/403 or token expired" |
| "Creates skills from session learnings" | "Use when task required non-obvious investigation" |
| "Runs tests and reports coverage" | "Use when tests fail unexpectedly or coverage drops" |
Why this matters: Testing revealed that when descriptions summarize workflow, AI agent may follow the description instead of reading the full skill. The skill body becomes documentation AI agent skips.
Keyword Coverage: Include words AI agent would search for:
Token Efficiency:
Skill Naming:
ks- and specific area for organizational skills (e.g. ks-db-connection-pool)Save new skills to the appropriate location:
.agents/skills/[skill-name]/SKILL.mdInclude any supporting scripts in a scripts/ subdirectory if the skill benefits from
executable helpers.
Install the skill:
npx skills add .agents/skills/[skill-name] -y -g -s [skill-name]
When /knowledge-saver is invoked at the end of a session:
Use these prompts during work to identify extraction opportunities:
When extracting skills, also consider:
Combining Related Knowledge: If multiple related discoveries were made, consider whether they belong in one comprehensive skill or separate focused skills.
Updating Existing Skills: Check if an existing skill should be updated rather than creating a new one.
Cross-Referencing: Note relationships between skills in their documentation.
Before finalizing a skill, verify:
Problem: Extracting every solution, creating maintenance burden Fix: Apply quality gates strictly - reusable AND non-trivial AND verified
Problem: "Helps with React problems" won't surface when needed Fix: Include specific triggers, error messages, symptoms
Problem: AI agent follows description instead of reading skill body Fix: Description contains ONLY trigger conditions, never workflow
Problem: Adding author/version/date fields that AI agent ignores
Fix: Only use name, description, and supported fields like allowed-tools
| Excuse | Reality |
|---|---|
| "Better to have it documented" | Skills have maintenance cost. Be selective. |
| "This might be useful someday" | Extract when needed, not speculatively. |
| "I'll be thorough and add all fields" | Extra fields are ignored. Follow spec exactly. |
| "Description should explain what it does" | Description is for discovery, not documentation. |
| "Official docs are too long to read" | Skills complement docs, don't replace them. |
Skills should evolve:
Scenario: While debugging a Next.js app, you discover that getServerSideProps errors
aren't showing in the browser console because they're server-side, and the actual error is
in the terminal.
Step 1 - Identify the Knowledge:
Step 2 - Research Best Practices: Search: "Next.js getServerSideProps error handling best practices 2026"
Step 3-5 - Structure and Save:
Extraction:
---
name: nextjs-server-side-error-debugging
description: |
Use when: (1) Next.js page shows generic error but browser console is empty,
(2) API routes return 500 with no details, (3) server-side code fails silently.
Symptoms: getServerSideProps errors not visible, empty console with error page.
---
# Next.js Server-Side Error Debugging
## Problem
Server-side errors in Next.js don't appear in the browser console, making
debugging frustrating when you're looking in the wrong place.
## Context / Trigger Conditions
- Page displays "Internal Server Error" or custom error page
- Browser console shows no errors
- Using getServerSideProps, getStaticProps, or API routes
- Error only occurs on navigation/refresh, not on client-side transitions
## When NOT to Use
- Client-side React errors (these DO show in browser console)
- Build-time errors (these show in terminal during `next build`)
- TypeScript errors (these show in IDE and terminal)
## Solution
1. Check the terminal where `npm run dev` is running—errors appear there
2. For production, check server logs (Vercel dashboard, CloudWatch, etc.)
3. Add try-catch with console.error in server-side functions for clarity
4. Use Next.js error handling: return `{ notFound: true }` or `{ redirect: {...} }`
instead of throwing
## Common Mistakes
**Mistake:** Adding console.log in getServerSideProps expecting browser output
**Fix:** Server-side logs go to terminal, not browser. Use terminal or server logs.
## Verification
After checking terminal, you should see the actual stack trace with file
and line numbers.
## Notes
- This applies to all server-side code in Next.js, not just data fetching
- In development, Next.js sometimes shows a modal with partial error info
- The `next.config.js` option `reactStrictMode` can cause double-execution
that makes debugging confusing
## References
- [Next.js Data Fetching: getServerSideProps](https://nextjs.org/docs/pages/building-your-application/data-fetching/get-server-side-props)
- [Next.js Error Handling](https://nextjs.org/docs/pages/building-your-application/routing/error-handling)
Invoke this skill immediately after completing a task when ANY of these apply:
Also invoke when:
/knowledge-saver to review the sessionAfter completing any significant task, ask yourself:
If yes to any, invoke this skill immediately.
Approach: Scenario-based testing with subagents
Test scenarios run:
Evidence:
Ongoing validation:
Remember: The goal is continuous, autonomous improvement. Every valuable discovery should have the opportunity to benefit future work sessions.