How to Add Skills
Add progressive-disclosure knowledge loading to an existing PromptPack so that agents can access domain expertise on demand without bloating system templates.
Prerequisites
- A PromptPack (v1.3.1+ schema)
- Understanding of Pack Structure
- Knowledge you want to make available to agents beyond what’s in system templates
Step 1: Identify Your Knowledge Sources
Skills represent modular knowledge units. Look at your existing prompts and identify:
- What domain expertise do agents need? → These become skill sources.
- Is the knowledge small enough to inline? → Use
InlineSkill. - Is the knowledge in external files? → Use string paths or
SkillPathSource. - Should any knowledge load eagerly? → Set
preload: true.
For example, if you have billing and technical support prompts:
skills/├── billing/ → billing policies, refund rules, account procedures├── technical/ → troubleshooting guides, diagnostic procedures└── compliance/ → regulatory requirements (preload for all states)Step 2: Add the Top-Level Skills Array
Add a skills array to your pack root. Each entry is one of three forms:
String Paths (Simplest)
{ "skills": [ "./skills/billing", "./skills/technical" ]}Path Objects (With Preload)
{ "skills": [ { "path": "./skills/compliance", "preload": true }, { "path": "./skills/billing" } ]}Use preload: true for knowledge that should be available immediately (e.g., compliance rules that apply to all interactions).
Inline Skills (Small, Pack-Specific)
{ "skills": [ { "name": "escalation-protocol", "description": "Steps for escalating unresolved customer issues", "instructions": "When a customer issue cannot be resolved within 3 exchanges:\n1. Acknowledge the complexity\n2. Collect all relevant case details\n3. Create an escalation ticket with priority based on customer tier\n4. Provide the ticket reference number to the customer" } ]}Inline skills are best for small, self-contained knowledge that doesn’t warrant a separate file.
Step 3: Mix Skill Sources (Optional)
You can combine all three forms in one array:
{ "skills": [ "./skills/general", { "path": "./skills/compliance", "preload": true }, { "name": "escalation-protocol", "description": "Steps for escalating unresolved issues", "instructions": "When an issue cannot be resolved:\n1. Collect details\n2. Create ticket\n3. Set follow-up expectations" } ]}Step 4: Scope Skills Per Workflow State (Optional)
If your pack uses a workflow, you can filter which skills are available in each state:
{ "workflow": { "version": 1, "entry": "triage", "states": { "triage": { "prompt_task": "triage", "on_event": { "billing": "billing_state", "technical": "tech_state" } }, "billing_state": { "prompt_task": "billing", "on_event": { "resolved": "closing" }, "skills": "./skills/billing" }, "tech_state": { "prompt_task": "technical", "on_event": { "resolved": "closing" }, "skills": "./skills/technical" }, "closing": { "prompt_task": "closing", "on_event": {}, "skills": "none" } } }}- Omit
skills→ all pack-level skills are available - Set a path → only skills from that path are available
- Set
"none"→ no skills are available in that state
Complete Example
Before: Skills Embedded in Templates
{ "id": "customer-support", "version": "1.3.0", "prompts": { "billing": { "id": "billing", "name": "Billing Support", "version": "1.0.0", "system_template": "You are a billing specialist.\n\nRefund Policy:\n- Full refunds within 30 days\n- Partial refunds within 90 days\n- No refunds after 90 days\n\nEscalation Protocol:\n- Collect case details...\n\n[50 more lines of embedded knowledge]" } }}After: Skills for Progressive Loading
{ "id": "customer-support", "version": "1.3.1", "skills": [ "./skills/billing", { "path": "./skills/compliance", "preload": true }, { "name": "escalation-protocol", "description": "Steps for escalating unresolved issues", "instructions": "When an issue cannot be resolved within 3 exchanges:\n1. Acknowledge the complexity\n2. Collect case details\n3. Create escalation ticket\n4. Provide ticket reference" } ], "prompts": { "billing": { "id": "billing", "name": "Billing Support", "version": "1.1.0", "system_template": "You are a billing specialist.\n\nUse your available skills for refund policies, compliance rules, and escalation procedures." } }}Validation Checklist
After adding skills, verify:
- Pack validates against the v1.3.1+ schema
- All file paths point to existing directories/files (if using path-based skills)
- Inline skills have all three required fields:
name,description,instructions -
SkillPathSourceobjects have apathfield - Workflow state
skillsvalues are either valid paths or"none" - Existing prompts still work without changes (backward compatible)
Common Mistakes
Putting runtime logic in skills
Skills are knowledge, not code. They should contain instructions and expertise, not executable logic.
Wrong:
{ "name": "billing-handler", "instructions": "if (customer.tier === 'premium') { applyDiscount(20) }"}Right:
{ "name": "billing-policy", "instructions": "For premium customers, apply a 20% discount on service fees."}Using skills for static text substitution
If you just need text inserted into a template at compile time, use fragments instead.
Use fragments for: Company intro, disclaimers, boilerplate text Use skills for: Domain expertise, procedures, behavioral instructions loaded at runtime
Forgetting to scope skills in workflows
Without a skills field on a workflow state, all pack-level skills are available. This may provide more context than needed. Scope skills to keep agent focus narrow:
"billing_state": { "prompt_task": "billing", "on_event": { "resolved": "closing" }, "skills": "./skills/billing"}Next Steps
- Architecture Patterns — how skills relate to other features
- Schema Guide — detailed field documentation
- Real-World Examples — complete pack with skills
- RFC-0008: Skills Extension — design rationale