launchdarkly-flag-cleanup

Par launchdarkly · agent-skills

Supprimez en toute sécurité un feature flag du code tout en préservant le comportement en production. À utiliser lorsque l'utilisateur souhaite supprimer un flag du code, effacer les références à ce flag, ou créer une PR qui encode en dur la variation gagnante après la fin d'un déploiement progressif.

npx skills add https://github.com/launchdarkly/agent-skills --skill launchdarkly-flag-cleanup

Nettoyage des drapeaux LaunchDarkly

Vous utilisez une skill qui vous guidera à travers la suppression sécurisée d'un drapeau de fonctionnalité d'une base de code tout en préservant le comportement de production. Votre travail consiste à explorer la base de code pour comprendre comment le drapeau est utilisé, interroger LaunchDarkly pour déterminer la valeur future correcte, supprimer le code du drapeau proprement, et vérifier le résultat.

Si vous n'avez pas encore identifié quel drapeau nettoyer, utilisez d'abord la skill de découverte de drapeaux pour auditer l'environnement et trouver des candidats.

Prérequis

Cette skill nécessite que le serveur MCP LaunchDarkly hébergé à distance soit configuré dans votre environnement.

Outils MCP obligatoires :

  • check-removal-readiness : vérification de sécurité détaillée (orchestre la configuration du drapeau, l'état entre environnements, les dépendances, les références au code et les cibles qui expirent en parallèle)
  • get-flag : récupère la configuration du drapeau pour un environnement spécifique

Outils MCP optionnels :

  • archive-flag : archive le drapeau dans LaunchDarkly après suppression du code
  • delete-flag : supprime définitivement le drapeau (irréversible, préférez l'archivage)

Principes fondamentaux

  1. La sécurité d'abord : préservez toujours le comportement de production actuel.
  2. LaunchDarkly comme source de vérité : ne deviez jamais la valeur future. Interrogez toujours la configuration réelle.
  3. Respectez les conventions : respectez le style et la structure du code existant.
  4. Changement minimal : supprimez uniquement le code lié au drapeau. Pas de refactorisation non liée.

Flux de travail

Étape 1 : Explorer la base de code

Avant de toucher à LaunchDarkly ou de supprimer du code, comprenez comment ce drapeau est utilisé dans la base de code.

  1. Trouvez toutes les références à la clé du drapeau. Recherchez la chaîne de clé du drapeau (par exemple, new-checkout-flow) dans toute la base de code. Vérifiez :

    • Les appels d'évaluation SDK directs (variation(), boolVariation(), useFlags(), etc.)
    • Les constantes/énumérations qui référencent la clé
    • Les modèles wrapper/service qui abstraient le SDK
    • Les fichiers de configuration, tests et documentation
    • Voir SDK Patterns pour la liste complète des modèles par langage
  2. Comprenez le branchement. Pour chaque référence, identifiez :

    • Quel code s'exécute quand le drapeau est true (ou variation A) ?
    • Quel code s'exécute quand le drapeau est false (ou variation B) ?
    • Y a-t-il des effets secondaires, des retours anticipés ou des conditions imbriquées ?
  3. Notez la portée. Combien de fichiers, composants ou modules ce drapeau touche-t-il ? Un drapeau utilisé dans un bloc if est plus simple qu'un drapeau qui traverse plusieurs couches.

Étape 2 : Exécutez la vérification de disponibilité pour le nettoyage

Utilisez check-removal-readiness pour obtenir une évaluation de sécurité détaillée. Cet appel à un seul outil orchestre plusieurs vérifications en parallèle :

  • Configuration du drapeau et état du ciblage
  • État entre environnements
  • Drapeaux dépendants (prérequis)
  • Cibles qui expirent
  • Statistiques de références au code

L'outil retourne un verdict de disponibilité :

safe : Pas de bloqueurs ni d'avertissements. Procédez à la suppression.

caution : Pas de bloqueurs durs mais des avertissements existent (par exemple, références au code dans d'autres dépôts, cibles qui expirent programmées, drapeau marqué comme permanent). Présentez les avertissements et laissez l'utilisateur décider.

blocked : Des bloqueurs durs empêchent la suppression sécurisée (par exemple, drapeaux dépendants, recevant activement des demandes, le ciblage est activé avec des règles actives). Présentez les bloqueurs : l'utilisateur doit d'abord les résoudre.

Étape 3 : Déterminez la valeur future

Utilisez get-flag pour récupérer la configuration du drapeau dans chaque environnement critique. La valeur future est la variation qui remplace le drapeau dans le code.

Scénario Valeur future
Tous les envs critiques ON, même fallthrough, pas de règles/cibles Utilisez fallthrough.variation
Tous les envs critiques OFF, même offVariation Utilisez offVariation
Les envs critiques diffèrent en état ON/OFF PAS SÛR : arrêtez et informez l'utilisateur
Les envs critiques servent des variations différentes PAS SÛR : arrêtez et informez l'utilisateur

Étape 4 : Présentez le plan de nettoyage

Avant de modifier du code, présentez un résumé à l'utilisateur et attendez la confirmation :

  1. La valeur future — quelle variation sera codée en dur et pourquoi (basé sur l'état actuel du drapeau).
  2. Toutes les références au code trouvées — chemins de fichier et numéros de ligne de l'Étape 1.
  3. Changements prévus — pour chaque référence, décrivez ce qui sera supprimé et ce qui sera conservé.
  4. Verdict de disponibilité — le résultat de check-removal-readiness (safe, caution ou blocked) et tous les avertissements.
  5. Action LaunchDarkly — confirmez que le drapeau sera archivé après la fin des changements de code.

Ne procédez pas aux changements de code tant que l'utilisateur n'a pas confirmé explicitement.

Étape 5 : Supprimez le drapeau du code

Maintenant exécutez la suppression en utilisant ce que vous avez appris à l'Étape 1.

  1. Remplacez les évaluations de drapeau par la valeur future.

    • Préservez la branche de code correspondant à la valeur future
    • Supprimez complètement la branche morte
    • Si la valeur du drapeau était assignée à une variable, remplacez la variable par la valeur littérale ou insérez-la en ligne
  2. Nettoyez le code mort.

    • Supprimez les imports, constantes et définitions de type qui n'existaient que pour le drapeau
    • Supprimez les fonctions, composants ou fichiers qui n'existaient que pour la branche morte
    • Vérifiez les exports orphelins, hooks, helpers, styles et fichiers de test
    • Si le dépôt utilise un outil unused-export (Knip, ts-prune, règles lint), exécutez-le et supprimez tout orphelin lié au drapeau
  3. Ne surnetoyez pas.

    • Supprimez uniquement le code directement lié au drapeau
    • Ne refactorisez pas, n'optimisez pas ou n'« améliorez » pas le code environnant
    • Ne changez pas le formatage ou le style du code non modifié

Exemple de transformation (drapeau booléen, valeur future = true) :

// Avant
const showNewCheckout = await ldClient.variation('new-checkout-flow', user, false);
if (showNewCheckout) {
  return renderNewCheckout();
} else {
  return renderOldCheckout();
}

// Après
return renderNewCheckout();

Étape 6 : Créez une pull request

Utilisez le modèle dans references/pr-template.md pour une description de PR structurée. La PR doit communiquer clairement :

  • Quel drapeau a été supprimé et pourquoi
  • Quelle est la valeur future et pourquoi elle est correcte
  • Les résultats de l'évaluation de disponibilité (de check-removal-readiness)
  • Quel code a été supprimé et quel comportement est préservé
  • Si d'autres dépôts font encore référence à ce drapeau

Étape 7 : Vérifiez

Avant de considérer le travail terminé :

  1. Le code se compile et passe le lint. Exécutez les étapes de build et lint du projet.
  2. Les tests passent. Si le drapeau a été utilisé dans les tests, les tests doivent être mis à jour pour refléter le comportement codé en dur.
  3. Aucune référence restante. Recherchez une dernière fois la clé du drapeau dans la base de code pour vous assurer que rien n'a été oublié.
  4. La PR est complète. La description couvre l'évaluation de disponibilité, la justification de la valeur future et toute coordination entre dépôts nécessaire.

Cas limites

Situation Action
Drapeau non trouvé dans LaunchDarkly Informez l'utilisateur, vérifiez les fautes de frappe dans la clé
Drapeau déjà archivé Demandez si le nettoyage du code est toujours nécessaire (le drapeau est parti de LD mais le code peut encore le référencer)
Plusieurs modèles SDK dans la base de code Recherchez tous les modèles : variation(), boolVariation(), variationDetail(), allFlags(), useFlags(), plus tout wrapper
Clés de drapeau dynamiques (flag-${id}) Avertissez que la suppression automatisée peut être incomplète : révision manuelle requise
Différentes valeurs par défaut dans le code vs LD Signalez comme incohérence dans la description de la PR
Exports/fichiers orphelins restent après suppression Exécutez les vérifications unused-export et supprimez les fichiers morts

Ce qu'il ne faut PAS faire

  • Ne modifiez pas le code non lié au nettoyage des drapeaux.
  • Ne refactorisez ou n'optimisez pas au-delà de la suppression des drapeaux.
  • Ne supprimez pas les drapeaux encore en cours de déploiement actif.
  • Ne devinez jamais la valeur future : interrogez toujours LaunchDarkly.

Après le nettoyage

Une fois que la PR est fusionnée et déployée :

  1. Archivez le drapeau dans LaunchDarkly en utilisant archive-flag. L'archivage est réversible ; la suppression ne l'est pas. Archivez toujours en premier.
  2. Notifiez les autres équipes si check-removal-readiness a signalé des références au code dans d'autres dépôts.
  3. Si le drapeau avait des changements de ciblage en attente, ils peuvent être ignorés : le drapeau est en cours de suppression.

Références

  • PR Template : Description de PR structurée pour la suppression de drapeau
  • SDK Patterns : Modèles d'évaluation de drapeau par langage/framework
  • Flag Discovery : Trouvez les candidats de nettoyage avant d'utiliser cette skill
  • Flag Targeting : Si vous devez modifier le ciblage au lieu de supprimer

Skills similaires