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

# Feature Flags nach dem Release bereinigen

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="Feature-Flags nach dem Release bereinigen" description="Plane eine einmalige Devin-Session, um ein Feature-Flag und den dazugehörigen toten Code zu entfernen, sobald sich dein Release stabilisiert hat." prompt="Nächsten Freitag um 9 Uhr das Feature-Flag 'enable_new_checkout' aus unserer Codebase entfernen. Die Flag-Definition löschen, den aktivierten Codepfad beibehalten, den deaktivierten Pfad entfernen, Tests aktualisieren und einen PR öffnen." category="Automations" features="Schedules" type="schedule" />

<div className="uc-detail-wrapper">
  <Tip>Möchtest du das nicht manuell einrichten? Füge einen Link zu dieser Seite in eine Devin-Session ein und bitte Devin, alles für dich einzurichten.</Tip>

  <Steps>
    <Step title="Plane die Bereinigung, wenn du das Flag auslieferst">
      Du hast gerade einen neuen Checkout-Flow hinter `enable_new_checkout` ausgerollt. Er ist in Produktion aktiviert, aber du möchtest eine Woche Monitoring, bevor du den alten Code wirklich entfernst. Anstatt ein Ticket zu erstellen, das du später vergisst, plane jetzt sofort eine einmalige Devin-Session – solange der Kontext noch frisch ist.

      Öffne die [Schedule-Erstellungsseite](https://app.devin.ai/settings/schedules/create?utm_source=docs\&utm_medium=use-case-gallery) und setze den Typ auf **One-time**. Wähle ein Datum nach deinem Monitoring-Fenster (z. B. nächsten Freitag um 9 Uhr). Wähle einen **Slack-Channel**, damit dein Team benachrichtigt wird, wenn die Session läuft und der PR bereit ist. Füge dann deinen Prompt ein:

      <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="Mach den Prompt möglichst präzise">
      Feature-Flags verstecken sich an unerwarteten Stellen – Config-Dateien, Test-Fixtures, Kommentare, Umgebungsvariablen. Je mehr Kontext du in den Prompt packst, desto sauberer wird das Ergebnis. Nimm Folgendes auf:

      * **Wie eure Flags funktionieren** – wo sie definiert sind und wie sie geprüft werden (z. B. `useFeatureFlag('name')` in React, `isEnabled('name')` in Backend-Services)
      * **Was unverändert bleiben soll** – das Flag-Framework selbst vs. das konkrete Flag (z. B. „Ändere `src/lib/featureFlags/` nicht – das ist das Framework“)
      * **Wo der alte und der neue Code liegen** – z. B. „Der alte Checkout liegt in `src/pages/checkout/legacy/`, der neue Flow in `src/pages/checkout/v2/`“
      * **Bereinigungsumfang** – Kommentare, Doku, `.env`-Dateien und CI-Configs, die auf das Flag verweisen, sollten ebenfalls bereinigt werden

      Ein Prompt mit diesem Detaillierungsgrad ermöglicht es Devin, alle Referenzen in einem Durchgang nachzuvollziehen – kein nachträglicher Sweep nötig.
    </Step>

    <Step title="Überprüfe den PR, wenn er erstellt ist">
      Wenn die geplante Session ausgelöst wird, verfolgt Devin jede Verwendung des Flags in deiner gesamten Codebase, behält den aktivierten Codepfad bei, entfernt den deaktivierten Pfad und toten Code, bereinigt Tests und öffnet einen PR. Du erhältst eine E-Mail-Benachrichtigung, sobald er bereit ist.

      Ein typischer PR sieht so aus:

      ```
      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
      ```

      Bevor du den PR mergst, prüfe sorgfältig, ob keine Business-Logik aus dem alten Pfad hätte erhalten bleiben müssen – Fehlerbehandlung, Analytics-Events oder Edge-Case-Fallbacks liegen manchmal in dem „disabled“-Branch.
    </Step>
  </Steps>
</div>
