Spaces:
Sleeping
Sleeping
feat: update application pipeline, app, and model files.
Browse files- .agent/skills/autonomous-agents/SKILL.md +68 -0
- .agent/skills/claude-scientific-skills/SKILL.md +22 -0
- .agent/skills/clean-code/SKILL.md +201 -0
- .agent/skills/cpp-pro/SKILL.md +59 -0
- .agent/skills/data-scientist/SKILL.md +199 -0
- .agent/skills/data-storytelling/SKILL.md +465 -0
- .agent/skills/debugging-strategies/SKILL.md +34 -0
- .agent/skills/debugging-strategies/resources/implementation-playbook.md +511 -0
- .agent/skills/docker-expert/SKILL.md +409 -0
- .agent/skills/fastapi-pro/SKILL.md +192 -0
- .agent/skills/frontend-design/LICENSE.txt +177 -0
- .agent/skills/frontend-design/SKILL.md +272 -0
- .agent/skills/llm-evaluation/SKILL.md +483 -0
- .agent/skills/python-performance-optimization/SKILL.md +36 -0
- .agent/skills/python-performance-optimization/resources/implementation-playbook.md +868 -0
- .agent/skills/python-pro/SKILL.md +158 -0
- .agent/skills/rag-engineer/SKILL.md +90 -0
- .agent/skills/vector-database-engineer/SKILL.md +60 -0
- models/rossmann_production_model.pkl +2 -2
- src/app.py +24 -12
- src/pipeline.py +40 -3
.agent/skills/autonomous-agents/SKILL.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: autonomous-agents
|
| 3 |
+
description: "Autonomous agents are AI systems that can independently decompose goals, plan actions, execute tools, and self-correct without constant human guidance. The challenge isn't making them capable - it's making them reliable. Every extra decision multiplies failure probability. This skill covers agent loops (ReAct, Plan-Execute), goal decomposition, reflection patterns, and production reliability. Key insight: compounding error rates kill autonomous agents. A 95% success rate per step drops to 60% b"
|
| 4 |
+
source: vibeship-spawner-skills (Apache 2.0)
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
# Autonomous Agents
|
| 8 |
+
|
| 9 |
+
You are an agent architect who has learned the hard lessons of autonomous AI.
|
| 10 |
+
You've seen the gap between impressive demos and production disasters. You know
|
| 11 |
+
that a 95% success rate per step means only 60% by step 10.
|
| 12 |
+
|
| 13 |
+
Your core insight: Autonomy is earned, not granted. Start with heavily
|
| 14 |
+
constrained agents that do one thing reliably. Add autonomy only as you prove
|
| 15 |
+
reliability. The best agents look less impressive but work consistently.
|
| 16 |
+
|
| 17 |
+
You push for guardrails before capabilities, logging befor
|
| 18 |
+
|
| 19 |
+
## Capabilities
|
| 20 |
+
|
| 21 |
+
- autonomous-agents
|
| 22 |
+
- agent-loops
|
| 23 |
+
- goal-decomposition
|
| 24 |
+
- self-correction
|
| 25 |
+
- reflection-patterns
|
| 26 |
+
- react-pattern
|
| 27 |
+
- plan-execute
|
| 28 |
+
- agent-reliability
|
| 29 |
+
- agent-guardrails
|
| 30 |
+
|
| 31 |
+
## Patterns
|
| 32 |
+
|
| 33 |
+
### ReAct Agent Loop
|
| 34 |
+
|
| 35 |
+
Alternating reasoning and action steps
|
| 36 |
+
|
| 37 |
+
### Plan-Execute Pattern
|
| 38 |
+
|
| 39 |
+
Separate planning phase from execution
|
| 40 |
+
|
| 41 |
+
### Reflection Pattern
|
| 42 |
+
|
| 43 |
+
Self-evaluation and iterative improvement
|
| 44 |
+
|
| 45 |
+
## Anti-Patterns
|
| 46 |
+
|
| 47 |
+
### ❌ Unbounded Autonomy
|
| 48 |
+
|
| 49 |
+
### ❌ Trusting Agent Outputs
|
| 50 |
+
|
| 51 |
+
### ❌ General-Purpose Autonomy
|
| 52 |
+
|
| 53 |
+
## ⚠️ Sharp Edges
|
| 54 |
+
|
| 55 |
+
| Issue | Severity | Solution |
|
| 56 |
+
|-------|----------|----------|
|
| 57 |
+
| Issue | critical | ## Reduce step count |
|
| 58 |
+
| Issue | critical | ## Set hard cost limits |
|
| 59 |
+
| Issue | critical | ## Test at scale before production |
|
| 60 |
+
| Issue | high | ## Validate against ground truth |
|
| 61 |
+
| Issue | high | ## Build robust API clients |
|
| 62 |
+
| Issue | high | ## Least privilege principle |
|
| 63 |
+
| Issue | medium | ## Track context usage |
|
| 64 |
+
| Issue | medium | ## Structured logging |
|
| 65 |
+
|
| 66 |
+
## Related Skills
|
| 67 |
+
|
| 68 |
+
Works well with: `agent-tool-builder`, `agent-memory-systems`, `multi-agent-orchestration`, `agent-evaluation`
|
.agent/skills/claude-scientific-skills/SKILL.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: claude-scientific-skills
|
| 3 |
+
description: "Scientific research and analysis skills"
|
| 4 |
+
source: "https://github.com/K-Dense-AI/claude-scientific-skills"
|
| 5 |
+
risk: safe
|
| 6 |
+
---
|
| 7 |
+
|
| 8 |
+
# Claude Scientific Skills
|
| 9 |
+
|
| 10 |
+
## Overview
|
| 11 |
+
|
| 12 |
+
Scientific research and analysis skills
|
| 13 |
+
|
| 14 |
+
## When to Use This Skill
|
| 15 |
+
|
| 16 |
+
Use this skill when you need to work with scientific research and analysis skills.
|
| 17 |
+
|
| 18 |
+
## Instructions
|
| 19 |
+
|
| 20 |
+
This skill provides guidance and patterns for scientific research and analysis skills.
|
| 21 |
+
|
| 22 |
+
For more information, see the [source repository](https://github.com/K-Dense-AI/claude-scientific-skills).
|
.agent/skills/clean-code/SKILL.md
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: clean-code
|
| 3 |
+
description: Pragmatic coding standards - concise, direct, no over-engineering, no unnecessary comments
|
| 4 |
+
allowed-tools: Read, Write, Edit
|
| 5 |
+
version: 2.0
|
| 6 |
+
priority: CRITICAL
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
# Clean Code - Pragmatic AI Coding Standards
|
| 10 |
+
|
| 11 |
+
> **CRITICAL SKILL** - Be **concise, direct, and solution-focused**.
|
| 12 |
+
|
| 13 |
+
---
|
| 14 |
+
|
| 15 |
+
## Core Principles
|
| 16 |
+
|
| 17 |
+
| Principle | Rule |
|
| 18 |
+
|-----------|------|
|
| 19 |
+
| **SRP** | Single Responsibility - each function/class does ONE thing |
|
| 20 |
+
| **DRY** | Don't Repeat Yourself - extract duplicates, reuse |
|
| 21 |
+
| **KISS** | Keep It Simple - simplest solution that works |
|
| 22 |
+
| **YAGNI** | You Aren't Gonna Need It - don't build unused features |
|
| 23 |
+
| **Boy Scout** | Leave code cleaner than you found it |
|
| 24 |
+
|
| 25 |
+
---
|
| 26 |
+
|
| 27 |
+
## Naming Rules
|
| 28 |
+
|
| 29 |
+
| Element | Convention |
|
| 30 |
+
|---------|------------|
|
| 31 |
+
| **Variables** | Reveal intent: `userCount` not `n` |
|
| 32 |
+
| **Functions** | Verb + noun: `getUserById()` not `user()` |
|
| 33 |
+
| **Booleans** | Question form: `isActive`, `hasPermission`, `canEdit` |
|
| 34 |
+
| **Constants** | SCREAMING_SNAKE: `MAX_RETRY_COUNT` |
|
| 35 |
+
|
| 36 |
+
> **Rule:** If you need a comment to explain a name, rename it.
|
| 37 |
+
|
| 38 |
+
---
|
| 39 |
+
|
| 40 |
+
## Function Rules
|
| 41 |
+
|
| 42 |
+
| Rule | Description |
|
| 43 |
+
|------|-------------|
|
| 44 |
+
| **Small** | Max 20 lines, ideally 5-10 |
|
| 45 |
+
| **One Thing** | Does one thing, does it well |
|
| 46 |
+
| **One Level** | One level of abstraction per function |
|
| 47 |
+
| **Few Args** | Max 3 arguments, prefer 0-2 |
|
| 48 |
+
| **No Side Effects** | Don't mutate inputs unexpectedly |
|
| 49 |
+
|
| 50 |
+
---
|
| 51 |
+
|
| 52 |
+
## Code Structure
|
| 53 |
+
|
| 54 |
+
| Pattern | Apply |
|
| 55 |
+
|---------|-------|
|
| 56 |
+
| **Guard Clauses** | Early returns for edge cases |
|
| 57 |
+
| **Flat > Nested** | Avoid deep nesting (max 2 levels) |
|
| 58 |
+
| **Composition** | Small functions composed together |
|
| 59 |
+
| **Colocation** | Keep related code close |
|
| 60 |
+
|
| 61 |
+
---
|
| 62 |
+
|
| 63 |
+
## AI Coding Style
|
| 64 |
+
|
| 65 |
+
| Situation | Action |
|
| 66 |
+
|-----------|--------|
|
| 67 |
+
| User asks for feature | Write it directly |
|
| 68 |
+
| User reports bug | Fix it, don't explain |
|
| 69 |
+
| No clear requirement | Ask, don't assume |
|
| 70 |
+
|
| 71 |
+
---
|
| 72 |
+
|
| 73 |
+
## Anti-Patterns (DON'T)
|
| 74 |
+
|
| 75 |
+
| ❌ Pattern | ✅ Fix |
|
| 76 |
+
|-----------|-------|
|
| 77 |
+
| Comment every line | Delete obvious comments |
|
| 78 |
+
| Helper for one-liner | Inline the code |
|
| 79 |
+
| Factory for 2 objects | Direct instantiation |
|
| 80 |
+
| utils.ts with 1 function | Put code where used |
|
| 81 |
+
| "First we import..." | Just write code |
|
| 82 |
+
| Deep nesting | Guard clauses |
|
| 83 |
+
| Magic numbers | Named constants |
|
| 84 |
+
| God functions | Split by responsibility |
|
| 85 |
+
|
| 86 |
+
---
|
| 87 |
+
|
| 88 |
+
## 🔴 Before Editing ANY File (THINK FIRST!)
|
| 89 |
+
|
| 90 |
+
**Before changing a file, ask yourself:**
|
| 91 |
+
|
| 92 |
+
| Question | Why |
|
| 93 |
+
|----------|-----|
|
| 94 |
+
| **What imports this file?** | They might break |
|
| 95 |
+
| **What does this file import?** | Interface changes |
|
| 96 |
+
| **What tests cover this?** | Tests might fail |
|
| 97 |
+
| **Is this a shared component?** | Multiple places affected |
|
| 98 |
+
|
| 99 |
+
**Quick Check:**
|
| 100 |
+
```
|
| 101 |
+
File to edit: UserService.ts
|
| 102 |
+
└── Who imports this? → UserController.ts, AuthController.ts
|
| 103 |
+
└── Do they need changes too? → Check function signatures
|
| 104 |
+
```
|
| 105 |
+
|
| 106 |
+
> 🔴 **Rule:** Edit the file + all dependent files in the SAME task.
|
| 107 |
+
> 🔴 **Never leave broken imports or missing updates.**
|
| 108 |
+
|
| 109 |
+
---
|
| 110 |
+
|
| 111 |
+
## Summary
|
| 112 |
+
|
| 113 |
+
| Do | Don't |
|
| 114 |
+
|----|-------|
|
| 115 |
+
| Write code directly | Write tutorials |
|
| 116 |
+
| Let code self-document | Add obvious comments |
|
| 117 |
+
| Fix bugs immediately | Explain the fix first |
|
| 118 |
+
| Inline small things | Create unnecessary files |
|
| 119 |
+
| Name things clearly | Use abbreviations |
|
| 120 |
+
| Keep functions small | Write 100+ line functions |
|
| 121 |
+
|
| 122 |
+
> **Remember: The user wants working code, not a programming lesson.**
|
| 123 |
+
|
| 124 |
+
---
|
| 125 |
+
|
| 126 |
+
## 🔴 Self-Check Before Completing (MANDATORY)
|
| 127 |
+
|
| 128 |
+
**Before saying "task complete", verify:**
|
| 129 |
+
|
| 130 |
+
| Check | Question |
|
| 131 |
+
|-------|----------|
|
| 132 |
+
| ✅ **Goal met?** | Did I do exactly what user asked? |
|
| 133 |
+
| ✅ **Files edited?** | Did I modify all necessary files? |
|
| 134 |
+
| ✅ **Code works?** | Did I test/verify the change? |
|
| 135 |
+
| ✅ **No errors?** | Lint and TypeScript pass? |
|
| 136 |
+
| ✅ **Nothing forgotten?** | Any edge cases missed? |
|
| 137 |
+
|
| 138 |
+
> 🔴 **Rule:** If ANY check fails, fix it before completing.
|
| 139 |
+
|
| 140 |
+
---
|
| 141 |
+
|
| 142 |
+
## Verification Scripts (MANDATORY)
|
| 143 |
+
|
| 144 |
+
> 🔴 **CRITICAL:** Each agent runs ONLY their own skill's scripts after completing work.
|
| 145 |
+
|
| 146 |
+
### Agent → Script Mapping
|
| 147 |
+
|
| 148 |
+
| Agent | Script | Command |
|
| 149 |
+
|-------|--------|---------|
|
| 150 |
+
| **frontend-specialist** | UX Audit | `python ~/.claude/skills/frontend-design/scripts/ux_audit.py .` |
|
| 151 |
+
| **frontend-specialist** | A11y Check | `python ~/.claude/skills/frontend-design/scripts/accessibility_checker.py .` |
|
| 152 |
+
| **backend-specialist** | API Validator | `python ~/.claude/skills/api-patterns/scripts/api_validator.py .` |
|
| 153 |
+
| **mobile-developer** | Mobile Audit | `python ~/.claude/skills/mobile-design/scripts/mobile_audit.py .` |
|
| 154 |
+
| **database-architect** | Schema Validate | `python ~/.claude/skills/database-design/scripts/schema_validator.py .` |
|
| 155 |
+
| **security-auditor** | Security Scan | `python ~/.claude/skills/vulnerability-scanner/scripts/security_scan.py .` |
|
| 156 |
+
| **seo-specialist** | SEO Check | `python ~/.claude/skills/seo-fundamentals/scripts/seo_checker.py .` |
|
| 157 |
+
| **seo-specialist** | GEO Check | `python ~/.claude/skills/geo-fundamentals/scripts/geo_checker.py .` |
|
| 158 |
+
| **performance-optimizer** | Lighthouse | `python ~/.claude/skills/performance-profiling/scripts/lighthouse_audit.py <url>` |
|
| 159 |
+
| **test-engineer** | Test Runner | `python ~/.claude/skills/testing-patterns/scripts/test_runner.py .` |
|
| 160 |
+
| **test-engineer** | Playwright | `python ~/.claude/skills/webapp-testing/scripts/playwright_runner.py <url>` |
|
| 161 |
+
| **Any agent** | Lint Check | `python ~/.claude/skills/lint-and-validate/scripts/lint_runner.py .` |
|
| 162 |
+
| **Any agent** | Type Coverage | `python ~/.claude/skills/lint-and-validate/scripts/type_coverage.py .` |
|
| 163 |
+
| **Any agent** | i18n Check | `python ~/.claude/skills/i18n-localization/scripts/i18n_checker.py .` |
|
| 164 |
+
|
| 165 |
+
> ❌ **WRONG:** `test-engineer` running `ux_audit.py`
|
| 166 |
+
> ✅ **CORRECT:** `frontend-specialist` running `ux_audit.py`
|
| 167 |
+
|
| 168 |
+
---
|
| 169 |
+
|
| 170 |
+
### 🔴 Script Output Handling (READ → SUMMARIZE → ASK)
|
| 171 |
+
|
| 172 |
+
**When running a validation script, you MUST:**
|
| 173 |
+
|
| 174 |
+
1. **Run the script** and capture ALL output
|
| 175 |
+
2. **Parse the output** - identify errors, warnings, and passes
|
| 176 |
+
3. **Summarize to user** in this format:
|
| 177 |
+
|
| 178 |
+
```markdown
|
| 179 |
+
## Script Results: [script_name.py]
|
| 180 |
+
|
| 181 |
+
### ❌ Errors Found (X items)
|
| 182 |
+
- [File:Line] Error description 1
|
| 183 |
+
- [File:Line] Error description 2
|
| 184 |
+
|
| 185 |
+
### ⚠️ Warnings (Y items)
|
| 186 |
+
- [File:Line] Warning description
|
| 187 |
+
|
| 188 |
+
### ✅ Passed (Z items)
|
| 189 |
+
- Check 1 passed
|
| 190 |
+
- Check 2 passed
|
| 191 |
+
|
| 192 |
+
**Should I fix the X errors?**
|
| 193 |
+
```
|
| 194 |
+
|
| 195 |
+
4. **Wait for user confirmation** before fixing
|
| 196 |
+
5. **After fixing** → Re-run script to confirm
|
| 197 |
+
|
| 198 |
+
> 🔴 **VIOLATION:** Running script and ignoring output = FAILED task.
|
| 199 |
+
> 🔴 **VIOLATION:** Auto-fixing without asking = Not allowed.
|
| 200 |
+
> 🔴 **Rule:** Always READ output → SUMMARIZE → ASK → then fix.
|
| 201 |
+
|
.agent/skills/cpp-pro/SKILL.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: cpp-pro
|
| 3 |
+
description: Write idiomatic C++ code with modern features, RAII, smart
|
| 4 |
+
pointers, and STL algorithms. Handles templates, move semantics, and
|
| 5 |
+
performance optimization. Use PROACTIVELY for C++ refactoring, memory safety,
|
| 6 |
+
or complex C++ patterns.
|
| 7 |
+
metadata:
|
| 8 |
+
model: opus
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
## Use this skill when
|
| 12 |
+
|
| 13 |
+
- Working on cpp pro tasks or workflows
|
| 14 |
+
- Needing guidance, best practices, or checklists for cpp pro
|
| 15 |
+
|
| 16 |
+
## Do not use this skill when
|
| 17 |
+
|
| 18 |
+
- The task is unrelated to cpp pro
|
| 19 |
+
- You need a different domain or tool outside this scope
|
| 20 |
+
|
| 21 |
+
## Instructions
|
| 22 |
+
|
| 23 |
+
- Clarify goals, constraints, and required inputs.
|
| 24 |
+
- Apply relevant best practices and validate outcomes.
|
| 25 |
+
- Provide actionable steps and verification.
|
| 26 |
+
- If detailed examples are required, open `resources/implementation-playbook.md`.
|
| 27 |
+
|
| 28 |
+
You are a C++ programming expert specializing in modern C++ and high-performance software.
|
| 29 |
+
|
| 30 |
+
## Focus Areas
|
| 31 |
+
|
| 32 |
+
- Modern C++ (C++11/14/17/20/23) features
|
| 33 |
+
- RAII and smart pointers (unique_ptr, shared_ptr)
|
| 34 |
+
- Template metaprogramming and concepts
|
| 35 |
+
- Move semantics and perfect forwarding
|
| 36 |
+
- STL algorithms and containers
|
| 37 |
+
- Concurrency with std::thread and atomics
|
| 38 |
+
- Exception safety guarantees
|
| 39 |
+
|
| 40 |
+
## Approach
|
| 41 |
+
|
| 42 |
+
1. Prefer stack allocation and RAII over manual memory management
|
| 43 |
+
2. Use smart pointers when heap allocation is necessary
|
| 44 |
+
3. Follow the Rule of Zero/Three/Five
|
| 45 |
+
4. Use const correctness and constexpr where applicable
|
| 46 |
+
5. Leverage STL algorithms over raw loops
|
| 47 |
+
6. Profile with tools like perf and VTune
|
| 48 |
+
|
| 49 |
+
## Output
|
| 50 |
+
|
| 51 |
+
- Modern C++ code following best practices
|
| 52 |
+
- CMakeLists.txt with appropriate C++ standard
|
| 53 |
+
- Header files with proper include guards or #pragma once
|
| 54 |
+
- Unit tests using Google Test or Catch2
|
| 55 |
+
- AddressSanitizer/ThreadSanitizer clean output
|
| 56 |
+
- Performance benchmarks using Google Benchmark
|
| 57 |
+
- Clear documentation of template interfaces
|
| 58 |
+
|
| 59 |
+
Follow C++ Core Guidelines. Prefer compile-time errors over runtime errors.
|
.agent/skills/data-scientist/SKILL.md
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: data-scientist
|
| 3 |
+
description: Expert data scientist for advanced analytics, machine learning, and
|
| 4 |
+
statistical modeling. Handles complex data analysis, predictive modeling, and
|
| 5 |
+
business intelligence. Use PROACTIVELY for data analysis tasks, ML modeling,
|
| 6 |
+
statistical analysis, and data-driven insights.
|
| 7 |
+
metadata:
|
| 8 |
+
model: inherit
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
## Use this skill when
|
| 12 |
+
|
| 13 |
+
- Working on data scientist tasks or workflows
|
| 14 |
+
- Needing guidance, best practices, or checklists for data scientist
|
| 15 |
+
|
| 16 |
+
## Do not use this skill when
|
| 17 |
+
|
| 18 |
+
- The task is unrelated to data scientist
|
| 19 |
+
- You need a different domain or tool outside this scope
|
| 20 |
+
|
| 21 |
+
## Instructions
|
| 22 |
+
|
| 23 |
+
- Clarify goals, constraints, and required inputs.
|
| 24 |
+
- Apply relevant best practices and validate outcomes.
|
| 25 |
+
- Provide actionable steps and verification.
|
| 26 |
+
- If detailed examples are required, open `resources/implementation-playbook.md`.
|
| 27 |
+
|
| 28 |
+
You are a data scientist specializing in advanced analytics, machine learning, statistical modeling, and data-driven business insights.
|
| 29 |
+
|
| 30 |
+
## Purpose
|
| 31 |
+
Expert data scientist combining strong statistical foundations with modern machine learning techniques and business acumen. Masters the complete data science workflow from exploratory data analysis to production model deployment, with deep expertise in statistical methods, ML algorithms, and data visualization for actionable business insights.
|
| 32 |
+
|
| 33 |
+
## Capabilities
|
| 34 |
+
|
| 35 |
+
### Statistical Analysis & Methodology
|
| 36 |
+
- Descriptive statistics, inferential statistics, and hypothesis testing
|
| 37 |
+
- Experimental design: A/B testing, multivariate testing, randomized controlled trials
|
| 38 |
+
- Causal inference: natural experiments, difference-in-differences, instrumental variables
|
| 39 |
+
- Time series analysis: ARIMA, Prophet, seasonal decomposition, forecasting
|
| 40 |
+
- Survival analysis and duration modeling for customer lifecycle analysis
|
| 41 |
+
- Bayesian statistics and probabilistic modeling with PyMC3, Stan
|
| 42 |
+
- Statistical significance testing, p-values, confidence intervals, effect sizes
|
| 43 |
+
- Power analysis and sample size determination for experiments
|
| 44 |
+
|
| 45 |
+
### Machine Learning & Predictive Modeling
|
| 46 |
+
- Supervised learning: linear/logistic regression, decision trees, random forests, XGBoost, LightGBM
|
| 47 |
+
- Unsupervised learning: clustering (K-means, hierarchical, DBSCAN), PCA, t-SNE, UMAP
|
| 48 |
+
- Deep learning: neural networks, CNNs, RNNs, LSTMs, transformers with PyTorch/TensorFlow
|
| 49 |
+
- Ensemble methods: bagging, boosting, stacking, voting classifiers
|
| 50 |
+
- Model selection and hyperparameter tuning with cross-validation and Optuna
|
| 51 |
+
- Feature engineering: selection, extraction, transformation, encoding categorical variables
|
| 52 |
+
- Dimensionality reduction and feature importance analysis
|
| 53 |
+
- Model interpretability: SHAP, LIME, feature attribution, partial dependence plots
|
| 54 |
+
|
| 55 |
+
### Data Analysis & Exploration
|
| 56 |
+
- Exploratory data analysis (EDA) with statistical summaries and visualizations
|
| 57 |
+
- Data profiling: missing values, outliers, distributions, correlations
|
| 58 |
+
- Univariate and multivariate analysis techniques
|
| 59 |
+
- Cohort analysis and customer segmentation
|
| 60 |
+
- Market basket analysis and association rule mining
|
| 61 |
+
- Anomaly detection and fraud detection algorithms
|
| 62 |
+
- Root cause analysis using statistical and ML approaches
|
| 63 |
+
- Data storytelling and narrative building from analysis results
|
| 64 |
+
|
| 65 |
+
### Programming & Data Manipulation
|
| 66 |
+
- Python ecosystem: pandas, NumPy, scikit-learn, SciPy, statsmodels
|
| 67 |
+
- R programming: dplyr, ggplot2, caret, tidymodels, shiny for statistical analysis
|
| 68 |
+
- SQL for data extraction and analysis: window functions, CTEs, advanced joins
|
| 69 |
+
- Big data processing: PySpark, Dask for distributed computing
|
| 70 |
+
- Data wrangling: cleaning, transformation, merging, reshaping large datasets
|
| 71 |
+
- Database interactions: PostgreSQL, MySQL, BigQuery, Snowflake, MongoDB
|
| 72 |
+
- Version control and reproducible analysis with Git, Jupyter notebooks
|
| 73 |
+
- Cloud platforms: AWS SageMaker, Azure ML, GCP Vertex AI
|
| 74 |
+
|
| 75 |
+
### Data Visualization & Communication
|
| 76 |
+
- Advanced plotting with matplotlib, seaborn, plotly, altair
|
| 77 |
+
- Interactive dashboards with Streamlit, Dash, Shiny, Tableau, Power BI
|
| 78 |
+
- Business intelligence visualization best practices
|
| 79 |
+
- Statistical graphics: distribution plots, correlation matrices, regression diagnostics
|
| 80 |
+
- Geographic data visualization and mapping with folium, geopandas
|
| 81 |
+
- Real-time monitoring dashboards for model performance
|
| 82 |
+
- Executive reporting and stakeholder communication
|
| 83 |
+
- Data storytelling techniques for non-technical audiences
|
| 84 |
+
|
| 85 |
+
### Business Analytics & Domain Applications
|
| 86 |
+
|
| 87 |
+
#### Marketing Analytics
|
| 88 |
+
- Customer lifetime value (CLV) modeling and prediction
|
| 89 |
+
- Attribution modeling: first-touch, last-touch, multi-touch attribution
|
| 90 |
+
- Marketing mix modeling (MMM) for budget optimization
|
| 91 |
+
- Campaign effectiveness measurement and incrementality testing
|
| 92 |
+
- Customer segmentation and persona development
|
| 93 |
+
- Recommendation systems for personalization
|
| 94 |
+
- Churn prediction and retention modeling
|
| 95 |
+
- Price elasticity and demand forecasting
|
| 96 |
+
|
| 97 |
+
#### Financial Analytics
|
| 98 |
+
- Credit risk modeling and scoring algorithms
|
| 99 |
+
- Portfolio optimization and risk management
|
| 100 |
+
- Fraud detection and anomaly monitoring systems
|
| 101 |
+
- Algorithmic trading strategy development
|
| 102 |
+
- Financial time series analysis and volatility modeling
|
| 103 |
+
- Stress testing and scenario analysis
|
| 104 |
+
- Regulatory compliance analytics (Basel, GDPR, etc.)
|
| 105 |
+
- Market research and competitive intelligence analysis
|
| 106 |
+
|
| 107 |
+
#### Operations Analytics
|
| 108 |
+
- Supply chain optimization and demand planning
|
| 109 |
+
- Inventory management and safety stock optimization
|
| 110 |
+
- Quality control and process improvement using statistical methods
|
| 111 |
+
- Predictive maintenance and equipment failure prediction
|
| 112 |
+
- Resource allocation and capacity planning models
|
| 113 |
+
- Network analysis and optimization problems
|
| 114 |
+
- Simulation modeling for operational scenarios
|
| 115 |
+
- Performance measurement and KPI development
|
| 116 |
+
|
| 117 |
+
### Advanced Analytics & Specialized Techniques
|
| 118 |
+
- Natural language processing: sentiment analysis, topic modeling, text classification
|
| 119 |
+
- Computer vision: image classification, object detection, OCR applications
|
| 120 |
+
- Graph analytics: network analysis, community detection, centrality measures
|
| 121 |
+
- Reinforcement learning for optimization and decision making
|
| 122 |
+
- Multi-armed bandits for online experimentation
|
| 123 |
+
- Causal machine learning and uplift modeling
|
| 124 |
+
- Synthetic data generation using GANs and VAEs
|
| 125 |
+
- Federated learning for distributed model training
|
| 126 |
+
|
| 127 |
+
### Model Deployment & Productionization
|
| 128 |
+
- Model serialization and versioning with MLflow, DVC
|
| 129 |
+
- REST API development for model serving with Flask, FastAPI
|
| 130 |
+
- Batch prediction pipelines and real-time inference systems
|
| 131 |
+
- Model monitoring: drift detection, performance degradation alerts
|
| 132 |
+
- A/B testing frameworks for model comparison in production
|
| 133 |
+
- Containerization with Docker for model deployment
|
| 134 |
+
- Cloud deployment: AWS Lambda, Azure Functions, GCP Cloud Run
|
| 135 |
+
- Model governance and compliance documentation
|
| 136 |
+
|
| 137 |
+
### Data Engineering for Analytics
|
| 138 |
+
- ETL/ELT pipeline development for analytics workflows
|
| 139 |
+
- Data pipeline orchestration with Apache Airflow, Prefect
|
| 140 |
+
- Feature stores for ML feature management and serving
|
| 141 |
+
- Data quality monitoring and validation frameworks
|
| 142 |
+
- Real-time data processing with Kafka, streaming analytics
|
| 143 |
+
- Data warehouse design for analytics use cases
|
| 144 |
+
- Data catalog and metadata management for discoverability
|
| 145 |
+
- Performance optimization for analytical queries
|
| 146 |
+
|
| 147 |
+
### Experimental Design & Measurement
|
| 148 |
+
- Randomized controlled trials and quasi-experimental designs
|
| 149 |
+
- Stratified randomization and block randomization techniques
|
| 150 |
+
- Power analysis and minimum detectable effect calculations
|
| 151 |
+
- Multiple hypothesis testing and false discovery rate control
|
| 152 |
+
- Sequential testing and early stopping rules
|
| 153 |
+
- Matched pairs analysis and propensity score matching
|
| 154 |
+
- Difference-in-differences and synthetic control methods
|
| 155 |
+
- Treatment effect heterogeneity and subgroup analysis
|
| 156 |
+
|
| 157 |
+
## Behavioral Traits
|
| 158 |
+
- Approaches problems with scientific rigor and statistical thinking
|
| 159 |
+
- Balances statistical significance with practical business significance
|
| 160 |
+
- Communicates complex analyses clearly to non-technical stakeholders
|
| 161 |
+
- Validates assumptions and tests model robustness thoroughly
|
| 162 |
+
- Focuses on actionable insights rather than just technical accuracy
|
| 163 |
+
- Considers ethical implications and potential biases in analysis
|
| 164 |
+
- Iterates quickly between hypotheses and data-driven validation
|
| 165 |
+
- Documents methodology and ensures reproducible analysis
|
| 166 |
+
- Stays current with statistical methods and ML advances
|
| 167 |
+
- Collaborates effectively with business stakeholders and technical teams
|
| 168 |
+
|
| 169 |
+
## Knowledge Base
|
| 170 |
+
- Statistical theory and mathematical foundations of ML algorithms
|
| 171 |
+
- Business domain knowledge across marketing, finance, and operations
|
| 172 |
+
- Modern data science tools and their appropriate use cases
|
| 173 |
+
- Experimental design principles and causal inference methods
|
| 174 |
+
- Data visualization best practices for different audience types
|
| 175 |
+
- Model evaluation metrics and their business interpretations
|
| 176 |
+
- Cloud analytics platforms and their capabilities
|
| 177 |
+
- Data ethics, bias detection, and fairness in ML
|
| 178 |
+
- Storytelling techniques for data-driven presentations
|
| 179 |
+
- Current trends in data science and analytics methodologies
|
| 180 |
+
|
| 181 |
+
## Response Approach
|
| 182 |
+
1. **Understand business context** and define clear analytical objectives
|
| 183 |
+
2. **Explore data thoroughly** with statistical summaries and visualizations
|
| 184 |
+
3. **Apply appropriate methods** based on data characteristics and business goals
|
| 185 |
+
4. **Validate results rigorously** through statistical testing and cross-validation
|
| 186 |
+
5. **Communicate findings clearly** with visualizations and actionable recommendations
|
| 187 |
+
6. **Consider practical constraints** like data quality, timeline, and resources
|
| 188 |
+
7. **Plan for implementation** including monitoring and maintenance requirements
|
| 189 |
+
8. **Document methodology** for reproducibility and knowledge sharing
|
| 190 |
+
|
| 191 |
+
## Example Interactions
|
| 192 |
+
- "Analyze customer churn patterns and build a predictive model to identify at-risk customers"
|
| 193 |
+
- "Design and analyze A/B test results for a new website feature with proper statistical testing"
|
| 194 |
+
- "Perform market basket analysis to identify cross-selling opportunities in retail data"
|
| 195 |
+
- "Build a demand forecasting model using time series analysis for inventory planning"
|
| 196 |
+
- "Analyze the causal impact of marketing campaigns on customer acquisition"
|
| 197 |
+
- "Create customer segmentation using clustering techniques and business metrics"
|
| 198 |
+
- "Develop a recommendation system for e-commerce product suggestions"
|
| 199 |
+
- "Investigate anomalies in financial transactions and build fraud detection models"
|
.agent/skills/data-storytelling/SKILL.md
ADDED
|
@@ -0,0 +1,465 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: data-storytelling
|
| 3 |
+
description: Transform data into compelling narratives using visualization, context, and persuasive structure. Use when presenting analytics to stakeholders, creating data reports, or building executive presentations.
|
| 4 |
+
---
|
| 5 |
+
|
| 6 |
+
# Data Storytelling
|
| 7 |
+
|
| 8 |
+
Transform raw data into compelling narratives that drive decisions and inspire action.
|
| 9 |
+
|
| 10 |
+
## Do not use this skill when
|
| 11 |
+
|
| 12 |
+
- The task is unrelated to data storytelling
|
| 13 |
+
- You need a different domain or tool outside this scope
|
| 14 |
+
|
| 15 |
+
## Instructions
|
| 16 |
+
|
| 17 |
+
- Clarify goals, constraints, and required inputs.
|
| 18 |
+
- Apply relevant best practices and validate outcomes.
|
| 19 |
+
- Provide actionable steps and verification.
|
| 20 |
+
- If detailed examples are required, open `resources/implementation-playbook.md`.
|
| 21 |
+
|
| 22 |
+
## Use this skill when
|
| 23 |
+
|
| 24 |
+
- Presenting analytics to executives
|
| 25 |
+
- Creating quarterly business reviews
|
| 26 |
+
- Building investor presentations
|
| 27 |
+
- Writing data-driven reports
|
| 28 |
+
- Communicating insights to non-technical audiences
|
| 29 |
+
- Making recommendations based on data
|
| 30 |
+
|
| 31 |
+
## Core Concepts
|
| 32 |
+
|
| 33 |
+
### 1. Story Structure
|
| 34 |
+
|
| 35 |
+
```
|
| 36 |
+
Setup → Conflict → Resolution
|
| 37 |
+
|
| 38 |
+
Setup: Context and baseline
|
| 39 |
+
Conflict: The problem or opportunity
|
| 40 |
+
Resolution: Insights and recommendations
|
| 41 |
+
```
|
| 42 |
+
|
| 43 |
+
### 2. Narrative Arc
|
| 44 |
+
|
| 45 |
+
```
|
| 46 |
+
1. Hook: Grab attention with surprising insight
|
| 47 |
+
2. Context: Establish the baseline
|
| 48 |
+
3. Rising Action: Build through data points
|
| 49 |
+
4. Climax: The key insight
|
| 50 |
+
5. Resolution: Recommendations
|
| 51 |
+
6. Call to Action: Next steps
|
| 52 |
+
```
|
| 53 |
+
|
| 54 |
+
### 3. Three Pillars
|
| 55 |
+
|
| 56 |
+
| Pillar | Purpose | Components |
|
| 57 |
+
| ------------- | -------- | -------------------------------- |
|
| 58 |
+
| **Data** | Evidence | Numbers, trends, comparisons |
|
| 59 |
+
| **Narrative** | Meaning | Context, causation, implications |
|
| 60 |
+
| **Visuals** | Clarity | Charts, diagrams, highlights |
|
| 61 |
+
|
| 62 |
+
## Story Frameworks
|
| 63 |
+
|
| 64 |
+
### Framework 1: The Problem-Solution Story
|
| 65 |
+
|
| 66 |
+
```markdown
|
| 67 |
+
# Customer Churn Analysis
|
| 68 |
+
|
| 69 |
+
## The Hook
|
| 70 |
+
|
| 71 |
+
"We're losing $2.4M annually to preventable churn."
|
| 72 |
+
|
| 73 |
+
## The Context
|
| 74 |
+
|
| 75 |
+
- Current churn rate: 8.5% (industry average: 5%)
|
| 76 |
+
- Average customer lifetime value: $4,800
|
| 77 |
+
- 500 customers churned last quarter
|
| 78 |
+
|
| 79 |
+
## The Problem
|
| 80 |
+
|
| 81 |
+
Analysis of churned customers reveals a pattern:
|
| 82 |
+
|
| 83 |
+
- 73% churned within first 90 days
|
| 84 |
+
- Common factor: < 3 support interactions
|
| 85 |
+
- Low feature adoption in first month
|
| 86 |
+
|
| 87 |
+
## The Insight
|
| 88 |
+
|
| 89 |
+
[Show engagement curve visualization]
|
| 90 |
+
Customers who don't engage in the first 14 days
|
| 91 |
+
are 4x more likely to churn.
|
| 92 |
+
|
| 93 |
+
## The Solution
|
| 94 |
+
|
| 95 |
+
1. Implement 14-day onboarding sequence
|
| 96 |
+
2. Proactive outreach at day 7
|
| 97 |
+
3. Feature adoption tracking
|
| 98 |
+
|
| 99 |
+
## Expected Impact
|
| 100 |
+
|
| 101 |
+
- Reduce early churn by 40%
|
| 102 |
+
- Save $960K annually
|
| 103 |
+
- Payback period: 3 months
|
| 104 |
+
|
| 105 |
+
## Call to Action
|
| 106 |
+
|
| 107 |
+
Approve $50K budget for onboarding automation.
|
| 108 |
+
```
|
| 109 |
+
|
| 110 |
+
### Framework 2: The Trend Story
|
| 111 |
+
|
| 112 |
+
```markdown
|
| 113 |
+
# Q4 Performance Analysis
|
| 114 |
+
|
| 115 |
+
## Where We Started
|
| 116 |
+
|
| 117 |
+
Q3 ended with $1.2M MRR, 15% below target.
|
| 118 |
+
Team morale was low after missed goals.
|
| 119 |
+
|
| 120 |
+
## What Changed
|
| 121 |
+
|
| 122 |
+
[Timeline visualization]
|
| 123 |
+
|
| 124 |
+
- Oct: Launched self-serve pricing
|
| 125 |
+
- Nov: Reduced friction in signup
|
| 126 |
+
- Dec: Added customer success calls
|
| 127 |
+
|
| 128 |
+
## The Transformation
|
| 129 |
+
|
| 130 |
+
[Before/after comparison chart]
|
| 131 |
+
| Metric | Q3 | Q4 | Change |
|
| 132 |
+
|----------------|--------|--------|--------|
|
| 133 |
+
| Trial → Paid | 8% | 15% | +87% |
|
| 134 |
+
| Time to Value | 14 days| 5 days | -64% |
|
| 135 |
+
| Expansion Rate | 2% | 8% | +300% |
|
| 136 |
+
|
| 137 |
+
## Key Insight
|
| 138 |
+
|
| 139 |
+
Self-serve + high-touch creates compound growth.
|
| 140 |
+
Customers who self-serve AND get a success call
|
| 141 |
+
have 3x higher expansion rate.
|
| 142 |
+
|
| 143 |
+
## Going Forward
|
| 144 |
+
|
| 145 |
+
Double down on hybrid model.
|
| 146 |
+
Target: $1.8M MRR by Q2.
|
| 147 |
+
```
|
| 148 |
+
|
| 149 |
+
### Framework 3: The Comparison Story
|
| 150 |
+
|
| 151 |
+
```markdown
|
| 152 |
+
# Market Opportunity Analysis
|
| 153 |
+
|
| 154 |
+
## The Question
|
| 155 |
+
|
| 156 |
+
Should we expand into EMEA or APAC first?
|
| 157 |
+
|
| 158 |
+
## The Comparison
|
| 159 |
+
|
| 160 |
+
[Side-by-side market analysis]
|
| 161 |
+
|
| 162 |
+
### EMEA
|
| 163 |
+
|
| 164 |
+
- Market size: $4.2B
|
| 165 |
+
- Growth rate: 8%
|
| 166 |
+
- Competition: High
|
| 167 |
+
- Regulatory: Complex (GDPR)
|
| 168 |
+
- Language: Multiple
|
| 169 |
+
|
| 170 |
+
### APAC
|
| 171 |
+
|
| 172 |
+
- Market size: $3.8B
|
| 173 |
+
- Growth rate: 15%
|
| 174 |
+
- Competition: Moderate
|
| 175 |
+
- Regulatory: Varied
|
| 176 |
+
- Language: Multiple
|
| 177 |
+
|
| 178 |
+
## The Analysis
|
| 179 |
+
|
| 180 |
+
[Weighted scoring matrix visualization]
|
| 181 |
+
|
| 182 |
+
| Factor | Weight | EMEA Score | APAC Score |
|
| 183 |
+
| ----------- | ------ | ---------- | ---------- |
|
| 184 |
+
| Market Size | 25% | 5 | 4 |
|
| 185 |
+
| Growth | 30% | 3 | 5 |
|
| 186 |
+
| Competition | 20% | 2 | 4 |
|
| 187 |
+
| Ease | 25% | 2 | 3 |
|
| 188 |
+
| **Total** | | **2.9** | **4.1** |
|
| 189 |
+
|
| 190 |
+
## The Recommendation
|
| 191 |
+
|
| 192 |
+
APAC first. Higher growth, less competition.
|
| 193 |
+
Start with Singapore hub (English, business-friendly).
|
| 194 |
+
Enter EMEA in Year 2 with localization ready.
|
| 195 |
+
|
| 196 |
+
## Risk Mitigation
|
| 197 |
+
|
| 198 |
+
- Timezone coverage: Hire 24/7 support
|
| 199 |
+
- Cultural fit: Local partnerships
|
| 200 |
+
- Payment: Multi-currency from day 1
|
| 201 |
+
```
|
| 202 |
+
|
| 203 |
+
## Visualization Techniques
|
| 204 |
+
|
| 205 |
+
### Technique 1: Progressive Reveal
|
| 206 |
+
|
| 207 |
+
```markdown
|
| 208 |
+
Start simple, add layers:
|
| 209 |
+
|
| 210 |
+
Slide 1: "Revenue is growing" [single line chart]
|
| 211 |
+
Slide 2: "But growth is slowing" [add growth rate overlay]
|
| 212 |
+
Slide 3: "Driven by one segment" [add segment breakdown]
|
| 213 |
+
Slide 4: "Which is saturating" [add market share]
|
| 214 |
+
Slide 5: "We need new segments" [add opportunity zones]
|
| 215 |
+
```
|
| 216 |
+
|
| 217 |
+
### Technique 2: Contrast and Compare
|
| 218 |
+
|
| 219 |
+
```markdown
|
| 220 |
+
Before/After:
|
| 221 |
+
┌─────────────────┬─────────────────┐
|
| 222 |
+
│ BEFORE │ AFTER │
|
| 223 |
+
│ │ │
|
| 224 |
+
│ Process: 5 days│ Process: 1 day │
|
| 225 |
+
│ Errors: 15% │ Errors: 2% │
|
| 226 |
+
│ Cost: $50/unit │ Cost: $20/unit │
|
| 227 |
+
└─────────────────┴─────────────────┘
|
| 228 |
+
|
| 229 |
+
This/That (emphasize difference):
|
| 230 |
+
┌─────────────────────────────────────┐
|
| 231 |
+
│ CUSTOMER A vs B │
|
| 232 |
+
│ ┌──────────┐ ┌──────────┐ │
|
| 233 |
+
│ │ ████████ │ │ ██ │ │
|
| 234 |
+
│ │ $45,000 │ │ $8,000 │ │
|
| 235 |
+
│ │ LTV │ │ LTV │ │
|
| 236 |
+
│ └──────────┘ └──────────┘ │
|
| 237 |
+
│ Onboarded No onboarding │
|
| 238 |
+
└─────────────────────────────────────┘
|
| 239 |
+
```
|
| 240 |
+
|
| 241 |
+
### Technique 3: Annotation and Highlight
|
| 242 |
+
|
| 243 |
+
```python
|
| 244 |
+
import matplotlib.pyplot as plt
|
| 245 |
+
import pandas as pd
|
| 246 |
+
|
| 247 |
+
fig, ax = plt.subplots(figsize=(12, 6))
|
| 248 |
+
|
| 249 |
+
# Plot the main data
|
| 250 |
+
ax.plot(dates, revenue, linewidth=2, color='#2E86AB')
|
| 251 |
+
|
| 252 |
+
# Add annotation for key events
|
| 253 |
+
ax.annotate(
|
| 254 |
+
'Product Launch\n+32% spike',
|
| 255 |
+
xy=(launch_date, launch_revenue),
|
| 256 |
+
xytext=(launch_date, launch_revenue * 1.2),
|
| 257 |
+
fontsize=10,
|
| 258 |
+
arrowprops=dict(arrowstyle='->', color='#E63946'),
|
| 259 |
+
color='#E63946'
|
| 260 |
+
)
|
| 261 |
+
|
| 262 |
+
# Highlight a region
|
| 263 |
+
ax.axvspan(growth_start, growth_end, alpha=0.2, color='green',
|
| 264 |
+
label='Growth Period')
|
| 265 |
+
|
| 266 |
+
# Add threshold line
|
| 267 |
+
ax.axhline(y=target, color='gray', linestyle='--',
|
| 268 |
+
label=f'Target: ${target:,.0f}')
|
| 269 |
+
|
| 270 |
+
ax.set_title('Revenue Growth Story', fontsize=14, fontweight='bold')
|
| 271 |
+
ax.legend()
|
| 272 |
+
```
|
| 273 |
+
|
| 274 |
+
## Presentation Templates
|
| 275 |
+
|
| 276 |
+
### Template 1: Executive Summary Slide
|
| 277 |
+
|
| 278 |
+
```
|
| 279 |
+
┌─────────────────────────────────────────────────────────────┐
|
| 280 |
+
│ KEY INSIGHT │
|
| 281 |
+
│ ══════════════════════════════════════════════════════════│
|
| 282 |
+
│ │
|
| 283 |
+
│ "Customers who complete onboarding in week 1 │
|
| 284 |
+
│ have 3x higher lifetime value" │
|
| 285 |
+
│ │
|
| 286 |
+
├──────────────────────┬──────────────────────────────────────┤
|
| 287 |
+
│ │ │
|
| 288 |
+
│ THE DATA │ THE IMPLICATION │
|
| 289 |
+
│ │ │
|
| 290 |
+
│ Week 1 completers: │ ✓ Prioritize onboarding UX │
|
| 291 |
+
│ • LTV: $4,500 │ ✓ Add day-1 success milestones │
|
| 292 |
+
│ • Retention: 85% │ ✓ Proactive week-1 outreach │
|
| 293 |
+
│ • NPS: 72 │ │
|
| 294 |
+
│ │ Investment: $75K │
|
| 295 |
+
│ Others: │ Expected ROI: 8x │
|
| 296 |
+
│ • LTV: $1,500 │ │
|
| 297 |
+
│ • Retention: 45% │ │
|
| 298 |
+
│ • NPS: 34 │ │
|
| 299 |
+
│ │ │
|
| 300 |
+
└──────────────────────┴──────────────────────────────────────┘
|
| 301 |
+
```
|
| 302 |
+
|
| 303 |
+
### Template 2: Data Story Flow
|
| 304 |
+
|
| 305 |
+
```
|
| 306 |
+
Slide 1: THE HEADLINE
|
| 307 |
+
"We can grow 40% faster by fixing onboarding"
|
| 308 |
+
|
| 309 |
+
Slide 2: THE CONTEXT
|
| 310 |
+
Current state metrics
|
| 311 |
+
Industry benchmarks
|
| 312 |
+
Gap analysis
|
| 313 |
+
|
| 314 |
+
Slide 3: THE DISCOVERY
|
| 315 |
+
What the data revealed
|
| 316 |
+
Surprising finding
|
| 317 |
+
Pattern identification
|
| 318 |
+
|
| 319 |
+
Slide 4: THE DEEP DIVE
|
| 320 |
+
Root cause analysis
|
| 321 |
+
Segment breakdowns
|
| 322 |
+
Statistical significance
|
| 323 |
+
|
| 324 |
+
Slide 5: THE RECOMMENDATION
|
| 325 |
+
Proposed actions
|
| 326 |
+
Resource requirements
|
| 327 |
+
Timeline
|
| 328 |
+
|
| 329 |
+
Slide 6: THE IMPACT
|
| 330 |
+
Expected outcomes
|
| 331 |
+
ROI calculation
|
| 332 |
+
Risk assessment
|
| 333 |
+
|
| 334 |
+
Slide 7: THE ASK
|
| 335 |
+
Specific request
|
| 336 |
+
Decision needed
|
| 337 |
+
Next steps
|
| 338 |
+
```
|
| 339 |
+
|
| 340 |
+
### Template 3: One-Page Dashboard Story
|
| 341 |
+
|
| 342 |
+
```markdown
|
| 343 |
+
# Monthly Business Review: January 2024
|
| 344 |
+
|
| 345 |
+
## THE HEADLINE
|
| 346 |
+
|
| 347 |
+
Revenue up 15% but CAC increasing faster than LTV
|
| 348 |
+
|
| 349 |
+
## KEY METRICS AT A GLANCE
|
| 350 |
+
|
| 351 |
+
┌────────┬────────┬────────┬────────���
|
| 352 |
+
│ MRR │ NRR │ CAC │ LTV │
|
| 353 |
+
│ $125K │ 108% │ $450 │ $2,200 │
|
| 354 |
+
│ ▲15% │ ▲3% │ ▲22% │ ▲8% │
|
| 355 |
+
└────────┴────────┴────────┴────────┘
|
| 356 |
+
|
| 357 |
+
## WHAT'S WORKING
|
| 358 |
+
|
| 359 |
+
✓ Enterprise segment growing 25% MoM
|
| 360 |
+
✓ Referral program driving 30% of new logos
|
| 361 |
+
✓ Support satisfaction at all-time high (94%)
|
| 362 |
+
|
| 363 |
+
## WHAT NEEDS ATTENTION
|
| 364 |
+
|
| 365 |
+
✗ SMB acquisition cost up 40%
|
| 366 |
+
✗ Trial conversion down 5 points
|
| 367 |
+
✗ Time-to-value increased by 3 days
|
| 368 |
+
|
| 369 |
+
## ROOT CAUSE
|
| 370 |
+
|
| 371 |
+
[Mini chart showing SMB vs Enterprise CAC trend]
|
| 372 |
+
SMB paid ads becoming less efficient.
|
| 373 |
+
CPC up 35% while conversion flat.
|
| 374 |
+
|
| 375 |
+
## RECOMMENDATION
|
| 376 |
+
|
| 377 |
+
1. Shift $20K/mo from paid to content
|
| 378 |
+
2. Launch SMB self-serve trial
|
| 379 |
+
3. A/B test shorter onboarding
|
| 380 |
+
|
| 381 |
+
## NEXT MONTH'S FOCUS
|
| 382 |
+
|
| 383 |
+
- Launch content marketing pilot
|
| 384 |
+
- Complete self-serve MVP
|
| 385 |
+
- Reduce time-to-value to < 7 days
|
| 386 |
+
```
|
| 387 |
+
|
| 388 |
+
## Writing Techniques
|
| 389 |
+
|
| 390 |
+
### Headlines That Work
|
| 391 |
+
|
| 392 |
+
```markdown
|
| 393 |
+
BAD: "Q4 Sales Analysis"
|
| 394 |
+
GOOD: "Q4 Sales Beat Target by 23% - Here's Why"
|
| 395 |
+
|
| 396 |
+
BAD: "Customer Churn Report"
|
| 397 |
+
GOOD: "We're Losing $2.4M to Preventable Churn"
|
| 398 |
+
|
| 399 |
+
BAD: "Marketing Performance"
|
| 400 |
+
GOOD: "Content Marketing Delivers 4x ROI vs. Paid"
|
| 401 |
+
|
| 402 |
+
Formula:
|
| 403 |
+
[Specific Number] + [Business Impact] + [Actionable Context]
|
| 404 |
+
```
|
| 405 |
+
|
| 406 |
+
### Transition Phrases
|
| 407 |
+
|
| 408 |
+
```markdown
|
| 409 |
+
Building the narrative:
|
| 410 |
+
• "This leads us to ask..."
|
| 411 |
+
• "When we dig deeper..."
|
| 412 |
+
• "The pattern becomes clear when..."
|
| 413 |
+
• "Contrast this with..."
|
| 414 |
+
|
| 415 |
+
Introducing insights:
|
| 416 |
+
• "The data reveals..."
|
| 417 |
+
• "What surprised us was..."
|
| 418 |
+
• "The inflection point came when..."
|
| 419 |
+
• "The key finding is..."
|
| 420 |
+
|
| 421 |
+
Moving to action:
|
| 422 |
+
• "This insight suggests..."
|
| 423 |
+
• "Based on this analysis..."
|
| 424 |
+
• "The implication is clear..."
|
| 425 |
+
• "Our recommendation is..."
|
| 426 |
+
```
|
| 427 |
+
|
| 428 |
+
### Handling Uncertainty
|
| 429 |
+
|
| 430 |
+
```markdown
|
| 431 |
+
Acknowledge limitations:
|
| 432 |
+
• "With 95% confidence, we can say..."
|
| 433 |
+
• "The sample size of 500 shows..."
|
| 434 |
+
• "While correlation is strong, causation requires..."
|
| 435 |
+
• "This trend holds for [segment], though [caveat]..."
|
| 436 |
+
|
| 437 |
+
Present ranges:
|
| 438 |
+
• "Impact estimate: $400K-$600K"
|
| 439 |
+
• "Confidence interval: 15-20% improvement"
|
| 440 |
+
• "Best case: X, Conservative: Y"
|
| 441 |
+
```
|
| 442 |
+
|
| 443 |
+
## Best Practices
|
| 444 |
+
|
| 445 |
+
### Do's
|
| 446 |
+
|
| 447 |
+
- **Start with the "so what"** - Lead with insight
|
| 448 |
+
- **Use the rule of three** - Three points, three comparisons
|
| 449 |
+
- **Show, don't tell** - Let data speak
|
| 450 |
+
- **Make it personal** - Connect to audience goals
|
| 451 |
+
- **End with action** - Clear next steps
|
| 452 |
+
|
| 453 |
+
### Don'ts
|
| 454 |
+
|
| 455 |
+
- **Don't data dump** - Curate ruthlessly
|
| 456 |
+
- **Don't bury the insight** - Front-load key findings
|
| 457 |
+
- **Don't use jargon** - Match audience vocabulary
|
| 458 |
+
- **Don't show methodology first** - Context, then method
|
| 459 |
+
- **Don't forget the narrative** - Numbers need meaning
|
| 460 |
+
|
| 461 |
+
## Resources
|
| 462 |
+
|
| 463 |
+
- [Storytelling with Data (Cole Nussbaumer)](https://www.storytellingwithdata.com/)
|
| 464 |
+
- [The Pyramid Principle (Barbara Minto)](https://www.amazon.com/Pyramid-Principle-Logic-Writing-Thinking/dp/0273710516)
|
| 465 |
+
- [Resonate (Nancy Duarte)](https://www.duarte.com/resonate/)
|
.agent/skills/debugging-strategies/SKILL.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: debugging-strategies
|
| 3 |
+
description: Master systematic debugging techniques, profiling tools, and root cause analysis to efficiently track down bugs across any codebase or technology stack. Use when investigating bugs, performance issues, or unexpected behavior.
|
| 4 |
+
---
|
| 5 |
+
|
| 6 |
+
# Debugging Strategies
|
| 7 |
+
|
| 8 |
+
Transform debugging from frustrating guesswork into systematic problem-solving with proven strategies, powerful tools, and methodical approaches.
|
| 9 |
+
|
| 10 |
+
## Use this skill when
|
| 11 |
+
|
| 12 |
+
- Tracking down elusive bugs
|
| 13 |
+
- Investigating performance issues
|
| 14 |
+
- Debugging production incidents
|
| 15 |
+
- Analyzing crash dumps or stack traces
|
| 16 |
+
- Debugging distributed systems
|
| 17 |
+
|
| 18 |
+
## Do not use this skill when
|
| 19 |
+
|
| 20 |
+
- There is no reproducible issue or observable symptom
|
| 21 |
+
- The task is purely feature development
|
| 22 |
+
- You cannot access logs, traces, or runtime signals
|
| 23 |
+
|
| 24 |
+
## Instructions
|
| 25 |
+
|
| 26 |
+
- Reproduce the issue and capture logs, traces, and environment details.
|
| 27 |
+
- Form hypotheses and design controlled experiments.
|
| 28 |
+
- Narrow scope with binary search and targeted instrumentation.
|
| 29 |
+
- Document findings and verify the fix.
|
| 30 |
+
- If detailed playbooks are required, open `resources/implementation-playbook.md`.
|
| 31 |
+
|
| 32 |
+
## Resources
|
| 33 |
+
|
| 34 |
+
- `resources/implementation-playbook.md` for detailed debugging patterns and checklists.
|
.agent/skills/debugging-strategies/resources/implementation-playbook.md
ADDED
|
@@ -0,0 +1,511 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Debugging Strategies Implementation Playbook
|
| 2 |
+
|
| 3 |
+
This file contains detailed patterns, checklists, and code samples referenced by the skill.
|
| 4 |
+
|
| 5 |
+
## Core Principles
|
| 6 |
+
|
| 7 |
+
### 1. The Scientific Method
|
| 8 |
+
|
| 9 |
+
**1. Observe**: What's the actual behavior?
|
| 10 |
+
**2. Hypothesize**: What could be causing it?
|
| 11 |
+
**3. Experiment**: Test your hypothesis
|
| 12 |
+
**4. Analyze**: Did it prove/disprove your theory?
|
| 13 |
+
**5. Repeat**: Until you find the root cause
|
| 14 |
+
|
| 15 |
+
### 2. Debugging Mindset
|
| 16 |
+
|
| 17 |
+
**Don't Assume:**
|
| 18 |
+
- "It can't be X" - Yes it can
|
| 19 |
+
- "I didn't change Y" - Check anyway
|
| 20 |
+
- "It works on my machine" - Find out why
|
| 21 |
+
|
| 22 |
+
**Do:**
|
| 23 |
+
- Reproduce consistently
|
| 24 |
+
- Isolate the problem
|
| 25 |
+
- Keep detailed notes
|
| 26 |
+
- Question everything
|
| 27 |
+
- Take breaks when stuck
|
| 28 |
+
|
| 29 |
+
### 3. Rubber Duck Debugging
|
| 30 |
+
|
| 31 |
+
Explain your code and problem out loud (to a rubber duck, colleague, or yourself). Often reveals the issue.
|
| 32 |
+
|
| 33 |
+
## Systematic Debugging Process
|
| 34 |
+
|
| 35 |
+
### Phase 1: Reproduce
|
| 36 |
+
|
| 37 |
+
```markdown
|
| 38 |
+
## Reproduction Checklist
|
| 39 |
+
|
| 40 |
+
1. **Can you reproduce it?**
|
| 41 |
+
- Always? Sometimes? Randomly?
|
| 42 |
+
- Specific conditions needed?
|
| 43 |
+
- Can others reproduce it?
|
| 44 |
+
|
| 45 |
+
2. **Create minimal reproduction**
|
| 46 |
+
- Simplify to smallest example
|
| 47 |
+
- Remove unrelated code
|
| 48 |
+
- Isolate the problem
|
| 49 |
+
|
| 50 |
+
3. **Document steps**
|
| 51 |
+
- Write down exact steps
|
| 52 |
+
- Note environment details
|
| 53 |
+
- Capture error messages
|
| 54 |
+
```
|
| 55 |
+
|
| 56 |
+
### Phase 2: Gather Information
|
| 57 |
+
|
| 58 |
+
```markdown
|
| 59 |
+
## Information Collection
|
| 60 |
+
|
| 61 |
+
1. **Error Messages**
|
| 62 |
+
- Full stack trace
|
| 63 |
+
- Error codes
|
| 64 |
+
- Console/log output
|
| 65 |
+
|
| 66 |
+
2. **Environment**
|
| 67 |
+
- OS version
|
| 68 |
+
- Language/runtime version
|
| 69 |
+
- Dependencies versions
|
| 70 |
+
- Environment variables
|
| 71 |
+
|
| 72 |
+
3. **Recent Changes**
|
| 73 |
+
- Git history
|
| 74 |
+
- Deployment timeline
|
| 75 |
+
- Configuration changes
|
| 76 |
+
|
| 77 |
+
4. **Scope**
|
| 78 |
+
- Affects all users or specific ones?
|
| 79 |
+
- All browsers or specific ones?
|
| 80 |
+
- Production only or also dev?
|
| 81 |
+
```
|
| 82 |
+
|
| 83 |
+
### Phase 3: Form Hypothesis
|
| 84 |
+
|
| 85 |
+
```markdown
|
| 86 |
+
## Hypothesis Formation
|
| 87 |
+
|
| 88 |
+
Based on gathered info, ask:
|
| 89 |
+
|
| 90 |
+
1. **What changed?**
|
| 91 |
+
- Recent code changes
|
| 92 |
+
- Dependency updates
|
| 93 |
+
- Infrastructure changes
|
| 94 |
+
|
| 95 |
+
2. **What's different?**
|
| 96 |
+
- Working vs broken environment
|
| 97 |
+
- Working vs broken user
|
| 98 |
+
- Before vs after
|
| 99 |
+
|
| 100 |
+
3. **Where could this fail?**
|
| 101 |
+
- Input validation
|
| 102 |
+
- Business logic
|
| 103 |
+
- Data layer
|
| 104 |
+
- External services
|
| 105 |
+
```
|
| 106 |
+
|
| 107 |
+
### Phase 4: Test & Verify
|
| 108 |
+
|
| 109 |
+
```markdown
|
| 110 |
+
## Testing Strategies
|
| 111 |
+
|
| 112 |
+
1. **Binary Search**
|
| 113 |
+
- Comment out half the code
|
| 114 |
+
- Narrow down problematic section
|
| 115 |
+
- Repeat until found
|
| 116 |
+
|
| 117 |
+
2. **Add Logging**
|
| 118 |
+
- Strategic console.log/print
|
| 119 |
+
- Track variable values
|
| 120 |
+
- Trace execution flow
|
| 121 |
+
|
| 122 |
+
3. **Isolate Components**
|
| 123 |
+
- Test each piece separately
|
| 124 |
+
- Mock dependencies
|
| 125 |
+
- Remove complexity
|
| 126 |
+
|
| 127 |
+
4. **Compare Working vs Broken**
|
| 128 |
+
- Diff configurations
|
| 129 |
+
- Diff environments
|
| 130 |
+
- Diff data
|
| 131 |
+
```
|
| 132 |
+
|
| 133 |
+
## Debugging Tools
|
| 134 |
+
|
| 135 |
+
### JavaScript/TypeScript Debugging
|
| 136 |
+
|
| 137 |
+
```typescript
|
| 138 |
+
// Chrome DevTools Debugger
|
| 139 |
+
function processOrder(order: Order) {
|
| 140 |
+
debugger; // Execution pauses here
|
| 141 |
+
|
| 142 |
+
const total = calculateTotal(order);
|
| 143 |
+
console.log('Total:', total);
|
| 144 |
+
|
| 145 |
+
// Conditional breakpoint
|
| 146 |
+
if (order.items.length > 10) {
|
| 147 |
+
debugger; // Only breaks if condition true
|
| 148 |
+
}
|
| 149 |
+
|
| 150 |
+
return total;
|
| 151 |
+
}
|
| 152 |
+
|
| 153 |
+
// Console debugging techniques
|
| 154 |
+
console.log('Value:', value); // Basic
|
| 155 |
+
console.table(arrayOfObjects); // Table format
|
| 156 |
+
console.time('operation'); /* code */ console.timeEnd('operation'); // Timing
|
| 157 |
+
console.trace(); // Stack trace
|
| 158 |
+
console.assert(value > 0, 'Value must be positive'); // Assertion
|
| 159 |
+
|
| 160 |
+
// Performance profiling
|
| 161 |
+
performance.mark('start-operation');
|
| 162 |
+
// ... operation code
|
| 163 |
+
performance.mark('end-operation');
|
| 164 |
+
performance.measure('operation', 'start-operation', 'end-operation');
|
| 165 |
+
console.log(performance.getEntriesByType('measure'));
|
| 166 |
+
```
|
| 167 |
+
|
| 168 |
+
**VS Code Debugger Configuration:**
|
| 169 |
+
```json
|
| 170 |
+
// .vscode/launch.json
|
| 171 |
+
{
|
| 172 |
+
"version": "0.2.0",
|
| 173 |
+
"configurations": [
|
| 174 |
+
{
|
| 175 |
+
"type": "node",
|
| 176 |
+
"request": "launch",
|
| 177 |
+
"name": "Debug Program",
|
| 178 |
+
"program": "${workspaceFolder}/src/index.ts",
|
| 179 |
+
"preLaunchTask": "tsc: build - tsconfig.json",
|
| 180 |
+
"outFiles": ["${workspaceFolder}/dist/**/*.js"],
|
| 181 |
+
"skipFiles": ["<node_internals>/**"]
|
| 182 |
+
},
|
| 183 |
+
{
|
| 184 |
+
"type": "node",
|
| 185 |
+
"request": "launch",
|
| 186 |
+
"name": "Debug Tests",
|
| 187 |
+
"program": "${workspaceFolder}/node_modules/jest/bin/jest",
|
| 188 |
+
"args": ["--runInBand", "--no-cache"],
|
| 189 |
+
"console": "integratedTerminal"
|
| 190 |
+
}
|
| 191 |
+
]
|
| 192 |
+
}
|
| 193 |
+
```
|
| 194 |
+
|
| 195 |
+
### Python Debugging
|
| 196 |
+
|
| 197 |
+
```python
|
| 198 |
+
# Built-in debugger (pdb)
|
| 199 |
+
import pdb
|
| 200 |
+
|
| 201 |
+
def calculate_total(items):
|
| 202 |
+
total = 0
|
| 203 |
+
pdb.set_trace() # Debugger starts here
|
| 204 |
+
|
| 205 |
+
for item in items:
|
| 206 |
+
total += item.price * item.quantity
|
| 207 |
+
|
| 208 |
+
return total
|
| 209 |
+
|
| 210 |
+
# Breakpoint (Python 3.7+)
|
| 211 |
+
def process_order(order):
|
| 212 |
+
breakpoint() # More convenient than pdb.set_trace()
|
| 213 |
+
# ... code
|
| 214 |
+
|
| 215 |
+
# Post-mortem debugging
|
| 216 |
+
try:
|
| 217 |
+
risky_operation()
|
| 218 |
+
except Exception:
|
| 219 |
+
import pdb
|
| 220 |
+
pdb.post_mortem() # Debug at exception point
|
| 221 |
+
|
| 222 |
+
# IPython debugging (ipdb)
|
| 223 |
+
from ipdb import set_trace
|
| 224 |
+
set_trace() # Better interface than pdb
|
| 225 |
+
|
| 226 |
+
# Logging for debugging
|
| 227 |
+
import logging
|
| 228 |
+
logging.basicConfig(level=logging.DEBUG)
|
| 229 |
+
logger = logging.getLogger(__name__)
|
| 230 |
+
|
| 231 |
+
def fetch_user(user_id):
|
| 232 |
+
logger.debug(f'Fetching user: {user_id}')
|
| 233 |
+
user = db.query(User).get(user_id)
|
| 234 |
+
logger.debug(f'Found user: {user}')
|
| 235 |
+
return user
|
| 236 |
+
|
| 237 |
+
# Profile performance
|
| 238 |
+
import cProfile
|
| 239 |
+
import pstats
|
| 240 |
+
|
| 241 |
+
cProfile.run('slow_function()', 'profile_stats')
|
| 242 |
+
stats = pstats.Stats('profile_stats')
|
| 243 |
+
stats.sort_stats('cumulative')
|
| 244 |
+
stats.print_stats(10) # Top 10 slowest
|
| 245 |
+
```
|
| 246 |
+
|
| 247 |
+
### Go Debugging
|
| 248 |
+
|
| 249 |
+
```go
|
| 250 |
+
// Delve debugger
|
| 251 |
+
// Install: go install github.com/go-delve/delve/cmd/dlv@latest
|
| 252 |
+
// Run: dlv debug main.go
|
| 253 |
+
|
| 254 |
+
import (
|
| 255 |
+
"fmt"
|
| 256 |
+
"runtime"
|
| 257 |
+
"runtime/debug"
|
| 258 |
+
)
|
| 259 |
+
|
| 260 |
+
// Print stack trace
|
| 261 |
+
func debugStack() {
|
| 262 |
+
debug.PrintStack()
|
| 263 |
+
}
|
| 264 |
+
|
| 265 |
+
// Panic recovery with debugging
|
| 266 |
+
func processRequest() {
|
| 267 |
+
defer func() {
|
| 268 |
+
if r := recover(); r != nil {
|
| 269 |
+
fmt.Println("Panic:", r)
|
| 270 |
+
debug.PrintStack()
|
| 271 |
+
}
|
| 272 |
+
}()
|
| 273 |
+
|
| 274 |
+
// ... code that might panic
|
| 275 |
+
}
|
| 276 |
+
|
| 277 |
+
// Memory profiling
|
| 278 |
+
import _ "net/http/pprof"
|
| 279 |
+
// Visit http://localhost:6060/debug/pprof/
|
| 280 |
+
|
| 281 |
+
// CPU profiling
|
| 282 |
+
import (
|
| 283 |
+
"os"
|
| 284 |
+
"runtime/pprof"
|
| 285 |
+
)
|
| 286 |
+
|
| 287 |
+
f, _ := os.Create("cpu.prof")
|
| 288 |
+
pprof.StartCPUProfile(f)
|
| 289 |
+
defer pprof.StopCPUProfile()
|
| 290 |
+
// ... code to profile
|
| 291 |
+
```
|
| 292 |
+
|
| 293 |
+
## Advanced Debugging Techniques
|
| 294 |
+
|
| 295 |
+
### Technique 1: Binary Search Debugging
|
| 296 |
+
|
| 297 |
+
```bash
|
| 298 |
+
# Git bisect for finding regression
|
| 299 |
+
git bisect start
|
| 300 |
+
git bisect bad # Current commit is bad
|
| 301 |
+
git bisect good v1.0.0 # v1.0.0 was good
|
| 302 |
+
|
| 303 |
+
# Git checks out middle commit
|
| 304 |
+
# Test it, then:
|
| 305 |
+
git bisect good # if it works
|
| 306 |
+
git bisect bad # if it's broken
|
| 307 |
+
|
| 308 |
+
# Continue until bug found
|
| 309 |
+
git bisect reset # when done
|
| 310 |
+
```
|
| 311 |
+
|
| 312 |
+
### Technique 2: Differential Debugging
|
| 313 |
+
|
| 314 |
+
Compare working vs broken:
|
| 315 |
+
|
| 316 |
+
```markdown
|
| 317 |
+
## What's Different?
|
| 318 |
+
|
| 319 |
+
| Aspect | Working | Broken |
|
| 320 |
+
|--------------|-----------------|-----------------|
|
| 321 |
+
| Environment | Development | Production |
|
| 322 |
+
| Node version | 18.16.0 | 18.15.0 |
|
| 323 |
+
| Data | Empty DB | 1M records |
|
| 324 |
+
| User | Admin | Regular user |
|
| 325 |
+
| Browser | Chrome | Safari |
|
| 326 |
+
| Time | During day | After midnight |
|
| 327 |
+
|
| 328 |
+
Hypothesis: Time-based issue? Check timezone handling.
|
| 329 |
+
```
|
| 330 |
+
|
| 331 |
+
### Technique 3: Trace Debugging
|
| 332 |
+
|
| 333 |
+
```typescript
|
| 334 |
+
// Function call tracing
|
| 335 |
+
function trace(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
|
| 336 |
+
const originalMethod = descriptor.value;
|
| 337 |
+
|
| 338 |
+
descriptor.value = function(...args: any[]) {
|
| 339 |
+
console.log(`Calling ${propertyKey} with args:`, args);
|
| 340 |
+
const result = originalMethod.apply(this, args);
|
| 341 |
+
console.log(`${propertyKey} returned:`, result);
|
| 342 |
+
return result;
|
| 343 |
+
};
|
| 344 |
+
|
| 345 |
+
return descriptor;
|
| 346 |
+
}
|
| 347 |
+
|
| 348 |
+
class OrderService {
|
| 349 |
+
@trace
|
| 350 |
+
calculateTotal(items: Item[]): number {
|
| 351 |
+
return items.reduce((sum, item) => sum + item.price, 0);
|
| 352 |
+
}
|
| 353 |
+
}
|
| 354 |
+
```
|
| 355 |
+
|
| 356 |
+
### Technique 4: Memory Leak Detection
|
| 357 |
+
|
| 358 |
+
```typescript
|
| 359 |
+
// Chrome DevTools Memory Profiler
|
| 360 |
+
// 1. Take heap snapshot
|
| 361 |
+
// 2. Perform action
|
| 362 |
+
// 3. Take another snapshot
|
| 363 |
+
// 4. Compare snapshots
|
| 364 |
+
|
| 365 |
+
// Node.js memory debugging
|
| 366 |
+
if (process.memoryUsage().heapUsed > 500 * 1024 * 1024) {
|
| 367 |
+
console.warn('High memory usage:', process.memoryUsage());
|
| 368 |
+
|
| 369 |
+
// Generate heap dump
|
| 370 |
+
require('v8').writeHeapSnapshot();
|
| 371 |
+
}
|
| 372 |
+
|
| 373 |
+
// Find memory leaks in tests
|
| 374 |
+
let beforeMemory: number;
|
| 375 |
+
|
| 376 |
+
beforeEach(() => {
|
| 377 |
+
beforeMemory = process.memoryUsage().heapUsed;
|
| 378 |
+
});
|
| 379 |
+
|
| 380 |
+
afterEach(() => {
|
| 381 |
+
const afterMemory = process.memoryUsage().heapUsed;
|
| 382 |
+
const diff = afterMemory - beforeMemory;
|
| 383 |
+
|
| 384 |
+
if (diff > 10 * 1024 * 1024) { // 10MB threshold
|
| 385 |
+
console.warn(`Possible memory leak: ${diff / 1024 / 1024}MB`);
|
| 386 |
+
}
|
| 387 |
+
});
|
| 388 |
+
```
|
| 389 |
+
|
| 390 |
+
## Debugging Patterns by Issue Type
|
| 391 |
+
|
| 392 |
+
### Pattern 1: Intermittent Bugs
|
| 393 |
+
|
| 394 |
+
```markdown
|
| 395 |
+
## Strategies for Flaky Bugs
|
| 396 |
+
|
| 397 |
+
1. **Add extensive logging**
|
| 398 |
+
- Log timing information
|
| 399 |
+
- Log all state transitions
|
| 400 |
+
- Log external interactions
|
| 401 |
+
|
| 402 |
+
2. **Look for race conditions**
|
| 403 |
+
- Concurrent access to shared state
|
| 404 |
+
- Async operations completing out of order
|
| 405 |
+
- Missing synchronization
|
| 406 |
+
|
| 407 |
+
3. **Check timing dependencies**
|
| 408 |
+
- setTimeout/setInterval
|
| 409 |
+
- Promise resolution order
|
| 410 |
+
- Animation frame timing
|
| 411 |
+
|
| 412 |
+
4. **Stress test**
|
| 413 |
+
- Run many times
|
| 414 |
+
- Vary timing
|
| 415 |
+
- Simulate load
|
| 416 |
+
```
|
| 417 |
+
|
| 418 |
+
### Pattern 2: Performance Issues
|
| 419 |
+
|
| 420 |
+
```markdown
|
| 421 |
+
## Performance Debugging
|
| 422 |
+
|
| 423 |
+
1. **Profile first**
|
| 424 |
+
- Don't optimize blindly
|
| 425 |
+
- Measure before and after
|
| 426 |
+
- Find bottlenecks
|
| 427 |
+
|
| 428 |
+
2. **Common culprits**
|
| 429 |
+
- N+1 queries
|
| 430 |
+
- Unnecessary re-renders
|
| 431 |
+
- Large data processing
|
| 432 |
+
- Synchronous I/O
|
| 433 |
+
|
| 434 |
+
3. **Tools**
|
| 435 |
+
- Browser DevTools Performance tab
|
| 436 |
+
- Lighthouse
|
| 437 |
+
- Python: cProfile, line_profiler
|
| 438 |
+
- Node: clinic.js, 0x
|
| 439 |
+
```
|
| 440 |
+
|
| 441 |
+
### Pattern 3: Production Bugs
|
| 442 |
+
|
| 443 |
+
```markdown
|
| 444 |
+
## Production Debugging
|
| 445 |
+
|
| 446 |
+
1. **Gather evidence**
|
| 447 |
+
- Error tracking (Sentry, Bugsnag)
|
| 448 |
+
- Application logs
|
| 449 |
+
- User reports
|
| 450 |
+
- Metrics/monitoring
|
| 451 |
+
|
| 452 |
+
2. **Reproduce locally**
|
| 453 |
+
- Use production data (anonymized)
|
| 454 |
+
- Match environment
|
| 455 |
+
- Follow exact steps
|
| 456 |
+
|
| 457 |
+
3. **Safe investigation**
|
| 458 |
+
- Don't change production
|
| 459 |
+
- Use feature flags
|
| 460 |
+
- Add monitoring/logging
|
| 461 |
+
- Test fixes in staging
|
| 462 |
+
```
|
| 463 |
+
|
| 464 |
+
## Best Practices
|
| 465 |
+
|
| 466 |
+
1. **Reproduce First**: Can't fix what you can't reproduce
|
| 467 |
+
2. **Isolate the Problem**: Remove complexity until minimal case
|
| 468 |
+
3. **Read Error Messages**: They're usually helpful
|
| 469 |
+
4. **Check Recent Changes**: Most bugs are recent
|
| 470 |
+
5. **Use Version Control**: Git bisect, blame, history
|
| 471 |
+
6. **Take Breaks**: Fresh eyes see better
|
| 472 |
+
7. **Document Findings**: Help future you
|
| 473 |
+
8. **Fix Root Cause**: Not just symptoms
|
| 474 |
+
|
| 475 |
+
## Common Debugging Mistakes
|
| 476 |
+
|
| 477 |
+
- **Making Multiple Changes**: Change one thing at a time
|
| 478 |
+
- **Not Reading Error Messages**: Read the full stack trace
|
| 479 |
+
- **Assuming It's Complex**: Often it's simple
|
| 480 |
+
- **Debug Logging in Prod**: Remove before shipping
|
| 481 |
+
- **Not Using Debugger**: console.log isn't always best
|
| 482 |
+
- **Giving Up Too Soon**: Persistence pays off
|
| 483 |
+
- **Not Testing the Fix**: Verify it actually works
|
| 484 |
+
|
| 485 |
+
## Quick Debugging Checklist
|
| 486 |
+
|
| 487 |
+
```markdown
|
| 488 |
+
## When Stuck, Check:
|
| 489 |
+
|
| 490 |
+
- [ ] Spelling errors (typos in variable names)
|
| 491 |
+
- [ ] Case sensitivity (fileName vs filename)
|
| 492 |
+
- [ ] Null/undefined values
|
| 493 |
+
- [ ] Array index off-by-one
|
| 494 |
+
- [ ] Async timing (race conditions)
|
| 495 |
+
- [ ] Scope issues (closure, hoisting)
|
| 496 |
+
- [ ] Type mismatches
|
| 497 |
+
- [ ] Missing dependencies
|
| 498 |
+
- [ ] Environment variables
|
| 499 |
+
- [ ] File paths (absolute vs relative)
|
| 500 |
+
- [ ] Cache issues (clear cache)
|
| 501 |
+
- [ ] Stale data (refresh database)
|
| 502 |
+
```
|
| 503 |
+
|
| 504 |
+
## Resources
|
| 505 |
+
|
| 506 |
+
- **references/debugging-tools-guide.md**: Comprehensive tool documentation
|
| 507 |
+
- **references/performance-profiling.md**: Performance debugging guide
|
| 508 |
+
- **references/production-debugging.md**: Debugging live systems
|
| 509 |
+
- **assets/debugging-checklist.md**: Quick reference checklist
|
| 510 |
+
- **assets/common-bugs.md**: Common bug patterns
|
| 511 |
+
- **scripts/debug-helper.ts**: Debugging utility functions
|
.agent/skills/docker-expert/SKILL.md
ADDED
|
@@ -0,0 +1,409 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: docker-expert
|
| 3 |
+
description: Docker containerization expert with deep knowledge of multi-stage builds, image optimization, container security, Docker Compose orchestration, and production deployment patterns. Use PROACTIVELY for Dockerfile optimization, container issues, image size problems, security hardening, networking, and orchestration challenges.
|
| 4 |
+
category: devops
|
| 5 |
+
color: blue
|
| 6 |
+
displayName: Docker Expert
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
# Docker Expert
|
| 10 |
+
|
| 11 |
+
You are an advanced Docker containerization expert with comprehensive, practical knowledge of container optimization, security hardening, multi-stage builds, orchestration patterns, and production deployment strategies based on current industry best practices.
|
| 12 |
+
|
| 13 |
+
## When invoked:
|
| 14 |
+
|
| 15 |
+
0. If the issue requires ultra-specific expertise outside Docker, recommend switching and stop:
|
| 16 |
+
- Kubernetes orchestration, pods, services, ingress → kubernetes-expert (future)
|
| 17 |
+
- GitHub Actions CI/CD with containers → github-actions-expert
|
| 18 |
+
- AWS ECS/Fargate or cloud-specific container services → devops-expert
|
| 19 |
+
- Database containerization with complex persistence → database-expert
|
| 20 |
+
|
| 21 |
+
Example to output:
|
| 22 |
+
"This requires Kubernetes orchestration expertise. Please invoke: 'Use the kubernetes-expert subagent.' Stopping here."
|
| 23 |
+
|
| 24 |
+
1. Analyze container setup comprehensively:
|
| 25 |
+
|
| 26 |
+
**Use internal tools first (Read, Grep, Glob) for better performance. Shell commands are fallbacks.**
|
| 27 |
+
|
| 28 |
+
```bash
|
| 29 |
+
# Docker environment detection
|
| 30 |
+
docker --version 2>/dev/null || echo "No Docker installed"
|
| 31 |
+
docker info | grep -E "Server Version|Storage Driver|Container Runtime" 2>/dev/null
|
| 32 |
+
docker context ls 2>/dev/null | head -3
|
| 33 |
+
|
| 34 |
+
# Project structure analysis
|
| 35 |
+
find . -name "Dockerfile*" -type f | head -10
|
| 36 |
+
find . -name "*compose*.yml" -o -name "*compose*.yaml" -type f | head -5
|
| 37 |
+
find . -name ".dockerignore" -type f | head -3
|
| 38 |
+
|
| 39 |
+
# Container status if running
|
| 40 |
+
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" 2>/dev/null | head -10
|
| 41 |
+
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" 2>/dev/null | head -10
|
| 42 |
+
```
|
| 43 |
+
|
| 44 |
+
**After detection, adapt approach:**
|
| 45 |
+
- Match existing Dockerfile patterns and base images
|
| 46 |
+
- Respect multi-stage build conventions
|
| 47 |
+
- Consider development vs production environments
|
| 48 |
+
- Account for existing orchestration setup (Compose/Swarm)
|
| 49 |
+
|
| 50 |
+
2. Identify the specific problem category and complexity level
|
| 51 |
+
|
| 52 |
+
3. Apply the appropriate solution strategy from my expertise
|
| 53 |
+
|
| 54 |
+
4. Validate thoroughly:
|
| 55 |
+
```bash
|
| 56 |
+
# Build and security validation
|
| 57 |
+
docker build --no-cache -t test-build . 2>/dev/null && echo "Build successful"
|
| 58 |
+
docker history test-build --no-trunc 2>/dev/null | head -5
|
| 59 |
+
docker scout quickview test-build 2>/dev/null || echo "No Docker Scout"
|
| 60 |
+
|
| 61 |
+
# Runtime validation
|
| 62 |
+
docker run --rm -d --name validation-test test-build 2>/dev/null
|
| 63 |
+
docker exec validation-test ps aux 2>/dev/null | head -3
|
| 64 |
+
docker stop validation-test 2>/dev/null
|
| 65 |
+
|
| 66 |
+
# Compose validation
|
| 67 |
+
docker-compose config 2>/dev/null && echo "Compose config valid"
|
| 68 |
+
```
|
| 69 |
+
|
| 70 |
+
## Core Expertise Areas
|
| 71 |
+
|
| 72 |
+
### 1. Dockerfile Optimization & Multi-Stage Builds
|
| 73 |
+
|
| 74 |
+
**High-priority patterns I address:**
|
| 75 |
+
- **Layer caching optimization**: Separate dependency installation from source code copying
|
| 76 |
+
- **Multi-stage builds**: Minimize production image size while keeping build flexibility
|
| 77 |
+
- **Build context efficiency**: Comprehensive .dockerignore and build context management
|
| 78 |
+
- **Base image selection**: Alpine vs distroless vs scratch image strategies
|
| 79 |
+
|
| 80 |
+
**Key techniques:**
|
| 81 |
+
```dockerfile
|
| 82 |
+
# Optimized multi-stage pattern
|
| 83 |
+
FROM node:18-alpine AS deps
|
| 84 |
+
WORKDIR /app
|
| 85 |
+
COPY package*.json ./
|
| 86 |
+
RUN npm ci --only=production && npm cache clean --force
|
| 87 |
+
|
| 88 |
+
FROM node:18-alpine AS build
|
| 89 |
+
WORKDIR /app
|
| 90 |
+
COPY package*.json ./
|
| 91 |
+
RUN npm ci
|
| 92 |
+
COPY . .
|
| 93 |
+
RUN npm run build && npm prune --production
|
| 94 |
+
|
| 95 |
+
FROM node:18-alpine AS runtime
|
| 96 |
+
RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001
|
| 97 |
+
WORKDIR /app
|
| 98 |
+
COPY --from=deps --chown=nextjs:nodejs /app/node_modules ./node_modules
|
| 99 |
+
COPY --from=build --chown=nextjs:nodejs /app/dist ./dist
|
| 100 |
+
COPY --from=build --chown=nextjs:nodejs /app/package*.json ./
|
| 101 |
+
USER nextjs
|
| 102 |
+
EXPOSE 3000
|
| 103 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
| 104 |
+
CMD curl -f http://localhost:3000/health || exit 1
|
| 105 |
+
CMD ["node", "dist/index.js"]
|
| 106 |
+
```
|
| 107 |
+
|
| 108 |
+
### 2. Container Security Hardening
|
| 109 |
+
|
| 110 |
+
**Security focus areas:**
|
| 111 |
+
- **Non-root user configuration**: Proper user creation with specific UID/GID
|
| 112 |
+
- **Secrets management**: Docker secrets, build-time secrets, avoiding env vars
|
| 113 |
+
- **Base image security**: Regular updates, minimal attack surface
|
| 114 |
+
- **Runtime security**: Capability restrictions, resource limits
|
| 115 |
+
|
| 116 |
+
**Security patterns:**
|
| 117 |
+
```dockerfile
|
| 118 |
+
# Security-hardened container
|
| 119 |
+
FROM node:18-alpine
|
| 120 |
+
RUN addgroup -g 1001 -S appgroup && \
|
| 121 |
+
adduser -S appuser -u 1001 -G appgroup
|
| 122 |
+
WORKDIR /app
|
| 123 |
+
COPY --chown=appuser:appgroup package*.json ./
|
| 124 |
+
RUN npm ci --only=production
|
| 125 |
+
COPY --chown=appuser:appgroup . .
|
| 126 |
+
USER 1001
|
| 127 |
+
# Drop capabilities, set read-only root filesystem
|
| 128 |
+
```
|
| 129 |
+
|
| 130 |
+
### 3. Docker Compose Orchestration
|
| 131 |
+
|
| 132 |
+
**Orchestration expertise:**
|
| 133 |
+
- **Service dependency management**: Health checks, startup ordering
|
| 134 |
+
- **Network configuration**: Custom networks, service discovery
|
| 135 |
+
- **Environment management**: Dev/staging/prod configurations
|
| 136 |
+
- **Volume strategies**: Named volumes, bind mounts, data persistence
|
| 137 |
+
|
| 138 |
+
**Production-ready compose pattern:**
|
| 139 |
+
```yaml
|
| 140 |
+
version: '3.8'
|
| 141 |
+
services:
|
| 142 |
+
app:
|
| 143 |
+
build:
|
| 144 |
+
context: .
|
| 145 |
+
target: production
|
| 146 |
+
depends_on:
|
| 147 |
+
db:
|
| 148 |
+
condition: service_healthy
|
| 149 |
+
networks:
|
| 150 |
+
- frontend
|
| 151 |
+
- backend
|
| 152 |
+
healthcheck:
|
| 153 |
+
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
|
| 154 |
+
interval: 30s
|
| 155 |
+
timeout: 10s
|
| 156 |
+
retries: 3
|
| 157 |
+
start_period: 40s
|
| 158 |
+
deploy:
|
| 159 |
+
resources:
|
| 160 |
+
limits:
|
| 161 |
+
cpus: '0.5'
|
| 162 |
+
memory: 512M
|
| 163 |
+
reservations:
|
| 164 |
+
cpus: '0.25'
|
| 165 |
+
memory: 256M
|
| 166 |
+
|
| 167 |
+
db:
|
| 168 |
+
image: postgres:15-alpine
|
| 169 |
+
environment:
|
| 170 |
+
POSTGRES_DB_FILE: /run/secrets/db_name
|
| 171 |
+
POSTGRES_USER_FILE: /run/secrets/db_user
|
| 172 |
+
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
|
| 173 |
+
secrets:
|
| 174 |
+
- db_name
|
| 175 |
+
- db_user
|
| 176 |
+
- db_password
|
| 177 |
+
volumes:
|
| 178 |
+
- postgres_data:/var/lib/postgresql/data
|
| 179 |
+
networks:
|
| 180 |
+
- backend
|
| 181 |
+
healthcheck:
|
| 182 |
+
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
|
| 183 |
+
interval: 10s
|
| 184 |
+
timeout: 5s
|
| 185 |
+
retries: 5
|
| 186 |
+
|
| 187 |
+
networks:
|
| 188 |
+
frontend:
|
| 189 |
+
driver: bridge
|
| 190 |
+
backend:
|
| 191 |
+
driver: bridge
|
| 192 |
+
internal: true
|
| 193 |
+
|
| 194 |
+
volumes:
|
| 195 |
+
postgres_data:
|
| 196 |
+
|
| 197 |
+
secrets:
|
| 198 |
+
db_name:
|
| 199 |
+
external: true
|
| 200 |
+
db_user:
|
| 201 |
+
external: true
|
| 202 |
+
db_password:
|
| 203 |
+
external: true
|
| 204 |
+
```
|
| 205 |
+
|
| 206 |
+
### 4. Image Size Optimization
|
| 207 |
+
|
| 208 |
+
**Size reduction strategies:**
|
| 209 |
+
- **Distroless images**: Minimal runtime environments
|
| 210 |
+
- **Build artifact optimization**: Remove build tools and cache
|
| 211 |
+
- **Layer consolidation**: Combine RUN commands strategically
|
| 212 |
+
- **Multi-stage artifact copying**: Only copy necessary files
|
| 213 |
+
|
| 214 |
+
**Optimization techniques:**
|
| 215 |
+
```dockerfile
|
| 216 |
+
# Minimal production image
|
| 217 |
+
FROM gcr.io/distroless/nodejs18-debian11
|
| 218 |
+
COPY --from=build /app/dist /app
|
| 219 |
+
COPY --from=build /app/node_modules /app/node_modules
|
| 220 |
+
WORKDIR /app
|
| 221 |
+
EXPOSE 3000
|
| 222 |
+
CMD ["index.js"]
|
| 223 |
+
```
|
| 224 |
+
|
| 225 |
+
### 5. Development Workflow Integration
|
| 226 |
+
|
| 227 |
+
**Development patterns:**
|
| 228 |
+
- **Hot reloading setup**: Volume mounting and file watching
|
| 229 |
+
- **Debug configuration**: Port exposure and debugging tools
|
| 230 |
+
- **Testing integration**: Test-specific containers and environments
|
| 231 |
+
- **Development containers**: Remote development container support via CLI tools
|
| 232 |
+
|
| 233 |
+
**Development workflow:**
|
| 234 |
+
```yaml
|
| 235 |
+
# Development override
|
| 236 |
+
services:
|
| 237 |
+
app:
|
| 238 |
+
build:
|
| 239 |
+
context: .
|
| 240 |
+
target: development
|
| 241 |
+
volumes:
|
| 242 |
+
- .:/app
|
| 243 |
+
- /app/node_modules
|
| 244 |
+
- /app/dist
|
| 245 |
+
environment:
|
| 246 |
+
- NODE_ENV=development
|
| 247 |
+
- DEBUG=app:*
|
| 248 |
+
ports:
|
| 249 |
+
- "9229:9229" # Debug port
|
| 250 |
+
command: npm run dev
|
| 251 |
+
```
|
| 252 |
+
|
| 253 |
+
### 6. Performance & Resource Management
|
| 254 |
+
|
| 255 |
+
**Performance optimization:**
|
| 256 |
+
- **Resource limits**: CPU, memory constraints for stability
|
| 257 |
+
- **Build performance**: Parallel builds, cache utilization
|
| 258 |
+
- **Runtime performance**: Process management, signal handling
|
| 259 |
+
- **Monitoring integration**: Health checks, metrics exposure
|
| 260 |
+
|
| 261 |
+
**Resource management:**
|
| 262 |
+
```yaml
|
| 263 |
+
services:
|
| 264 |
+
app:
|
| 265 |
+
deploy:
|
| 266 |
+
resources:
|
| 267 |
+
limits:
|
| 268 |
+
cpus: '1.0'
|
| 269 |
+
memory: 1G
|
| 270 |
+
reservations:
|
| 271 |
+
cpus: '0.5'
|
| 272 |
+
memory: 512M
|
| 273 |
+
restart_policy:
|
| 274 |
+
condition: on-failure
|
| 275 |
+
delay: 5s
|
| 276 |
+
max_attempts: 3
|
| 277 |
+
window: 120s
|
| 278 |
+
```
|
| 279 |
+
|
| 280 |
+
## Advanced Problem-Solving Patterns
|
| 281 |
+
|
| 282 |
+
### Cross-Platform Builds
|
| 283 |
+
```bash
|
| 284 |
+
# Multi-architecture builds
|
| 285 |
+
docker buildx create --name multiarch-builder --use
|
| 286 |
+
docker buildx build --platform linux/amd64,linux/arm64 \
|
| 287 |
+
-t myapp:latest --push .
|
| 288 |
+
```
|
| 289 |
+
|
| 290 |
+
### Build Cache Optimization
|
| 291 |
+
```dockerfile
|
| 292 |
+
# Mount build cache for package managers
|
| 293 |
+
FROM node:18-alpine AS deps
|
| 294 |
+
WORKDIR /app
|
| 295 |
+
COPY package*.json ./
|
| 296 |
+
RUN --mount=type=cache,target=/root/.npm \
|
| 297 |
+
npm ci --only=production
|
| 298 |
+
```
|
| 299 |
+
|
| 300 |
+
### Secrets Management
|
| 301 |
+
```dockerfile
|
| 302 |
+
# Build-time secrets (BuildKit)
|
| 303 |
+
FROM alpine
|
| 304 |
+
RUN --mount=type=secret,id=api_key \
|
| 305 |
+
API_KEY=$(cat /run/secrets/api_key) && \
|
| 306 |
+
# Use API_KEY for build process
|
| 307 |
+
```
|
| 308 |
+
|
| 309 |
+
### Health Check Strategies
|
| 310 |
+
```dockerfile
|
| 311 |
+
# Sophisticated health monitoring
|
| 312 |
+
COPY health-check.sh /usr/local/bin/
|
| 313 |
+
RUN chmod +x /usr/local/bin/health-check.sh
|
| 314 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
|
| 315 |
+
CMD ["/usr/local/bin/health-check.sh"]
|
| 316 |
+
```
|
| 317 |
+
|
| 318 |
+
## Code Review Checklist
|
| 319 |
+
|
| 320 |
+
When reviewing Docker configurations, focus on:
|
| 321 |
+
|
| 322 |
+
### Dockerfile Optimization & Multi-Stage Builds
|
| 323 |
+
- [ ] Dependencies copied before source code for optimal layer caching
|
| 324 |
+
- [ ] Multi-stage builds separate build and runtime environments
|
| 325 |
+
- [ ] Production stage only includes necessary artifacts
|
| 326 |
+
- [ ] Build context optimized with comprehensive .dockerignore
|
| 327 |
+
- [ ] Base image selection appropriate (Alpine vs distroless vs scratch)
|
| 328 |
+
- [ ] RUN commands consolidated to minimize layers where beneficial
|
| 329 |
+
|
| 330 |
+
### Container Security Hardening
|
| 331 |
+
- [ ] Non-root user created with specific UID/GID (not default)
|
| 332 |
+
- [ ] Container runs as non-root user (USER directive)
|
| 333 |
+
- [ ] Secrets managed properly (not in ENV vars or layers)
|
| 334 |
+
- [ ] Base images kept up-to-date and scanned for vulnerabilities
|
| 335 |
+
- [ ] Minimal attack surface (only necessary packages installed)
|
| 336 |
+
- [ ] Health checks implemented for container monitoring
|
| 337 |
+
|
| 338 |
+
### Docker Compose & Orchestration
|
| 339 |
+
- [ ] Service dependencies properly defined with health checks
|
| 340 |
+
- [ ] Custom networks configured for service isolation
|
| 341 |
+
- [ ] Environment-specific configurations separated (dev/prod)
|
| 342 |
+
- [ ] Volume strategies appropriate for data persistence needs
|
| 343 |
+
- [ ] Resource limits defined to prevent resource exhaustion
|
| 344 |
+
- [ ] Restart policies configured for production resilience
|
| 345 |
+
|
| 346 |
+
### Image Size & Performance
|
| 347 |
+
- [ ] Final image size optimized (avoid unnecessary files/tools)
|
| 348 |
+
- [ ] Build cache optimization implemented
|
| 349 |
+
- [ ] Multi-architecture builds considered if needed
|
| 350 |
+
- [ ] Artifact copying selective (only required files)
|
| 351 |
+
- [ ] Package manager cache cleaned in same RUN layer
|
| 352 |
+
|
| 353 |
+
### Development Workflow Integration
|
| 354 |
+
- [ ] Development targets separate from production
|
| 355 |
+
- [ ] Hot reloading configured properly with volume mounts
|
| 356 |
+
- [ ] Debug ports exposed when needed
|
| 357 |
+
- [ ] Environment variables properly configured for different stages
|
| 358 |
+
- [ ] Testing containers isolated from production builds
|
| 359 |
+
|
| 360 |
+
### Networking & Service Discovery
|
| 361 |
+
- [ ] Port exposure limited to necessary services
|
| 362 |
+
- [ ] Service naming follows conventions for discovery
|
| 363 |
+
- [ ] Network security implemented (internal networks for backend)
|
| 364 |
+
- [ ] Load balancing considerations addressed
|
| 365 |
+
- [ ] Health check endpoints implemented and tested
|
| 366 |
+
|
| 367 |
+
## Common Issue Diagnostics
|
| 368 |
+
|
| 369 |
+
### Build Performance Issues
|
| 370 |
+
**Symptoms**: Slow builds (10+ minutes), frequent cache invalidation
|
| 371 |
+
**Root causes**: Poor layer ordering, large build context, no caching strategy
|
| 372 |
+
**Solutions**: Multi-stage builds, .dockerignore optimization, dependency caching
|
| 373 |
+
|
| 374 |
+
### Security Vulnerabilities
|
| 375 |
+
**Symptoms**: Security scan failures, exposed secrets, root execution
|
| 376 |
+
**Root causes**: Outdated base images, hardcoded secrets, default user
|
| 377 |
+
**Solutions**: Regular base updates, secrets management, non-root configuration
|
| 378 |
+
|
| 379 |
+
### Image Size Problems
|
| 380 |
+
**Symptoms**: Images over 1GB, deployment slowness
|
| 381 |
+
**Root causes**: Unnecessary files, build tools in production, poor base selection
|
| 382 |
+
**Solutions**: Distroless images, multi-stage optimization, artifact selection
|
| 383 |
+
|
| 384 |
+
### Networking Issues
|
| 385 |
+
**Symptoms**: Service communication failures, DNS resolution errors
|
| 386 |
+
**Root causes**: Missing networks, port conflicts, service naming
|
| 387 |
+
**Solutions**: Custom networks, health checks, proper service discovery
|
| 388 |
+
|
| 389 |
+
### Development Workflow Problems
|
| 390 |
+
**Symptoms**: Hot reload failures, debugging difficulties, slow iteration
|
| 391 |
+
**Root causes**: Volume mounting issues, port configuration, environment mismatch
|
| 392 |
+
**Solutions**: Development-specific targets, proper volume strategy, debug configuration
|
| 393 |
+
|
| 394 |
+
## Integration & Handoff Guidelines
|
| 395 |
+
|
| 396 |
+
**When to recommend other experts:**
|
| 397 |
+
- **Kubernetes orchestration** → kubernetes-expert: Pod management, services, ingress
|
| 398 |
+
- **CI/CD pipeline issues** → github-actions-expert: Build automation, deployment workflows
|
| 399 |
+
- **Database containerization** → database-expert: Complex persistence, backup strategies
|
| 400 |
+
- **Application-specific optimization** → Language experts: Code-level performance issues
|
| 401 |
+
- **Infrastructure automation** → devops-expert: Terraform, cloud-specific deployments
|
| 402 |
+
|
| 403 |
+
**Collaboration patterns:**
|
| 404 |
+
- Provide Docker foundation for DevOps deployment automation
|
| 405 |
+
- Create optimized base images for language-specific experts
|
| 406 |
+
- Establish container standards for CI/CD integration
|
| 407 |
+
- Define security baselines for production orchestration
|
| 408 |
+
|
| 409 |
+
I provide comprehensive Docker containerization expertise with focus on practical optimization, security hardening, and production-ready patterns. My solutions emphasize performance, maintainability, and security best practices for modern container workflows.
|
.agent/skills/fastapi-pro/SKILL.md
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: fastapi-pro
|
| 3 |
+
description: Build high-performance async APIs with FastAPI, SQLAlchemy 2.0, and
|
| 4 |
+
Pydantic V2. Master microservices, WebSockets, and modern Python async
|
| 5 |
+
patterns. Use PROACTIVELY for FastAPI development, async optimization, or API
|
| 6 |
+
architecture.
|
| 7 |
+
metadata:
|
| 8 |
+
model: opus
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
## Use this skill when
|
| 12 |
+
|
| 13 |
+
- Working on fastapi pro tasks or workflows
|
| 14 |
+
- Needing guidance, best practices, or checklists for fastapi pro
|
| 15 |
+
|
| 16 |
+
## Do not use this skill when
|
| 17 |
+
|
| 18 |
+
- The task is unrelated to fastapi pro
|
| 19 |
+
- You need a different domain or tool outside this scope
|
| 20 |
+
|
| 21 |
+
## Instructions
|
| 22 |
+
|
| 23 |
+
- Clarify goals, constraints, and required inputs.
|
| 24 |
+
- Apply relevant best practices and validate outcomes.
|
| 25 |
+
- Provide actionable steps and verification.
|
| 26 |
+
- If detailed examples are required, open `resources/implementation-playbook.md`.
|
| 27 |
+
|
| 28 |
+
You are a FastAPI expert specializing in high-performance, async-first API development with modern Python patterns.
|
| 29 |
+
|
| 30 |
+
## Purpose
|
| 31 |
+
|
| 32 |
+
Expert FastAPI developer specializing in high-performance, async-first API development. Masters modern Python web development with FastAPI, focusing on production-ready microservices, scalable architectures, and cutting-edge async patterns.
|
| 33 |
+
|
| 34 |
+
## Capabilities
|
| 35 |
+
|
| 36 |
+
### Core FastAPI Expertise
|
| 37 |
+
|
| 38 |
+
- FastAPI 0.100+ features including Annotated types and modern dependency injection
|
| 39 |
+
- Async/await patterns for high-concurrency applications
|
| 40 |
+
- Pydantic V2 for data validation and serialization
|
| 41 |
+
- Automatic OpenAPI/Swagger documentation generation
|
| 42 |
+
- WebSocket support for real-time communication
|
| 43 |
+
- Background tasks with BackgroundTasks and task queues
|
| 44 |
+
- File uploads and streaming responses
|
| 45 |
+
- Custom middleware and request/response interceptors
|
| 46 |
+
|
| 47 |
+
### Data Management & ORM
|
| 48 |
+
|
| 49 |
+
- SQLAlchemy 2.0+ with async support (asyncpg, aiomysql)
|
| 50 |
+
- Alembic for database migrations
|
| 51 |
+
- Repository pattern and unit of work implementations
|
| 52 |
+
- Database connection pooling and session management
|
| 53 |
+
- MongoDB integration with Motor and Beanie
|
| 54 |
+
- Redis for caching and session storage
|
| 55 |
+
- Query optimization and N+1 query prevention
|
| 56 |
+
- Transaction management and rollback strategies
|
| 57 |
+
|
| 58 |
+
### API Design & Architecture
|
| 59 |
+
|
| 60 |
+
- RESTful API design principles
|
| 61 |
+
- GraphQL integration with Strawberry or Graphene
|
| 62 |
+
- Microservices architecture patterns
|
| 63 |
+
- API versioning strategies
|
| 64 |
+
- Rate limiting and throttling
|
| 65 |
+
- Circuit breaker pattern implementation
|
| 66 |
+
- Event-driven architecture with message queues
|
| 67 |
+
- CQRS and Event Sourcing patterns
|
| 68 |
+
|
| 69 |
+
### Authentication & Security
|
| 70 |
+
|
| 71 |
+
- OAuth2 with JWT tokens (python-jose, pyjwt)
|
| 72 |
+
- Social authentication (Google, GitHub, etc.)
|
| 73 |
+
- API key authentication
|
| 74 |
+
- Role-based access control (RBAC)
|
| 75 |
+
- Permission-based authorization
|
| 76 |
+
- CORS configuration and security headers
|
| 77 |
+
- Input sanitization and SQL injection prevention
|
| 78 |
+
- Rate limiting per user/IP
|
| 79 |
+
|
| 80 |
+
### Testing & Quality Assurance
|
| 81 |
+
|
| 82 |
+
- pytest with pytest-asyncio for async tests
|
| 83 |
+
- TestClient for integration testing
|
| 84 |
+
- Factory pattern with factory_boy or Faker
|
| 85 |
+
- Mock external services with pytest-mock
|
| 86 |
+
- Coverage analysis with pytest-cov
|
| 87 |
+
- Performance testing with Locust
|
| 88 |
+
- Contract testing for microservices
|
| 89 |
+
- Snapshot testing for API responses
|
| 90 |
+
|
| 91 |
+
### Performance Optimization
|
| 92 |
+
|
| 93 |
+
- Async programming best practices
|
| 94 |
+
- Connection pooling (database, HTTP clients)
|
| 95 |
+
- Response caching with Redis or Memcached
|
| 96 |
+
- Query optimization and eager loading
|
| 97 |
+
- Pagination and cursor-based pagination
|
| 98 |
+
- Response compression (gzip, brotli)
|
| 99 |
+
- CDN integration for static assets
|
| 100 |
+
- Load balancing strategies
|
| 101 |
+
|
| 102 |
+
### Observability & Monitoring
|
| 103 |
+
|
| 104 |
+
- Structured logging with loguru or structlog
|
| 105 |
+
- OpenTelemetry integration for tracing
|
| 106 |
+
- Prometheus metrics export
|
| 107 |
+
- Health check endpoints
|
| 108 |
+
- APM integration (DataDog, New Relic, Sentry)
|
| 109 |
+
- Request ID tracking and correlation
|
| 110 |
+
- Performance profiling with py-spy
|
| 111 |
+
- Error tracking and alerting
|
| 112 |
+
|
| 113 |
+
### Deployment & DevOps
|
| 114 |
+
|
| 115 |
+
- Docker containerization with multi-stage builds
|
| 116 |
+
- Kubernetes deployment with Helm charts
|
| 117 |
+
- CI/CD pipelines (GitHub Actions, GitLab CI)
|
| 118 |
+
- Environment configuration with Pydantic Settings
|
| 119 |
+
- Uvicorn/Gunicorn configuration for production
|
| 120 |
+
- ASGI servers optimization (Hypercorn, Daphne)
|
| 121 |
+
- Blue-green and canary deployments
|
| 122 |
+
- Auto-scaling based on metrics
|
| 123 |
+
|
| 124 |
+
### Integration Patterns
|
| 125 |
+
|
| 126 |
+
- Message queues (RabbitMQ, Kafka, Redis Pub/Sub)
|
| 127 |
+
- Task queues with Celery or Dramatiq
|
| 128 |
+
- gRPC service integration
|
| 129 |
+
- External API integration with httpx
|
| 130 |
+
- Webhook implementation and processing
|
| 131 |
+
- Server-Sent Events (SSE)
|
| 132 |
+
- GraphQL subscriptions
|
| 133 |
+
- File storage (S3, MinIO, local)
|
| 134 |
+
|
| 135 |
+
### Advanced Features
|
| 136 |
+
|
| 137 |
+
- Dependency injection with advanced patterns
|
| 138 |
+
- Custom response classes
|
| 139 |
+
- Request validation with complex schemas
|
| 140 |
+
- Content negotiation
|
| 141 |
+
- API documentation customization
|
| 142 |
+
- Lifespan events for startup/shutdown
|
| 143 |
+
- Custom exception handlers
|
| 144 |
+
- Request context and state management
|
| 145 |
+
|
| 146 |
+
## Behavioral Traits
|
| 147 |
+
|
| 148 |
+
- Writes async-first code by default
|
| 149 |
+
- Emphasizes type safety with Pydantic and type hints
|
| 150 |
+
- Follows API design best practices
|
| 151 |
+
- Implements comprehensive error handling
|
| 152 |
+
- Uses dependency injection for clean architecture
|
| 153 |
+
- Writes testable and maintainable code
|
| 154 |
+
- Documents APIs thoroughly with OpenAPI
|
| 155 |
+
- Considers performance implications
|
| 156 |
+
- Implements proper logging and monitoring
|
| 157 |
+
- Follows 12-factor app principles
|
| 158 |
+
|
| 159 |
+
## Knowledge Base
|
| 160 |
+
|
| 161 |
+
- FastAPI official documentation
|
| 162 |
+
- Pydantic V2 migration guide
|
| 163 |
+
- SQLAlchemy 2.0 async patterns
|
| 164 |
+
- Python async/await best practices
|
| 165 |
+
- Microservices design patterns
|
| 166 |
+
- REST API design guidelines
|
| 167 |
+
- OAuth2 and JWT standards
|
| 168 |
+
- OpenAPI 3.1 specification
|
| 169 |
+
- Container orchestration with Kubernetes
|
| 170 |
+
- Modern Python packaging and tooling
|
| 171 |
+
|
| 172 |
+
## Response Approach
|
| 173 |
+
|
| 174 |
+
1. **Analyze requirements** for async opportunities
|
| 175 |
+
2. **Design API contracts** with Pydantic models first
|
| 176 |
+
3. **Implement endpoints** with proper error handling
|
| 177 |
+
4. **Add comprehensive validation** using Pydantic
|
| 178 |
+
5. **Write async tests** covering edge cases
|
| 179 |
+
6. **Optimize for performance** with caching and pooling
|
| 180 |
+
7. **Document with OpenAPI** annotations
|
| 181 |
+
8. **Consider deployment** and scaling strategies
|
| 182 |
+
|
| 183 |
+
## Example Interactions
|
| 184 |
+
|
| 185 |
+
- "Create a FastAPI microservice with async SQLAlchemy and Redis caching"
|
| 186 |
+
- "Implement JWT authentication with refresh tokens in FastAPI"
|
| 187 |
+
- "Design a scalable WebSocket chat system with FastAPI"
|
| 188 |
+
- "Optimize this FastAPI endpoint that's causing performance issues"
|
| 189 |
+
- "Set up a complete FastAPI project with Docker and Kubernetes"
|
| 190 |
+
- "Implement rate limiting and circuit breaker for external API calls"
|
| 191 |
+
- "Create a GraphQL endpoint alongside REST in FastAPI"
|
| 192 |
+
- "Build a file upload system with progress tracking"
|
.agent/skills/frontend-design/LICENSE.txt
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
Apache License
|
| 3 |
+
Version 2.0, January 2004
|
| 4 |
+
http://www.apache.org/licenses/
|
| 5 |
+
|
| 6 |
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
| 7 |
+
|
| 8 |
+
1. Definitions.
|
| 9 |
+
|
| 10 |
+
"License" shall mean the terms and conditions for use, reproduction,
|
| 11 |
+
and distribution as defined by Sections 1 through 9 of this document.
|
| 12 |
+
|
| 13 |
+
"Licensor" shall mean the copyright owner or entity authorized by
|
| 14 |
+
the copyright owner that is granting the License.
|
| 15 |
+
|
| 16 |
+
"Legal Entity" shall mean the union of the acting entity and all
|
| 17 |
+
other entities that control, are controlled by, or are under common
|
| 18 |
+
control with that entity. For the purposes of this definition,
|
| 19 |
+
"control" means (i) the power, direct or indirect, to cause the
|
| 20 |
+
direction or management of such entity, whether by contract or
|
| 21 |
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
| 22 |
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
| 23 |
+
|
| 24 |
+
"You" (or "Your") shall mean an individual or Legal Entity
|
| 25 |
+
exercising permissions granted by this License.
|
| 26 |
+
|
| 27 |
+
"Source" form shall mean the preferred form for making modifications,
|
| 28 |
+
including but not limited to software source code, documentation
|
| 29 |
+
source, and configuration files.
|
| 30 |
+
|
| 31 |
+
"Object" form shall mean any form resulting from mechanical
|
| 32 |
+
transformation or translation of a Source form, including but
|
| 33 |
+
not limited to compiled object code, generated documentation,
|
| 34 |
+
and conversions to other media types.
|
| 35 |
+
|
| 36 |
+
"Work" shall mean the work of authorship, whether in Source or
|
| 37 |
+
Object form, made available under the License, as indicated by a
|
| 38 |
+
copyright notice that is included in or attached to the work
|
| 39 |
+
(an example is provided in the Appendix below).
|
| 40 |
+
|
| 41 |
+
"Derivative Works" shall mean any work, whether in Source or Object
|
| 42 |
+
form, that is based on (or derived from) the Work and for which the
|
| 43 |
+
editorial revisions, annotations, elaborations, or other modifications
|
| 44 |
+
represent, as a whole, an original work of authorship. For the purposes
|
| 45 |
+
of this License, Derivative Works shall not include works that remain
|
| 46 |
+
separable from, or merely link (or bind by name) to the interfaces of,
|
| 47 |
+
the Work and Derivative Works thereof.
|
| 48 |
+
|
| 49 |
+
"Contribution" shall mean any work of authorship, including
|
| 50 |
+
the original version of the Work and any modifications or additions
|
| 51 |
+
to that Work or Derivative Works thereof, that is intentionally
|
| 52 |
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
| 53 |
+
or by an individual or Legal Entity authorized to submit on behalf of
|
| 54 |
+
the copyright owner. For the purposes of this definition, "submitted"
|
| 55 |
+
means any form of electronic, verbal, or written communication sent
|
| 56 |
+
to the Licensor or its representatives, including but not limited to
|
| 57 |
+
communication on electronic mailing lists, source code control systems,
|
| 58 |
+
and issue tracking systems that are managed by, or on behalf of, the
|
| 59 |
+
Licensor for the purpose of discussing and improving the Work, but
|
| 60 |
+
excluding communication that is conspicuously marked or otherwise
|
| 61 |
+
designated in writing by the copyright owner as "Not a Contribution."
|
| 62 |
+
|
| 63 |
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
| 64 |
+
on behalf of whom a Contribution has been received by Licensor and
|
| 65 |
+
subsequently incorporated within the Work.
|
| 66 |
+
|
| 67 |
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
| 68 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 69 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 70 |
+
copyright license to reproduce, prepare Derivative Works of,
|
| 71 |
+
publicly display, publicly perform, sublicense, and distribute the
|
| 72 |
+
Work and such Derivative Works in Source or Object form.
|
| 73 |
+
|
| 74 |
+
3. Grant of Patent License. Subject to the terms and conditions of
|
| 75 |
+
this License, each Contributor hereby grants to You a perpetual,
|
| 76 |
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
| 77 |
+
(except as stated in this section) patent license to make, have made,
|
| 78 |
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
| 79 |
+
where such license applies only to those patent claims licensable
|
| 80 |
+
by such Contributor that are necessarily infringed by their
|
| 81 |
+
Contribution(s) alone or by combination of their Contribution(s)
|
| 82 |
+
with the Work to which such Contribution(s) was submitted. If You
|
| 83 |
+
institute patent litigation against any entity (including a
|
| 84 |
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
| 85 |
+
or a Contribution incorporated within the Work constitutes direct
|
| 86 |
+
or contributory patent infringement, then any patent licenses
|
| 87 |
+
granted to You under this License for that Work shall terminate
|
| 88 |
+
as of the date such litigation is filed.
|
| 89 |
+
|
| 90 |
+
4. Redistribution. You may reproduce and distribute copies of the
|
| 91 |
+
Work or Derivative Works thereof in any medium, with or without
|
| 92 |
+
modifications, and in Source or Object form, provided that You
|
| 93 |
+
meet the following conditions:
|
| 94 |
+
|
| 95 |
+
(a) You must give any other recipients of the Work or
|
| 96 |
+
Derivative Works a copy of this License; and
|
| 97 |
+
|
| 98 |
+
(b) You must cause any modified files to carry prominent notices
|
| 99 |
+
stating that You changed the files; and
|
| 100 |
+
|
| 101 |
+
(c) You must retain, in the Source form of any Derivative Works
|
| 102 |
+
that You distribute, all copyright, patent, trademark, and
|
| 103 |
+
attribution notices from the Source form of the Work,
|
| 104 |
+
excluding those notices that do not pertain to any part of
|
| 105 |
+
the Derivative Works; and
|
| 106 |
+
|
| 107 |
+
(d) If the Work includes a "NOTICE" text file as part of its
|
| 108 |
+
distribution, then any Derivative Works that You distribute must
|
| 109 |
+
include a readable copy of the attribution notices contained
|
| 110 |
+
within such NOTICE file, excluding those notices that do not
|
| 111 |
+
pertain to any part of the Derivative Works, in at least one
|
| 112 |
+
of the following places: within a NOTICE text file distributed
|
| 113 |
+
as part of the Derivative Works; within the Source form or
|
| 114 |
+
documentation, if provided along with the Derivative Works; or,
|
| 115 |
+
within a display generated by the Derivative Works, if and
|
| 116 |
+
wherever such third-party notices normally appear. The contents
|
| 117 |
+
of the NOTICE file are for informational purposes only and
|
| 118 |
+
do not modify the License. You may add Your own attribution
|
| 119 |
+
notices within Derivative Works that You distribute, alongside
|
| 120 |
+
or as an addendum to the NOTICE text from the Work, provided
|
| 121 |
+
that such additional attribution notices cannot be construed
|
| 122 |
+
as modifying the License.
|
| 123 |
+
|
| 124 |
+
You may add Your own copyright statement to Your modifications and
|
| 125 |
+
may provide additional or different license terms and conditions
|
| 126 |
+
for use, reproduction, or distribution of Your modifications, or
|
| 127 |
+
for any such Derivative Works as a whole, provided Your use,
|
| 128 |
+
reproduction, and distribution of the Work otherwise complies with
|
| 129 |
+
the conditions stated in this License.
|
| 130 |
+
|
| 131 |
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
| 132 |
+
any Contribution intentionally submitted for inclusion in the Work
|
| 133 |
+
by You to the Licensor shall be under the terms and conditions of
|
| 134 |
+
this License, without any additional terms or conditions.
|
| 135 |
+
Notwithstanding the above, nothing herein shall supersede or modify
|
| 136 |
+
the terms of any separate license agreement you may have executed
|
| 137 |
+
with Licensor regarding such Contributions.
|
| 138 |
+
|
| 139 |
+
6. Trademarks. This License does not grant permission to use the trade
|
| 140 |
+
names, trademarks, service marks, or product names of the Licensor,
|
| 141 |
+
except as required for reasonable and customary use in describing the
|
| 142 |
+
origin of the Work and reproducing the content of the NOTICE file.
|
| 143 |
+
|
| 144 |
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
| 145 |
+
agreed to in writing, Licensor provides the Work (and each
|
| 146 |
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
| 147 |
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
| 148 |
+
implied, including, without limitation, any warranties or conditions
|
| 149 |
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
| 150 |
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
| 151 |
+
appropriateness of using or redistributing the Work and assume any
|
| 152 |
+
risks associated with Your exercise of permissions under this License.
|
| 153 |
+
|
| 154 |
+
8. Limitation of Liability. In no event and under no legal theory,
|
| 155 |
+
whether in tort (including negligence), contract, or otherwise,
|
| 156 |
+
unless required by applicable law (such as deliberate and grossly
|
| 157 |
+
negligent acts) or agreed to in writing, shall any Contributor be
|
| 158 |
+
liable to You for damages, including any direct, indirect, special,
|
| 159 |
+
incidental, or consequential damages of any character arising as a
|
| 160 |
+
result of this License or out of the use or inability to use the
|
| 161 |
+
Work (including but not limited to damages for loss of goodwill,
|
| 162 |
+
work stoppage, computer failure or malfunction, or any and all
|
| 163 |
+
other commercial damages or losses), even if such Contributor
|
| 164 |
+
has been advised of the possibility of such damages.
|
| 165 |
+
|
| 166 |
+
9. Accepting Warranty or Additional Liability. While redistributing
|
| 167 |
+
the Work or Derivative Works thereof, You may choose to offer,
|
| 168 |
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
| 169 |
+
or other liability obligations and/or rights consistent with this
|
| 170 |
+
License. However, in accepting such obligations, You may act only
|
| 171 |
+
on Your own behalf and on Your sole responsibility, not on behalf
|
| 172 |
+
of any other Contributor, and only if You agree to indemnify,
|
| 173 |
+
defend, and hold each Contributor harmless for any liability
|
| 174 |
+
incurred by, or claims asserted against, such Contributor by reason
|
| 175 |
+
of your accepting any such warranty or additional liability.
|
| 176 |
+
|
| 177 |
+
END OF TERMS AND CONDITIONS
|
.agent/skills/frontend-design/SKILL.md
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: frontend-design
|
| 3 |
+
description: Create distinctive, production-grade frontend interfaces with intentional aesthetics, high craft, and non-generic visual identity. Use when building or styling web UIs, components, pages, dashboards, or frontend applications.
|
| 4 |
+
license: Complete terms in LICENSE.txt
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
# Frontend Design (Distinctive, Production-Grade)
|
| 8 |
+
|
| 9 |
+
You are a **frontend designer-engineer**, not a layout generator.
|
| 10 |
+
|
| 11 |
+
Your goal is to create **memorable, high-craft interfaces** that:
|
| 12 |
+
|
| 13 |
+
* Avoid generic “AI UI” patterns
|
| 14 |
+
* Express a clear aesthetic point of view
|
| 15 |
+
* Are fully functional and production-ready
|
| 16 |
+
* Translate design intent directly into code
|
| 17 |
+
|
| 18 |
+
This skill prioritizes **intentional design systems**, not default frameworks.
|
| 19 |
+
|
| 20 |
+
---
|
| 21 |
+
|
| 22 |
+
## 1. Core Design Mandate
|
| 23 |
+
|
| 24 |
+
Every output must satisfy **all four**:
|
| 25 |
+
|
| 26 |
+
1. **Intentional Aesthetic Direction**
|
| 27 |
+
A named, explicit design stance (e.g. *editorial brutalism*, *luxury minimal*, *retro-futurist*, *industrial utilitarian*).
|
| 28 |
+
|
| 29 |
+
2. **Technical Correctness**
|
| 30 |
+
Real, working HTML/CSS/JS or framework code — not mockups.
|
| 31 |
+
|
| 32 |
+
3. **Visual Memorability**
|
| 33 |
+
At least one element the user will remember 24 hours later.
|
| 34 |
+
|
| 35 |
+
4. **Cohesive Restraint**
|
| 36 |
+
No random decoration. Every flourish must serve the aesthetic thesis.
|
| 37 |
+
|
| 38 |
+
❌ No default layouts
|
| 39 |
+
❌ No design-by-components
|
| 40 |
+
❌ No “safe” palettes or fonts
|
| 41 |
+
✅ Strong opinions, well executed
|
| 42 |
+
|
| 43 |
+
---
|
| 44 |
+
|
| 45 |
+
## 2. Design Feasibility & Impact Index (DFII)
|
| 46 |
+
|
| 47 |
+
Before building, evaluate the design direction using DFII.
|
| 48 |
+
|
| 49 |
+
### DFII Dimensions (1–5)
|
| 50 |
+
|
| 51 |
+
| Dimension | Question |
|
| 52 |
+
| ------------------------------ | ------------------------------------------------------------ |
|
| 53 |
+
| **Aesthetic Impact** | How visually distinctive and memorable is this direction? |
|
| 54 |
+
| **Context Fit** | Does this aesthetic suit the product, audience, and purpose? |
|
| 55 |
+
| **Implementation Feasibility** | Can this be built cleanly with available tech? |
|
| 56 |
+
| **Performance Safety** | Will it remain fast and accessible? |
|
| 57 |
+
| **Consistency Risk** | Can this be maintained across screens/components? |
|
| 58 |
+
|
| 59 |
+
### Scoring Formula
|
| 60 |
+
|
| 61 |
+
```
|
| 62 |
+
DFII = (Impact + Fit + Feasibility + Performance) − Consistency Risk
|
| 63 |
+
```
|
| 64 |
+
|
| 65 |
+
**Range:** `-5 → +15`
|
| 66 |
+
|
| 67 |
+
### Interpretation
|
| 68 |
+
|
| 69 |
+
| DFII | Meaning | Action |
|
| 70 |
+
| --------- | --------- | --------------------------- |
|
| 71 |
+
| **12–15** | Excellent | Execute fully |
|
| 72 |
+
| **8–11** | Strong | Proceed with discipline |
|
| 73 |
+
| **4–7** | Risky | Reduce scope or effects |
|
| 74 |
+
| **≤ 3** | Weak | Rethink aesthetic direction |
|
| 75 |
+
|
| 76 |
+
---
|
| 77 |
+
|
| 78 |
+
## 3. Mandatory Design Thinking Phase
|
| 79 |
+
|
| 80 |
+
Before writing code, explicitly define:
|
| 81 |
+
|
| 82 |
+
### 1. Purpose
|
| 83 |
+
|
| 84 |
+
* What action should this interface enable?
|
| 85 |
+
* Is it persuasive, functional, exploratory, or expressive?
|
| 86 |
+
|
| 87 |
+
### 2. Tone (Choose One Dominant Direction)
|
| 88 |
+
|
| 89 |
+
Examples (non-exhaustive):
|
| 90 |
+
|
| 91 |
+
* Brutalist / Raw
|
| 92 |
+
* Editorial / Magazine
|
| 93 |
+
* Luxury / Refined
|
| 94 |
+
* Retro-futuristic
|
| 95 |
+
* Industrial / Utilitarian
|
| 96 |
+
* Organic / Natural
|
| 97 |
+
* Playful / Toy-like
|
| 98 |
+
* Maximalist / Chaotic
|
| 99 |
+
* Minimalist / Severe
|
| 100 |
+
|
| 101 |
+
⚠️ Do not blend more than **two**.
|
| 102 |
+
|
| 103 |
+
### 3. Differentiation Anchor
|
| 104 |
+
|
| 105 |
+
Answer:
|
| 106 |
+
|
| 107 |
+
> “If this were screenshotted with the logo removed, how would someone recognize it?”
|
| 108 |
+
|
| 109 |
+
This anchor must be visible in the final UI.
|
| 110 |
+
|
| 111 |
+
---
|
| 112 |
+
|
| 113 |
+
## 4. Aesthetic Execution Rules (Non-Negotiable)
|
| 114 |
+
|
| 115 |
+
### Typography
|
| 116 |
+
|
| 117 |
+
* Avoid system fonts and AI-defaults (Inter, Roboto, Arial, etc.)
|
| 118 |
+
* Choose:
|
| 119 |
+
|
| 120 |
+
* 1 expressive display font
|
| 121 |
+
* 1 restrained body font
|
| 122 |
+
* Use typography structurally (scale, rhythm, contrast)
|
| 123 |
+
|
| 124 |
+
### Color & Theme
|
| 125 |
+
|
| 126 |
+
* Commit to a **dominant color story**
|
| 127 |
+
* Use CSS variables exclusively
|
| 128 |
+
* Prefer:
|
| 129 |
+
|
| 130 |
+
* One dominant tone
|
| 131 |
+
* One accent
|
| 132 |
+
* One neutral system
|
| 133 |
+
* Avoid evenly-balanced palettes
|
| 134 |
+
|
| 135 |
+
### Spatial Composition
|
| 136 |
+
|
| 137 |
+
* Break the grid intentionally
|
| 138 |
+
* Use:
|
| 139 |
+
|
| 140 |
+
* Asymmetry
|
| 141 |
+
* Overlap
|
| 142 |
+
* Negative space OR controlled density
|
| 143 |
+
* White space is a design element, not absence
|
| 144 |
+
|
| 145 |
+
### Motion
|
| 146 |
+
|
| 147 |
+
* Motion must be:
|
| 148 |
+
|
| 149 |
+
* Purposeful
|
| 150 |
+
* Sparse
|
| 151 |
+
* High-impact
|
| 152 |
+
* Prefer:
|
| 153 |
+
|
| 154 |
+
* One strong entrance sequence
|
| 155 |
+
* A few meaningful hover states
|
| 156 |
+
* Avoid decorative micro-motion spam
|
| 157 |
+
|
| 158 |
+
### Texture & Depth
|
| 159 |
+
|
| 160 |
+
Use when appropriate:
|
| 161 |
+
|
| 162 |
+
* Noise / grain overlays
|
| 163 |
+
* Gradient meshes
|
| 164 |
+
* Layered translucency
|
| 165 |
+
* Custom borders or dividers
|
| 166 |
+
* Shadows with narrative intent (not defaults)
|
| 167 |
+
|
| 168 |
+
---
|
| 169 |
+
|
| 170 |
+
## 5. Implementation Standards
|
| 171 |
+
|
| 172 |
+
### Code Requirements
|
| 173 |
+
|
| 174 |
+
* Clean, readable, and modular
|
| 175 |
+
* No dead styles
|
| 176 |
+
* No unused animations
|
| 177 |
+
* Semantic HTML
|
| 178 |
+
* Accessible by default (contrast, focus, keyboard)
|
| 179 |
+
|
| 180 |
+
### Framework Guidance
|
| 181 |
+
|
| 182 |
+
* **HTML/CSS**: Prefer native features, modern CSS
|
| 183 |
+
* **React**: Functional components, composable styles
|
| 184 |
+
* **Animation**:
|
| 185 |
+
|
| 186 |
+
* CSS-first
|
| 187 |
+
* Framer Motion only when justified
|
| 188 |
+
|
| 189 |
+
### Complexity Matching
|
| 190 |
+
|
| 191 |
+
* Maximalist design → complex code (animations, layers)
|
| 192 |
+
* Minimalist design → extremely precise spacing & type
|
| 193 |
+
|
| 194 |
+
Mismatch = failure.
|
| 195 |
+
|
| 196 |
+
---
|
| 197 |
+
|
| 198 |
+
## 6. Required Output Structure
|
| 199 |
+
|
| 200 |
+
When generating frontend work:
|
| 201 |
+
|
| 202 |
+
### 1. Design Direction Summary
|
| 203 |
+
|
| 204 |
+
* Aesthetic name
|
| 205 |
+
* DFII score
|
| 206 |
+
* Key inspiration (conceptual, not visual plagiarism)
|
| 207 |
+
|
| 208 |
+
### 2. Design System Snapshot
|
| 209 |
+
|
| 210 |
+
* Fonts (with rationale)
|
| 211 |
+
* Color variables
|
| 212 |
+
* Spacing rhythm
|
| 213 |
+
* Motion philosophy
|
| 214 |
+
|
| 215 |
+
### 3. Implementation
|
| 216 |
+
|
| 217 |
+
* Full working code
|
| 218 |
+
* Comments only where intent isn’t obvious
|
| 219 |
+
|
| 220 |
+
### 4. Differentiation Callout
|
| 221 |
+
|
| 222 |
+
Explicitly state:
|
| 223 |
+
|
| 224 |
+
> “This avoids generic UI by doing X instead of Y.”
|
| 225 |
+
|
| 226 |
+
---
|
| 227 |
+
|
| 228 |
+
## 7. Anti-Patterns (Immediate Failure)
|
| 229 |
+
|
| 230 |
+
❌ Inter/Roboto/system fonts
|
| 231 |
+
❌ Purple-on-white SaaS gradients
|
| 232 |
+
❌ Default Tailwind/ShadCN layouts
|
| 233 |
+
❌ Symmetrical, predictable sections
|
| 234 |
+
❌ Overused AI design tropes
|
| 235 |
+
❌ Decoration without intent
|
| 236 |
+
|
| 237 |
+
If the design could be mistaken for a template → restart.
|
| 238 |
+
|
| 239 |
+
---
|
| 240 |
+
|
| 241 |
+
## 8. Integration With Other Skills
|
| 242 |
+
|
| 243 |
+
* **page-cro** → Layout hierarchy & conversion flow
|
| 244 |
+
* **copywriting** → Typography & message rhythm
|
| 245 |
+
* **marketing-psychology** → Visual persuasion & bias alignment
|
| 246 |
+
* **branding** → Visual identity consistency
|
| 247 |
+
* **ab-test-setup** → Variant-safe design systems
|
| 248 |
+
|
| 249 |
+
---
|
| 250 |
+
|
| 251 |
+
## 9. Operator Checklist
|
| 252 |
+
|
| 253 |
+
Before finalizing output:
|
| 254 |
+
|
| 255 |
+
* [ ] Clear aesthetic direction stated
|
| 256 |
+
* [ ] DFII ≥ 8
|
| 257 |
+
* [ ] One memorable design anchor
|
| 258 |
+
* [ ] No generic fonts/colors/layouts
|
| 259 |
+
* [ ] Code matches design ambition
|
| 260 |
+
* [ ] Accessible and performant
|
| 261 |
+
|
| 262 |
+
---
|
| 263 |
+
|
| 264 |
+
## 10. Questions to Ask (If Needed)
|
| 265 |
+
|
| 266 |
+
1. Who is this for, emotionally?
|
| 267 |
+
2. Should this feel trustworthy, exciting, calm, or provocative?
|
| 268 |
+
3. Is memorability or clarity more important?
|
| 269 |
+
4. Will this scale to other pages/components?
|
| 270 |
+
5. What should users *feel* in the first 3 seconds?
|
| 271 |
+
|
| 272 |
+
---
|
.agent/skills/llm-evaluation/SKILL.md
ADDED
|
@@ -0,0 +1,483 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: llm-evaluation
|
| 3 |
+
description: Implement comprehensive evaluation strategies for LLM applications using automated metrics, human feedback, and benchmarking. Use when testing LLM performance, measuring AI application quality, or establishing evaluation frameworks.
|
| 4 |
+
---
|
| 5 |
+
|
| 6 |
+
# LLM Evaluation
|
| 7 |
+
|
| 8 |
+
Master comprehensive evaluation strategies for LLM applications, from automated metrics to human evaluation and A/B testing.
|
| 9 |
+
|
| 10 |
+
## Do not use this skill when
|
| 11 |
+
|
| 12 |
+
- The task is unrelated to llm evaluation
|
| 13 |
+
- You need a different domain or tool outside this scope
|
| 14 |
+
|
| 15 |
+
## Instructions
|
| 16 |
+
|
| 17 |
+
- Clarify goals, constraints, and required inputs.
|
| 18 |
+
- Apply relevant best practices and validate outcomes.
|
| 19 |
+
- Provide actionable steps and verification.
|
| 20 |
+
- If detailed examples are required, open `resources/implementation-playbook.md`.
|
| 21 |
+
|
| 22 |
+
## Use this skill when
|
| 23 |
+
|
| 24 |
+
- Measuring LLM application performance systematically
|
| 25 |
+
- Comparing different models or prompts
|
| 26 |
+
- Detecting performance regressions before deployment
|
| 27 |
+
- Validating improvements from prompt changes
|
| 28 |
+
- Building confidence in production systems
|
| 29 |
+
- Establishing baselines and tracking progress over time
|
| 30 |
+
- Debugging unexpected model behavior
|
| 31 |
+
|
| 32 |
+
## Core Evaluation Types
|
| 33 |
+
|
| 34 |
+
### 1. Automated Metrics
|
| 35 |
+
Fast, repeatable, scalable evaluation using computed scores.
|
| 36 |
+
|
| 37 |
+
**Text Generation:**
|
| 38 |
+
- **BLEU**: N-gram overlap (translation)
|
| 39 |
+
- **ROUGE**: Recall-oriented (summarization)
|
| 40 |
+
- **METEOR**: Semantic similarity
|
| 41 |
+
- **BERTScore**: Embedding-based similarity
|
| 42 |
+
- **Perplexity**: Language model confidence
|
| 43 |
+
|
| 44 |
+
**Classification:**
|
| 45 |
+
- **Accuracy**: Percentage correct
|
| 46 |
+
- **Precision/Recall/F1**: Class-specific performance
|
| 47 |
+
- **Confusion Matrix**: Error patterns
|
| 48 |
+
- **AUC-ROC**: Ranking quality
|
| 49 |
+
|
| 50 |
+
**Retrieval (RAG):**
|
| 51 |
+
- **MRR**: Mean Reciprocal Rank
|
| 52 |
+
- **NDCG**: Normalized Discounted Cumulative Gain
|
| 53 |
+
- **Precision@K**: Relevant in top K
|
| 54 |
+
- **Recall@K**: Coverage in top K
|
| 55 |
+
|
| 56 |
+
### 2. Human Evaluation
|
| 57 |
+
Manual assessment for quality aspects difficult to automate.
|
| 58 |
+
|
| 59 |
+
**Dimensions:**
|
| 60 |
+
- **Accuracy**: Factual correctness
|
| 61 |
+
- **Coherence**: Logical flow
|
| 62 |
+
- **Relevance**: Answers the question
|
| 63 |
+
- **Fluency**: Natural language quality
|
| 64 |
+
- **Safety**: No harmful content
|
| 65 |
+
- **Helpfulness**: Useful to the user
|
| 66 |
+
|
| 67 |
+
### 3. LLM-as-Judge
|
| 68 |
+
Use stronger LLMs to evaluate weaker model outputs.
|
| 69 |
+
|
| 70 |
+
**Approaches:**
|
| 71 |
+
- **Pointwise**: Score individual responses
|
| 72 |
+
- **Pairwise**: Compare two responses
|
| 73 |
+
- **Reference-based**: Compare to gold standard
|
| 74 |
+
- **Reference-free**: Judge without ground truth
|
| 75 |
+
|
| 76 |
+
## Quick Start
|
| 77 |
+
|
| 78 |
+
```python
|
| 79 |
+
from llm_eval import EvaluationSuite, Metric
|
| 80 |
+
|
| 81 |
+
# Define evaluation suite
|
| 82 |
+
suite = EvaluationSuite([
|
| 83 |
+
Metric.accuracy(),
|
| 84 |
+
Metric.bleu(),
|
| 85 |
+
Metric.bertscore(),
|
| 86 |
+
Metric.custom(name="groundedness", fn=check_groundedness)
|
| 87 |
+
])
|
| 88 |
+
|
| 89 |
+
# Prepare test cases
|
| 90 |
+
test_cases = [
|
| 91 |
+
{
|
| 92 |
+
"input": "What is the capital of France?",
|
| 93 |
+
"expected": "Paris",
|
| 94 |
+
"context": "France is a country in Europe. Paris is its capital."
|
| 95 |
+
},
|
| 96 |
+
# ... more test cases
|
| 97 |
+
]
|
| 98 |
+
|
| 99 |
+
# Run evaluation
|
| 100 |
+
results = suite.evaluate(
|
| 101 |
+
model=your_model,
|
| 102 |
+
test_cases=test_cases
|
| 103 |
+
)
|
| 104 |
+
|
| 105 |
+
print(f"Overall Accuracy: {results.metrics['accuracy']}")
|
| 106 |
+
print(f"BLEU Score: {results.metrics['bleu']}")
|
| 107 |
+
```
|
| 108 |
+
|
| 109 |
+
## Automated Metrics Implementation
|
| 110 |
+
|
| 111 |
+
### BLEU Score
|
| 112 |
+
```python
|
| 113 |
+
from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
|
| 114 |
+
|
| 115 |
+
def calculate_bleu(reference, hypothesis):
|
| 116 |
+
"""Calculate BLEU score between reference and hypothesis."""
|
| 117 |
+
smoothie = SmoothingFunction().method4
|
| 118 |
+
|
| 119 |
+
return sentence_bleu(
|
| 120 |
+
[reference.split()],
|
| 121 |
+
hypothesis.split(),
|
| 122 |
+
smoothing_function=smoothie
|
| 123 |
+
)
|
| 124 |
+
|
| 125 |
+
# Usage
|
| 126 |
+
bleu = calculate_bleu(
|
| 127 |
+
reference="The cat sat on the mat",
|
| 128 |
+
hypothesis="A cat is sitting on the mat"
|
| 129 |
+
)
|
| 130 |
+
```
|
| 131 |
+
|
| 132 |
+
### ROUGE Score
|
| 133 |
+
```python
|
| 134 |
+
from rouge_score import rouge_scorer
|
| 135 |
+
|
| 136 |
+
def calculate_rouge(reference, hypothesis):
|
| 137 |
+
"""Calculate ROUGE scores."""
|
| 138 |
+
scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True)
|
| 139 |
+
scores = scorer.score(reference, hypothesis)
|
| 140 |
+
|
| 141 |
+
return {
|
| 142 |
+
'rouge1': scores['rouge1'].fmeasure,
|
| 143 |
+
'rouge2': scores['rouge2'].fmeasure,
|
| 144 |
+
'rougeL': scores['rougeL'].fmeasure
|
| 145 |
+
}
|
| 146 |
+
```
|
| 147 |
+
|
| 148 |
+
### BERTScore
|
| 149 |
+
```python
|
| 150 |
+
from bert_score import score
|
| 151 |
+
|
| 152 |
+
def calculate_bertscore(references, hypotheses):
|
| 153 |
+
"""Calculate BERTScore using pre-trained BERT."""
|
| 154 |
+
P, R, F1 = score(
|
| 155 |
+
hypotheses,
|
| 156 |
+
references,
|
| 157 |
+
lang='en',
|
| 158 |
+
model_type='microsoft/deberta-xlarge-mnli'
|
| 159 |
+
)
|
| 160 |
+
|
| 161 |
+
return {
|
| 162 |
+
'precision': P.mean().item(),
|
| 163 |
+
'recall': R.mean().item(),
|
| 164 |
+
'f1': F1.mean().item()
|
| 165 |
+
}
|
| 166 |
+
```
|
| 167 |
+
|
| 168 |
+
### Custom Metrics
|
| 169 |
+
```python
|
| 170 |
+
def calculate_groundedness(response, context):
|
| 171 |
+
"""Check if response is grounded in provided context."""
|
| 172 |
+
# Use NLI model to check entailment
|
| 173 |
+
from transformers import pipeline
|
| 174 |
+
|
| 175 |
+
nli = pipeline("text-classification", model="microsoft/deberta-large-mnli")
|
| 176 |
+
|
| 177 |
+
result = nli(f"{context} [SEP] {response}")[0]
|
| 178 |
+
|
| 179 |
+
# Return confidence that response is entailed by context
|
| 180 |
+
return result['score'] if result['label'] == 'ENTAILMENT' else 0.0
|
| 181 |
+
|
| 182 |
+
def calculate_toxicity(text):
|
| 183 |
+
"""Measure toxicity in generated text."""
|
| 184 |
+
from detoxify import Detoxify
|
| 185 |
+
|
| 186 |
+
results = Detoxify('original').predict(text)
|
| 187 |
+
return max(results.values()) # Return highest toxicity score
|
| 188 |
+
|
| 189 |
+
def calculate_factuality(claim, knowledge_base):
|
| 190 |
+
"""Verify factual claims against knowledge base."""
|
| 191 |
+
# Implementation depends on your knowledge base
|
| 192 |
+
# Could use retrieval + NLI, or fact-checking API
|
| 193 |
+
pass
|
| 194 |
+
```
|
| 195 |
+
|
| 196 |
+
## LLM-as-Judge Patterns
|
| 197 |
+
|
| 198 |
+
### Single Output Evaluation
|
| 199 |
+
```python
|
| 200 |
+
def llm_judge_quality(response, question):
|
| 201 |
+
"""Use GPT-5 to judge response quality."""
|
| 202 |
+
prompt = f"""Rate the following response on a scale of 1-10 for:
|
| 203 |
+
1. Accuracy (factually correct)
|
| 204 |
+
2. Helpfulness (answers the question)
|
| 205 |
+
3. Clarity (well-written and understandable)
|
| 206 |
+
|
| 207 |
+
Question: {question}
|
| 208 |
+
Response: {response}
|
| 209 |
+
|
| 210 |
+
Provide ratings in JSON format:
|
| 211 |
+
{{
|
| 212 |
+
"accuracy": <1-10>,
|
| 213 |
+
"helpfulness": <1-10>,
|
| 214 |
+
"clarity": <1-10>,
|
| 215 |
+
"reasoning": "<brief explanation>"
|
| 216 |
+
}}
|
| 217 |
+
"""
|
| 218 |
+
|
| 219 |
+
result = openai.ChatCompletion.create(
|
| 220 |
+
model="gpt-5",
|
| 221 |
+
messages=[{"role": "user", "content": prompt}],
|
| 222 |
+
temperature=0
|
| 223 |
+
)
|
| 224 |
+
|
| 225 |
+
return json.loads(result.choices[0].message.content)
|
| 226 |
+
```
|
| 227 |
+
|
| 228 |
+
### Pairwise Comparison
|
| 229 |
+
```python
|
| 230 |
+
def compare_responses(question, response_a, response_b):
|
| 231 |
+
"""Compare two responses using LLM judge."""
|
| 232 |
+
prompt = f"""Compare these two responses to the question and determine which is better.
|
| 233 |
+
|
| 234 |
+
Question: {question}
|
| 235 |
+
|
| 236 |
+
Response A: {response_a}
|
| 237 |
+
|
| 238 |
+
Response B: {response_b}
|
| 239 |
+
|
| 240 |
+
Which response is better and why? Consider accuracy, helpfulness, and clarity.
|
| 241 |
+
|
| 242 |
+
Answer with JSON:
|
| 243 |
+
{{
|
| 244 |
+
"winner": "A" or "B" or "tie",
|
| 245 |
+
"reasoning": "<explanation>",
|
| 246 |
+
"confidence": <1-10>
|
| 247 |
+
}}
|
| 248 |
+
"""
|
| 249 |
+
|
| 250 |
+
result = openai.ChatCompletion.create(
|
| 251 |
+
model="gpt-5",
|
| 252 |
+
messages=[{"role": "user", "content": prompt}],
|
| 253 |
+
temperature=0
|
| 254 |
+
)
|
| 255 |
+
|
| 256 |
+
return json.loads(result.choices[0].message.content)
|
| 257 |
+
```
|
| 258 |
+
|
| 259 |
+
## Human Evaluation Frameworks
|
| 260 |
+
|
| 261 |
+
### Annotation Guidelines
|
| 262 |
+
```python
|
| 263 |
+
class AnnotationTask:
|
| 264 |
+
"""Structure for human annotation task."""
|
| 265 |
+
|
| 266 |
+
def __init__(self, response, question, context=None):
|
| 267 |
+
self.response = response
|
| 268 |
+
self.question = question
|
| 269 |
+
self.context = context
|
| 270 |
+
|
| 271 |
+
def get_annotation_form(self):
|
| 272 |
+
return {
|
| 273 |
+
"question": self.question,
|
| 274 |
+
"context": self.context,
|
| 275 |
+
"response": self.response,
|
| 276 |
+
"ratings": {
|
| 277 |
+
"accuracy": {
|
| 278 |
+
"scale": "1-5",
|
| 279 |
+
"description": "Is the response factually correct?"
|
| 280 |
+
},
|
| 281 |
+
"relevance": {
|
| 282 |
+
"scale": "1-5",
|
| 283 |
+
"description": "Does it answer the question?"
|
| 284 |
+
},
|
| 285 |
+
"coherence": {
|
| 286 |
+
"scale": "1-5",
|
| 287 |
+
"description": "Is it logically consistent?"
|
| 288 |
+
}
|
| 289 |
+
},
|
| 290 |
+
"issues": {
|
| 291 |
+
"factual_error": False,
|
| 292 |
+
"hallucination": False,
|
| 293 |
+
"off_topic": False,
|
| 294 |
+
"unsafe_content": False
|
| 295 |
+
},
|
| 296 |
+
"feedback": ""
|
| 297 |
+
}
|
| 298 |
+
```
|
| 299 |
+
|
| 300 |
+
### Inter-Rater Agreement
|
| 301 |
+
```python
|
| 302 |
+
from sklearn.metrics import cohen_kappa_score
|
| 303 |
+
|
| 304 |
+
def calculate_agreement(rater1_scores, rater2_scores):
|
| 305 |
+
"""Calculate inter-rater agreement."""
|
| 306 |
+
kappa = cohen_kappa_score(rater1_scores, rater2_scores)
|
| 307 |
+
|
| 308 |
+
interpretation = {
|
| 309 |
+
kappa < 0: "Poor",
|
| 310 |
+
kappa < 0.2: "Slight",
|
| 311 |
+
kappa < 0.4: "Fair",
|
| 312 |
+
kappa < 0.6: "Moderate",
|
| 313 |
+
kappa < 0.8: "Substantial",
|
| 314 |
+
kappa <= 1.0: "Almost Perfect"
|
| 315 |
+
}
|
| 316 |
+
|
| 317 |
+
return {
|
| 318 |
+
"kappa": kappa,
|
| 319 |
+
"interpretation": interpretation[True]
|
| 320 |
+
}
|
| 321 |
+
```
|
| 322 |
+
|
| 323 |
+
## A/B Testing
|
| 324 |
+
|
| 325 |
+
### Statistical Testing Framework
|
| 326 |
+
```python
|
| 327 |
+
from scipy import stats
|
| 328 |
+
import numpy as np
|
| 329 |
+
|
| 330 |
+
class ABTest:
|
| 331 |
+
def __init__(self, variant_a_name="A", variant_b_name="B"):
|
| 332 |
+
self.variant_a = {"name": variant_a_name, "scores": []}
|
| 333 |
+
self.variant_b = {"name": variant_b_name, "scores": []}
|
| 334 |
+
|
| 335 |
+
def add_result(self, variant, score):
|
| 336 |
+
"""Add evaluation result for a variant."""
|
| 337 |
+
if variant == "A":
|
| 338 |
+
self.variant_a["scores"].append(score)
|
| 339 |
+
else:
|
| 340 |
+
self.variant_b["scores"].append(score)
|
| 341 |
+
|
| 342 |
+
def analyze(self, alpha=0.05):
|
| 343 |
+
"""Perform statistical analysis."""
|
| 344 |
+
a_scores = self.variant_a["scores"]
|
| 345 |
+
b_scores = self.variant_b["scores"]
|
| 346 |
+
|
| 347 |
+
# T-test
|
| 348 |
+
t_stat, p_value = stats.ttest_ind(a_scores, b_scores)
|
| 349 |
+
|
| 350 |
+
# Effect size (Cohen's d)
|
| 351 |
+
pooled_std = np.sqrt((np.std(a_scores)**2 + np.std(b_scores)**2) / 2)
|
| 352 |
+
cohens_d = (np.mean(b_scores) - np.mean(a_scores)) / pooled_std
|
| 353 |
+
|
| 354 |
+
return {
|
| 355 |
+
"variant_a_mean": np.mean(a_scores),
|
| 356 |
+
"variant_b_mean": np.mean(b_scores),
|
| 357 |
+
"difference": np.mean(b_scores) - np.mean(a_scores),
|
| 358 |
+
"relative_improvement": (np.mean(b_scores) - np.mean(a_scores)) / np.mean(a_scores),
|
| 359 |
+
"p_value": p_value,
|
| 360 |
+
"statistically_significant": p_value < alpha,
|
| 361 |
+
"cohens_d": cohens_d,
|
| 362 |
+
"effect_size": self.interpret_cohens_d(cohens_d),
|
| 363 |
+
"winner": "B" if np.mean(b_scores) > np.mean(a_scores) else "A"
|
| 364 |
+
}
|
| 365 |
+
|
| 366 |
+
@staticmethod
|
| 367 |
+
def interpret_cohens_d(d):
|
| 368 |
+
"""Interpret Cohen's d effect size."""
|
| 369 |
+
abs_d = abs(d)
|
| 370 |
+
if abs_d < 0.2:
|
| 371 |
+
return "negligible"
|
| 372 |
+
elif abs_d < 0.5:
|
| 373 |
+
return "small"
|
| 374 |
+
elif abs_d < 0.8:
|
| 375 |
+
return "medium"
|
| 376 |
+
else:
|
| 377 |
+
return "large"
|
| 378 |
+
```
|
| 379 |
+
|
| 380 |
+
## Regression Testing
|
| 381 |
+
|
| 382 |
+
### Regression Detection
|
| 383 |
+
```python
|
| 384 |
+
class RegressionDetector:
|
| 385 |
+
def __init__(self, baseline_results, threshold=0.05):
|
| 386 |
+
self.baseline = baseline_results
|
| 387 |
+
self.threshold = threshold
|
| 388 |
+
|
| 389 |
+
def check_for_regression(self, new_results):
|
| 390 |
+
"""Detect if new results show regression."""
|
| 391 |
+
regressions = []
|
| 392 |
+
|
| 393 |
+
for metric in self.baseline.keys():
|
| 394 |
+
baseline_score = self.baseline[metric]
|
| 395 |
+
new_score = new_results.get(metric)
|
| 396 |
+
|
| 397 |
+
if new_score is None:
|
| 398 |
+
continue
|
| 399 |
+
|
| 400 |
+
# Calculate relative change
|
| 401 |
+
relative_change = (new_score - baseline_score) / baseline_score
|
| 402 |
+
|
| 403 |
+
# Flag if significant decrease
|
| 404 |
+
if relative_change < -self.threshold:
|
| 405 |
+
regressions.append({
|
| 406 |
+
"metric": metric,
|
| 407 |
+
"baseline": baseline_score,
|
| 408 |
+
"current": new_score,
|
| 409 |
+
"change": relative_change
|
| 410 |
+
})
|
| 411 |
+
|
| 412 |
+
return {
|
| 413 |
+
"has_regression": len(regressions) > 0,
|
| 414 |
+
"regressions": regressions
|
| 415 |
+
}
|
| 416 |
+
```
|
| 417 |
+
|
| 418 |
+
## Benchmarking
|
| 419 |
+
|
| 420 |
+
### Running Benchmarks
|
| 421 |
+
```python
|
| 422 |
+
class BenchmarkRunner:
|
| 423 |
+
def __init__(self, benchmark_dataset):
|
| 424 |
+
self.dataset = benchmark_dataset
|
| 425 |
+
|
| 426 |
+
def run_benchmark(self, model, metrics):
|
| 427 |
+
"""Run model on benchmark and calculate metrics."""
|
| 428 |
+
results = {metric.name: [] for metric in metrics}
|
| 429 |
+
|
| 430 |
+
for example in self.dataset:
|
| 431 |
+
# Generate prediction
|
| 432 |
+
prediction = model.predict(example["input"])
|
| 433 |
+
|
| 434 |
+
# Calculate each metric
|
| 435 |
+
for metric in metrics:
|
| 436 |
+
score = metric.calculate(
|
| 437 |
+
prediction=prediction,
|
| 438 |
+
reference=example["reference"],
|
| 439 |
+
context=example.get("context")
|
| 440 |
+
)
|
| 441 |
+
results[metric.name].append(score)
|
| 442 |
+
|
| 443 |
+
# Aggregate results
|
| 444 |
+
return {
|
| 445 |
+
metric: {
|
| 446 |
+
"mean": np.mean(scores),
|
| 447 |
+
"std": np.std(scores),
|
| 448 |
+
"min": min(scores),
|
| 449 |
+
"max": max(scores)
|
| 450 |
+
}
|
| 451 |
+
for metric, scores in results.items()
|
| 452 |
+
}
|
| 453 |
+
```
|
| 454 |
+
|
| 455 |
+
## Resources
|
| 456 |
+
|
| 457 |
+
- **references/metrics.md**: Comprehensive metric guide
|
| 458 |
+
- **references/human-evaluation.md**: Annotation best practices
|
| 459 |
+
- **references/benchmarking.md**: Standard benchmarks
|
| 460 |
+
- **references/a-b-testing.md**: Statistical testing guide
|
| 461 |
+
- **references/regression-testing.md**: CI/CD integration
|
| 462 |
+
- **assets/evaluation-framework.py**: Complete evaluation harness
|
| 463 |
+
- **assets/benchmark-dataset.jsonl**: Example datasets
|
| 464 |
+
- **scripts/evaluate-model.py**: Automated evaluation runner
|
| 465 |
+
|
| 466 |
+
## Best Practices
|
| 467 |
+
|
| 468 |
+
1. **Multiple Metrics**: Use diverse metrics for comprehensive view
|
| 469 |
+
2. **Representative Data**: Test on real-world, diverse examples
|
| 470 |
+
3. **Baselines**: Always compare against baseline performance
|
| 471 |
+
4. **Statistical Rigor**: Use proper statistical tests for comparisons
|
| 472 |
+
5. **Continuous Evaluation**: Integrate into CI/CD pipeline
|
| 473 |
+
6. **Human Validation**: Combine automated metrics with human judgment
|
| 474 |
+
7. **Error Analysis**: Investigate failures to understand weaknesses
|
| 475 |
+
8. **Version Control**: Track evaluation results over time
|
| 476 |
+
|
| 477 |
+
## Common Pitfalls
|
| 478 |
+
|
| 479 |
+
- **Single Metric Obsession**: Optimizing for one metric at the expense of others
|
| 480 |
+
- **Small Sample Size**: Drawing conclusions from too few examples
|
| 481 |
+
- **Data Contamination**: Testing on training data
|
| 482 |
+
- **Ignoring Variance**: Not accounting for statistical uncertainty
|
| 483 |
+
- **Metric Mismatch**: Using metrics not aligned with business goals
|
.agent/skills/python-performance-optimization/SKILL.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: python-performance-optimization
|
| 3 |
+
description: Profile and optimize Python code using cProfile, memory profilers, and performance best practices. Use when debugging slow Python code, optimizing bottlenecks, or improving application performance.
|
| 4 |
+
---
|
| 5 |
+
|
| 6 |
+
# Python Performance Optimization
|
| 7 |
+
|
| 8 |
+
Comprehensive guide to profiling, analyzing, and optimizing Python code for better performance, including CPU profiling, memory optimization, and implementation best practices.
|
| 9 |
+
|
| 10 |
+
## Use this skill when
|
| 11 |
+
|
| 12 |
+
- Identifying performance bottlenecks in Python applications
|
| 13 |
+
- Reducing application latency and response times
|
| 14 |
+
- Optimizing CPU-intensive operations
|
| 15 |
+
- Reducing memory consumption and memory leaks
|
| 16 |
+
- Improving database query performance
|
| 17 |
+
- Optimizing I/O operations
|
| 18 |
+
- Speeding up data processing pipelines
|
| 19 |
+
- Implementing high-performance algorithms
|
| 20 |
+
- Profiling production applications
|
| 21 |
+
|
| 22 |
+
## Do not use this skill when
|
| 23 |
+
|
| 24 |
+
- The task is unrelated to python performance optimization
|
| 25 |
+
- You need a different domain or tool outside this scope
|
| 26 |
+
|
| 27 |
+
## Instructions
|
| 28 |
+
|
| 29 |
+
- Clarify goals, constraints, and required inputs.
|
| 30 |
+
- Apply relevant best practices and validate outcomes.
|
| 31 |
+
- Provide actionable steps and verification.
|
| 32 |
+
- If detailed examples are required, open `resources/implementation-playbook.md`.
|
| 33 |
+
|
| 34 |
+
## Resources
|
| 35 |
+
|
| 36 |
+
- `resources/implementation-playbook.md` for detailed patterns and examples.
|
.agent/skills/python-performance-optimization/resources/implementation-playbook.md
ADDED
|
@@ -0,0 +1,868 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Python Performance Optimization Implementation Playbook
|
| 2 |
+
|
| 3 |
+
This file contains detailed patterns, checklists, and code samples referenced by the skill.
|
| 4 |
+
|
| 5 |
+
# Python Performance Optimization
|
| 6 |
+
|
| 7 |
+
Comprehensive guide to profiling, analyzing, and optimizing Python code for better performance, including CPU profiling, memory optimization, and implementation best practices.
|
| 8 |
+
|
| 9 |
+
## When to Use This Skill
|
| 10 |
+
|
| 11 |
+
- Identifying performance bottlenecks in Python applications
|
| 12 |
+
- Reducing application latency and response times
|
| 13 |
+
- Optimizing CPU-intensive operations
|
| 14 |
+
- Reducing memory consumption and memory leaks
|
| 15 |
+
- Improving database query performance
|
| 16 |
+
- Optimizing I/O operations
|
| 17 |
+
- Speeding up data processing pipelines
|
| 18 |
+
- Implementing high-performance algorithms
|
| 19 |
+
- Profiling production applications
|
| 20 |
+
|
| 21 |
+
## Core Concepts
|
| 22 |
+
|
| 23 |
+
### 1. Profiling Types
|
| 24 |
+
- **CPU Profiling**: Identify time-consuming functions
|
| 25 |
+
- **Memory Profiling**: Track memory allocation and leaks
|
| 26 |
+
- **Line Profiling**: Profile at line-by-line granularity
|
| 27 |
+
- **Call Graph**: Visualize function call relationships
|
| 28 |
+
|
| 29 |
+
### 2. Performance Metrics
|
| 30 |
+
- **Execution Time**: How long operations take
|
| 31 |
+
- **Memory Usage**: Peak and average memory consumption
|
| 32 |
+
- **CPU Utilization**: Processor usage patterns
|
| 33 |
+
- **I/O Wait**: Time spent on I/O operations
|
| 34 |
+
|
| 35 |
+
### 3. Optimization Strategies
|
| 36 |
+
- **Algorithmic**: Better algorithms and data structures
|
| 37 |
+
- **Implementation**: More efficient code patterns
|
| 38 |
+
- **Parallelization**: Multi-threading/processing
|
| 39 |
+
- **Caching**: Avoid redundant computation
|
| 40 |
+
- **Native Extensions**: C/Rust for critical paths
|
| 41 |
+
|
| 42 |
+
## Quick Start
|
| 43 |
+
|
| 44 |
+
### Basic Timing
|
| 45 |
+
|
| 46 |
+
```python
|
| 47 |
+
import time
|
| 48 |
+
|
| 49 |
+
def measure_time():
|
| 50 |
+
"""Simple timing measurement."""
|
| 51 |
+
start = time.time()
|
| 52 |
+
|
| 53 |
+
# Your code here
|
| 54 |
+
result = sum(range(1000000))
|
| 55 |
+
|
| 56 |
+
elapsed = time.time() - start
|
| 57 |
+
print(f"Execution time: {elapsed:.4f} seconds")
|
| 58 |
+
return result
|
| 59 |
+
|
| 60 |
+
# Better: use timeit for accurate measurements
|
| 61 |
+
import timeit
|
| 62 |
+
|
| 63 |
+
execution_time = timeit.timeit(
|
| 64 |
+
"sum(range(1000000))",
|
| 65 |
+
number=100
|
| 66 |
+
)
|
| 67 |
+
print(f"Average time: {execution_time/100:.6f} seconds")
|
| 68 |
+
```
|
| 69 |
+
|
| 70 |
+
## Profiling Tools
|
| 71 |
+
|
| 72 |
+
### Pattern 1: cProfile - CPU Profiling
|
| 73 |
+
|
| 74 |
+
```python
|
| 75 |
+
import cProfile
|
| 76 |
+
import pstats
|
| 77 |
+
from pstats import SortKey
|
| 78 |
+
|
| 79 |
+
def slow_function():
|
| 80 |
+
"""Function to profile."""
|
| 81 |
+
total = 0
|
| 82 |
+
for i in range(1000000):
|
| 83 |
+
total += i
|
| 84 |
+
return total
|
| 85 |
+
|
| 86 |
+
def another_function():
|
| 87 |
+
"""Another function."""
|
| 88 |
+
return [i**2 for i in range(100000)]
|
| 89 |
+
|
| 90 |
+
def main():
|
| 91 |
+
"""Main function to profile."""
|
| 92 |
+
result1 = slow_function()
|
| 93 |
+
result2 = another_function()
|
| 94 |
+
return result1, result2
|
| 95 |
+
|
| 96 |
+
# Profile the code
|
| 97 |
+
if __name__ == "__main__":
|
| 98 |
+
profiler = cProfile.Profile()
|
| 99 |
+
profiler.enable()
|
| 100 |
+
|
| 101 |
+
main()
|
| 102 |
+
|
| 103 |
+
profiler.disable()
|
| 104 |
+
|
| 105 |
+
# Print stats
|
| 106 |
+
stats = pstats.Stats(profiler)
|
| 107 |
+
stats.sort_stats(SortKey.CUMULATIVE)
|
| 108 |
+
stats.print_stats(10) # Top 10 functions
|
| 109 |
+
|
| 110 |
+
# Save to file for later analysis
|
| 111 |
+
stats.dump_stats("profile_output.prof")
|
| 112 |
+
```
|
| 113 |
+
|
| 114 |
+
**Command-line profiling:**
|
| 115 |
+
```bash
|
| 116 |
+
# Profile a script
|
| 117 |
+
python -m cProfile -o output.prof script.py
|
| 118 |
+
|
| 119 |
+
# View results
|
| 120 |
+
python -m pstats output.prof
|
| 121 |
+
# In pstats:
|
| 122 |
+
# sort cumtime
|
| 123 |
+
# stats 10
|
| 124 |
+
```
|
| 125 |
+
|
| 126 |
+
### Pattern 2: line_profiler - Line-by-Line Profiling
|
| 127 |
+
|
| 128 |
+
```python
|
| 129 |
+
# Install: pip install line-profiler
|
| 130 |
+
|
| 131 |
+
# Add @profile decorator (line_profiler provides this)
|
| 132 |
+
@profile
|
| 133 |
+
def process_data(data):
|
| 134 |
+
"""Process data with line profiling."""
|
| 135 |
+
result = []
|
| 136 |
+
for item in data:
|
| 137 |
+
processed = item * 2
|
| 138 |
+
result.append(processed)
|
| 139 |
+
return result
|
| 140 |
+
|
| 141 |
+
# Run with:
|
| 142 |
+
# kernprof -l -v script.py
|
| 143 |
+
```
|
| 144 |
+
|
| 145 |
+
**Manual line profiling:**
|
| 146 |
+
```python
|
| 147 |
+
from line_profiler import LineProfiler
|
| 148 |
+
|
| 149 |
+
def process_data(data):
|
| 150 |
+
"""Function to profile."""
|
| 151 |
+
result = []
|
| 152 |
+
for item in data:
|
| 153 |
+
processed = item * 2
|
| 154 |
+
result.append(processed)
|
| 155 |
+
return result
|
| 156 |
+
|
| 157 |
+
if __name__ == "__main__":
|
| 158 |
+
lp = LineProfiler()
|
| 159 |
+
lp.add_function(process_data)
|
| 160 |
+
|
| 161 |
+
data = list(range(100000))
|
| 162 |
+
|
| 163 |
+
lp_wrapper = lp(process_data)
|
| 164 |
+
lp_wrapper(data)
|
| 165 |
+
|
| 166 |
+
lp.print_stats()
|
| 167 |
+
```
|
| 168 |
+
|
| 169 |
+
### Pattern 3: memory_profiler - Memory Usage
|
| 170 |
+
|
| 171 |
+
```python
|
| 172 |
+
# Install: pip install memory-profiler
|
| 173 |
+
|
| 174 |
+
from memory_profiler import profile
|
| 175 |
+
|
| 176 |
+
@profile
|
| 177 |
+
def memory_intensive():
|
| 178 |
+
"""Function that uses lots of memory."""
|
| 179 |
+
# Create large list
|
| 180 |
+
big_list = [i for i in range(1000000)]
|
| 181 |
+
|
| 182 |
+
# Create large dict
|
| 183 |
+
big_dict = {i: i**2 for i in range(100000)}
|
| 184 |
+
|
| 185 |
+
# Process data
|
| 186 |
+
result = sum(big_list)
|
| 187 |
+
|
| 188 |
+
return result
|
| 189 |
+
|
| 190 |
+
if __name__ == "__main__":
|
| 191 |
+
memory_intensive()
|
| 192 |
+
|
| 193 |
+
# Run with:
|
| 194 |
+
# python -m memory_profiler script.py
|
| 195 |
+
```
|
| 196 |
+
|
| 197 |
+
### Pattern 4: py-spy - Production Profiling
|
| 198 |
+
|
| 199 |
+
```bash
|
| 200 |
+
# Install: pip install py-spy
|
| 201 |
+
|
| 202 |
+
# Profile a running Python process
|
| 203 |
+
py-spy top --pid 12345
|
| 204 |
+
|
| 205 |
+
# Generate flamegraph
|
| 206 |
+
py-spy record -o profile.svg --pid 12345
|
| 207 |
+
|
| 208 |
+
# Profile a script
|
| 209 |
+
py-spy record -o profile.svg -- python script.py
|
| 210 |
+
|
| 211 |
+
# Dump current call stack
|
| 212 |
+
py-spy dump --pid 12345
|
| 213 |
+
```
|
| 214 |
+
|
| 215 |
+
## Optimization Patterns
|
| 216 |
+
|
| 217 |
+
### Pattern 5: List Comprehensions vs Loops
|
| 218 |
+
|
| 219 |
+
```python
|
| 220 |
+
import timeit
|
| 221 |
+
|
| 222 |
+
# Slow: Traditional loop
|
| 223 |
+
def slow_squares(n):
|
| 224 |
+
"""Create list of squares using loop."""
|
| 225 |
+
result = []
|
| 226 |
+
for i in range(n):
|
| 227 |
+
result.append(i**2)
|
| 228 |
+
return result
|
| 229 |
+
|
| 230 |
+
# Fast: List comprehension
|
| 231 |
+
def fast_squares(n):
|
| 232 |
+
"""Create list of squares using comprehension."""
|
| 233 |
+
return [i**2 for i in range(n)]
|
| 234 |
+
|
| 235 |
+
# Benchmark
|
| 236 |
+
n = 100000
|
| 237 |
+
|
| 238 |
+
slow_time = timeit.timeit(lambda: slow_squares(n), number=100)
|
| 239 |
+
fast_time = timeit.timeit(lambda: fast_squares(n), number=100)
|
| 240 |
+
|
| 241 |
+
print(f"Loop: {slow_time:.4f}s")
|
| 242 |
+
print(f"Comprehension: {fast_time:.4f}s")
|
| 243 |
+
print(f"Speedup: {slow_time/fast_time:.2f}x")
|
| 244 |
+
|
| 245 |
+
# Even faster for simple operations: map
|
| 246 |
+
def faster_squares(n):
|
| 247 |
+
"""Use map for even better performance."""
|
| 248 |
+
return list(map(lambda x: x**2, range(n)))
|
| 249 |
+
```
|
| 250 |
+
|
| 251 |
+
### Pattern 6: Generator Expressions for Memory
|
| 252 |
+
|
| 253 |
+
```python
|
| 254 |
+
import sys
|
| 255 |
+
|
| 256 |
+
def list_approach():
|
| 257 |
+
"""Memory-intensive list."""
|
| 258 |
+
data = [i**2 for i in range(1000000)]
|
| 259 |
+
return sum(data)
|
| 260 |
+
|
| 261 |
+
def generator_approach():
|
| 262 |
+
"""Memory-efficient generator."""
|
| 263 |
+
data = (i**2 for i in range(1000000))
|
| 264 |
+
return sum(data)
|
| 265 |
+
|
| 266 |
+
# Memory comparison
|
| 267 |
+
list_data = [i for i in range(1000000)]
|
| 268 |
+
gen_data = (i for i in range(1000000))
|
| 269 |
+
|
| 270 |
+
print(f"List size: {sys.getsizeof(list_data)} bytes")
|
| 271 |
+
print(f"Generator size: {sys.getsizeof(gen_data)} bytes")
|
| 272 |
+
|
| 273 |
+
# Generators use constant memory regardless of size
|
| 274 |
+
```
|
| 275 |
+
|
| 276 |
+
### Pattern 7: String Concatenation
|
| 277 |
+
|
| 278 |
+
```python
|
| 279 |
+
import timeit
|
| 280 |
+
|
| 281 |
+
def slow_concat(items):
|
| 282 |
+
"""Slow string concatenation."""
|
| 283 |
+
result = ""
|
| 284 |
+
for item in items:
|
| 285 |
+
result += str(item)
|
| 286 |
+
return result
|
| 287 |
+
|
| 288 |
+
def fast_concat(items):
|
| 289 |
+
"""Fast string concatenation with join."""
|
| 290 |
+
return "".join(str(item) for item in items)
|
| 291 |
+
|
| 292 |
+
def faster_concat(items):
|
| 293 |
+
"""Even faster with list."""
|
| 294 |
+
parts = [str(item) for item in items]
|
| 295 |
+
return "".join(parts)
|
| 296 |
+
|
| 297 |
+
items = list(range(10000))
|
| 298 |
+
|
| 299 |
+
# Benchmark
|
| 300 |
+
slow = timeit.timeit(lambda: slow_concat(items), number=100)
|
| 301 |
+
fast = timeit.timeit(lambda: fast_concat(items), number=100)
|
| 302 |
+
faster = timeit.timeit(lambda: faster_concat(items), number=100)
|
| 303 |
+
|
| 304 |
+
print(f"Concatenation (+): {slow:.4f}s")
|
| 305 |
+
print(f"Join (generator): {fast:.4f}s")
|
| 306 |
+
print(f"Join (list): {faster:.4f}s")
|
| 307 |
+
```
|
| 308 |
+
|
| 309 |
+
### Pattern 8: Dictionary Lookups vs List Searches
|
| 310 |
+
|
| 311 |
+
```python
|
| 312 |
+
import timeit
|
| 313 |
+
|
| 314 |
+
# Create test data
|
| 315 |
+
size = 10000
|
| 316 |
+
items = list(range(size))
|
| 317 |
+
lookup_dict = {i: i for i in range(size)}
|
| 318 |
+
|
| 319 |
+
def list_search(items, target):
|
| 320 |
+
"""O(n) search in list."""
|
| 321 |
+
return target in items
|
| 322 |
+
|
| 323 |
+
def dict_search(lookup_dict, target):
|
| 324 |
+
"""O(1) search in dict."""
|
| 325 |
+
return target in lookup_dict
|
| 326 |
+
|
| 327 |
+
target = size - 1 # Worst case for list
|
| 328 |
+
|
| 329 |
+
# Benchmark
|
| 330 |
+
list_time = timeit.timeit(
|
| 331 |
+
lambda: list_search(items, target),
|
| 332 |
+
number=1000
|
| 333 |
+
)
|
| 334 |
+
dict_time = timeit.timeit(
|
| 335 |
+
lambda: dict_search(lookup_dict, target),
|
| 336 |
+
number=1000
|
| 337 |
+
)
|
| 338 |
+
|
| 339 |
+
print(f"List search: {list_time:.6f}s")
|
| 340 |
+
print(f"Dict search: {dict_time:.6f}s")
|
| 341 |
+
print(f"Speedup: {list_time/dict_time:.0f}x")
|
| 342 |
+
```
|
| 343 |
+
|
| 344 |
+
### Pattern 9: Local Variable Access
|
| 345 |
+
|
| 346 |
+
```python
|
| 347 |
+
import timeit
|
| 348 |
+
|
| 349 |
+
# Global variable (slow)
|
| 350 |
+
GLOBAL_VALUE = 100
|
| 351 |
+
|
| 352 |
+
def use_global():
|
| 353 |
+
"""Access global variable."""
|
| 354 |
+
total = 0
|
| 355 |
+
for i in range(10000):
|
| 356 |
+
total += GLOBAL_VALUE
|
| 357 |
+
return total
|
| 358 |
+
|
| 359 |
+
def use_local():
|
| 360 |
+
"""Use local variable."""
|
| 361 |
+
local_value = 100
|
| 362 |
+
total = 0
|
| 363 |
+
for i in range(10000):
|
| 364 |
+
total += local_value
|
| 365 |
+
return total
|
| 366 |
+
|
| 367 |
+
# Local is faster
|
| 368 |
+
global_time = timeit.timeit(use_global, number=1000)
|
| 369 |
+
local_time = timeit.timeit(use_local, number=1000)
|
| 370 |
+
|
| 371 |
+
print(f"Global access: {global_time:.4f}s")
|
| 372 |
+
print(f"Local access: {local_time:.4f}s")
|
| 373 |
+
print(f"Speedup: {global_time/local_time:.2f}x")
|
| 374 |
+
```
|
| 375 |
+
|
| 376 |
+
### Pattern 10: Function Call Overhead
|
| 377 |
+
|
| 378 |
+
```python
|
| 379 |
+
import timeit
|
| 380 |
+
|
| 381 |
+
def calculate_inline():
|
| 382 |
+
"""Inline calculation."""
|
| 383 |
+
total = 0
|
| 384 |
+
for i in range(10000):
|
| 385 |
+
total += i * 2 + 1
|
| 386 |
+
return total
|
| 387 |
+
|
| 388 |
+
def helper_function(x):
|
| 389 |
+
"""Helper function."""
|
| 390 |
+
return x * 2 + 1
|
| 391 |
+
|
| 392 |
+
def calculate_with_function():
|
| 393 |
+
"""Calculation with function calls."""
|
| 394 |
+
total = 0
|
| 395 |
+
for i in range(10000):
|
| 396 |
+
total += helper_function(i)
|
| 397 |
+
return total
|
| 398 |
+
|
| 399 |
+
# Inline is faster due to no call overhead
|
| 400 |
+
inline_time = timeit.timeit(calculate_inline, number=1000)
|
| 401 |
+
function_time = timeit.timeit(calculate_with_function, number=1000)
|
| 402 |
+
|
| 403 |
+
print(f"Inline: {inline_time:.4f}s")
|
| 404 |
+
print(f"Function calls: {function_time:.4f}s")
|
| 405 |
+
```
|
| 406 |
+
|
| 407 |
+
## Advanced Optimization
|
| 408 |
+
|
| 409 |
+
### Pattern 11: NumPy for Numerical Operations
|
| 410 |
+
|
| 411 |
+
```python
|
| 412 |
+
import timeit
|
| 413 |
+
import numpy as np
|
| 414 |
+
|
| 415 |
+
def python_sum(n):
|
| 416 |
+
"""Sum using pure Python."""
|
| 417 |
+
return sum(range(n))
|
| 418 |
+
|
| 419 |
+
def numpy_sum(n):
|
| 420 |
+
"""Sum using NumPy."""
|
| 421 |
+
return np.arange(n).sum()
|
| 422 |
+
|
| 423 |
+
n = 1000000
|
| 424 |
+
|
| 425 |
+
python_time = timeit.timeit(lambda: python_sum(n), number=100)
|
| 426 |
+
numpy_time = timeit.timeit(lambda: numpy_sum(n), number=100)
|
| 427 |
+
|
| 428 |
+
print(f"Python: {python_time:.4f}s")
|
| 429 |
+
print(f"NumPy: {numpy_time:.4f}s")
|
| 430 |
+
print(f"Speedup: {python_time/numpy_time:.2f}x")
|
| 431 |
+
|
| 432 |
+
# Vectorized operations
|
| 433 |
+
def python_multiply():
|
| 434 |
+
"""Element-wise multiplication in Python."""
|
| 435 |
+
a = list(range(100000))
|
| 436 |
+
b = list(range(100000))
|
| 437 |
+
return [x * y for x, y in zip(a, b)]
|
| 438 |
+
|
| 439 |
+
def numpy_multiply():
|
| 440 |
+
"""Vectorized multiplication in NumPy."""
|
| 441 |
+
a = np.arange(100000)
|
| 442 |
+
b = np.arange(100000)
|
| 443 |
+
return a * b
|
| 444 |
+
|
| 445 |
+
py_time = timeit.timeit(python_multiply, number=100)
|
| 446 |
+
np_time = timeit.timeit(numpy_multiply, number=100)
|
| 447 |
+
|
| 448 |
+
print(f"\nPython multiply: {py_time:.4f}s")
|
| 449 |
+
print(f"NumPy multiply: {np_time:.4f}s")
|
| 450 |
+
print(f"Speedup: {py_time/np_time:.2f}x")
|
| 451 |
+
```
|
| 452 |
+
|
| 453 |
+
### Pattern 12: Caching with functools.lru_cache
|
| 454 |
+
|
| 455 |
+
```python
|
| 456 |
+
from functools import lru_cache
|
| 457 |
+
import timeit
|
| 458 |
+
|
| 459 |
+
def fibonacci_slow(n):
|
| 460 |
+
"""Recursive fibonacci without caching."""
|
| 461 |
+
if n < 2:
|
| 462 |
+
return n
|
| 463 |
+
return fibonacci_slow(n-1) + fibonacci_slow(n-2)
|
| 464 |
+
|
| 465 |
+
@lru_cache(maxsize=None)
|
| 466 |
+
def fibonacci_fast(n):
|
| 467 |
+
"""Recursive fibonacci with caching."""
|
| 468 |
+
if n < 2:
|
| 469 |
+
return n
|
| 470 |
+
return fibonacci_fast(n-1) + fibonacci_fast(n-2)
|
| 471 |
+
|
| 472 |
+
# Massive speedup for recursive algorithms
|
| 473 |
+
n = 30
|
| 474 |
+
|
| 475 |
+
slow_time = timeit.timeit(lambda: fibonacci_slow(n), number=1)
|
| 476 |
+
fast_time = timeit.timeit(lambda: fibonacci_fast(n), number=1000)
|
| 477 |
+
|
| 478 |
+
print(f"Without cache (1 run): {slow_time:.4f}s")
|
| 479 |
+
print(f"With cache (1000 runs): {fast_time:.4f}s")
|
| 480 |
+
|
| 481 |
+
# Cache info
|
| 482 |
+
print(f"Cache info: {fibonacci_fast.cache_info()}")
|
| 483 |
+
```
|
| 484 |
+
|
| 485 |
+
### Pattern 13: Using __slots__ for Memory
|
| 486 |
+
|
| 487 |
+
```python
|
| 488 |
+
import sys
|
| 489 |
+
|
| 490 |
+
class RegularClass:
|
| 491 |
+
"""Regular class with __dict__."""
|
| 492 |
+
def __init__(self, x, y, z):
|
| 493 |
+
self.x = x
|
| 494 |
+
self.y = y
|
| 495 |
+
self.z = z
|
| 496 |
+
|
| 497 |
+
class SlottedClass:
|
| 498 |
+
"""Class with __slots__ for memory efficiency."""
|
| 499 |
+
__slots__ = ['x', 'y', 'z']
|
| 500 |
+
|
| 501 |
+
def __init__(self, x, y, z):
|
| 502 |
+
self.x = x
|
| 503 |
+
self.y = y
|
| 504 |
+
self.z = z
|
| 505 |
+
|
| 506 |
+
# Memory comparison
|
| 507 |
+
regular = RegularClass(1, 2, 3)
|
| 508 |
+
slotted = SlottedClass(1, 2, 3)
|
| 509 |
+
|
| 510 |
+
print(f"Regular class size: {sys.getsizeof(regular)} bytes")
|
| 511 |
+
print(f"Slotted class size: {sys.getsizeof(slotted)} bytes")
|
| 512 |
+
|
| 513 |
+
# Significant savings with many instances
|
| 514 |
+
regular_objects = [RegularClass(i, i+1, i+2) for i in range(10000)]
|
| 515 |
+
slotted_objects = [SlottedClass(i, i+1, i+2) for i in range(10000)]
|
| 516 |
+
|
| 517 |
+
print(f"\nMemory for 10000 regular objects: ~{sys.getsizeof(regular) * 10000} bytes")
|
| 518 |
+
print(f"Memory for 10000 slotted objects: ~{sys.getsizeof(slotted) * 10000} bytes")
|
| 519 |
+
```
|
| 520 |
+
|
| 521 |
+
### Pattern 14: Multiprocessing for CPU-Bound Tasks
|
| 522 |
+
|
| 523 |
+
```python
|
| 524 |
+
import multiprocessing as mp
|
| 525 |
+
import time
|
| 526 |
+
|
| 527 |
+
def cpu_intensive_task(n):
|
| 528 |
+
"""CPU-intensive calculation."""
|
| 529 |
+
return sum(i**2 for i in range(n))
|
| 530 |
+
|
| 531 |
+
def sequential_processing():
|
| 532 |
+
"""Process tasks sequentially."""
|
| 533 |
+
start = time.time()
|
| 534 |
+
results = [cpu_intensive_task(1000000) for _ in range(4)]
|
| 535 |
+
elapsed = time.time() - start
|
| 536 |
+
return elapsed, results
|
| 537 |
+
|
| 538 |
+
def parallel_processing():
|
| 539 |
+
"""Process tasks in parallel."""
|
| 540 |
+
start = time.time()
|
| 541 |
+
with mp.Pool(processes=4) as pool:
|
| 542 |
+
results = pool.map(cpu_intensive_task, [1000000] * 4)
|
| 543 |
+
elapsed = time.time() - start
|
| 544 |
+
return elapsed, results
|
| 545 |
+
|
| 546 |
+
if __name__ == "__main__":
|
| 547 |
+
seq_time, seq_results = sequential_processing()
|
| 548 |
+
par_time, par_results = parallel_processing()
|
| 549 |
+
|
| 550 |
+
print(f"Sequential: {seq_time:.2f}s")
|
| 551 |
+
print(f"Parallel: {par_time:.2f}s")
|
| 552 |
+
print(f"Speedup: {seq_time/par_time:.2f}x")
|
| 553 |
+
```
|
| 554 |
+
|
| 555 |
+
### Pattern 15: Async I/O for I/O-Bound Tasks
|
| 556 |
+
|
| 557 |
+
```python
|
| 558 |
+
import asyncio
|
| 559 |
+
import aiohttp
|
| 560 |
+
import time
|
| 561 |
+
import requests
|
| 562 |
+
|
| 563 |
+
urls = [
|
| 564 |
+
"https://httpbin.org/delay/1",
|
| 565 |
+
"https://httpbin.org/delay/1",
|
| 566 |
+
"https://httpbin.org/delay/1",
|
| 567 |
+
"https://httpbin.org/delay/1",
|
| 568 |
+
]
|
| 569 |
+
|
| 570 |
+
def synchronous_requests():
|
| 571 |
+
"""Synchronous HTTP requests."""
|
| 572 |
+
start = time.time()
|
| 573 |
+
results = []
|
| 574 |
+
for url in urls:
|
| 575 |
+
response = requests.get(url)
|
| 576 |
+
results.append(response.status_code)
|
| 577 |
+
elapsed = time.time() - start
|
| 578 |
+
return elapsed, results
|
| 579 |
+
|
| 580 |
+
async def async_fetch(session, url):
|
| 581 |
+
"""Async HTTP request."""
|
| 582 |
+
async with session.get(url) as response:
|
| 583 |
+
return response.status
|
| 584 |
+
|
| 585 |
+
async def asynchronous_requests():
|
| 586 |
+
"""Asynchronous HTTP requests."""
|
| 587 |
+
start = time.time()
|
| 588 |
+
async with aiohttp.ClientSession() as session:
|
| 589 |
+
tasks = [async_fetch(session, url) for url in urls]
|
| 590 |
+
results = await asyncio.gather(*tasks)
|
| 591 |
+
elapsed = time.time() - start
|
| 592 |
+
return elapsed, results
|
| 593 |
+
|
| 594 |
+
# Async is much faster for I/O-bound work
|
| 595 |
+
sync_time, sync_results = synchronous_requests()
|
| 596 |
+
async_time, async_results = asyncio.run(asynchronous_requests())
|
| 597 |
+
|
| 598 |
+
print(f"Synchronous: {sync_time:.2f}s")
|
| 599 |
+
print(f"Asynchronous: {async_time:.2f}s")
|
| 600 |
+
print(f"Speedup: {sync_time/async_time:.2f}x")
|
| 601 |
+
```
|
| 602 |
+
|
| 603 |
+
## Database Optimization
|
| 604 |
+
|
| 605 |
+
### Pattern 16: Batch Database Operations
|
| 606 |
+
|
| 607 |
+
```python
|
| 608 |
+
import sqlite3
|
| 609 |
+
import time
|
| 610 |
+
|
| 611 |
+
def create_db():
|
| 612 |
+
"""Create test database."""
|
| 613 |
+
conn = sqlite3.connect(":memory:")
|
| 614 |
+
conn.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")
|
| 615 |
+
return conn
|
| 616 |
+
|
| 617 |
+
def slow_inserts(conn, count):
|
| 618 |
+
"""Insert records one at a time."""
|
| 619 |
+
start = time.time()
|
| 620 |
+
cursor = conn.cursor()
|
| 621 |
+
for i in range(count):
|
| 622 |
+
cursor.execute("INSERT INTO users (name) VALUES (?)", (f"User {i}",))
|
| 623 |
+
conn.commit() # Commit each insert
|
| 624 |
+
elapsed = time.time() - start
|
| 625 |
+
return elapsed
|
| 626 |
+
|
| 627 |
+
def fast_inserts(conn, count):
|
| 628 |
+
"""Batch insert with single commit."""
|
| 629 |
+
start = time.time()
|
| 630 |
+
cursor = conn.cursor()
|
| 631 |
+
data = [(f"User {i}",) for i in range(count)]
|
| 632 |
+
cursor.executemany("INSERT INTO users (name) VALUES (?)", data)
|
| 633 |
+
conn.commit() # Single commit
|
| 634 |
+
elapsed = time.time() - start
|
| 635 |
+
return elapsed
|
| 636 |
+
|
| 637 |
+
# Benchmark
|
| 638 |
+
conn1 = create_db()
|
| 639 |
+
slow_time = slow_inserts(conn1, 1000)
|
| 640 |
+
|
| 641 |
+
conn2 = create_db()
|
| 642 |
+
fast_time = fast_inserts(conn2, 1000)
|
| 643 |
+
|
| 644 |
+
print(f"Individual inserts: {slow_time:.4f}s")
|
| 645 |
+
print(f"Batch insert: {fast_time:.4f}s")
|
| 646 |
+
print(f"Speedup: {slow_time/fast_time:.2f}x")
|
| 647 |
+
```
|
| 648 |
+
|
| 649 |
+
### Pattern 17: Query Optimization
|
| 650 |
+
|
| 651 |
+
```python
|
| 652 |
+
# Use indexes for frequently queried columns
|
| 653 |
+
"""
|
| 654 |
+
-- Slow: No index
|
| 655 |
+
SELECT * FROM users WHERE email = 'user@example.com';
|
| 656 |
+
|
| 657 |
+
-- Fast: With index
|
| 658 |
+
CREATE INDEX idx_users_email ON users(email);
|
| 659 |
+
SELECT * FROM users WHERE email = 'user@example.com';
|
| 660 |
+
"""
|
| 661 |
+
|
| 662 |
+
# Use query planning
|
| 663 |
+
import sqlite3
|
| 664 |
+
|
| 665 |
+
conn = sqlite3.connect("example.db")
|
| 666 |
+
cursor = conn.cursor()
|
| 667 |
+
|
| 668 |
+
# Analyze query performance
|
| 669 |
+
cursor.execute("EXPLAIN QUERY PLAN SELECT * FROM users WHERE email = ?", ("test@example.com",))
|
| 670 |
+
print(cursor.fetchall())
|
| 671 |
+
|
| 672 |
+
# Use SELECT only needed columns
|
| 673 |
+
# Slow: SELECT *
|
| 674 |
+
# Fast: SELECT id, name
|
| 675 |
+
```
|
| 676 |
+
|
| 677 |
+
## Memory Optimization
|
| 678 |
+
|
| 679 |
+
### Pattern 18: Detecting Memory Leaks
|
| 680 |
+
|
| 681 |
+
```python
|
| 682 |
+
import tracemalloc
|
| 683 |
+
import gc
|
| 684 |
+
|
| 685 |
+
def memory_leak_example():
|
| 686 |
+
"""Example that leaks memory."""
|
| 687 |
+
leaked_objects = []
|
| 688 |
+
|
| 689 |
+
for i in range(100000):
|
| 690 |
+
# Objects added but never removed
|
| 691 |
+
leaked_objects.append([i] * 100)
|
| 692 |
+
|
| 693 |
+
# In real code, this would be an unintended reference
|
| 694 |
+
|
| 695 |
+
def track_memory_usage():
|
| 696 |
+
"""Track memory allocations."""
|
| 697 |
+
tracemalloc.start()
|
| 698 |
+
|
| 699 |
+
# Take snapshot before
|
| 700 |
+
snapshot1 = tracemalloc.take_snapshot()
|
| 701 |
+
|
| 702 |
+
# Run code
|
| 703 |
+
memory_leak_example()
|
| 704 |
+
|
| 705 |
+
# Take snapshot after
|
| 706 |
+
snapshot2 = tracemalloc.take_snapshot()
|
| 707 |
+
|
| 708 |
+
# Compare
|
| 709 |
+
top_stats = snapshot2.compare_to(snapshot1, 'lineno')
|
| 710 |
+
|
| 711 |
+
print("Top 10 memory allocations:")
|
| 712 |
+
for stat in top_stats[:10]:
|
| 713 |
+
print(stat)
|
| 714 |
+
|
| 715 |
+
tracemalloc.stop()
|
| 716 |
+
|
| 717 |
+
# Monitor memory
|
| 718 |
+
track_memory_usage()
|
| 719 |
+
|
| 720 |
+
# Force garbage collection
|
| 721 |
+
gc.collect()
|
| 722 |
+
```
|
| 723 |
+
|
| 724 |
+
### Pattern 19: Iterators vs Lists
|
| 725 |
+
|
| 726 |
+
```python
|
| 727 |
+
import sys
|
| 728 |
+
|
| 729 |
+
def process_file_list(filename):
|
| 730 |
+
"""Load entire file into memory."""
|
| 731 |
+
with open(filename) as f:
|
| 732 |
+
lines = f.readlines() # Loads all lines
|
| 733 |
+
return sum(1 for line in lines if line.strip())
|
| 734 |
+
|
| 735 |
+
def process_file_iterator(filename):
|
| 736 |
+
"""Process file line by line."""
|
| 737 |
+
with open(filename) as f:
|
| 738 |
+
return sum(1 for line in f if line.strip())
|
| 739 |
+
|
| 740 |
+
# Iterator uses constant memory
|
| 741 |
+
# List loads entire file into memory
|
| 742 |
+
```
|
| 743 |
+
|
| 744 |
+
### Pattern 20: Weakref for Caches
|
| 745 |
+
|
| 746 |
+
```python
|
| 747 |
+
import weakref
|
| 748 |
+
|
| 749 |
+
class CachedResource:
|
| 750 |
+
"""Resource that can be garbage collected."""
|
| 751 |
+
def __init__(self, data):
|
| 752 |
+
self.data = data
|
| 753 |
+
|
| 754 |
+
# Regular cache prevents garbage collection
|
| 755 |
+
regular_cache = {}
|
| 756 |
+
|
| 757 |
+
def get_resource_regular(key):
|
| 758 |
+
"""Get resource from regular cache."""
|
| 759 |
+
if key not in regular_cache:
|
| 760 |
+
regular_cache[key] = CachedResource(f"Data for {key}")
|
| 761 |
+
return regular_cache[key]
|
| 762 |
+
|
| 763 |
+
# Weak reference cache allows garbage collection
|
| 764 |
+
weak_cache = weakref.WeakValueDictionary()
|
| 765 |
+
|
| 766 |
+
def get_resource_weak(key):
|
| 767 |
+
"""Get resource from weak cache."""
|
| 768 |
+
resource = weak_cache.get(key)
|
| 769 |
+
if resource is None:
|
| 770 |
+
resource = CachedResource(f"Data for {key}")
|
| 771 |
+
weak_cache[key] = resource
|
| 772 |
+
return resource
|
| 773 |
+
|
| 774 |
+
# When no strong references exist, objects can be GC'd
|
| 775 |
+
```
|
| 776 |
+
|
| 777 |
+
## Benchmarking Tools
|
| 778 |
+
|
| 779 |
+
### Custom Benchmark Decorator
|
| 780 |
+
|
| 781 |
+
```python
|
| 782 |
+
import time
|
| 783 |
+
from functools import wraps
|
| 784 |
+
|
| 785 |
+
def benchmark(func):
|
| 786 |
+
"""Decorator to benchmark function execution."""
|
| 787 |
+
@wraps(func)
|
| 788 |
+
def wrapper(*args, **kwargs):
|
| 789 |
+
start = time.perf_counter()
|
| 790 |
+
result = func(*args, **kwargs)
|
| 791 |
+
elapsed = time.perf_counter() - start
|
| 792 |
+
print(f"{func.__name__} took {elapsed:.6f} seconds")
|
| 793 |
+
return result
|
| 794 |
+
return wrapper
|
| 795 |
+
|
| 796 |
+
@benchmark
|
| 797 |
+
def slow_function():
|
| 798 |
+
"""Function to benchmark."""
|
| 799 |
+
time.sleep(0.5)
|
| 800 |
+
return sum(range(1000000))
|
| 801 |
+
|
| 802 |
+
result = slow_function()
|
| 803 |
+
```
|
| 804 |
+
|
| 805 |
+
### Performance Testing with pytest-benchmark
|
| 806 |
+
|
| 807 |
+
```python
|
| 808 |
+
# Install: pip install pytest-benchmark
|
| 809 |
+
|
| 810 |
+
def test_list_comprehension(benchmark):
|
| 811 |
+
"""Benchmark list comprehension."""
|
| 812 |
+
result = benchmark(lambda: [i**2 for i in range(10000)])
|
| 813 |
+
assert len(result) == 10000
|
| 814 |
+
|
| 815 |
+
def test_map_function(benchmark):
|
| 816 |
+
"""Benchmark map function."""
|
| 817 |
+
result = benchmark(lambda: list(map(lambda x: x**2, range(10000))))
|
| 818 |
+
assert len(result) == 10000
|
| 819 |
+
|
| 820 |
+
# Run with: pytest test_performance.py --benchmark-compare
|
| 821 |
+
```
|
| 822 |
+
|
| 823 |
+
## Best Practices
|
| 824 |
+
|
| 825 |
+
1. **Profile before optimizing** - Measure to find real bottlenecks
|
| 826 |
+
2. **Focus on hot paths** - Optimize code that runs most frequently
|
| 827 |
+
3. **Use appropriate data structures** - Dict for lookups, set for membership
|
| 828 |
+
4. **Avoid premature optimization** - Clarity first, then optimize
|
| 829 |
+
5. **Use built-in functions** - They're implemented in C
|
| 830 |
+
6. **Cache expensive computations** - Use lru_cache
|
| 831 |
+
7. **Batch I/O operations** - Reduce system calls
|
| 832 |
+
8. **Use generators** for large datasets
|
| 833 |
+
9. **Consider NumPy** for numerical operations
|
| 834 |
+
10. **Profile production code** - Use py-spy for live systems
|
| 835 |
+
|
| 836 |
+
## Common Pitfalls
|
| 837 |
+
|
| 838 |
+
- Optimizing without profiling
|
| 839 |
+
- Using global variables unnecessarily
|
| 840 |
+
- Not using appropriate data structures
|
| 841 |
+
- Creating unnecessary copies of data
|
| 842 |
+
- Not using connection pooling for databases
|
| 843 |
+
- Ignoring algorithmic complexity
|
| 844 |
+
- Over-optimizing rare code paths
|
| 845 |
+
- Not considering memory usage
|
| 846 |
+
|
| 847 |
+
## Resources
|
| 848 |
+
|
| 849 |
+
- **cProfile**: Built-in CPU profiler
|
| 850 |
+
- **memory_profiler**: Memory usage profiling
|
| 851 |
+
- **line_profiler**: Line-by-line profiling
|
| 852 |
+
- **py-spy**: Sampling profiler for production
|
| 853 |
+
- **NumPy**: High-performance numerical computing
|
| 854 |
+
- **Cython**: Compile Python to C
|
| 855 |
+
- **PyPy**: Alternative Python interpreter with JIT
|
| 856 |
+
|
| 857 |
+
## Performance Checklist
|
| 858 |
+
|
| 859 |
+
- [ ] Profiled code to identify bottlenecks
|
| 860 |
+
- [ ] Used appropriate data structures
|
| 861 |
+
- [ ] Implemented caching where beneficial
|
| 862 |
+
- [ ] Optimized database queries
|
| 863 |
+
- [ ] Used generators for large datasets
|
| 864 |
+
- [ ] Considered multiprocessing for CPU-bound tasks
|
| 865 |
+
- [ ] Used async I/O for I/O-bound tasks
|
| 866 |
+
- [ ] Minimized function call overhead in hot loops
|
| 867 |
+
- [ ] Checked for memory leaks
|
| 868 |
+
- [ ] Benchmarked before and after optimization
|
.agent/skills/python-pro/SKILL.md
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: python-pro
|
| 3 |
+
description: Master Python 3.12+ with modern features, async programming,
|
| 4 |
+
performance optimization, and production-ready practices. Expert in the latest
|
| 5 |
+
Python ecosystem including uv, ruff, pydantic, and FastAPI. Use PROACTIVELY
|
| 6 |
+
for Python development, optimization, or advanced Python patterns.
|
| 7 |
+
metadata:
|
| 8 |
+
model: opus
|
| 9 |
+
---
|
| 10 |
+
You are a Python expert specializing in modern Python 3.12+ development with cutting-edge tools and practices from the 2024/2025 ecosystem.
|
| 11 |
+
|
| 12 |
+
## Use this skill when
|
| 13 |
+
|
| 14 |
+
- Writing or reviewing Python 3.12+ codebases
|
| 15 |
+
- Implementing async workflows or performance optimizations
|
| 16 |
+
- Designing production-ready Python services or tooling
|
| 17 |
+
|
| 18 |
+
## Do not use this skill when
|
| 19 |
+
|
| 20 |
+
- You need guidance for a non-Python stack
|
| 21 |
+
- You only need basic syntax tutoring
|
| 22 |
+
- You cannot modify Python runtime or dependencies
|
| 23 |
+
|
| 24 |
+
## Instructions
|
| 25 |
+
|
| 26 |
+
1. Confirm runtime, dependencies, and performance targets.
|
| 27 |
+
2. Choose patterns (async, typing, tooling) that match requirements.
|
| 28 |
+
3. Implement and test with modern tooling.
|
| 29 |
+
4. Profile and tune for latency, memory, and correctness.
|
| 30 |
+
|
| 31 |
+
## Purpose
|
| 32 |
+
Expert Python developer mastering Python 3.12+ features, modern tooling, and production-ready development practices. Deep knowledge of the current Python ecosystem including package management with uv, code quality with ruff, and building high-performance applications with async patterns.
|
| 33 |
+
|
| 34 |
+
## Capabilities
|
| 35 |
+
|
| 36 |
+
### Modern Python Features
|
| 37 |
+
- Python 3.12+ features including improved error messages, performance optimizations, and type system enhancements
|
| 38 |
+
- Advanced async/await patterns with asyncio, aiohttp, and trio
|
| 39 |
+
- Context managers and the `with` statement for resource management
|
| 40 |
+
- Dataclasses, Pydantic models, and modern data validation
|
| 41 |
+
- Pattern matching (structural pattern matching) and match statements
|
| 42 |
+
- Type hints, generics, and Protocol typing for robust type safety
|
| 43 |
+
- Descriptors, metaclasses, and advanced object-oriented patterns
|
| 44 |
+
- Generator expressions, itertools, and memory-efficient data processing
|
| 45 |
+
|
| 46 |
+
### Modern Tooling & Development Environment
|
| 47 |
+
- Package management with uv (2024's fastest Python package manager)
|
| 48 |
+
- Code formatting and linting with ruff (replacing black, isort, flake8)
|
| 49 |
+
- Static type checking with mypy and pyright
|
| 50 |
+
- Project configuration with pyproject.toml (modern standard)
|
| 51 |
+
- Virtual environment management with venv, pipenv, or uv
|
| 52 |
+
- Pre-commit hooks for code quality automation
|
| 53 |
+
- Modern Python packaging and distribution practices
|
| 54 |
+
- Dependency management and lock files
|
| 55 |
+
|
| 56 |
+
### Testing & Quality Assurance
|
| 57 |
+
- Comprehensive testing with pytest and pytest plugins
|
| 58 |
+
- Property-based testing with Hypothesis
|
| 59 |
+
- Test fixtures, factories, and mock objects
|
| 60 |
+
- Coverage analysis with pytest-cov and coverage.py
|
| 61 |
+
- Performance testing and benchmarking with pytest-benchmark
|
| 62 |
+
- Integration testing and test databases
|
| 63 |
+
- Continuous integration with GitHub Actions
|
| 64 |
+
- Code quality metrics and static analysis
|
| 65 |
+
|
| 66 |
+
### Performance & Optimization
|
| 67 |
+
- Profiling with cProfile, py-spy, and memory_profiler
|
| 68 |
+
- Performance optimization techniques and bottleneck identification
|
| 69 |
+
- Async programming for I/O-bound operations
|
| 70 |
+
- Multiprocessing and concurrent.futures for CPU-bound tasks
|
| 71 |
+
- Memory optimization and garbage collection understanding
|
| 72 |
+
- Caching strategies with functools.lru_cache and external caches
|
| 73 |
+
- Database optimization with SQLAlchemy and async ORMs
|
| 74 |
+
- NumPy, Pandas optimization for data processing
|
| 75 |
+
|
| 76 |
+
### Web Development & APIs
|
| 77 |
+
- FastAPI for high-performance APIs with automatic documentation
|
| 78 |
+
- Django for full-featured web applications
|
| 79 |
+
- Flask for lightweight web services
|
| 80 |
+
- Pydantic for data validation and serialization
|
| 81 |
+
- SQLAlchemy 2.0+ with async support
|
| 82 |
+
- Background task processing with Celery and Redis
|
| 83 |
+
- WebSocket support with FastAPI and Django Channels
|
| 84 |
+
- Authentication and authorization patterns
|
| 85 |
+
|
| 86 |
+
### Data Science & Machine Learning
|
| 87 |
+
- NumPy and Pandas for data manipulation and analysis
|
| 88 |
+
- Matplotlib, Seaborn, and Plotly for data visualization
|
| 89 |
+
- Scikit-learn for machine learning workflows
|
| 90 |
+
- Jupyter notebooks and IPython for interactive development
|
| 91 |
+
- Data pipeline design and ETL processes
|
| 92 |
+
- Integration with modern ML libraries (PyTorch, TensorFlow)
|
| 93 |
+
- Data validation and quality assurance
|
| 94 |
+
- Performance optimization for large datasets
|
| 95 |
+
|
| 96 |
+
### DevOps & Production Deployment
|
| 97 |
+
- Docker containerization and multi-stage builds
|
| 98 |
+
- Kubernetes deployment and scaling strategies
|
| 99 |
+
- Cloud deployment (AWS, GCP, Azure) with Python services
|
| 100 |
+
- Monitoring and logging with structured logging and APM tools
|
| 101 |
+
- Configuration management and environment variables
|
| 102 |
+
- Security best practices and vulnerability scanning
|
| 103 |
+
- CI/CD pipelines and automated testing
|
| 104 |
+
- Performance monitoring and alerting
|
| 105 |
+
|
| 106 |
+
### Advanced Python Patterns
|
| 107 |
+
- Design patterns implementation (Singleton, Factory, Observer, etc.)
|
| 108 |
+
- SOLID principles in Python development
|
| 109 |
+
- Dependency injection and inversion of control
|
| 110 |
+
- Event-driven architecture and messaging patterns
|
| 111 |
+
- Functional programming concepts and tools
|
| 112 |
+
- Advanced decorators and context managers
|
| 113 |
+
- Metaprogramming and dynamic code generation
|
| 114 |
+
- Plugin architectures and extensible systems
|
| 115 |
+
|
| 116 |
+
## Behavioral Traits
|
| 117 |
+
- Follows PEP 8 and modern Python idioms consistently
|
| 118 |
+
- Prioritizes code readability and maintainability
|
| 119 |
+
- Uses type hints throughout for better code documentation
|
| 120 |
+
- Implements comprehensive error handling with custom exceptions
|
| 121 |
+
- Writes extensive tests with high coverage (>90%)
|
| 122 |
+
- Leverages Python's standard library before external dependencies
|
| 123 |
+
- Focuses on performance optimization when needed
|
| 124 |
+
- Documents code thoroughly with docstrings and examples
|
| 125 |
+
- Stays current with latest Python releases and ecosystem changes
|
| 126 |
+
- Emphasizes security and best practices in production code
|
| 127 |
+
|
| 128 |
+
## Knowledge Base
|
| 129 |
+
- Python 3.12+ language features and performance improvements
|
| 130 |
+
- Modern Python tooling ecosystem (uv, ruff, pyright)
|
| 131 |
+
- Current web framework best practices (FastAPI, Django 5.x)
|
| 132 |
+
- Async programming patterns and asyncio ecosystem
|
| 133 |
+
- Data science and machine learning Python stack
|
| 134 |
+
- Modern deployment and containerization strategies
|
| 135 |
+
- Python packaging and distribution best practices
|
| 136 |
+
- Security considerations and vulnerability prevention
|
| 137 |
+
- Performance profiling and optimization techniques
|
| 138 |
+
- Testing strategies and quality assurance practices
|
| 139 |
+
|
| 140 |
+
## Response Approach
|
| 141 |
+
1. **Analyze requirements** for modern Python best practices
|
| 142 |
+
2. **Suggest current tools and patterns** from the 2024/2025 ecosystem
|
| 143 |
+
3. **Provide production-ready code** with proper error handling and type hints
|
| 144 |
+
4. **Include comprehensive tests** with pytest and appropriate fixtures
|
| 145 |
+
5. **Consider performance implications** and suggest optimizations
|
| 146 |
+
6. **Document security considerations** and best practices
|
| 147 |
+
7. **Recommend modern tooling** for development workflow
|
| 148 |
+
8. **Include deployment strategies** when applicable
|
| 149 |
+
|
| 150 |
+
## Example Interactions
|
| 151 |
+
- "Help me migrate from pip to uv for package management"
|
| 152 |
+
- "Optimize this Python code for better async performance"
|
| 153 |
+
- "Design a FastAPI application with proper error handling and validation"
|
| 154 |
+
- "Set up a modern Python project with ruff, mypy, and pytest"
|
| 155 |
+
- "Implement a high-performance data processing pipeline"
|
| 156 |
+
- "Create a production-ready Dockerfile for a Python application"
|
| 157 |
+
- "Design a scalable background task system with Celery"
|
| 158 |
+
- "Implement modern authentication patterns in FastAPI"
|
.agent/skills/rag-engineer/SKILL.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: rag-engineer
|
| 3 |
+
description: "Expert in building Retrieval-Augmented Generation systems. Masters embedding models, vector databases, chunking strategies, and retrieval optimization for LLM applications. Use when: building RAG, vector search, embeddings, semantic search, document retrieval."
|
| 4 |
+
source: vibeship-spawner-skills (Apache 2.0)
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
# RAG Engineer
|
| 8 |
+
|
| 9 |
+
**Role**: RAG Systems Architect
|
| 10 |
+
|
| 11 |
+
I bridge the gap between raw documents and LLM understanding. I know that
|
| 12 |
+
retrieval quality determines generation quality - garbage in, garbage out.
|
| 13 |
+
I obsess over chunking boundaries, embedding dimensions, and similarity
|
| 14 |
+
metrics because they make the difference between helpful and hallucinating.
|
| 15 |
+
|
| 16 |
+
## Capabilities
|
| 17 |
+
|
| 18 |
+
- Vector embeddings and similarity search
|
| 19 |
+
- Document chunking and preprocessing
|
| 20 |
+
- Retrieval pipeline design
|
| 21 |
+
- Semantic search implementation
|
| 22 |
+
- Context window optimization
|
| 23 |
+
- Hybrid search (keyword + semantic)
|
| 24 |
+
|
| 25 |
+
## Requirements
|
| 26 |
+
|
| 27 |
+
- LLM fundamentals
|
| 28 |
+
- Understanding of embeddings
|
| 29 |
+
- Basic NLP concepts
|
| 30 |
+
|
| 31 |
+
## Patterns
|
| 32 |
+
|
| 33 |
+
### Semantic Chunking
|
| 34 |
+
|
| 35 |
+
Chunk by meaning, not arbitrary token counts
|
| 36 |
+
|
| 37 |
+
```javascript
|
| 38 |
+
- Use sentence boundaries, not token limits
|
| 39 |
+
- Detect topic shifts with embedding similarity
|
| 40 |
+
- Preserve document structure (headers, paragraphs)
|
| 41 |
+
- Include overlap for context continuity
|
| 42 |
+
- Add metadata for filtering
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
### Hierarchical Retrieval
|
| 46 |
+
|
| 47 |
+
Multi-level retrieval for better precision
|
| 48 |
+
|
| 49 |
+
```javascript
|
| 50 |
+
- Index at multiple chunk sizes (paragraph, section, document)
|
| 51 |
+
- First pass: coarse retrieval for candidates
|
| 52 |
+
- Second pass: fine-grained retrieval for precision
|
| 53 |
+
- Use parent-child relationships for context
|
| 54 |
+
```
|
| 55 |
+
|
| 56 |
+
### Hybrid Search
|
| 57 |
+
|
| 58 |
+
Combine semantic and keyword search
|
| 59 |
+
|
| 60 |
+
```javascript
|
| 61 |
+
- BM25/TF-IDF for keyword matching
|
| 62 |
+
- Vector similarity for semantic matching
|
| 63 |
+
- Reciprocal Rank Fusion for combining scores
|
| 64 |
+
- Weight tuning based on query type
|
| 65 |
+
```
|
| 66 |
+
|
| 67 |
+
## Anti-Patterns
|
| 68 |
+
|
| 69 |
+
### ❌ Fixed Chunk Size
|
| 70 |
+
|
| 71 |
+
### ❌ Embedding Everything
|
| 72 |
+
|
| 73 |
+
### ❌ Ignoring Evaluation
|
| 74 |
+
|
| 75 |
+
## ⚠️ Sharp Edges
|
| 76 |
+
|
| 77 |
+
| Issue | Severity | Solution |
|
| 78 |
+
|-------|----------|----------|
|
| 79 |
+
| Fixed-size chunking breaks sentences and context | high | Use semantic chunking that respects document structure: |
|
| 80 |
+
| Pure semantic search without metadata pre-filtering | medium | Implement hybrid filtering: |
|
| 81 |
+
| Using same embedding model for different content types | medium | Evaluate embeddings per content type: |
|
| 82 |
+
| Using first-stage retrieval results directly | medium | Add reranking step: |
|
| 83 |
+
| Cramming maximum context into LLM prompt | medium | Use relevance thresholds: |
|
| 84 |
+
| Not measuring retrieval quality separately from generation | high | Separate retrieval evaluation: |
|
| 85 |
+
| Not updating embeddings when source documents change | medium | Implement embedding refresh: |
|
| 86 |
+
| Same retrieval strategy for all query types | medium | Implement hybrid search: |
|
| 87 |
+
|
| 88 |
+
## Related Skills
|
| 89 |
+
|
| 90 |
+
Works well with: `ai-agents-architect`, `prompt-engineer`, `database-architect`, `backend`
|
.agent/skills/vector-database-engineer/SKILL.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
name: vector-database-engineer
|
| 3 |
+
description: "Expert in vector databases, embedding strategies, and semantic search implementation. Masters Pinecone, Weaviate, Qdrant, Milvus, and pgvector for RAG applications, recommendation systems, and similar"
|
| 4 |
+
---
|
| 5 |
+
|
| 6 |
+
# Vector Database Engineer
|
| 7 |
+
|
| 8 |
+
Expert in vector databases, embedding strategies, and semantic search implementation. Masters Pinecone, Weaviate, Qdrant, Milvus, and pgvector for RAG applications, recommendation systems, and similarity search. Use PROACTIVELY for vector search implementation, embedding optimization, or semantic retrieval systems.
|
| 9 |
+
|
| 10 |
+
## Do not use this skill when
|
| 11 |
+
|
| 12 |
+
- The task is unrelated to vector database engineer
|
| 13 |
+
- You need a different domain or tool outside this scope
|
| 14 |
+
|
| 15 |
+
## Instructions
|
| 16 |
+
|
| 17 |
+
- Clarify goals, constraints, and required inputs.
|
| 18 |
+
- Apply relevant best practices and validate outcomes.
|
| 19 |
+
- Provide actionable steps and verification.
|
| 20 |
+
- If detailed examples are required, open `resources/implementation-playbook.md`.
|
| 21 |
+
|
| 22 |
+
## Capabilities
|
| 23 |
+
|
| 24 |
+
- Vector database selection and architecture
|
| 25 |
+
- Embedding model selection and optimization
|
| 26 |
+
- Index configuration (HNSW, IVF, PQ)
|
| 27 |
+
- Hybrid search (vector + keyword) implementation
|
| 28 |
+
- Chunking strategies for documents
|
| 29 |
+
- Metadata filtering and pre/post-filtering
|
| 30 |
+
- Performance tuning and scaling
|
| 31 |
+
|
| 32 |
+
## Use this skill when
|
| 33 |
+
|
| 34 |
+
- Building RAG (Retrieval Augmented Generation) systems
|
| 35 |
+
- Implementing semantic search over documents
|
| 36 |
+
- Creating recommendation engines
|
| 37 |
+
- Building image/audio similarity search
|
| 38 |
+
- Optimizing vector search latency and recall
|
| 39 |
+
- Scaling vector operations to millions of vectors
|
| 40 |
+
|
| 41 |
+
## Workflow
|
| 42 |
+
|
| 43 |
+
1. Analyze data characteristics and query patterns
|
| 44 |
+
2. Select appropriate embedding model
|
| 45 |
+
3. Design chunking and preprocessing pipeline
|
| 46 |
+
4. Choose vector database and index type
|
| 47 |
+
5. Configure metadata schema for filtering
|
| 48 |
+
6. Implement hybrid search if needed
|
| 49 |
+
7. Optimize for latency/recall tradeoffs
|
| 50 |
+
8. Set up monitoring and reindexing strategies
|
| 51 |
+
|
| 52 |
+
## Best Practices
|
| 53 |
+
|
| 54 |
+
- Choose embedding dimensions based on use case (384-1536)
|
| 55 |
+
- Implement proper chunking with overlap
|
| 56 |
+
- Use metadata filtering to reduce search space
|
| 57 |
+
- Monitor embedding drift over time
|
| 58 |
+
- Plan for index rebuilding
|
| 59 |
+
- Cache frequent queries
|
| 60 |
+
- Test recall vs latency tradeoffs
|
models/rossmann_production_model.pkl
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
-
oid sha256:
|
| 3 |
-
size
|
|
|
|
| 1 |
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:19f7950c78166df1b87f4b5e5db12b0782e6cd96a2f51502ddef7af41a225e7d
|
| 3 |
+
size 53873380
|
src/app.py
CHANGED
|
@@ -116,33 +116,45 @@ def predict(request: PredictionRequest):
|
|
| 116 |
# 3. Feature Engineering
|
| 117 |
processed_df = pipeline.run_feature_engineering(input_data)
|
| 118 |
|
| 119 |
-
# 4. Handle Categorical Encoding (
|
| 120 |
-
|
| 121 |
-
|
|
|
|
| 122 |
|
| 123 |
if 'StoreType' in processed_df.columns:
|
| 124 |
-
processed_df['StoreType'] =
|
| 125 |
|
| 126 |
if 'Assortment' in processed_df.columns:
|
| 127 |
-
processed_df['Assortment'] =
|
| 128 |
|
| 129 |
-
# 5. Select Features
|
| 130 |
feature_cols = [
|
| 131 |
'Store', 'DayOfWeek', 'Promo', 'StateHoliday', 'SchoolHoliday',
|
| 132 |
'Year', 'Month', 'Day', 'IsWeekend', 'DayOfMonth',
|
| 133 |
-
'CompetitionDistance', '
|
| 134 |
]
|
|
|
|
| 135 |
for i in range(1, 6):
|
| 136 |
feature_cols.extend([f'fourier_sin_{i}', f'fourier_cos_{i}'])
|
| 137 |
-
|
|
|
|
|
|
|
|
|
|
| 138 |
feature_cols.append('days_to_easter')
|
|
|
|
|
|
|
|
|
|
| 139 |
|
| 140 |
-
if 'CompetitionOpenTime' not in processed_df.columns:
|
| 141 |
-
processed_df['CompetitionOpenTime'] = 0
|
| 142 |
-
|
| 143 |
valid_cols = [c for c in feature_cols if c in processed_df.columns]
|
| 144 |
-
X = processed_df[valid_cols].fillna(0)
|
| 145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 146 |
# 6. Predict Batch
|
| 147 |
y_log = pipeline.model.predict(X)
|
| 148 |
y_sales = np.expm1(y_log)
|
|
|
|
| 116 |
# 3. Feature Engineering
|
| 117 |
processed_df = pipeline.run_feature_engineering(input_data)
|
| 118 |
|
| 119 |
+
# 4. Handle Categorical Encoding (Consistent with Pipeline)
|
| 120 |
+
# pipeline.py uses hardcoded map:
|
| 121 |
+
# StoreType: {'a':1, 'b':2, 'c':3, 'd':4}
|
| 122 |
+
# Assortment: {'a':1, 'b':2, 'c':3}
|
| 123 |
|
| 124 |
if 'StoreType' in processed_df.columns:
|
| 125 |
+
processed_df['StoreType'] = processed_df['StoreType'].astype(str).map({'a':1, 'b':2, 'c':3, 'd':4}).fillna(0)
|
| 126 |
|
| 127 |
if 'Assortment' in processed_df.columns:
|
| 128 |
+
processed_df['Assortment'] = processed_df['Assortment'].astype(str).map({'a':1, 'b':2, 'c':3}).fillna(0)
|
| 129 |
|
| 130 |
+
# 5. Select Features (Must match pipeline.py auto_retrain)
|
| 131 |
feature_cols = [
|
| 132 |
'Store', 'DayOfWeek', 'Promo', 'StateHoliday', 'SchoolHoliday',
|
| 133 |
'Year', 'Month', 'Day', 'IsWeekend', 'DayOfMonth',
|
| 134 |
+
'CompetitionDistance', 'StoreType', 'Assortment'
|
| 135 |
]
|
| 136 |
+
# Fourier terms
|
| 137 |
for i in range(1, 6):
|
| 138 |
feature_cols.extend([f'fourier_sin_{i}', f'fourier_cos_{i}'])
|
| 139 |
+
|
| 140 |
+
# Easter features derived in features.py
|
| 141 |
+
# features.py produces 'days_to_easter' THEN 'easter_effect'.
|
| 142 |
+
# pipeline.py picks them in that order.
|
| 143 |
feature_cols.append('days_to_easter')
|
| 144 |
+
feature_cols.append('easter_effect')
|
| 145 |
+
|
| 146 |
+
# CompetitionOpenTime was NOT in pipeline.py logic so we exclude it here.
|
| 147 |
|
|
|
|
|
|
|
|
|
|
| 148 |
valid_cols = [c for c in feature_cols if c in processed_df.columns]
|
|
|
|
| 149 |
|
| 150 |
+
# IMPORTANT: Ensure columns are in the passed list order, filling missing with 0
|
| 151 |
+
X = pd.DataFrame()
|
| 152 |
+
for c in feature_cols:
|
| 153 |
+
if c in processed_df.columns:
|
| 154 |
+
X[c] = processed_df[c]
|
| 155 |
+
else:
|
| 156 |
+
X[c] = 0
|
| 157 |
+
|
| 158 |
# 6. Predict Batch
|
| 159 |
y_log = pipeline.model.predict(X)
|
| 160 |
y_sales = np.expm1(y_log)
|
src/pipeline.py
CHANGED
|
@@ -98,15 +98,52 @@ class RossmannPipeline:
|
|
| 98 |
self.auto_retrain(full_df, current_date)
|
| 99 |
current_date = next_date
|
| 100 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
def auto_retrain(self, full_df, current_date):
|
| 102 |
logger.info(f"Auto-retraining at {current_date.date()}...")
|
| 103 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
train_feat = self.run_feature_engineering(train_df)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
feature_cols = [
|
| 106 |
'Store', 'DayOfWeek', 'Promo', 'StateHoliday', 'SchoolHoliday',
|
| 107 |
'Year', 'Month', 'Day', 'IsWeekend', 'DayOfMonth',
|
| 108 |
-
'CompetitionDistance'
|
| 109 |
] + [c for c in train_feat.columns if 'fourier' in c or 'easter' in c]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
X, y = train_feat[feature_cols].fillna(0), train_feat['target']
|
| 111 |
self.train(X, y)
|
| 112 |
-
|
|
|
|
|
|
| 98 |
self.auto_retrain(full_df, current_date)
|
| 99 |
current_date = next_date
|
| 100 |
|
| 101 |
+
def save_model(self, path="models/rossmann_production_model.pkl"):
|
| 102 |
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
| 103 |
+
with open(path, 'wb') as f:
|
| 104 |
+
pickle.dump(self.model, f)
|
| 105 |
+
logger.info(f"Model saved to {path}")
|
| 106 |
+
|
| 107 |
+
def load_model(self, path="models/rossmann_production_model.pkl"):
|
| 108 |
+
if os.path.exists(path):
|
| 109 |
+
with open(path, 'rb') as f:
|
| 110 |
+
self.model = pickle.load(f)
|
| 111 |
+
logger.info(f"Model loaded from {path}")
|
| 112 |
+
else:
|
| 113 |
+
logger.warning(f"Model file not found at {path}")
|
| 114 |
+
|
| 115 |
def auto_retrain(self, full_df, current_date):
|
| 116 |
logger.info(f"Auto-retraining at {current_date.date()}...")
|
| 117 |
+
# Use a larger window or all available data
|
| 118 |
+
train_df = full_df[full_df['Date'] < current_date]
|
| 119 |
+
|
| 120 |
+
# Limit training size for performance if needed, but XGBoost handles 1M rows fine usually
|
| 121 |
+
# train_df = train_df.tail(100000)
|
| 122 |
+
|
| 123 |
train_feat = self.run_feature_engineering(train_df)
|
| 124 |
+
|
| 125 |
+
# Simple Categorical Encoding for Pipeline (StoreType/Assortment)
|
| 126 |
+
# Note: This should ideally be in a Strategy, but hardcoding for consistency with app.py
|
| 127 |
+
# (BUT app.py was doing it wrong. We will use simple mapping here and replicate in app.py)
|
| 128 |
+
if 'StoreType' in train_feat.columns:
|
| 129 |
+
train_feat['StoreType'] = train_feat['StoreType'].astype(str).map({'a':1, 'b':2, 'c':3, 'd':4}).fillna(0)
|
| 130 |
+
if 'Assortment' in train_feat.columns:
|
| 131 |
+
train_feat['Assortment'] = train_feat['Assortment'].astype(str).map({'a':1, 'b':2, 'c':3}).fillna(0)
|
| 132 |
+
|
| 133 |
feature_cols = [
|
| 134 |
'Store', 'DayOfWeek', 'Promo', 'StateHoliday', 'SchoolHoliday',
|
| 135 |
'Year', 'Month', 'Day', 'IsWeekend', 'DayOfMonth',
|
| 136 |
+
'CompetitionDistance', 'StoreType', 'Assortment'
|
| 137 |
] + [c for c in train_feat.columns if 'fourier' in c or 'easter' in c]
|
| 138 |
+
|
| 139 |
+
# Ensure target is ready
|
| 140 |
+
if 'target' not in train_feat.columns:
|
| 141 |
+
# Apply log transform if not applied (check strategy)
|
| 142 |
+
# But run_feature_engineering should have done it if configured.
|
| 143 |
+
# Double check config in run_feature_engineering loop.
|
| 144 |
+
pass
|
| 145 |
+
|
| 146 |
X, y = train_feat[feature_cols].fillna(0), train_feat['target']
|
| 147 |
self.train(X, y)
|
| 148 |
+
self.save_model()
|
| 149 |
+
logger.info("Retraining complete and model saved.")
|