> ## 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.

# Résolution quotidienne des erreurs Sentry

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="Corrections quotidiennes des erreurs Sentry" description="Planifiez chaque jour une session Devin qui récupère les nouvelles erreurs Sentry pendant la nuit, lance une session de correction pour chacune et prépare des PR prêtes dès le matin." prompt="Utilisez le Sentry MCP pour récupérer toutes les erreurs non résolues des 24 dernières heures dans le projet payments-api, triées par nombre d’événements. Pour les 5 erreurs les plus fréquentes, analysez la stack trace et la cause racine, puis démarrez une session Devin pour chacune afin d’ouvrir une PR avec une correction et un test de non-régression. Ignorez les erreurs marquées wontfix ou expected-behavior." category="Automatisations" features="Programmations, MCP, Avancé" type="schedule" agent="advanced" />

<div className="uc-detail-wrapper">
  <Tip>Pour un guide d'intégration Sentry plus détaillé, [cliquez ici](/fr/enterprise/integrations/sentry).</Tip>

  <Steps>
    <Step title="Connecter Sentry MCP">
      Avant de créer votre planning, Devin a besoin d'accéder à vos données Sentry.

      1. Allez dans **Settings > Connections > serveurs MCP** et recherchez **Sentry**
      2. Cliquez sur **Enable** et authentifiez-vous via OAuth — cela accorde à Devin un accès en lecture à vos problèmes, événements et traces de pile Sentry
      3. Cliquez sur **Test listing tools** pour vérifier que la connexion fonctionne

      Une fois la connexion établie, Devin peut interroger vos projets Sentry, récupérer les détails des problèmes et les traces de pile, et lire les breadcrumbs — le tout au sein d'une session. En savoir plus sur la [configuration des serveurs MCP](/fr/work-with-devin/mcp).
    </Step>

    <Step title="Créer la planification">
      Allez dans **Settings > [Schedules](/fr/product-guides/scheduled-sessions)** et cliquez sur **Create schedule**.

      * **Name** : `Daily Sentry remediation — payments-api`
      * **Frequency** : Tous les jours à 6 h (pour que les PR de correctifs soient prêtes avant la réunion de stand-up)
      * **Agent** : Devin — cela permet à Devin de lancer une session séparée pour chaque erreur, afin que les correctifs s’exécutent en parallèle
      * **Slack channel** : Sélectionnez un canal (par exemple, `#sentry-fixes`) pour que votre équipe soit notifiée lorsque l’exécution est terminée et que les PR sont prêtes pour revue
      * **Prompt** :

      <PromptBlock type="schedule" agent="advanced">
        ```txt Daily Sentry remediation theme={null}
        Utilise le Sentry MCP pour récupérer toutes les erreurs non résolues
        des dernières 24 heures dans le projet payments-api, triées par
        nombre d’événements.
        Ignore les erreurs étiquetées `wontfix` ou `expected-behavior`.

        Pour les 5 erreurs principales :
        1. Récupère la stack trace complète et les breadcrumbs
        2. Trouve les fichiers source pertinents dans notre repo
        3. Identifie la cause racine
        4. Démarre une session Devin pour ouvrir une PR avec un correctif
           et un test de non-régression, en ajoutant l’URL du ticket Sentry
           dans la description de la PR

        Publie un récapitulatif de toutes les erreurs et de leurs PR sur Slack.

        Si je laisse un commentaire sur l’une des PR (par exemple, en marquant un
        correctif comme faux positif, en demandant une approche différente
        ou en approuvant un pattern), crée une entrée Knowledge qui capture
        ce commentaire afin que les exécutions futures gèrent correctement les
        erreurs similaires.
        ```
      </PromptBlock>
    </Step>

    <Step title="Alimentez Knowledge avec votre base de code et vos correctifs précédents">
      Devin apporte de meilleures corrections lorsqu’il comprend les modèles d’erreurs de votre application. Au lieu de rédiger vous‑même des entrées Knowledge, demandez à Devin dans n’importe quelle session d’analyser votre base de code et les corrections passées, puis laissez‑le créer ces entrées Knowledge :

      <PromptBlock agent="advanced">
        ```txt Learn our error patterns and create Knowledge theme={null}
        Analyse notre base de code payments-api et crée des entrées Knowledge
        pour les modèles d’erreur fréquents :

        1. Lis les PR (pull requests) récemment fusionnées qui ont corrigé
           des erreurs Sentry — recherche des modèles dans ce qui a
           dysfonctionné et dans la façon dont cela a été corrigé
        2. Vérifie les problèmes Sentry résolus pour repérer des causes
           profondes récurrentes
           (vérifications de null, requêtes N+1, error boundaries manquantes)
        3. Passe en revue nos conventions de gestion des erreurs dans la base
           de code — quelles classes wrapper nous utilisons, comment nous
           enregistrons les erreurs dans les logs, nos modèles de retry/fallback

        Pour chaque modèle que tu identifies, crée une entrée Knowledge avec un
        déclencheur spécifique (p. ex. « TypeError in checkout », « database
        timeout in reports ») et des consignes de correction concrètes.
        ```
      </PromptBlock>

      Ces entrées sont automatiquement réutilisées lorsque Devin rencontre des erreurs correspondantes lors des exécutions planifiées — et le prompt planifié ci‑dessus indique à Devin de mettre à jour Knowledge en fonction de vos retours sur les PR, de sorte qu’il s’améliore au fil du temps.
    </Step>

    <Step title="Ce que produit une exécution type">
      Chaque matin, Devin traite la file d'attente des erreurs accumulées pendant la nuit et ouvre des PR ciblées. Voici à quoi ressemble la sortie d'une session réelle :

      ```
      Processed 5 Sentry errors from payments-api (past 24h):

      1. TypeError: Cannot read property 'last4' of null (1,892 events)
         Root cause: Stripe webhook delivers `payment_method: null` for
         bank transfer payments. CheckoutReceipt.tsx:34 destructures
         without a null check.
         PR #612: Add null safety to CheckoutReceipt, show "Bank Transfer"
         fallback for non-card payments.

      2. TimeoutError: Query timeout after 30s on /api/invoices (743 events)
         Root cause: N+1 query in InvoiceService.getMonthly() — each
         line item triggers a separate product lookup.
         PR #613: Add eager loading for invoice line items with
         Sequelize `include`.

      3. RangeError: Maximum call stack size exceeded (412 events)
         Root cause: Circular reference in refund.toJSON() when a
         refund references its parent transaction which references
         the refund.
         PR #614: Break circular ref with a custom serializer,
         add max-depth test.

      4-5. Two lower-frequency validation errors — PRs #615, #616.
      ```

      Chaque pull request (PR) inclut le lien vers le problème Sentry, une description de la cause racine, la correction apportée, ainsi qu’un test qui aurait permis de détecter l’erreur initiale.
    </Step>

    <Step title="Ajuster et itérer">
      Après une semaine d’exécutions, examinez ce qui fonctionne et ajustez :

      **Calibrez le nombre d’erreurs.** Commencez avec les erreurs `top 5` par exécution. Si Devin produit systématiquement des PR fusionnables, augmentez à 8-10. Si les corrections nécessitent de lourdes révisions, réduisez à 3.

      **Filtrer par projet ou par tag.** Limitez le prompt à des projets Sentry spécifiques (`payments-api`, `web-frontend`) ou excluez les tags bruyants. Vous pouvez créer des programmations distinctes par projet si les volumes d’erreurs diffèrent.

      **Tirer des enseignements des résultats.** Au bout de quelques semaines, demandez à Devin d’analyser quelles corrections ont réellement été livrées et de les consigner dans Knowledge :

      <PromptBlock agent="advanced">
        ```txt Analyse les résultats des corrections Sentry et mets à jour Knowledge theme={null}
        Examine toutes les pull requests (PR) que Devin a ouvertes pour des erreurs Sentry au cours des 2 dernières semaines.
        Pour chaque PR, vérifie si elle a été fusionnée ou fermée.

        Identifie les thèmes et les enseignements : quels modèles de correction ont fonctionné, quelles
        approches ont été rejetées, quels types d’erreurs étaient des faux positifs,
        et dans quels cas Devin manquait de contexte. Puis mets à jour ta Knowledge
        en conséquence : crée de nouvelles entrées, modifie celles existantes ou supprime
        les entrées qui ont conduit à de mauvaises corrections.
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
