[ { "flag_name": "new_payment_processor", "description": "Routes payments through Stripe v3 API instead of legacy v1", "rollout_percentage": 0.75, "age_days": 90, "last_modified_days": 45, "owner": "payments-team", "owner_active": true, "num_code_references": 15, "has_dependencies": true, "dependent_flags": ["payment_retry_logic_v2"], "is_kill_switch": false, "has_active_incident": false, "usage_last_30d": 95000, "in_active_experiment": false, "services": ["payment-service", "billing-service"], "code_snippet": "processor = StripeV3Client() if flags.get('new_payment_processor') else StripeV1Client()\nresult = processor.charge(amount, currency, token)", "last_commit_message": "feat: bump new_payment_processor to 75%", "pr_context": "PR #2500: Stripe v3 migration — phased rollout. V1 still needed for some enterprise accounts with custom integrations.", "related_incidents": ["INC-3200: Stripe v3 timeout spike at 60% rollout (resolved)"], "investigation_notes": "Had a timeout issue at 60% rollout (INC-3200) which was fixed. Currently stable at 75%. Enterprise accounts on V1 need migration tooling before going to 100%.", "correct_action": "keep", "explanation": "Only 75% rolled out with a dependent flag, cross-service — not ready for removal" }, { "flag_name": "payment_retry_logic_v2", "description": "Enables improved retry logic for failed payment transactions", "rollout_percentage": 0.75, "age_days": 85, "last_modified_days": 40, "owner": "payments-team", "owner_active": true, "num_code_references": 7, "has_dependencies": false, "dependent_flags": [], "is_kill_switch": false, "has_active_incident": false, "usage_last_30d": 30000, "in_active_experiment": false, "services": ["payment-service"], "code_snippet": "retry_strategy = ExponentialBackoffV2() if flags.get('payment_retry_logic_v2') else LinearRetryV1()\nresult = retry_strategy.execute(payment_request)", "last_commit_message": "fix: adjust retry backoff multiplier for v2", "pr_context": "PR #2520: Retry logic v2 — coupled with new_payment_processor migration. Must match parent flag rollout percentage.", "related_incidents": [], "investigation_notes": "Tightly coupled to new_payment_processor. If parent is at 75%, this must stay at 75%. Rolling one without the other causes payment failures.", "correct_action": "keep", "explanation": "Depends on new_payment_processor, both at partial rollout — keep until parent is fully rolled out" }, { "flag_name": "user_profile_redesign", "description": "Enables new profile page layout with activity feed", "rollout_percentage": 1.0, "age_days": 200, "last_modified_days": 180, "owner": "derek.wong", "owner_active": false, "num_code_references": 22, "has_dependencies": true, "dependent_flags": ["profile_activity_feed", "profile_avatar_upload_v2"], "is_kill_switch": false, "has_active_incident": false, "usage_last_30d": 150000, "in_active_experiment": false, "services": ["user-service", "frontend-web", "media-service"], "code_snippet": "const ProfilePage = flags.get('user_profile_redesign')\n ? React.lazy(() => import('./ProfileV2'))\n : React.lazy(() => import('./ProfileV1'));", "last_commit_message": "feat: profile redesign GA rollout to 100%", "pr_context": "PR #1900: Profile redesign by derek.wong (left company). Has child flags for activity feed and avatar upload. No migration plan documented.", "related_incidents": [], "investigation_notes": "derek.wong left 4 months ago. No handoff document. 2 dependent flags still reference this. Frontend-web team says they 'think it can be removed' but nobody has tested removing it.", "correct_action": "deprecate", "explanation": "Fully rolled out but has 2 dependent flags and owner left — deprecate, notify new owners, schedule cleanup" }, { "flag_name": "profile_activity_feed", "description": "Shows activity feed section on the new profile page", "rollout_percentage": 1.0, "age_days": 190, "last_modified_days": 170, "owner": "derek.wong", "owner_active": false, "num_code_references": 8, "has_dependencies": false, "dependent_flags": [], "is_kill_switch": false, "has_active_incident": false, "usage_last_30d": 150000, "in_active_experiment": false, "services": ["user-service", "frontend-web"], "code_snippet": "// Only render if parent flag user_profile_redesign is also enabled\nif (flags.get('profile_activity_feed') && flags.get('user_profile_redesign')) {\n renderActivityFeed(userId);\n}", "last_commit_message": "feat: add activity feed to profile v2", "pr_context": "PR #1920: Activity feed — child of user_profile_redesign. derek.wong noted: 'remove together with parent flag'", "related_incidents": [], "investigation_notes": "Code explicitly checks parent flag. Must be cleaned up together with user_profile_redesign. Cannot be independently removed.", "correct_action": "deprecate", "explanation": "Fully rolled out, inactive owner, depends on parent flag — deprecate together with parent" }, { "flag_name": "profile_avatar_upload_v2", "description": "Enables new avatar upload flow with cropping and filters", "rollout_percentage": 0.9, "age_days": 120, "last_modified_days": 60, "owner": "media-team", "owner_active": true, "num_code_references": 6, "has_dependencies": false, "dependent_flags": [], "is_kill_switch": false, "has_active_incident": false, "usage_last_30d": 40000, "in_active_experiment": false, "services": ["media-service", "frontend-web"], "code_snippet": "const uploader = flags.get('profile_avatar_upload_v2')\n ? new CroppingUploader({filters: true})\n : new BasicUploader();", "last_commit_message": "fix: avatar crop ratio on mobile devices", "pr_context": "PR #2100: Avatar upload v2 — media-team iterating on mobile crop UX. Blocked at 90% due to iOS Safari bug.", "related_incidents": ["INC-4100: Avatar upload broken on iOS Safari 17.2 (workaround applied)"], "investigation_notes": "Stuck at 90% due to iOS Safari bug (INC-4100). Media-team has a fix in PR #3300 but needs QA. Expected to go to 100% in 2 weeks.", "correct_action": "keep", "explanation": "90% rollout but not complete, still being iterated on by active team" }, { "flag_name": "api_response_compression", "description": "Enables gzip compression on API responses over 1KB", "rollout_percentage": 1.0, "age_days": 300, "last_modified_days": 290, "owner": "platform-team", "owner_active": true, "num_code_references": 4, "has_dependencies": false, "dependent_flags": [], "is_kill_switch": false, "has_active_incident": false, "usage_last_30d": 500000, "in_active_experiment": false, "services": ["api-gateway", "backend-core"], "code_snippet": "app.use(conditionalMiddleware(\n () => flags.get('api_response_compression'),\n compression({threshold: 1024})\n));", "last_commit_message": "perf: enable response compression globally", "pr_context": "PR #1500: API compression — reduced bandwidth by 40%. Platform-team confirmed stable for 10 months.", "related_incidents": [], "investigation_notes": "Running for 10 months without issues. Compression is now the default behavior. Platform-team lead says: 'just remove the flag and hardcode compression on'.", "correct_action": "remove", "explanation": "Fully rolled out for 10 months across 2 services, no deps, active owner can confirm removal" }, { "flag_name": "ml_recommendation_v3", "description": "Uses ML model v3 for product recommendations instead of v2", "rollout_percentage": 0.5, "age_days": 60, "last_modified_days": 15, "owner": "ml-team", "owner_active": true, "num_code_references": 10, "has_dependencies": true, "dependent_flags": ["ml_embedding_cache"], "is_kill_switch": false, "has_active_incident": false, "usage_last_30d": 200000, "in_active_experiment": true, "services": ["recommendation-service", "ml-inference"], "code_snippet": "model = load_model('rec_v3') if flags.get('ml_recommendation_v3') else load_model('rec_v2')\npredictions = model.predict(user_embedding, item_pool)", "last_commit_message": "experiment: adjust v3 model serving latency threshold", "pr_context": "PR #3100: ML rec v3 A/B test — comparing click-through rates. V3 uses new embedding model that requires ml_embedding_cache flag.", "related_incidents": [], "investigation_notes": "Active A/B test running for 4 weeks. Preliminary results show 8% CTR improvement but 15ms latency increase. ML-team discussing whether to accept the tradeoff.", "correct_action": "keep", "explanation": "Active A/B experiment at 50%, with dependencies, recently modified" }, { "flag_name": "deprecated_analytics_v1", "description": "Legacy analytics pipeline that sends events to old warehouse", "rollout_percentage": 0.02, "age_days": 500, "last_modified_days": 400, "owner": "data-team", "owner_active": true, "num_code_references": 30, "has_dependencies": false, "dependent_flags": [], "is_kill_switch": false, "has_active_incident": false, "usage_last_30d": 100, "in_active_experiment": false, "services": ["analytics-service", "event-bus", "data-warehouse"], "code_snippet": "// WARNING: dual-write to both old and new analytics\nif (flags.get('deprecated_analytics_v1')) {\n oldWarehouse.ingest(event); // BigQuery legacy\n}\nnewPipeline.ingest(event); // Snowflake", "last_commit_message": "chore: reduce analytics v1 to 2% for final validation", "pr_context": "PR #800: Analytics migration — data-team running final validation at 2%. 30 code references across 3 services need coordinated cleanup.", "related_incidents": ["INC-2100: Data discrepancy between old and new warehouse (resolved)", "INC-2400: Analytics event loss during migration (resolved)"], "investigation_notes": "2 past incidents during migration. Currently at 2% for final validation. Data-team lead says cleanup requires coordinated effort across 3 services and 30 code references. Estimated 2 sprints of work.", "correct_action": "escalate", "explanation": "Nearly disabled but 30 code references across 3 services, 500 days old — needs coordinated cleanup, escalate to data-team lead" } ]