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

# Correcciones diarias de errores en 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="Correcciones diarias de errores de Sentry" description="Programa una sesión diaria de Devin que obtenga los nuevos errores de Sentry durante la noche, inicie una sesión de corrección para cada uno y deje las PR listas por la mañana." prompt="Usa el MCP de Sentry para obtener todos los errores no resueltos de las últimas 24 horas en el proyecto payments-api, ordenados por número de eventos. Para los 5 errores más frecuentes, investiga el stack trace y la causa raíz, luego inicia una sesión de Devin para cada uno para abrir una PR con una corrección y una prueba de regresión. Omite los errores etiquetados como wontfix o expected-behavior." category="Automatizaciones" features="Programaciones, MCP, Avanzado" type="schedule" agent="advanced" />

<div className="uc-detail-wrapper">
  <Tip>Para una guía de integración de Sentry más detallada, [haz clic aquí](/es/enterprise/integrations/sentry).</Tip>

  <Steps>
    <Step title="Conectar el MCP de Sentry">
      Antes de crear tu calendario, Devin necesita acceso a tus datos de Sentry.

      1. Ve a **Settings > Connections > servidores MCP** y busca **Sentry**
      2. Haz clic en **Enable** y autenticándote mediante OAuth; esto le otorga a Devin acceso de solo lectura a tus incidencias, eventos y trazas de pila de Sentry
      3. Haz clic en **Test listing tools** para verificar que la conexión funciona correctamente

      Una vez conectado, Devin puede consultar tus proyectos de Sentry, obtener detalles de incidencias y trazas de pila, y leer breadcrumbs, todo dentro de una sesión. Obtén más información sobre cómo [configurar servidores MCP](/es/work-with-devin/mcp).
    </Step>

    <Step title="Crear la programación">
      Ve a **Configuración > [Programaciones](/es/product-guides/scheduled-sessions)** y haz clic en **Crear programación**.

      * **Nombre**: `Daily Sentry remediation — payments-api`
      * **Frecuencia**: Todos los días a las 6:00 a. m. (para que las PR de corrección estén listas antes de la reunión diaria)
      * **Agente**: Devin — esto permite que Devin inicie una sesión independiente para cada error, de modo que las correcciones se ejecuten en paralelo
      * **Canal de Slack**: Selecciona un canal (p. ej., `#sentry-fixes`) para que tu equipo reciba una notificación cuando la ejecución termine y las PR estén listas para revisión
      * **Prompt**:

      <PromptBlock type="schedule" agent="advanced">
        ```txt Daily Sentry remediation theme={null}
        Usa el MCP de Sentry para obtener todos los errores sin resolver de las últimas
        24 horas en el proyecto payments-api, ordenados por número de eventos.
        Omite los errores etiquetados como `wontfix` o `expected-behavior`.

        Para los 5 errores principales:
        1. Obtén el stack trace completo y los breadcrumbs
        2. Encuentra los archivos de código fuente relevantes en nuestro repositorio
        3. Identifica la causa raíz
        4. Inicia una sesión de Devin para abrir una PR con una corrección y una prueba
           de regresión, incluyendo la URL de la incidencia de Sentry en la descripción de la PR

        Publica un resumen de todos los errores y sus PR en Slack.

        Si dejo comentarios en cualquiera de las PR (p. ej., marcando una corrección como
        falso positivo, solicitando un enfoque diferente o aprobando un
        patrón), crea una entrada de Knowledge que recoja esos comentarios para que
        futuras ejecuciones gestionen errores similares correctamente.
        ```
      </PromptBlock>
    </Step>

    <Step title="Nutre Knowledge con tu base de código y correcciones anteriores">
      Devin genera mejores correcciones cuando comprende los patrones de error de tu aplicación. En lugar de escribir tú mismo las entradas de Knowledge, pídele a Devin en cualquier sesión que investigue tu base de código y las correcciones anteriores, y luego deja que cree Knowledge:

      <PromptBlock agent="advanced">
        ```txt Learn our error patterns and create Knowledge theme={null}
        Investigate our payments-api codebase and build Knowledge entries
        for common error patterns:

        1. Read recent merged PRs that fixed Sentry errors — look for
           patterns in what broke and how it was fixed
        2. Check resolved Sentry issues for recurring root causes
           (null checks, N+1 queries, missing error boundaries)
        3. Review our error handling conventions in the codebase —
           which wrapper classes we use, how we log errors, our
           retry/fallback patterns

        For each pattern you find, create a Knowledge entry with a
        specific trigger (e.g., "TypeError in checkout", "database
        timeout in reports") and actionable fix guidance.
        ```
      </PromptBlock>

      Estas entradas se recuperan automáticamente cuando Devin encuentra errores que coinciden durante ejecuciones programadas, y la instrucción programada anterior le indica a Devin que actualice Knowledge según tus comentarios sobre las pull requests (PR), de modo que mejore con el tiempo.
    </Step>

    <Step title="Qué produce una ejecución típica">
      Cada mañana, Devin procesa la cola de errores acumulados durante la noche y abre PR específicas. Este es un ejemplo de la salida de una sesión real:

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

      Cada PR incluye un enlace a la incidencia de Sentry, una descripción de la causa principal, la solución y una prueba que habría detectado el error original.
    </Step>

    <Step title="Optimiza e itera">
      Tras una semana de ejecuciones, revisa qué está funcionando y ajústalo:

      **Acota el número de errores.** Comienza con los errores `top 5` por ejecución. Si Devin produce de forma constante PR que se puedan fusionar, aumenta a 8-10. Si las correcciones necesitan revisiones importantes, reduce a 3.

      **Filtra por proyecto o etiqueta.** Restringe el prompt a proyectos específicos de Sentry (`payments-api`, `web-frontend`) o excluye etiquetas ruidosas. Puedes crear programaciones independientes por proyecto si los volúmenes de errores difieren.

      **Aprende de los resultados.** Tras un par de semanas, pídele a Devin que analice qué correcciones se desplegaron realmente y convierta eso en Knowledge:

      <PromptBlock agent="advanced">
        ```txt Analiza los resultados de las correcciones de Sentry y actualiza Knowledge theme={null}
        Revisa todos los PR que Devin abrió para errores de Sentry en las últimas 2 semanas.
        Para cada PR, comprueba si se fusionó o se cerró.

        Identifica patrones y aprendizajes: qué patrones de corrección funcionaron, qué
        enfoques fueron rechazados, qué tipos de errores fueron falsos positivos
        y dónde le faltó contexto a Devin. Luego actualiza tu Knowledge
        en consecuencia: crea nuevas entradas, edita las existentes o elimina
        las entradas que llevaron a correcciones erróneas.
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
