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

# Correções Diárias de Erros no 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="Correções diárias de erros no Sentry" description="Agende uma sessão diária do Devin que busque novos erros do Sentry durante a noite, inicie uma sessão de correção para cada um e deixe PRs prontos pela manhã." prompt="Use o Sentry MCP para buscar todos os erros não resolvidos das últimas 24 horas no projeto payments-api, ordenados por contagem de eventos. Para os 5 principais erros, investigue o stack trace e a causa raiz, depois inicie uma sessão do Devin em cada um para abrir um PR com uma correção e um teste de regressão. Ignore erros marcados como wontfix ou expected-behavior." category="Automatizações" features="Agendamentos, MCP, Avançado" type="schedule" agent="advanced" />

<div className="uc-detail-wrapper">
  <Tip>Para um guia mais detalhado de integração com o Sentry, [clique aqui](/pt-BR/enterprise/integrations/sentry).</Tip>

  <Steps>
    <Step title="Conectar o Sentry MCP">
      Antes de criar seu cronograma, Devin precisa de acesso aos seus dados do Sentry.

      1. Vá para **Settings > Connections > MCP servers** e pesquise por **Sentry**
      2. Clique em **Enable** e autentique via OAuth — isso concede ao Devin acesso de leitura aos seus issues, eventos e stack traces do Sentry
      3. Clique em **Test listing tools** para verificar se a conexão está funcionando

      Depois de conectado, Devin pode consultar seus projetos do Sentry, obter detalhes de issues e stack traces e ler breadcrumbs — tudo durante uma sessão. Saiba mais sobre [configurar servidores MCP](/pt-BR/work-with-devin/mcp).
    </Step>

    <Step title="Criar agendamento">
      Go to **Settings > [Schedules](/pt-BR/product-guides/scheduled-sessions)** and click **Create schedule**.

      * **Name**: `Daily Sentry remediation — payments-api`
      * **Frequency**: Diariamente às 6:00 AM (para que os PRs com correções estejam prontos antes do standup)
      * **Agent**: Devin — isso permite que o Devin inicie uma sessão separada para cada erro, de modo que as correções sejam executadas em paralelo
      * **Slack channel**: Selecione um canal (por exemplo, `#sentry-fixes`) para que sua equipe seja notificada quando a execução terminar e os PRs estiverem prontos para revisão
      * **Prompt**:

      <PromptBlock type="schedule" agent="advanced">
        ```txt Daily Sentry remediation theme={null}
        Use o Sentry MCP para buscar todos os erros não resolvidos das
        últimas 24 horas no projeto payments-api, ordenados por contagem
        de eventos. Ignore erros marcados como `wontfix` ou
        `expected-behavior`.

        Para os 5 principais erros:
        1. Obtenha o stack trace completo e os breadcrumbs
        2. Encontre os arquivos de código relevantes em nosso repositório
        3. Identifique a causa raiz
        4. Inicie uma sessão do Devin para abrir um PR com uma correção
           e um teste de regressão, incluindo a URL da issue do Sentry na
           descrição do PR

        Publique um resumo de todos os erros e seus respectivos PRs no Slack.

        Se eu deixar feedback em qualquer um dos PRs (por exemplo,
        marcando uma correção como falso positivo, solicitando uma
        abordagem diferente ou aprovando um padrão), crie uma entrada
        no Knowledge registrando esse feedback para que futuras execuções
        lidem corretamente com erros semelhantes.
        ```
      </PromptBlock>
    </Step>

    <Step title="Alimente o Knowledge a partir da sua base de código e de correções anteriores">
      Devin escreve correções melhores quando entende os padrões de erro da sua aplicação. Em vez de criar entradas de Knowledge manualmente, peça ao Devin em qualquer sessão para investigar sua base de código e correções anteriores e deixe que ele crie o Knowledge:

      <PromptBlock agent="advanced">
        ```txt Aprenda nossos padrões de erro e crie Knowledge theme={null}
        Investigue a base de código do nosso payments-api e construa entradas
        de Knowledge para padrões de erro comuns:

        1. Leia PRs recentes que foram mesclados e corrigiram erros reportados
           pelo Sentry — procure padrões no que falhou e em como foi corrigido
        2. Verifique issues resolvidas no Sentry em busca de causas-raiz recorrentes
           (verificações de null, queries N+1, falta de error boundaries)
        3. Revise nossas convenções de tratamento de erro na base de código —
           quais classes wrapper usamos, como registramos erros em log,
           nossos padrões de nova tentativa/retentativa e fallback

        Para cada padrão que você encontrar, crie uma entrada de Knowledge com um
        gatilho específico (por exemplo, "TypeError in checkout", "database
        timeout in reports") e instruções de correção acionáveis.
        ```
      </PromptBlock>

      Essas entradas são automaticamente recuperadas quando o Devin encontra erros correspondentes durante execuções agendadas — e o prompt agendado acima instrui o Devin a atualizar o Knowledge com base no seu feedback em PRs, para que ele melhore ao longo do tempo.
    </Step>

    <Step title="O que uma execução típica gera">
      Todas as manhãs, Devin processa a fila de erros gerados durante a noite e abre PRs direcionados. Aqui está um exemplo de saída de uma sessão 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 inclui o link da issue do Sentry, uma descrição da causa raiz, a correção e um teste que teria detectado o erro original.
    </Step>

    <Step title="Ajustar e iterar">
      Após uma semana de execuções, revise o que está funcionando e faça ajustes:

      **Defina o escopo da contagem de erros.** Comece com os `top 5` erros por execução. Se Devin estiver produzindo PRs que podem ser mesclados de forma consistente, aumente para 8–10. Se as correções exigirem muitas revisões, reduza para 3.

      **Filtre por projeto ou tag.** Restrinja o prompt a projetos específicos do Sentry (`payments-api`, `web-frontend`) ou exclua tags ruidosas. Você pode criar agendamentos separados por projeto se os volumes de erro forem diferentes.

      **Aprenda com os resultados.** Depois de algumas semanas, peça ao Devin para analisar quais correções realmente foram enviadas e transformar isso em Knowledge:

      <PromptBlock agent="advanced">
        ```txt Analyze Sentry fix outcomes and update Knowledge theme={null}
        Look at all PRs Devin opened for Sentry errors in the last 2 weeks.
        For each PR, check whether it was merged or closed.

        Identify themes and learnings — which fix patterns worked, which
        approaches were rejected, what types of errors were false positives,
        and where Devin lacked context. Then update your Knowledge
        accordingly: create new entries, edit existing ones, or delete
        entries that led to bad fixes.
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
