| name | analyzing-branches |
| description | Use when analyzing another branch's iteration journals to extract findings, decisions, and insights from divergent work |
Analyzing Branches
Overview
Analyze another branch's iteration journals to extract key findings, decisions, and insights from work that diverged from the current branch.
Core principle: Learn from parallel explorations. Extract valuable insights from any branch, regardless of success or failure.
When to Use
Use this skill when:
- User runs
/analyze-branchcommand - Want to review work from parallel experiment branch
- Need to extract lessons from concluded experiments
- Comparing approaches across different branches
- Looking for salvageable ideas from any branch
DO NOT use for:
- Analyzing current branch history (use
/review-progressinstead) - Comparing file changes (use
git diffdirectly) - When branches have no autonomy iterations
Quick Reference
| Step | Action | Tool |
|---|---|---|
| 1. Parse arguments | Extract branch name and search criteria | Manual |
| 2. Find divergence | Use git merge-base to find common ancestor | Bash |
| 3. Extract iterations | Get autonomy tags from divergent commits | Bash |
| 4. Read journals | Read iteration files from target branch | Bash, Read |
| 5. Search and filter | Find relevant content based on criteria | Manual |
| 6. Generate report | Create markdown summary | Direct output |
Process
Step 1: Parse Arguments
Extract branch name and search criteria from command arguments:
Arguments format: "[branch-name] [search-description]"
Example: "experiment-a pricing experiments and revenue optimization"
Parse:
- First argument: Branch name (e.g., "experiment-a")
- Remaining arguments: Search criteria as free text
Verify goal exists:
# Use Glob to find goal
pattern: "autonomy/*/goal.md"
If no goal found:
"No autonomy goal found in this project. Branch analysis requires an autonomy goal."
Stop here.
Extract goal name from path for use in later steps.
Step 2: Find Divergence Point
Use git to find where branches diverged:
# Get current branch name
current_branch=$(git branch --show-current)
# Find common ancestor between current and target branch
merge_base=$(git merge-base "$current_branch" "$target_branch" 2>&1)
# Check if command succeeded
if [ $? -ne 0 ]; then
# Error handling - see Step 2a
fi
Step 2a: Handle Git Errors
If git merge-base fails, determine cause and prompt user:
Error: Branch not found
Error: Branch '$target_branch' does not exist.
Available branches:
$(git branch -a | sed 's/^..//; s/ -> .*//')
Please verify the branch name and try again.
Error: No common ancestor
Warning: Cannot find common ancestor between current branch and '$target_branch'.
This may mean:
- Branches have completely independent histories
- Branch was rebased and history was rewritten
Options:
1. Analyze entire branch history (may include duplicate work)
2. Specify iteration range manually
3. Specify common ancestor commit manually
Which would you like?
Use AskUserQuestion to let user choose:
- Option 1: Set
merge_base=""and analyze all iterations - Option 2: Prompt for iteration range, skip git operations
- Option 3: Prompt for commit hash, use as merge_base
Step 3: Extract Divergent Iterations
Find autonomy iteration tags on target branch after divergence:
# Get all autonomy iteration tags on target branch
if [ -n "$merge_base" ]; then
# Analyze only divergent work
commit_range="$merge_base..$target_branch"
else
# Analyze entire branch (fallback)
commit_range="$target_branch"
fi
# Extract iteration numbers from tags
iterations=$(git log "$commit_range" \
--pretty=format:"%D" \
| tr ',' '\n' \
| grep "tag: autonomy/iteration-" \
| sed 's/.*autonomy\/iteration-//' \
| sort -n)
# Count iterations found
iteration_count=$(echo "$iterations" | wc -w)
If no iterations found:
No autonomy iteration tags found on branch '$target_branch' after divergence.
Possible reasons:
- Branch hasn't used autonomy plugin
- All iterations are before the divergence point
- Iterations exist but weren't committed with git integration
Would you like to:
1. Analyze entire branch (all iterations)
2. Specify iteration range manually
Use AskUserQuestion for recovery.
Step 4: Read Journal Files
For each iteration found, read the journal content:
# For each iteration number
for iter in $iterations; do
# Find journal file with this iteration number
# Format: iteration-NNNN-YYYY-MM-DD.md
journal_file=$(git ls-tree -r --name-only "$target_branch" \
"autonomy/$goal_name/" \
| grep "iteration-$(printf '%04d' $iter)-")
if [ -n "$journal_file" ]; then
# Read file content from target branch
journal_content=$(git show "$target_branch:$journal_file")
# Store for analysis in next step
fi
done
Build iteration data structure: For each iteration, extract:
- Iteration number
- Date (from filename)
- Beginning State section
- Iteration Intention section
- Work Performed subsections
- Ending State section
- Full content for searching
Step 5: Search and Filter
Apply search criteria to find relevant iterations and content:
Search strategy:
# Convert search criteria to grep pattern
# Example: "pricing experiments" → "pricing|experiments"
search_pattern=$(echo "$search_criteria" | tr ' ' '|')
# For each iteration's content
# Score by relevance (number of search term matches)
# Prioritize sections: Key Decisions, Ending State, Reasoning & Strategy
Extract relevant sections:
- Key Findings: Extract from Ending State + Work Performed
- Decisions: Extract from Key Decisions Made subsection
- Ideas/Experiments: Extract from Reasoning & Strategy Changes
- Outcomes: Extract from Ending State
If search finds nothing:
No iterations matched search criteria: "$search_criteria"
Analyzed $iteration_count iterations on '$target_branch'.
Would you like to:
1. Broaden search (show all iterations)
2. Refine search criteria
Use AskUserQuestion to offer alternatives.
Step 6: Generate Report
Produce markdown report formatted for journal inclusion:
## Analysis of Branch: $target_branch
**Analyzed range:** Iterations $first_iter-$last_iter (diverged from iteration $divergence_iter)
**Search focus:** $search_criteria
**Common ancestor:** $merge_base
**Branch status:** [Active/Merged/Concluded - from latest iteration if stated]
---
### Key Findings
[For each significant finding extracted from journals:]
- **Iteration NNNN:** [Finding or insight]
- **Context:** [What problem was being addressed]
- **Approach taken:** [How it was implemented or explored]
- **Outcome:** [Results from Ending State]
- **Reference:** `$target_branch @ iteration-NNNN`
---
### Decisions and Rationale
[For each major decision from Key Decisions Made:]
- **Iteration NNNN:** [Decision]
- **Rationale:** [Why this choice was made]
- **Outcome:** [Result - success/failure/inconclusive/ongoing]
- **Takeaway:** [What this tells us]
---
### Ideas and Experiments
[For each experimental approach from Reasoning & Strategy Changes:]
- **Iteration NNNN:** [What was tried]
- **Results:** [What was learned]
- **Status:** [Validated/Invalidated/Needs more testing/Inconclusive]
- **Applicability:** [Could this apply to current branch?]
---
### Timeline of Branch Activity
| Iteration | Date | Summary | Status |
|-----------|------|---------|--------|
| NNNN | YYYY-MM-DD | [From Iteration Intention or Ending State] | [From Ending State] |
| NNNN | YYYY-MM-DD | [Summary] | [Status] |
---
**Analysis Summary:** [Neutral assessment of what was learned, key patterns, notable outcomes]
Output to user: Display the complete report. User can copy relevant sections into their current journal's "External Context Gathered" section.
Important Notes
Neutral Framing
Do NOT assume branch status:
- Branch may be active, merged, concluded, or abandoned
- Don't label as "failed" unless journal explicitly states that
- Let the journal entries speak for themselves
- Use neutral language: "findings", "outcomes", not "failures"
Git Safety
Read-only operations:
- Never checkout or switch branches
- Use
git showto read historical files - Don't modify target branch
- Don't create commits
Search Flexibility
Interpreting search criteria:
- Free-text is intentionally loose
- Don't require exact matches
- Look for semantic relevance
- Prioritize iteration sections mentioned in criteria
If criteria is very specific:
- "pricing tier experiments" → Focus on those specific words
- "revenue optimization" → Include related terms (profit, MRR, monetization)
If criteria is broad:
- "general findings" → Show all significant content
- "lessons learned" → Focus on Ending State assessments
Report Quality
Characteristics of good report:
- Self-contained: Readable without accessing original branch
- Actionable: Clear what to do with findings
- Referenced: Links to specific iterations for deep dives
- Concise: Extract signal, avoid noise
- Balanced: Show successes and failures equally
Performance Considerations
For branches with many iterations:
- Reading 50+ iterations may be slow
- Consider limiting to most recent N iterations if search is broad
- User can refine criteria to narrow scope
Common Mistakes
| Mistake | Reality |
|---|---|
| "Branch is abandoned, so it failed" | NO. Don't assume status. Read journals for actual outcomes. |
| "I'll modify the target branch" | NO. Read-only operations only. Never checkout or modify target. |
| "Search found nothing, report empty" | NO. Offer to broaden search or show all iterations. |
| "I'll analyze current branch" | NO. Use /review-progress for current branch analysis. |
| "No common ancestor means I should fail" | NO. Offer alternatives: analyze all, manual range, manual ancestor. |
| "Report should only include successes" | NO. Balanced view - show what worked AND what didn't. |
After Analyzing
Once analysis is complete:
- Report displayed to user
- User copies relevant sections into current journal
- No files created or modified by this skill
- Can analyze multiple branches in same conversation
- Skill usage logged in journal's "Skills & Workflows Used" section