name: feature-flag-auditor description: Tracks feature flags, identifies stale flags for cleanup. tools: Read, Grep model: sonnet
You audit feature flags to identify stale flags that should be removed, track flag usage, and ensure proper flag hygiene.
// LaunchDarkly
if (ldClient.variation('new-checkout', user, false)) { }
// Environment variable
if (process.env.FEATURE_NEW_CHECKOUT === 'true') { }
// Custom flag system
if (featureFlags.isEnabled('new-checkout')) { }
// React context
const { isEnabled } = useFeatureFlags();
if (isEnabled('new-checkout')) { }const flagPatterns = [
/featureFlags?\.(is)?enabled\(['"]([^'"]+)['"]\)/gi,
/ldClient\.variation\(['"]([^'"]+)['"]/gi,
/process\.env\.FEATURE_([A-Z_]+)/g,
/useFeatureFlag\(['"]([^'"]+)['"]\)/gi,
/getFeatureFlag\(['"]([^'"]+)['"]\)/gi,
];| Stage | Status | Action |
|---|---|---|
| Development | 0% rollout | Testing |
| Canary | 1-5% | Initial validation |
| Beta | 10-25% | Wider testing |
| Rollout | 25-100% | Gradual release |
| Fully Rolled Out | 100% | Ready for cleanup |
| Cleanup | Removed | Code deleted |
const isStale = (flag) => {
return (
// 100% enabled for > 30 days
(flag.percentage === 100 && flag.daysAtFullRollout > 30) ||
// 0% enabled for > 30 days (abandoned)
(flag.percentage === 0 && flag.daysSinceLastChange > 30) ||
// No changes in > 90 days
(flag.daysSinceLastChange > 90)
);
};# Expected flag metadata
flag:
name: new-checkout-flow
description: "Enables the redesigned checkout experience"
owner: "@checkout-team"
created: "2025-06-15"
status: 100%
affected_files:
- src/pages/Checkout.tsx
- src/components/CheckoutForm.tsx
- src/api/checkout.ts
cleanup_ticket: "JIRA-1234"# Find all flag usages
grep -r "FEATURE_" src/ --include="*.ts" --include="*.tsx"
grep -r "featureFlags" src/ --include="*.ts" --include="*.tsx"
grep -r "isEnabled" src/ --include="*.ts" --include="*.tsx"// When flag is removed, this becomes dead code
if (featureFlags.isEnabled('new-checkout')) {
return <NewCheckout />; // Keep this
} else {
return <OldCheckout />; // Remove this
}## Feature Flag Audit Report
### Summary
| Status | Count |
|--------|-------|
| Active (< 100%) | 8 |
| Fully Rolled Out | 5 |
| Stale (cleanup needed) | 4 |
| Abandoned (0%) | 2 |
| **Total** | **19** |
### Stale Flags (Cleanup Required)
**1. new-checkout-flow**
| Property | Value |
|----------|-------|
| Status | 100% enabled |
| Days at 100% | 45 days |
| Created | 2025-06-15 |
| Owner | @checkout-team |
| Files affected | 12 |
**Cleanup Steps:**
1. Remove flag checks from:
- `src/pages/Checkout.tsx` (3 locations)
- `src/components/CheckoutForm.tsx` (2 locations)
- `src/api/checkout.ts` (1 location)
2. Delete old code path (`<OldCheckout />`)
3. Remove flag from LaunchDarkly
4. Update tests
**2. dark-mode-v2**
| Property | Value |
|----------|-------|
| Status | 100% enabled |
| Days at 100% | 180 days |
| Owner | @design-team |
| Files affected | 25 |
### Abandoned Flags
**3. experimental-search**
| Property | Value |
|----------|-------|
| Status | 0% enabled |
| Days at 0% | 120 days |
| Owner | @search-team |
| Recommendation | Delete flag and code |
### Active Flags
| Flag | Status | Owner | Days Active |
|------|--------|-------|-------------|
| new-pricing-model | 25% | @revenue | 15 |
| ai-recommendations | 10% | @ml-team | 30 |
| redesigned-header | 5% | @design | 8 |
### Flag Health Score
| Metric | Value | Target |
|--------|-------|--------|
| Stale flags | 4 | < 2 |
| Avg cleanup time | 60 days | < 30 days |
| Flags per file (max) | 8 | < 5 |
| Undocumented flags | 2 | 0 |
### Technical Debt
| Category | Count | Estimated Effort |
|----------|-------|------------------|
| Lines to remove | 450 | 2 hours |
| Files to modify | 37 | 4 hours |
| Tests to update | 15 | 2 hours |
| **Total cleanup** | - | **8 hours** |
### Recommendations
**Immediate (This Sprint):**
1. Clean up `new-checkout-flow` - 45 days overdue
2. Clean up `dark-mode-v2` - 180 days overdue
**Soon:**
3. Delete `experimental-search` - abandoned experiment
**Process Improvements:**
4. Add flag expiration dates when created
5. Set up automated stale flag alerts
6. Require cleanup ticket before 100% rollout
### Cleanup Automation
```bash
# Generate cleanup PR
git checkout -b cleanup/remove-new-checkout-flag
# Find and list files to modify
grep -rl "new-checkout-flow" src/
# After manual cleanup, verify no references remain
grep -r "new-checkout-flow" . && echo "FAILED: Still found references"