feat: team-aware /retro v2.0 — per-person praise and growth opportunities

- Identify current user via git config, orient narrative as "you" vs teammates
- Add per-author metrics: commits, LOC, focus areas, commit type mix, sessions
- New "Your Week" section with personal deep-dive for whoever runs the command
- New "Team Breakdown" with per-person praise and growth opportunities
- Track AI-assisted commits via Co-Authored-By trailers
- Personal + team shipping streaks
- Tone: praise like a 1:1, growth like investment advice, never compare negatively

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-03-13 00:17:10 -07:00
parent c1431f07a9
commit e706917263

View File

@@ -1,9 +1,10 @@
--- ---
name: retro name: retro
version: 1.0.0 version: 2.0.0
description: | description: |
Weekly engineering retrospective. Analyzes commit history, work patterns, Weekly engineering retrospective. Analyzes commit history, work patterns,
and code quality metrics with persistent history and trend tracking. and code quality metrics with persistent history and trend tracking.
Team-aware: breaks down per-person contributions with praise and growth areas.
allowed-tools: allowed-tools:
- Bash - Bash
- Read - Read
@@ -13,7 +14,7 @@ allowed-tools:
# /retro — Weekly Engineering Retrospective # /retro — Weekly Engineering Retrospective
Generates a comprehensive engineering retrospective analyzing commit history, work patterns, and code quality metrics. Designed for a senior IC/CTO-level builder using Claude Code as a force multiplier. Generates a comprehensive engineering retrospective analyzing commit history, work patterns, and code quality metrics. Team-aware: identifies the user running the command, then analyzes every contributor with per-person praise and growth opportunities. Designed for a senior IC/CTO-level builder using Claude Code as a force multiplier.
## User-invocable ## User-invocable
When the user types `/retro`, run this skill. When the user types `/retro`, run this skill.
@@ -43,31 +44,42 @@ Usage: /retro [window]
### Step 1: Gather Raw Data ### Step 1: Gather Raw Data
First, fetch origin to ensure we have the latest: First, fetch origin and identify the current user:
```bash ```bash
git fetch origin main --quiet git fetch origin main --quiet
# Identify who is running the retro
git config user.name
git config user.email
``` ```
The name returned by `git config user.name` is **"you"** — the person reading this retro. All other authors are teammates. Use this to orient the narrative: "your" commits vs teammate contributions.
Run ALL of these git commands in parallel (they are independent): Run ALL of these git commands in parallel (they are independent):
```bash ```bash
# 1. All commits in window with timestamps, subject, hash, files changed, insertions, deletions # 1. All commits in window with timestamps, subject, hash, AUTHOR, files changed, insertions, deletions
git log origin/main --since="<window>" --format="%H|%ai|%s" --shortstat git log origin/main --since="<window>" --format="%H|%aN|%ae|%ai|%s" --shortstat
# 2. Per-commit test vs total LOC breakdown (single command, parse output) # 2. Per-commit test vs total LOC breakdown with author
# Each commit block starts with COMMIT:<hash>, followed by numstat lines. # Each commit block starts with COMMIT:<hash>|<author>, followed by numstat lines.
# Separate test files (matching test/|spec/|__tests__/) from production files. # Separate test files (matching test/|spec/|__tests__/) from production files.
git log origin/main --since="<window>" --format="COMMIT:%H" --numstat git log origin/main --since="<window>" --format="COMMIT:%H|%aN" --numstat
# 3. Commit timestamps for session detection and hourly distribution # 3. Commit timestamps for session detection and hourly distribution (with author)
# Use TZ=America/Los_Angeles for Pacific time conversion # Use TZ=America/Los_Angeles for Pacific time conversion
TZ=America/Los_Angeles git log origin/main --since="<window>" --format="%at|%ai|%s" | sort -n TZ=America/Los_Angeles git log origin/main --since="<window>" --format="%at|%aN|%ai|%s" | sort -n
# 4. Files most frequently changed (hotspot analysis) # 4. Files most frequently changed (hotspot analysis)
git log origin/main --since="<window>" --format="" --name-only | grep -v '^$' | sort | uniq -c | sort -rn git log origin/main --since="<window>" --format="" --name-only | grep -v '^$' | sort | uniq -c | sort -rn
# 5. PR numbers from commit messages (extract #NNN patterns) # 5. PR numbers from commit messages (extract #NNN patterns)
git log origin/main --since="<window>" --format="%s" | grep -oE '#[0-9]+' | sed 's/^#//' | sort -n | uniq | sed 's/^/#/' git log origin/main --since="<window>" --format="%s" | grep -oE '#[0-9]+' | sed 's/^#//' | sort -n | uniq | sed 's/^/#/'
# 6. Per-author file hotspots (who touches what)
git log origin/main --since="<window>" --format="AUTHOR:%aN" --name-only
# 7. Per-author commit counts (quick summary)
git shortlog origin/main --since="<window>" -sn --no-merges
``` ```
### Step 2: Compute Metrics ### Step 2: Compute Metrics
@@ -77,6 +89,7 @@ Calculate and present these metrics in a summary table:
| Metric | Value | | Metric | Value |
|--------|-------| |--------|-------|
| Commits to main | N | | Commits to main | N |
| Contributors | N |
| PRs merged | N | | PRs merged | N |
| Total insertions | N | | Total insertions | N |
| Total deletions | N | | Total deletions | N |
@@ -88,6 +101,17 @@ Calculate and present these metrics in a summary table:
| Detected sessions | N | | Detected sessions | N |
| Avg LOC/session-hour | N | | Avg LOC/session-hour | N |
Then show a **per-author leaderboard** immediately below:
```
Contributor Commits +/- Top area
You (garry) 32 +2400/-300 browse/
alice 12 +800/-150 app/services/
bob 3 +120/-40 tests/
```
Sort by commits descending. The current user (from `git config user.name`) always appears first, labeled "You (name)".
### Step 3: Commit Time Distribution ### Step 3: Commit Time Distribution
Show hourly histogram in Pacific time using bar chart: Show hourly histogram in Pacific time using bar chart:
@@ -158,27 +182,54 @@ From commit diffs, estimate PR sizes and bucket them:
- LOC changed - LOC changed
- Why it matters (infer from commit messages and files touched) - Why it matters (infer from commit messages and files touched)
### Step 9: Week-over-Week Trends (if window >= 14d) ### Step 9: Team Member Analysis
For each contributor (including the current user), compute:
1. **Commits and LOC** — total commits, insertions, deletions, net LOC
2. **Areas of focus** — which directories/files they touched most (top 3)
3. **Commit type mix** — their personal feat/fix/refactor/test breakdown
4. **Session patterns** — when they code (their peak hours), session count
5. **Test discipline** — their personal test LOC ratio
6. **Biggest ship** — their single highest-impact commit or PR in the window
**For the current user ("You"):** This section gets the deepest treatment. Include all the detail from the solo retro — session analysis, time patterns, focus score. Frame it in first person: "Your peak hours...", "Your biggest ship..."
**For each teammate:** Write 2-3 sentences covering what they worked on and their pattern. Then:
- **Praise** (1-2 specific things): Anchor in actual commits. Not "great work" — say exactly what was good. Examples: "Shipped the entire auth middleware rewrite in 3 focused sessions with 45% test coverage", "Every PR under 200 LOC — disciplined decomposition."
- **Opportunity for growth** (1 specific thing): Frame as a leveling-up suggestion, not criticism. Anchor in actual data. Examples: "Test ratio was 12% this week — adding test coverage to the payment module before it gets more complex would pay off", "5 fix commits on the same file suggest the original PR could have used a review pass."
**If only one contributor (solo repo):** Skip the team breakdown and proceed as before — the retro is personal.
**If there are Co-Authored-By trailers:** Parse `Co-Authored-By:` lines in commit messages. Credit those authors for the commit alongside the primary author. Note AI co-authors (e.g., `noreply@anthropic.com`) but do not include them as team members — instead, track "AI-assisted commits" as a separate metric.
### Step 10: Week-over-Week Trends (if window >= 14d)
If the time window is 14 days or more, split into weekly buckets and show trends: If the time window is 14 days or more, split into weekly buckets and show trends:
- Commits per week - Commits per week (total and per-author)
- LOC per week - LOC per week
- Test ratio per week - Test ratio per week
- Fix ratio per week - Fix ratio per week
- Session count per week - Session count per week
### Step 10: Streak Tracking ### Step 11: Streak Tracking
Count consecutive days with at least 1 commit to origin/main, going back from today: Count consecutive days with at least 1 commit to origin/main, going back from today. Track both team streak and personal streak:
```bash ```bash
# Get all unique commit dates (Pacific time) — no hard cutoff # Team streak: all unique commit dates (Pacific time) — no hard cutoff
TZ=America/Los_Angeles git log origin/main --format="%ad" --date=format:"%Y-%m-%d" | sort -u TZ=America/Los_Angeles git log origin/main --format="%ad" --date=format:"%Y-%m-%d" | sort -u
# Personal streak: only the current user's commits
TZ=America/Los_Angeles git log origin/main --author="<user_name>" --format="%ad" --date=format:"%Y-%m-%d" | sort -u
``` ```
Count backward from today — how many consecutive days have at least one commit? This queries the full history so streaks of any length are reported accurately. Display: "Shipping streak: 47 consecutive days" Count backward from today — how many consecutive days have at least one commit? This queries the full history so streaks of any length are reported accurately. Display both:
- "Team shipping streak: 47 consecutive days"
- "Your shipping streak: 32 consecutive days"
### Step 11: Load History & Compare ### Step 12: Load History & Compare
Before saving the new snapshot, check for prior retro history: Before saving the new snapshot, check for prior retro history:
@@ -199,7 +250,7 @@ Deep sessions: 3 → 5 ↑2
**If no prior retros exist:** Skip the comparison section and append: "First retro recorded — run again next week to see trends." **If no prior retros exist:** Skip the comparison section and append: "First retro recorded — run again next week to see trends."
### Step 12: Save Retro History ### Step 13: Save Retro History
After computing all metrics (including streak) and loading any prior history for comparison, save a JSON snapshot: After computing all metrics (including streak) and loading any prior history for comparison, save a JSON snapshot:
@@ -223,6 +274,7 @@ Use the Write tool to save the JSON file with this schema:
"window": "7d", "window": "7d",
"metrics": { "metrics": {
"commits": 47, "commits": 47,
"contributors": 3,
"prs_merged": 12, "prs_merged": 12,
"insertions": 3200, "insertions": 3200,
"deletions": 800, "deletions": 800,
@@ -236,15 +288,20 @@ Use the Write tool to save the JSON file with this schema:
"loc_per_session_hour": 350, "loc_per_session_hour": 350,
"feat_pct": 0.40, "feat_pct": 0.40,
"fix_pct": 0.30, "fix_pct": 0.30,
"peak_hour": 22 "peak_hour": 22,
"ai_assisted_commits": 32
},
"authors": {
"Garry Tan": { "commits": 32, "insertions": 2400, "deletions": 300, "test_ratio": 0.41, "top_area": "browse/" },
"Alice": { "commits": 12, "insertions": 800, "deletions": 150, "test_ratio": 0.35, "top_area": "app/services/" }
}, },
"version_range": ["1.16.0.0", "1.16.1.0"], "version_range": ["1.16.0.0", "1.16.1.0"],
"streak_days": 47, "streak_days": 47,
"tweetable": "Week of Mar 1: 47 commits, 3.2k LOC, 38% tests, 12 PRs, peak: 10pm" "tweetable": "Week of Mar 1: 47 commits (3 contributors), 3.2k LOC, 38% tests, 12 PRs, peak: 10pm"
} }
``` ```
### Step 13: Write the Narrative ### Step 14: Write the Narrative
Structure the output as: Structure the output as:
@@ -252,7 +309,7 @@ Structure the output as:
**Tweetable summary** (first line, before everything else): **Tweetable summary** (first line, before everything else):
``` ```
Week of Mar 1: 47 commits, 3.2k LOC, 38% tests, 12 PRs, peak: 10pm | Streak: 47d Week of Mar 1: 47 commits (3 contributors), 3.2k LOC, 38% tests, 12 PRs, peak: 10pm | Streak: 47d
``` ```
## Engineering Retro: [date range] ## Engineering Retro: [date range]
@@ -266,11 +323,11 @@ Week of Mar 1: 47 commits, 3.2k LOC, 38% tests, 12 PRs, peak: 10pm | Streak: 47d
### Time & Session Patterns ### Time & Session Patterns
(from Steps 3-4) (from Steps 3-4)
Narrative interpreting what the patterns mean: Narrative interpreting what the team-wide patterns mean:
- When the most productive hours are and what drives them - When the most productive hours are and what drives them
- Whether sessions are getting longer or shorter over time - Whether sessions are getting longer or shorter over time
- Estimated hours per day of active coding - Estimated hours per day of active coding (team aggregate)
- How this maps to "CEO who also codes" lifestyle - Notable patterns: do team members code at the same time or in shifts?
### Shipping Velocity ### Shipping Velocity
(from Steps 5-7) (from Steps 5-7)
@@ -291,20 +348,49 @@ Narrative covering:
- Focus score with interpretation - Focus score with interpretation
- Ship of the week callout - Ship of the week callout
### Top 3 Wins ### Your Week (personal deep-dive)
Identify the 3 highest-impact things shipped in the window. For each: (from Step 9, for the current user only)
This is the section the user cares most about. Include:
- Their personal commit count, LOC, test ratio
- Their session patterns and peak hours
- Their focus areas
- Their biggest ship
- **What you did well** (2-3 specific things anchored in commits)
- **Where to level up** (1-2 specific, actionable suggestions)
### Team Breakdown
(from Step 9, for each teammate — skip if solo repo)
For each teammate (sorted by commits descending), write a section:
#### [Name]
- **What they shipped**: 2-3 sentences on their contributions, areas of focus, and commit patterns
- **Praise**: 1-2 specific things they did well, anchored in actual commits. Be genuine — what would you actually say in a 1:1? Examples:
- "Cleaned up the entire auth module in 3 small, reviewable PRs — textbook decomposition"
- "Added integration tests for every new endpoint, not just happy paths"
- "Fixed the N+1 query that was causing 2s load times on the dashboard"
- **Opportunity for growth**: 1 specific, constructive suggestion. Frame as investment, not criticism. Examples:
- "Test coverage on the payment module is at 8% — worth investing in before the next feature lands on top of it"
- "3 of the 5 PRs were 800+ LOC — breaking these up would catch issues earlier and make review easier"
- "All commits land between 1-4am — sustainable pace matters for code quality long-term"
**AI collaboration note:** If many commits have `Co-Authored-By` AI trailers (e.g., Claude, Copilot), note the AI-assisted commit percentage as a team metric. Frame it neutrally — "N% of commits were AI-assisted" — without judgment.
### Top 3 Team Wins
Identify the 3 highest-impact things shipped in the window across the whole team. For each:
- What it was - What it was
- Who shipped it
- Why it matters (product/architecture impact) - Why it matters (product/architecture impact)
- What's impressive about the execution
### 3 Things to Improve ### 3 Things to Improve
Specific, actionable, anchored in actual commits. Phrase as "to get even better, you could..." Specific, actionable, anchored in actual commits. Mix personal and team-level suggestions. Phrase as "to get even better, the team could..."
### 3 Habits for Next Week ### 3 Habits for Next Week
Small, practical, realistic for a very busy person. Each must be something that takes <5 minutes to adopt. Small, practical, realistic. Each must be something that takes <5 minutes to adopt. At least one should be team-oriented (e.g., "review each other's PRs same-day").
### Week-over-Week Trends ### Week-over-Week Trends
(if applicable, from Step 9) (if applicable, from Step 10)
--- ---
@@ -324,7 +410,10 @@ When the user runs `/retro compare` (or `/retro compare 14d`):
- Specific and concrete — always anchor in actual commits/code - Specific and concrete — always anchor in actual commits/code
- Skip generic praise ("great job!") — say exactly what was good and why - Skip generic praise ("great job!") — say exactly what was good and why
- Frame improvements as leveling up, not criticism - Frame improvements as leveling up, not criticism
- Keep total output around 2500-3500 words - **Praise should feel like something you'd actually say in a 1:1** — specific, earned, genuine
- **Growth suggestions should feel like investment advice** — "this is worth your time because..." not "you failed at..."
- Never compare teammates against each other negatively. Each person's section stands on its own.
- Keep total output around 3000-4500 words (slightly longer to accommodate team sections)
- Use markdown tables and code blocks for data, prose for narrative - Use markdown tables and code blocks for data, prose for narrative
- Output directly to the conversation — do NOT write to filesystem (except the `.context/retros/` JSON snapshot) - Output directly to the conversation — do NOT write to filesystem (except the `.context/retros/` JSON snapshot)