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

# Crear PR tras cada llamada

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="Crea PR tras cada llamada" description="Una programación horaria de Devin sondea Granola en busca de reuniones nuevas, extrae tareas de ingeniería de las transcripciones e inicia sesiones secundarias para crear PR." prompt="Configura una programación horaria de Devin que sondee Granola en busca de reuniones nuevas a través del servidor MCP de Granola. Para cada reunión con una transcripción lista, extrae las tareas de ingeniería e inicia sesiones secundarias de Devin para abrir PR. Usa una nota de Knowledge para registrar las reuniones procesadas." category="Automatizaciones" features="Programaciones, MCP, Playbooks, Avanzado" type="schedule" agent="devin" />

<div className="uc-detail-wrapper">
  <Tip>¿Prefiere no configurarlo manualmente? Pegue un enlace a esta página en una sesión de Devin y pídale que configure todo por usted.</Tip>

  Granola graba tus reuniones y las convierte en notas, resúmenes y transcripciones. Una vez que conectes el Granola MCP, Devin puede usar esos artefactos de reunión igual que lo haría un compañero de equipo: leer lo que se discutió, identificar tareas de seguimiento de ingeniería concretas y comenzar a trabajar.

  Ejecuta esto como una programación por hora y las tareas pueden comenzar justo cuando terminas una llamada. Todo el ciclo se ejecuta dentro de tu instancia de Devin, usando una programación, el Granola MCP, Knowledge y child sessions.

  ```
  Sesión programada de Devin (cada hora)
    → Listar reuniones recientes de Granola vía MCP
    → Para cada nueva reunión (de más antigua a más reciente):
        → Obtener metadatos, notas, resumen de IA y transcripción
        → Identificar tareas de ingeniería a partir de la discusión
        → Iniciar sesiones secundarias de Devin para tareas concretas
        → Registrar la reunión procesada en Knowledge
  ```

  <Steps>
    <Step title="Conecta el MCP de Granola">
      Devin necesita acceso a tus reuniones en Granola para leer transcripciones y notas.

      1. Ve a **Settings > Connections > servidores MCP** y busca **Granola**
      2. Haz clic en **Enable** y autentícate; esto le concede a Devin acceso de lectura a tus reuniones, transcripciones y notas
      3. Haz clic en **Probar herramientas para listar** para verificar que la conexión funciona correctamente

      Una vez conectado, Devin puede llamar a `list_meetings`, `get_meetings` y `get_meeting_transcript` para obtener datos de reuniones durante una sesión. Obtén más información sobre cómo [configurar servidores MCP](/es/work-with-devin/mcp).
    </Step>

    <Step title="Crear una nota de Knowledge llamada processed-meetings">
      Devin usa una sola nota de [Knowledge](/es/product-guides/knowledge) para registrar qué reuniones ya se han procesado. Esto evita el procesamiento duplicado en las ejecuciones horarias.

      Ve a **Settings > Knowledge** y crea una nota nueva:

      * **Name**: `Granola Post-call Processor Meeting Log`
      * **Trigger**: `Cuando ejecutes la sesión programada del procesador posterior a la llamada de Granola, usa esta nota para llevar un registro de las reuniones ya procesadas.`
      * **Body**:

      ```json Granola Post-call Processor Meeting Log theme={null}
      {
        "last_processed_meeting_id": null,
        "last_processed_meeting_time": null,
        "last_processed_title": null,
        "updated_at": null
      }
      ```

      La sesión programada registra en esta nota cada reunión procesada correctamente, para que la siguiente ejecución retome desde donde se quedó la anterior.
    </Step>

    <Step title="Redacta la guía operativa del Post-call Operator">
      Crea un [playbook](/es/product-guides/creating-playbooks) que le indique a Devin cómo procesar cada reunión. Ve a [**Settings > Playbooks**](https://app.devin.ai/settings/playbooks/create?utm_source=docs\&utm_medium=use-case-gallery) y crea un nuevo playbook:

      <PromptBlock type="playbook">
        ```txt Operador posllamada theme={null}
        Convierte una reunión de Granola ya finalizada en trabajo de ingeniería concreto.
        Lee la transcripción, identifica cada tarea de código que se pueda ejecutar e inicia
        sesiones hijas de Devin para crear PR. Prioriza claramente la acción:
        si algo puede convertirse en una PR, iníciala.

        Para cada reunión:
        1. Lee la transcripción, el resumen de IA y cualquier nota privada
        2. Identifica cada tarea de ingeniería mencionada o implícita:
           - Correcciones de bugs comentadas
           - Solicitudes de nuevas funcionalidades con suficiente detalle para definirlas
           - Refactorizaciones o mejoras acordadas
           - Tareas de investigación/análisis
           - Actualizaciones de documentación
           - Cambios de infraestructura o DevOps
        3. Para cada tarea, redacta una especificación concreta:
           - En qué repo(s) trabajar
           - Qué debe hacer el cambio
           - Criterios de aceptación
           - Contexto clave de la reunión (cita con moderación)
        4. Inicia una sesión hija de Devin para cada tarea lo bastante concreta
           como para generar una PR. Incluye la especificación completa como prompt.
        5. Para las tareas demasiado vagas para una PR, enuméralas como acciones
           recomendadas e indica el contexto que falta.
        6. Devuelve un resumen estructurado de las sesiones iniciadas y
           las recomendaciones.

        No inicies sesiones para ideas vagas. Si una tarea necesita
        aclaración, enumérala como una recomendación en su lugar.
        ```
      </PromptBlock>

      Anota el ID del playbook después de guardarlo: lo usarás como referencia en el prompt de programación.
    </Step>

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

      * **Nombre**: `Procesador posllamada de Granola`
      * **Frecuencia**: Cada hora (`0 * * * *`)
      * **Agente**: Devin — esto permite que Devin cree sesiones secundarias para cada tarea, de modo que las correcciones se ejecuten en paralelo
      * **Canal de Slack** (opcional): Selecciona un canal para que tu equipo reciba notificaciones cuando se procesen las reuniones y se abran PR
      * **Prompt**:

      <PromptBlock type="schedule" agent="devin">
        ```txt Procesador posllamada de Granola theme={null}
        Ejecuta el procesador posllamada de Granola.

        Usa el servidor MCP de Granola y la nota de Knowledge llamada
        "Registro de reuniones del procesador posllamada de Granola".

        1. Revisa el registro de reuniones para encontrar el último ID/hora de reunión procesado.
        2. Lista las reuniones de Granola de las últimas 24 horas.
        3. Selecciona las reuniones posteriores a la última reunión del registro. Ordénalas de la más antigua a la más reciente.
        4. Para cada reunión:
           a. Obtén los metadatos, las notas privadas y el resumen generado por IA mediante MCP
           b. Obtén la transcripción completa mediante MCP
           c. Si la transcripción no está disponible, DETÉN el procesamiento del lote
              aquí — no continúes con las siguientes. La próxima ejecución lo reintentará.
           d. Ejecuta el playbook Post-call Operator para esta reunión
           e. Inicia sesiones secundarias de Devin para tareas de ingeniería concretas
           f. Registra esta reunión procesada en la nota de Knowledge
        5. Publica un resumen en Slack: reuniones procesadas, sesiones iniciadas
           y cualquier reunión omitida por falta de transcripción.

        Si no hay reuniones nuevas desde la última reunión del registro, finaliza sin hacer nada.
        ```
      </PromptBlock>

      Configura **bypass approval** en `true` si quieres un funcionamiento totalmente autónomo — no se necesitan aprobaciones manuales para herramientas MCP, actualizaciones de Knowledge ni creación de sesiones secundarias.
    </Step>

    <Step title="Lo que genera una ejecución típica">
      Cada hora, Devin procesa las nuevas reuniones y abre PR específicas. Este es el aspecto del resultado de una sesión real:

      ```
      Se procesó 1 nueva reunión de Granola desde la última entrada del registro de reuniones:

      Meeting: "Backend API planning" (2026-04-29 2:00 PM)

      Child sessions iniciadas (3):
      1. Fix N+1 query in /api/invoices endpoint
         Repo: acme/api-server
         PR: Eager-load invoice line items to fix timeout
         Session: https://app.devin.ai/sessions/abc123

      2. Add rate limiting to webhook endpoints
         Repo: acme/api-server
         PR: Per-key rate limits on /webhooks/*
         Session: https://app.devin.ai/sessions/def456

      3. Update API docs for new billing endpoints
         Repo: acme/docs
         PR: Add billing endpoint reference docs
         Session: https://app.devin.ai/sessions/ghi789

      Acciones recomendadas (1):
      - Investigar el flujo de actualización del auth token — mencionado como "a veces
        inestable" pero sin ningún error específico ni repo identificado. Se necesita más
        contexto del equipo.

      Registro de reuniones de Knowledge actualizado a "Backend API planning" (2026-04-29).
      ```

      Cada sesión secundaria se ejecuta de forma independiente y abre su propio pull request (PR), con el contexto de la reunión ya incorporado en la descripción.
    </Step>

    <Step title="Ajusta e itera">
      Después de unos días de ejecuciones, revisa qué está funcionando y haz ajustes:

      **Gestiona los retrasos en las transcripciones.** La programación deja de procesar cuando encuentra una reunión cuya transcripción aún no está lista; esto evita que se omitan reuniones con transcripciones retrasadas. Si ves que las transcripciones suelen tardar, aumenta el intervalo de la programación o agrega un margen de espera al prompt.

      **Define el ámbito según el tipo de reunión.** No todas las reuniones generan trabajo de ingeniería. Agrega filtros al prompt para omitir ciertos tipos de reunión:

      <PromptBlock agent="advanced">
        ```txt Filtrar reuniones por tipo theme={null}
        Actualiza el prompt de la programación: omite reuniones con títulos que contengan
        "1:1", "standup" o "social". Procesa solo reuniones que
        probablemente incluyan conversaciones de ingeniería: sesiones de planificación,
        triaje de bugs, revisiones de diseño y llamadas con clientes.
        ```
      </PromptBlock>

      **Aprende de los resultados.** Después de un par de semanas, pídele a Devin que analice qué sesiones hijas produjeron PR fusionadas y cuáles se cerraron sin fusionarse. Usa ese feedback para ajustar los criterios de extracción de tareas del playbook:

      <PromptBlock agent="advanced">
        ```txt Analizar resultados después de la llamada y actualizar el playbook theme={null}
        Revisa todas las sesiones hijas iniciadas por el procesador posterior a la llamada de Granola
        en las últimas 2 semanas. Para cada sesión, comprueba si
        la PR se fusionó o se cerró.

        Identifica patrones: qué tipos de tareas producen sistemáticamente
        PR que se pueden fusionar, cuáles son demasiado vagas y dónde el playbook
        necesita más contexto. Luego sugiere actualizaciones al playbook de Post-call
        Operator en función de estos aprendizajes.
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
