Retro
by demithras
Skill & agent-centric retrospective with auto-collection, entity extraction, and skill suggestions. Invoke when: user calls /retro, finishes significant work, or wants to reflect on tooling effectiveness. Captures skill gaps, friction, agent evaluation, extracts entities, and creates improvement issues.
Skill Details
Repository Files
2 files in this skill directory
name: retro version: 2.3.0 description: "Skill & agent-centric retrospective with auto-collection, entity extraction, and skill suggestions. Invoke when: user calls /retro, finishes significant work, or wants to reflect on tooling effectiveness. Captures skill gaps, friction, agent evaluation, extracts entities, and creates improvement issues." allowed-tools: [Read, Bash, Glob, Grep, Write, AskUserQuestion] lifecycle: status: active created_at: "2026-01-21" updated_at: "2026-01-26" history:
- version: 2.3.0 date: "2026-01-26" changes: "Added auto skill suggestions based on friction patterns, repeated agents, and coverage gaps."
- version: 2.2.0 date: "2026-01-26" changes: "Added entity extraction to Obsidian vault. Extracted entities written to obsidian-vault/entities/"
- version: 2.1.0 date: "2026-01-26" changes: "Simplified: removed auto-trigger ceremony, made opt-in not ritual. Removed references to deleted skills."
- version: 2.0.0 date: "2026-01-26" changes: "Major rewrite: skill-centric + agent-centric evaluation, auto-collection, beads issue creation" manual_validated: "2026-01-26 - scenario: '/retro --quick' - PASS (6/6: auto-collection, structured report, skill+agent eval, AX state, CLEAR check, no errors)"
- version: 1.0.0 date: "2026-01-21" changes: "MVP: list closed, reflect on specific, adaptive prompts, dual storage"
/retro — Skill & Agent Centric Retrospective
TL;DR: Auto-collect session data (skills, agents, friction), analyze tooling effectiveness, and create actionable improvement issues. The "R" in CLEAR.
Quick Reference
/retro # Full retro with auto-collection
/retro <issue-id> # Retro focused on specific work
/retro --quick # Minimal prompts, max automation
/retro --verbose # Include all collected data in output
Core Philosophy
Retro is about tooling, not feelings. (model)
Traditional retros ask "what went well/badly?" — subjective and hard to act on. This skill focuses on tooling effectiveness:
- Which skills helped? Which caused friction?
- Which agents worked? What's missing?
- What can we automate for next time?
Key insight: Every retro feeds /skill-farm — the system improves itself.
What Gets Auto-Collected
/retro automatically analyzes the session for:
| Data Type | Source | Purpose |
|---|---|---|
| Skills invoked | <command-name> tags, state blocks |
Skill usage patterns |
| Skill outcomes | State blocks, completion indicators | Success/failure analysis |
| Agents spawned | Task tool calls | Agent effectiveness |
| Friction events | Tool errors, retries, workarounds | Pain point identification |
| Entities | Skills, agents, tools, patterns | Knowledge graph population |
No manual logging required — the skill reconstructs this from conversation context.
Entity Extraction
Entities are extracted and persisted to obsidian-vault/entities/ for knowledge graph building.
Entity Types
| Type | Source | Example |
|---|---|---|
| skill | /skill-name invocations |
/meta, /retro |
| agent | Task tool calls | Explore, general-purpose |
| tool | Tool invocations | Read, Write, Bash |
| pattern | Repeated behaviors | "parallel agents", "CLEAR check" |
| concept | Key terms mentioned | "L-labels", "AX", "state blocks" |
Auto-Extraction Rules
EXTRACT_ENTITIES():
entities = []
# Skills → entity files
FOR EACH skill IN collected_skills:
entities.push({
type: "skill",
name: skill.skill_name,
context: skill.outcome,
frequency: COUNT occurrences
})
# Agents → entity files
FOR EACH agent IN collected_agents:
entities.push({
type: "agent",
name: agent.subagent_type,
context: agent.description,
frequency: COUNT occurrences
})
# Patterns → extract from repeated behaviors
IF detected_patterns:
FOR EACH pattern IN detected_patterns:
entities.push({
type: "pattern",
name: pattern.name,
context: pattern.description
})
RETURN entities
Entity Persistence
PERSIST_ENTITIES(entities):
vault_path = "obsidian-vault/entities"
FOR EACH entity IN entities:
filename = SLUGIFY(entity.name) + ".md"
filepath = vault_path + "/" + filename
IF EXISTS(filepath):
# Update existing entity
content = Read(filepath)
UPDATE frequency in frontmatter
ADD new occurrence to table
Write(filepath, updated_content)
ELSE:
# Create new entity from template
content = GENERATE from templates/entity.md
FILL IN:
- entity_type: entity.type
- name: entity.name
- description: entity.context
- frequency: 1
- last_seen: TODAY
Write(filepath, content)
Data Collection Schema
session_data:
skills:
- skill_name: string # e.g., "clarify", "action"
invoked_at: timestamp
arguments: string | null
outcome: "success" | "partial" | "failed" | "interrupted"
friction_signals:
- type: "retry" | "workaround" | "abandoned"
description: string
agents:
- subagent_type: string # e.g., "general-purpose", "Explore"
description: string
spawned_at: timestamp
outcome: "success" | "failed" | "timeout"
parent_skill: string | null
friction:
- tool: string
error_type: string
recovery: "retry" | "workaround" | "abandoned" | "asked_user"
context: string
Evaluation Frameworks
Skill Evaluation
| Analysis | Question | Output |
|---|---|---|
| Gaps | What skills were needed but don't exist? | New skill proposals |
| Friction | Where did existing skills slow things down? | Improvement suggestions |
| Coverage | What should existing skills do better? | Missing capabilities |
Agent Evaluation
| Analysis | Question | Output |
|---|---|---|
| Skill Needs | Which skills should agents have access to? | Agent tool additions |
| Missing Agents | What specialized agents would help? | New agent proposals |
| Orchestration | How can agent coordination improve? | Pattern improvements |
Output Format
UX Layer (Human-Readable)
## Retro: [Session/Feature Name]
**Session Summary**: X skills | Y agents | Z friction events
---
### 🎯 What Worked
- [Auto-generated + user additions]
### ⚠️ What Didn't Work
- [Auto-generated + user additions]
### 🔄 Patterns Discovered
- [Extracted patterns]
---
### 🛠️ Skill Evaluation
#### Gaps (Missing Skills)
| Gap | Evidence | Suggested Skill | Priority |
|-----|----------|-----------------|----------|
#### Friction (Existing Skills)
| Skill | Issue | Suggested Fix |
|-------|-------|---------------|
#### Coverage (Skill Improvements)
| Skill | Missing Capability | Use Case |
|-------|-------------------|----------|
---
### 🤖 Agent Evaluation
#### Skill Needs
| Agent Type | Needed Skill | Rationale |
|------------|--------------|-----------|
#### Missing Agents
| Proposed Agent | Use Case | Skills Needed |
|----------------|----------|---------------|
#### Orchestration
| Current Pattern | Improvement |
|-----------------|-------------|
---
### 🔍 Entities Extracted
| Entity | Type | File |
|--------|------|------|
| /meta | skill | [[entities/meta]] |
| Explore | agent | [[entities/explore-agent]] |
**New**: 2 | **Updated**: 1
---
### 💡 Skill Suggestions
| Type | Name/Target | Reason |
|------|-------------|--------|
| New skill | /canvas-gen | Repeated agent pattern (2x) |
| Improve | /meta | Missing "quick mode" capability |
**Actions**: `/skill-farm create canvas-gen` | `/skill-farm improve meta`
---
### 📋 Issues Created
- meta-xxx: [SKILL] skillname: fix description
- meta-yyy: [NEW SKILL] proposal
Ready for → next session | /skill-farm | entities viewable in Obsidian
AX Layer (Agent-Parseable)
<!-- retro:state
session_id: "..."
summary: {skills_used: X, agents_spawned: Y, friction_events: Z, entities_extracted: N}
collected_data: {
skills: [...],
agents: [...],
friction: [...]
}
skill_evaluation: {
gaps: [{description, evidence, suggested_skill, priority}],
friction: [{skill_name, issue, suggested_fix}],
coverage: [{skill_name, missing_capability, use_case}]
}
agent_evaluation: {
skill_needs: [{agent_type, needed_skill, rationale}],
missing_agents: [{description, use_case, skills_needed}],
orchestration: [{current_pattern, improvement}]
}
entities_extracted: [
{type: "skill", name: "/meta", file: "entities/meta.md"},
{type: "agent", name: "Explore", file: "entities/explore-agent.md"}
]
skill_suggestions: [
{type: "new_skill", name: "canvas-gen", reason: "Repeated agent pattern", command: "/skill-farm create canvas-gen"},
{type: "improve_skill", skill: "meta", capability: "quick mode", command: "/skill-farm improve meta"}
]
issues_created: ["meta-xxx", "meta-yyy"]
handoff: {
skill_farm: {applicable: true, issues: [...], suggestions: [...]},
entities: {created: [...], updated: [...]}
}
/retro:state -->
Agent Execution Guide
1. PARSE input and flags:
IF --quick flag → minimal_prompts = true
IF --verbose flag → show_raw_data = true
IF <issue-id> provided → scope = specific_issue
ELSE → scope = full_session
2. COLLECT session data:
2.1 COLLECT_SKILLS():
skills = []
# Pattern 1: Command tags
FOR EACH match of /<command-name>\/(\w+)<\/command-name>/ in conversation:
skills.push({skill_name: match[1], source: "command"})
# Pattern 2: State blocks
FOR EACH match of /<!-- (\w+):state[\s\S]*?\/\1:state -->/:
skill = skills.find(s => s.skill_name == match[1])
IF skill:
skill.outcome = PARSE state for "met: true" → "success" ELSE "partial"
ELSE:
skills.push({skill_name: match[1], outcome: "success", source: "state_block"})
RETURN deduplicate(skills)
2.2 COLLECT_AGENTS():
agents = []
FOR EACH Task tool call in conversation:
agents.push({
subagent_type: EXTRACT subagent_type param,
description: EXTRACT description param,
outcome: IF result message exists → "success" ELSE "unknown"
})
RETURN agents
2.3 COLLECT_FRICTION():
friction = []
# Look for error patterns
FOR EACH tool error or retry pattern:
friction.push({
tool: identified_tool,
error_type: categorize_error(),
recovery: detect_recovery_action()
})
RETURN friction
3. EVALUATE skills:
3.1 ANALYZE_GAPS():
gaps = []
# Friction with workaround = potential skill gap
FOR EACH f IN friction WHERE f.recovery == "workaround":
gaps.push({
description: f.context,
evidence: [f],
suggested_skill: INFER from workaround pattern,
priority: "medium"
})
RETURN gaps
3.2 ANALYZE_FRICTION():
skill_friction = []
FOR EACH skill IN skills WHERE skill.outcome != "success":
skill_friction.push({
skill_name: skill.skill_name,
issue: INFER from friction_signals or outcome,
suggested_fix: GENERATE improvement suggestion
})
RETURN skill_friction
3.3 ANALYZE_COVERAGE():
coverage = []
# Agent work that could be a skill
FOR EACH agent IN agents WHERE agent.description matches repeatable pattern:
coverage.push({
skill_name: INFER target skill,
missing_capability: agent.description,
use_case: INFER from context
})
RETURN coverage
4. EVALUATE agents:
4.1 ANALYZE_SKILL_NEEDS():
needs = []
FOR EACH agent failure or limitation:
needs.push({
agent_type: agent.subagent_type,
needed_skill: INFER from failure context,
rationale: "Would have helped with X"
})
RETURN needs
4.2 ANALYZE_MISSING_AGENTS():
missing = []
# Repeated patterns that could be specialized agents
FOR EACH repeated_pattern IN agent_descriptions:
missing.push({
description: "Specialized agent for " + pattern,
use_case: pattern_context,
skills_needed: INFER required tools
})
RETURN missing
4.3 ANALYZE_ORCHESTRATION():
orchestration = []
# Sequential work that could be parallel
IF detected sequential agents without dependencies:
orchestration.push({
current_pattern: "Sequential execution",
improvement: "Parallel execution possible"
})
RETURN orchestration
5. PROMPT user (unless --quick):
IF NOT minimal_prompts:
AskUserQuestion([
{
question: "Any additional observations about what worked well?",
header: "Worked",
options: [
{label: "Skills were helpful", description: "The skills invoked did their job"},
{label: "Agents were effective", description: "Subagents completed work successfully"},
{label: "Smooth workflow", description: "No significant friction"},
{label: "Nothing to add", description: "Auto-collected data is sufficient"}
],
multiSelect: true
},
{
question: "Any friction points the system missed?",
header: "Friction",
options: [
{label: "Skill was confusing", description: "Had to re-read or retry"},
{label: "Missing capability", description: "Wanted something that doesn't exist"},
{label: "Agent failed", description: "Subagent didn't complete as expected"},
{label: "None missed", description: "Auto-collection captured everything"}
],
multiSelect: true
}
])
INCORPORATE user_responses into evaluation
6. EXTRACT and PERSIST entities:
entities = EXTRACT_ENTITIES() # See Entity Extraction section
PERSIST_ENTITIES(entities) # Write to obsidian-vault/entities/
# Track what was extracted
entities_created = []
entities_updated = []
FOR EACH entity IN entities:
IF entity was new:
entities_created.push(entity.name)
ELSE:
entities_updated.push(entity.name)
7. CREATE beads issues:
issues_created = []
# High/medium priority gaps → new skill issues
FOR EACH gap IN gaps WHERE gap.priority IN ["high", "medium"]:
priority_num = IF gap.priority == "high" THEN 1 ELSE 2
result = Bash("bd create --title='[NEW SKILL] {gap.suggested_skill}' --type=feature --priority={priority_num}")
issues_created.push(EXTRACT issue_id from result)
# Friction fixes → improvement issues
FOR EACH friction IN skill_friction:
result = Bash("bd create --title='[SKILL] {friction.skill_name}: {friction.suggested_fix}' --type=task --priority=2")
issues_created.push(EXTRACT issue_id from result)
# Agent needs → agent issues
FOR EACH need IN skill_needs:
result = Bash("bd create --title='[AGENT] {need.agent_type}: add {need.needed_skill}' --type=task --priority=3")
issues_created.push(EXTRACT issue_id from result)
9. GENERATE output:
9.1 OUTPUT UX layer:
- Session summary with counts
- What worked / What didn't (auto + user)
- Skill evaluation tables
- Agent evaluation tables
- Entities extracted section
- Issues created list
9.2 OUTPUT AX layer:
<!-- retro:state ... -->
10. CLEAR check:
OUTPUT "📋 CLEAR: C✓ L✓ E✓ A✓ R✓ | Retro complete"
IF issues_created.length > 0:
OUTPUT "→ /skill-farm can process {issues_created.length} improvement issues"
IF entities_created.length > 0:
OUTPUT "→ {entities_created.length} new entities in obsidian-vault/entities/"
11. ERROR recovery:
IF collection fails → WARN, proceed with partial data
IF bd create fails → WARN, output markdown-only (no persistence)
IF no data collected → prompt user for manual input
Integration Notes
Downstream: /skill-farm
Improvement issues feed into /skill-farm:
/retro → [SKILL] issues → /skill-farm → improved skills
Auto Skill Suggestions
/retro automatically detects patterns that indicate new skills should be created:
| Pattern | Detection | Suggested Action |
|---|---|---|
| Repeated workaround | Same friction type 2+ times | New skill to automate |
| Agent doing skill work | Agent description matches skill pattern | Formalize as skill |
| Manual multi-step | User did 3+ steps that could be one command | New skill to bundle |
| Coverage gap | Existing skill lacks needed capability | Skill improvement |
Detection Logic:
SUGGEST_SKILLS():
suggestions = []
# Pattern 1: Repeated workarounds → new skill
workaround_groups = GROUP friction BY context_similarity
FOR EACH group WHERE group.count >= 2:
suggestions.push({
type: "new_skill",
name: INFER from workaround pattern,
reason: "Repeated workaround detected ({group.count}x)",
evidence: group.items
})
# Pattern 2: Agent work → formalize as skill
FOR EACH agent IN agents:
IF agent.description matches /implement|create|generate|validate/:
IF similar_agent_spawned_before(agent):
suggestions.push({
type: "new_skill",
name: INFER from agent.description,
reason: "Repeated agent pattern could be a skill",
evidence: [agent]
})
# Pattern 3: Coverage gaps
FOR EACH friction IN skill_friction:
IF friction.issue indicates "missing capability":
suggestions.push({
type: "improve_skill",
skill: friction.skill_name,
capability: friction.issue,
reason: "Skill coverage gap"
})
RETURN suggestions
Output Section:
### 💡 Skill Suggestions
| Type | Name/Target | Reason | Action |
|------|-------------|--------|--------|
| New skill | /canvas-gen | Repeated agent pattern | `/skill-farm create canvas-gen` |
| Improve | /meta | Missing "quick mode" | `/skill-farm improve meta` |
Run suggested commands or dismiss: [Create All] [Skip]
When to Run /retro
Good times to run:
- End of work session
- After significant friction encountered
- Want to capture patterns for reuse
- Closing significant beads issues
Skip when:
- Trivial single-step tasks
- Pure exploration with no execution
Examples
Example 1: After Significant Work
/retro
## Retro: Export Feature Implementation
**Session Summary**: 2 skills | 3 agents | 1 friction event
### 🎯 What Worked
- /meta analysis helped choose approach
- Parallel agent execution saved time (tasks 2 & 3)
### ⚠️ What Didn't Work
- Agent prompt was too vague, needed retry
### 🛠️ Skill Evaluation
#### Friction
| Skill | Issue | Suggested Fix |
|-------|-------|---------------|
| - | Agent prompt unclear | Add prompt templates |
### 📋 Issues Created
- meta-abc: [SKILL] Add agent prompt templates
📋 CLEAR: C✓ L✓ E✓ A✓ R✓ | Retro complete
Example 2: Quick Mode
/retro --quick
## Retro: Session Summary
**Auto-collected**: 2 skills | 1 agent | 0 friction
No significant issues detected. Session was smooth.
📋 CLEAR: C✓ L✓ E✓ A✓ R✓
Anti-Patterns
| Don't | Do Instead |
|---|---|
| Run after every tiny task | Reserve for significant work |
| Skip issue creation | Persist actionable improvements |
| Ignore agent evaluation | Both skills AND agents matter |
| Over-prompt the user | Auto-collect first, ask only if needed |
Error Handling
| Condition | Recovery |
|---|---|
| No session data found | Prompt user for manual reflection |
| bd create fails | Output markdown, skip persistence |
| Collection incomplete | Proceed with partial data, note gaps |
| User skips all prompts | Generate from auto-collected only |
CLEAR Check (Required Exit)
Every /retro invocation ends with:
📋 CLEAR: C✓ L✓ E✓ A✓ R✓ | Retro complete
If issues were created:
→ /skill-farm can process N improvement issues
Version History
| Version | Date | Changes |
|---|---|---|
| 2.0.0 | 2026-01-26 | Major rewrite: skill-centric + agent-centric, auto-collection, beads issues |
| 1.0.0 | 2026-01-21 | MVP: list closed, reflect, adaptive prompts, dual storage |
Related Skills
Dbt Transformation Patterns
Master dbt (data build tool) for analytics engineering with model organization, testing, documentation, and incremental strategies. Use when building data transformations, creating data models, or implementing analytics engineering best practices.
Anndata
This skill should be used when working with annotated data matrices in Python, particularly for single-cell genomics analysis, managing experimental measurements with metadata, or handling large-scale biological datasets. Use when tasks involve AnnData objects, h5ad files, single-cell RNA-seq data, or integration with scanpy/scverse tools.
Xlsx
Spreadsheet toolkit (.xlsx/.csv). Create/edit with formulas/formatting, analyze data, visualization, recalculate formulas, for spreadsheet processing and analysis.
Tensorboard
Visualize training metrics, debug models with histograms, compare experiments, visualize model graphs, and profile performance with TensorBoard - Google's ML visualization toolkit
Deeptools
NGS analysis toolkit. BAM to bigWig conversion, QC (correlation, PCA, fingerprints), heatmaps/profiles (TSS, peaks), for ChIP-seq, RNA-seq, ATAC-seq visualization.
Scvi Tools
This skill should be used when working with single-cell omics data analysis using scvi-tools, including scRNA-seq, scATAC-seq, CITE-seq, spatial transcriptomics, and other single-cell modalities. Use this skill for probabilistic modeling, batch correction, dimensionality reduction, differential expression, cell type annotation, multimodal integration, and spatial analysis tasks.
Statsmodels
Statistical modeling toolkit. OLS, GLM, logistic, ARIMA, time series, hypothesis tests, diagnostics, AIC/BIC, for rigorous statistical inference and econometric analysis.
Scikit Survival
Comprehensive toolkit for survival analysis and time-to-event modeling in Python using scikit-survival. Use this skill when working with censored survival data, performing time-to-event analysis, fitting Cox models, Random Survival Forests, Gradient Boosting models, or Survival SVMs, evaluating survival predictions with concordance index or Brier score, handling competing risks, or implementing any survival analysis workflow with the scikit-survival library.
Neurokit2
Comprehensive biosignal processing toolkit for analyzing physiological data including ECG, EEG, EDA, RSP, PPG, EMG, and EOG signals. Use this skill when processing cardiovascular signals, brain activity, electrodermal responses, respiratory patterns, muscle activity, or eye movements. Applicable for heart rate variability analysis, event-related potentials, complexity measures, autonomic nervous system assessment, psychophysiology research, and multi-modal physiological signal integration.
Statistical Analysis
Statistical analysis toolkit. Hypothesis tests (t-test, ANOVA, chi-square), regression, correlation, Bayesian stats, power analysis, assumption checks, APA reporting, for academic research.
