> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Nettoyer les feature flags après le déploiement

export const UseCaseHero = ({title, description, prompt, category, features, devinUrl, agent, intent, playbookId, type}) => {
  const encodedPrompt = encodeURIComponent(prompt || '');
  const tag = 'docs-use-case-gallery';
  const utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=hero-cta';
  const agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  const devinHref = type === 'schedule' ? 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + (prompt ? '&prompt=' + encodedPrompt : '') : type === 'review' ? 'https://app.devin.ai/review?' + utm : agent === 'ada' ? 'https://app.devin.ai/search?' + utm + '&noSubmit=true' + (prompt ? '&prompt=' + encodedPrompt : '') : devinUrl ? devinUrl.includes('?') ? devinUrl + '&' + utm + agentParams : devinUrl + '?' + utm + agentParams : prompt ? 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encodedPrompt : 'https://app.devin.ai/?' + utm + agentParams;
  const buttonLabel = type === 'schedule' ? 'Schedule in Devin ↗' : type === 'review' ? 'Set Up Devin Review ↗' : agent === 'advanced' ? 'Try in Devin ↗' : agent === 'dana' ? 'Try in Dana ↗' : agent === 'ada' ? 'Try in Ask Devin ↗' : 'Try in Devin ↗';
  const featureList = features ? features.split(',').map(f => f.trim()) : [];
  return <div className="uc-hero">
      <div className="uc-hero-inner">
        <div className="uc-hero-left">
          <h1 className="uc-hero-title">{title}</h1>
          <p className="uc-hero-desc">{description}</p>
          <div>
            <a href={devinHref} target="_blank" rel="noopener noreferrer" className="try-in-devin-btn">
              {buttonLabel}
            </a>
          </div>
        </div>
        <div className="uc-hero-meta">
          <div className="uc-meta-item">
            <span className="uc-meta-label">Author</span>
            <span className="uc-meta-value">Cognition</span>
          </div>
          <div className="uc-meta-item">
            <span className="uc-meta-label">Category</span>
            <span className="uc-meta-value">{category}</span>
          </div>
          {featureList.length > 0 && <div className="uc-meta-item">
              <span className="uc-meta-label">Features</span>
              <span className="uc-meta-value">{featureList.join(', ')}</span>
            </div>}
        </div>
      </div>
    </div>;
};

export const PromptBlock = ({children, type, agent, intent, playbookId}) => {
  var utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=prompt-block';
  var tag = 'docs-use-case-gallery';
  var agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  var label = type === 'schedule' ? 'Schedule in Devin' : type === 'playbook' ? 'Create Playbook' : type === 'knowledge' ? 'Add to Knowledge' : agent === 'advanced' ? 'Try in Devin' : agent === 'dana' ? 'Try in Dana' : agent === 'ada' ? 'Try in Ask Devin' : 'Try in Devin';
  var buildUrl = function (text) {
    var encoded = encodeURIComponent(text);
    if (type === 'schedule') return 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + '&prompt=' + encoded;
    if (type === 'playbook') return 'https://app.devin.ai/settings/playbooks/create?' + utm + '&body=' + encoded;
    if (type === 'knowledge') return 'https://app.devin.ai/knowledge?' + utm + '&body=' + encoded;
    if (agent === 'ada') return 'https://app.devin.ai/search?' + utm + '&noSubmit=true&prompt=' + encoded;
    return 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encoded;
  };
  const ref = React.useRef(null);
  const [href, setHref] = React.useState('#');
  React.useEffect(() => {
    if (!ref.current) return;
    var codeEl = ref.current.querySelector('pre code');
    if (codeEl) {
      var text = codeEl.textContent.trim();
      if (text) setHref(buildUrl(text));
    }
    var header = ref.current.querySelector('[data-component-part="code-block-header"]');
    if (header && !header.querySelector('.prompt-block-devin-link')) {
      var link = document.createElement('a');
      link.href = href;
      link.target = '_blank';
      link.rel = 'noopener noreferrer';
      link.className = 'prompt-block-devin-link';
      link.style.cssText = 'display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#fff;font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;white-space:nowrap;background:#317CFF;transition:background 0.2s;margin-left:8px;';
      link.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> ' + label;
      link.onmouseenter = function () {
        link.style.background = '#2968D9';
      };
      link.onmouseleave = function () {
        link.style.background = '#317CFF';
      };
      header.appendChild(link);
    }
    var existingLink = ref.current.querySelector('.prompt-block-devin-link');
    if (existingLink && href !== '#') existingLink.href = href;
  });
  return <div className="prompt-block" ref={ref}>{children}</div>;
};

<UseCaseHero title="Nettoyer les feature flags après la mise en production" description="Planifiez une session Devin ponctuelle pour supprimer un feature flag et son code mort une fois que votre mise en production s'est stabilisée." prompt="Vendredi prochain à 9 h, supprime le feature flag 'enable_new_checkout' de notre base de code. Supprime la définition du flag, conserve le chemin de code activé, supprime le chemin désactivé, mets à jour les tests et ouvre une PR." category="Automations" features="Planifications" type="schedule" />

<div className="uc-detail-wrapper">
  <Tip>Vous ne voulez pas faire cette configuration manuellement ? Collez un lien vers cette page dans une session Devin et demandez-lui de tout configurer pour vous.</Tip>

  <Steps>
    <Step title="Planifiez le nettoyage au moment où vous livrez le flag">
      Vous venez de déployer un nouveau flux de paiement derrière `enable_new_checkout`. Il'est activé en production, mais vous voulez une semaine de surveillance avant de vous engager à supprimer l'ancien code. Au lieu de créer un ticket que vous oublierez, planifiez dès maintenant une session Devin ponctuelle — pendant que le contexte est encore frais.

      Ouvrez la [page de création de planification](https://app.devin.ai/settings/schedules/create?utm_source=docs\&utm_medium=use-case-gallery) et réglez le type sur **Ponctuelle**. Choisissez une date après votre fenêtre de surveillance (par exemple, vendredi prochain à 9 h). Sélectionnez un **canal Slack** pour que votre équipe soit notifiée lorsque la session s'exécute et que la PR est prête. Puis collez votre prompt :

      <PromptBlock type="schedule">
        ```txt Clean up feature flag after release theme={null}
        Remove the feature flag "enable_new_checkout" from the codebase:

        1. Delete the flag definition from src/config/featureFlags.ts
        2. Find every conditional that checks this flag (useFeatureFlag, isEnabled,
           if/else branches) and keep only the enabled path
        3. Delete the old checkout implementation that's now unreachable
        4. Remove or update any tests that mock this flag
        5. Run the test suite and open a PR with a summary of what was removed
        ```
      </PromptBlock>
    </Step>

    <Step title="Rendez le prompt exhaustif">
      Les feature flags se cachent à des endroits inattendus — fichiers de configuration, fixtures de tests, commentaires, variables d'environnement. Plus vous mettez de contexte dans le prompt, plus le résultat est propre. Incluez :

      * **Comment fonctionnent vos flags** — où ils sont définis et comment ils sont vérifiés (par exemple, `useFeatureFlag('name')` dans React, `isEnabled('name')` dans les services backend)
      * **Ce qu'il ne faut pas toucher** — le framework de flags lui-même vs. le flag spécifique (par exemple, « ne modifiez pas `src/lib/featureFlags/` — c'est le framework »)
      * **Où se trouvent l'ancien et le nouveau code** — par exemple « l'ancien checkout se trouve dans `src/pages/checkout/legacy/`, le nouveau flux est dans `src/pages/checkout/v2/` »
      * **Périmètre du nettoyage** — les commentaires, la documentation, les fichiers `.env` et les configurations CI qui référencent le flag doivent également être nettoyés

      Un prompt avec ce niveau de détail permet à Devin de suivre toutes les références en un seul passage — pas besoin de second passage.
    </Step>

    <Step title="Passez en revue la PR lorsqu'elle arrive">
      Lorsque la session planifiée se déclenche, Devin suit chaque utilisation du flag dans votre base de code, conserve le chemin de code activé, supprime le chemin désactivé et le code mort, nettoie les tests et ouvre une PR. Vous recevrez une notification par e-mail lorsqu'elle sera prête.

      Une PR typique ressemble à ceci :

      ```
      Removed feature flag: enable_new_checkout

      - Deleted flag from src/config/featureFlags.ts (1 file)
      - Removed 12 conditional branches across 7 files
      - Deleted src/pages/checkout/legacy/ (4 files, 380 lines)
      - Updated 3 test files — removed flag mocking, deleted old-path tests
      - All 1,204 tests passing
      ```

      Avant de fusionner, vérifiez bien qu'aucune logique métier de l'ancien chemin n'aurait dû être conservée — la gestion des erreurs, les événements d'analyse ou les fallbacks pour les cas limites se trouvent parfois dans la branche « disabled ».
    </Step>
  </Steps>
</div>
