Decision Tracking
Track development decisions, record outcomes, and learn from patterns
Decision Tracking helps you log important development decisions, record their outcomes, and learn from patterns over time.
Overview#
Track decisions to:
- Remember context - Why was this decision made?
- Record outcomes - Did it work? What happened?
- Learn patterns - What decisions lead to success?
- Get recommendations - What worked before in similar situations?
How It Works#
Decision Logged Outcome Recorded Pattern Learned
───────────────────────────────────────────────────────────
"Use PostgreSQL" ──▶ "Success" ──▶ "PostgreSQL works
for user data" "Fast queries" well for user data"
(confidence: 0.85)
Logging Decisions#
Via CLI#
1# Log a decision
2bootspring decision log "Using Clerk for authentication" \
3 --type architecture \
4 --reason "Built-in SSO, easy integration, good docs"
5
6# With more detail
7bootspring decision log "Switching to connection pooling" \
8 --type database \
9 --reason "Hitting connection limits in production" \
10 --context "50+ concurrent users causing timeouts"Via API#
1const memory = require('bootspring/intelligence/memory');
2
3memory.logDecision({
4 decision: 'Using Clerk for authentication',
5 type: 'architecture',
6 category: 'auth',
7 reason: 'Built-in SSO, easy integration, good docs',
8 context: 'Need enterprise auth features',
9 confidence: 0.8
10});Decision Types#
| Type | Description | Examples |
|---|---|---|
architecture | System design decisions | Tech stack, patterns |
database | Data model decisions | Schema, queries |
security | Security-related | Auth, encryption |
performance | Optimization choices | Caching, indexes |
ui | Interface decisions | Components, layout |
dependency | Library choices | npm packages |
process | Workflow decisions | Git flow, deployments |
Recording Outcomes#
When a Decision Works#
bootspring decision outcome <decision-id> success \
--notes "Reduced auth issues by 90%"memory.recordOutcome(decisionId, {
status: 'success',
notes: 'Reduced auth issues by 90%',
metrics: { authErrors: -90, loginTime: -500 }
});When a Decision Fails#
bootspring decision outcome <decision-id> failure \
--notes "Performance issues under load"memory.recordOutcome(decisionId, {
status: 'failure',
notes: 'Performance issues under load',
lesson: 'Need connection pooling for high concurrency'
});Outcome Statuses#
success- Decision worked as expectedpartial- Partially successful, some issuesfailure- Decision didn't work outpending- Still evaluating
Getting Recommendations#
Ask for past decisions that worked:
1const recommendation = memory.getRecommendation({
2 type: 'database',
3 category: 'caching',
4 context: 'Need to reduce database load'
5});
6// {
7// found: true,
8// decision: 'Redis for session caching',
9// outcome: 'success',
10// confidence: 0.9,
11// similar: [...]
12// }bootspring decision recommend --type database --category cachingImpact Scoring#
Decisions are automatically scored by impact:
| Level | Score | Description |
|---|---|---|
| Critical | 5 | Major architectural decisions |
| High | 4 | Important feature decisions |
| Medium | 3 | Standard development choices |
| Low | 2 | Minor implementation details |
| Minimal | 1 | Trivial decisions |
How Impact is Calculated#
impactScore = typeWeight × confidenceScore × outcomeMultiplier- typeWeight - Based on decision type (architecture = 1.5, security = 1.4, etc.)
- confidenceScore - Your confidence when making the decision
- outcomeMultiplier - Success = 1.2, Failure = 0.8
Viewing Decisions#
Recent Decisions#
bootspring decision list --recent 10const recent = memory.getRecentDecisions(10);Pending Outcomes#
bootspring decision pendingconst pending = memory.getPendingDecisions();Decision Statistics#
bootspring decision stats1const stats = memory.getStats();
2// {
3// total: 45,
4// byType: { architecture: 12, database: 8, ... },
5// outcomes: { success: 30, failure: 5, pending: 10 },
6// successRate: 0.85
7// }Pattern Learning#
The system learns from your decisions:
1const learning = require('bootspring/intelligence/learning');
2
3// Analyze patterns
4const patterns = learning.analyze();
5// {
6// insights: [
7// { type: 'success_pattern', message: 'PostgreSQL decisions succeed 90%' }
8// ],
9// recommendations: {
10// by_type: {
11// 'database': { success_rate: 0.9, recommendation: 'Use PostgreSQL' }
12// }
13// }
14// }
15
16// Get anti-patterns to avoid
17const antiPatterns = learning.getAntiPatterns();
18// [
19// { decision: 'hardcoded_secrets', failure_rate: 1.0, recommendation: 'AVOID' }
20// ]Best Practices#
- Log decisions as you make them - Context is freshest immediately
- Be specific about reasons - Future you will thank present you
- Record outcomes promptly - Don't wait too long to evaluate
- Review patterns regularly - Learn from your history
- Include metrics when possible - Quantifiable outcomes are more useful
Performance#
Decision tracking uses an append-only strategy for fast writes:
- O(1) write performance for logging decisions
- O(1) write performance for recording outcomes
- Periodic compaction keeps read performance optimal