Description
The Planner currently uses simple keyword-based heuristics for effort estimation (e.g., 'implement' = 6 hours). We can make this much smarter by leveraging:
- GitHub history from our GitHub Context subagent
- Task complexity analysis
- AI-assisted development factors
Current Behavior
// Simple keyword matching
if (lowerDesc.includes('implement')) {
return 6; // Always 6 hours
}
Example: Issue #28 estimated at 4 days, but with AI assistance took ~4-6 hours.
Proposed Solution: Use GitHub History! 🎯
We already have the GitHub Context subagent (#10) that indexes issues, PRs, and their metadata. Use this data!
Historical Data Available
// From GitHub Context subagent
interface GitHubDocument {
number: number;
title: string;
state: 'open' | 'closed';
created_at: string;
closed_at?: string; // ← Calculate duration!
labels: string[]; // ← Complexity indicators
comments: number; // ← Complexity/difficulty indicator
body: string;
linkedPRs?: number[]; // ← See actual code changes
}
1. Learn from Similar Issues
// Use GitHub agent to find similar closed issues
async function estimateFromHistory(task: PlanTask): Promise<number> {
// Search for similar closed issues
const similar = await githubAgent.search(task.description, {
type: 'issue',
state: 'closed',
limit: 5
});
// Calculate their durations
const durations = similar.map(issue => {
const created = new Date(issue.created_at);
const closed = new Date(issue.closed_at!);
return (closed - created) / (1000 * 60 * 60); // hours
});
// Use median duration as estimate
return median(durations);
}
2. Complexity Indicators from History
interface ComplexityFactors {
commentCount: number; // More comments = more complex
linkedPRCount: number; // Multiple PRs = larger scope
labelComplexity: string[]; // 'bug' < 'feature' < 'epic'
descriptionLength: number; // Detailed = complex
acceptanceCriteria: number; // More criteria = more work
}
function calculateComplexity(issue: GitHubDocument): number {
let score = 1.0;
if (issue.comments > 10) score *= 1.5; // Lots of discussion
if (issue.linkedPRs.length > 2) score *= 1.3; // Multiple PRs
if (issue.labels.includes('epic')) score *= 2.0;
if (issue.labels.includes('enhancement')) score *= 1.2;
return score;
}
3. AI Assistance Detection
// Detect if repo uses dev-agent
function detectAIAssistance(): boolean {
return fs.existsSync('.dev-agent.json') ||
fs.existsSync('.cursor/') ||
// Check commit messages for AI signatures
recentCommits.some(c => c.message.includes('feat('));
}
const AI_MULTIPLIER = 0.3; // AI is 3x faster
4. Full Estimation Flow
async function smartEstimate(task: PlanTask): Promise<number> {
// 1. Find similar historical issues
const historical = await estimateFromHistory(task);
// 2. Analyze current task complexity
const complexity = analyzeComplexity(task);
// 3. Apply AI multiplier if detected
const isAI = detectAIAssistance();
const multiplier = isAI ? AI_MULTIPLIER : 1.0;
// 4. Combine signals
let estimate = historical * complexity * multiplier;
// 5. Fallback to heuristics if no history
if (!historical) {
estimate = keywordEstimate(task) * complexity * multiplier;
}
return Math.ceil(estimate);
}
Integration with Existing System
Planner already coordinates with GitHub agent:
// In PlannerAgent.createPlan()
const githubContext = await this.coordinator.sendMessage({
recipient: 'github',
payload: {
action: 'search',
query: task.description,
searchOptions: { type: 'issue', state: 'closed' }
}
});
Acceptance Criteria
Benefits
- Learn from past work - Similar issues took X hours historically
- Complexity-aware - More comments/PRs = harder task
- AI-realistic - 3x faster estimates when AI-assisted
- Self-improving - Gets better as more issues are closed
- Already integrated - Uses existing GitHub Context subagent!
Example
# Planner checks GitHub history
dev plan 34
# Finds: Issue #28 (similar, took 6 hours, had 3 comments)
# Calculates: 6h * 1.2 (more complex) * 0.3 (AI) = 2.2h
# → Estimates: 3 hours
Priority: Medium (improves dogfooding accuracy)
Estimate: 1-2 days
Dependencies: GitHub Context subagent (#10) ✅ (already done!)
Related: Issue #28 (discovered during dogfooding)
Description
The Planner currently uses simple keyword-based heuristics for effort estimation (e.g., 'implement' = 6 hours). We can make this much smarter by leveraging:
Current Behavior
Example: Issue #28 estimated at 4 days, but with AI assistance took ~4-6 hours.
Proposed Solution: Use GitHub History! 🎯
We already have the GitHub Context subagent (#10) that indexes issues, PRs, and their metadata. Use this data!
Historical Data Available
1. Learn from Similar Issues
2. Complexity Indicators from History
3. AI Assistance Detection
4. Full Estimation Flow
Integration with Existing System
Planner already coordinates with GitHub agent:
Acceptance Criteria
created_attoclosed_atBenefits
Example
Priority: Medium (improves dogfooding accuracy)
Estimate: 1-2 days
Dependencies: GitHub Context subagent (#10) ✅ (already done!)
Related: Issue #28 (discovered during dogfooding)