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

# Heartbeat

<Note>
  **¿Heartbeat frente a Cron?** Consulta [Automatización](/es/automation) para obtener orientación sobre cuándo usar cada uno.
</Note>

Heartbeat ejecuta **turnos periódicos de agente** en la sesión principal para que el modelo pueda señalar cualquier cosa que requiera atención sin enviarte spam.

Heartbeat es un turno programado de la sesión principal; **no** crea registros de [tarea en segundo plano](/es/automation/tasks). Los registros de tareas son para trabajo desacoplado (ejecuciones ACP, subagentes, trabajos Cron aislados).

Solución de problemas: [Tareas programadas](/es/automation/cron-jobs#troubleshooting)

## Inicio rápido (principiante)

<Steps>
  <Step title="Elige una cadencia">
    Deja los Heartbeats habilitados (el valor predeterminado es `30m`, o `1h` cuando la autenticación OAuth/token de Anthropic está configurada, incluida la reutilización de Claude CLI) o define tu propia cadencia.
  </Step>

  <Step title="Añade HEARTBEAT.md (opcional)">
    Crea una pequeña lista de comprobación `HEARTBEAT.md` o un bloque `tasks:` en el espacio de trabajo del agente.
  </Step>

  <Step title="Decide adónde deben ir los mensajes de Heartbeat">
    `target: "none"` es el valor predeterminado; define `target: "last"` para dirigirlos al último contacto.
  </Step>

  <Step title="Ajuste opcional">
    * Habilita la entrega del razonamiento de Heartbeat para mayor transparencia.
    * Usa contexto de arranque ligero si las ejecuciones de Heartbeat solo necesitan `HEARTBEAT.md`.
    * Habilita sesiones aisladas para evitar enviar todo el historial de conversación en cada Heartbeat.
    * Restringe los Heartbeats a horas activas (hora local).
  </Step>
</Steps>

Configuración de ejemplo:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m",
        target: "last", // explicit delivery to last contact (default is "none")
        directPolicy: "allow", // default: allow direct/DM targets; set "block" to suppress
        lightContext: true, // optional: only inject HEARTBEAT.md from bootstrap files
        isolatedSession: true, // optional: fresh session each run (no conversation history)
        skipWhenBusy: true, // optional: also defer when this agent's subagent or nested lanes are busy
        // activeHours: { start: "08:00", end: "24:00" },
        // includeReasoning: true, // optional: send separate `Thinking` message too
      },
    },
  },
}
```

## Valores predeterminados

* Intervalo: `30m`. Aplicar los valores predeterminados del proveedor Anthropic lo aumenta a `1h` cuando el modo de autenticación resuelto es OAuth/token (incluida la reutilización de Claude CLI), pero solo mientras `heartbeat.every` no esté definido. Define `agents.defaults.heartbeat.every` o `agents.list[].heartbeat.every` por agente; usa `0m` para deshabilitarlo.
* Cuerpo del prompt (configurable mediante `agents.defaults.heartbeat.prompt`): `Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.`
* Tiempo de espera: los turnos de Heartbeat sin definir usan `agents.defaults.timeoutSeconds` cuando está configurado. De lo contrario, usan la cadencia de Heartbeat limitada a 600 segundos. Define `agents.defaults.heartbeat.timeoutSeconds` o `agents.list[].heartbeat.timeoutSeconds` por agente para trabajos de Heartbeat más largos.
* El prompt de Heartbeat se envía **literalmente** como mensaje del usuario. El prompt del sistema incluye una sección "Heartbeats" solo cuando los Heartbeats están habilitados para el agente predeterminado (y `includeSystemPromptSection` no es `false`), y la ejecución se marca internamente.
* Cuando los Heartbeats se deshabilitan con `0m`, las ejecuciones normales también omiten `HEARTBEAT.md` del contexto de arranque para que el modelo no vea instrucciones exclusivas de Heartbeat.
* Las horas activas (`heartbeat.activeHours`) se comprueban en la zona horaria configurada. Fuera de la ventana, los Heartbeats se omiten hasta el siguiente tic dentro de la ventana.
* Los Heartbeats se aplazan automáticamente mientras el trabajo Cron está activo o en cola. Define `heartbeat.skipWhenBusy: true` para aplazar también un agente en sus propios carriles de subagente con clave de sesión o comandos anidados; los agentes hermanos ya no se pausan solo porque otro agente tenga trabajo de subagente en curso.

## Para qué sirve el prompt de Heartbeat

El prompt predeterminado es intencionalmente amplio:

* **Tareas en segundo plano**: "Consider outstanding tasks" impulsa al agente a revisar seguimientos (bandeja de entrada, calendario, recordatorios, trabajo en cola) y señalar cualquier cosa urgente.
* **Comprobación con la persona**: "Checkup sometimes on your human during day time" impulsa un mensaje ligero ocasional de "¿necesitas algo?", pero evita el spam nocturno usando tu zona horaria local configurada (consulta [Zona horaria](/es/concepts/timezone)).

Heartbeat puede reaccionar a [tareas en segundo plano](/es/automation/tasks) completadas, pero una ejecución de Heartbeat en sí no crea un registro de tarea.

Si quieres que un Heartbeat haga algo muy específico (por ejemplo, "check Gmail PubSub stats" o "verify gateway health"), define `agents.defaults.heartbeat.prompt` (o `agents.list[].heartbeat.prompt`) con un cuerpo personalizado (enviado literalmente).

## Contrato de respuesta

* Si nada requiere atención, responde con **`HEARTBEAT_OK`**.
* Las ejecuciones de Heartbeat pueden llamar en su lugar a `heartbeat_respond` con `notify: false` para no mostrar ninguna actualización visible, o `notify: true` más `notificationText` para una alerta. Cuando está presente, la respuesta estructurada de la herramienta tiene prioridad sobre el texto de reserva.
* Durante las ejecuciones de Heartbeat, OpenClaw trata `HEARTBEAT_OK` como una confirmación cuando aparece al **inicio o al final** de la respuesta. El token se elimina y la respuesta se descarta si el contenido restante es **≤ `ackMaxChars`** (predeterminado: 300).
* Si `HEARTBEAT_OK` aparece en el **medio** de una respuesta, no recibe tratamiento especial.
* Para alertas, **no** incluyas `HEARTBEAT_OK`; devuelve solo el texto de la alerta.

Fuera de los Heartbeats, un `HEARTBEAT_OK` suelto al inicio/final de un mensaje se elimina y se registra; un mensaje que solo contiene `HEARTBEAT_OK` se descarta.

## Configuración

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m", // default: 30m (0m disables)
        model: "anthropic/claude-opus-4-6",
        includeReasoning: false, // default: false (deliver separate Thinking message when available)
        lightContext: false, // default: false; true keeps only HEARTBEAT.md from workspace bootstrap files
        isolatedSession: false, // default: false; true runs each heartbeat in a fresh session (no conversation history)
        skipWhenBusy: false, // default: false; true also waits for this agent's subagent/nested lanes
        target: "last", // default: none | options: last | none | <channel id> (core or plugin, e.g. "imessage")
        to: "+15551234567", // optional channel-specific override
        accountId: "ops-bot", // optional multi-account channel id
        prompt: "Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.",
        includeSystemPromptSection: true, // default: true; false omits the ## Heartbeats system prompt section for the default agent
        ackMaxChars: 300, // max chars allowed after HEARTBEAT_OK
      },
    },
  },
}
```

### Alcance y precedencia

* `agents.defaults.heartbeat` define el comportamiento global de Heartbeat.
* `agents.list[].heartbeat` se combina encima; si algún agente tiene un bloque `heartbeat`, **solo esos agentes** ejecutan Heartbeats.
* `channels.defaults.heartbeat` define los valores predeterminados de visibilidad para todos los canales.
* `channels.<channel>.heartbeat` sobrescribe los valores predeterminados del canal.
* `channels.<channel>.accounts.<id>.heartbeat` (canales multicuenta) sobrescribe la configuración por canal.

### Heartbeats por agente

Si alguna entrada `agents.list[]` incluye un bloque `heartbeat`, **solo esos agentes** ejecutan Heartbeats. El bloque por agente se combina encima de `agents.defaults.heartbeat` (así puedes definir valores predeterminados compartidos una vez y sobrescribirlos por agente).

Ejemplo: dos agentes, solo el segundo agente ejecuta Heartbeats.

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m",
        target: "last", // explicit delivery to last contact (default is "none")
      },
    },
    list: [
      { id: "main", default: true },
      {
        id: "ops",
        heartbeat: {
          every: "1h",
          target: "whatsapp",
          to: "+15551234567",
          timeoutSeconds: 45,
          prompt: "Read HEARTBEAT.md if it exists (workspace context). Follow it strictly. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.",
        },
      },
    ],
  },
}
```

### Ejemplo de horas activas

Restringe los Heartbeats al horario laboral en una zona horaria específica:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  agents: {
    defaults: {
      heartbeat: {
        every: "30m",
        target: "last", // explicit delivery to last contact (default is "none")
        activeHours: {
          start: "09:00",
          end: "22:00",
          timezone: "America/New_York", // optional; uses your userTimezone if set, otherwise host tz
        },
      },
    },
  },
}
```

Fuera de esta ventana (antes de las 9 a. m. o después de las 10 p. m. hora del Este), los Heartbeats se omiten. El siguiente tic programado dentro de la ventana se ejecutará normalmente.

### Configuración 24/7

Si quieres que los Heartbeats se ejecuten todo el día, usa uno de estos patrones:

* Omite `activeHours` por completo (sin restricción de ventana horaria; este es el comportamiento predeterminado).
* Define una ventana de día completo: `activeHours: { start: "00:00", end: "24:00" }`.

<Warning>
  No definas la misma hora de `start` y `end` (por ejemplo, de `08:00` a `08:00`). Eso se trata como una ventana de ancho cero, por lo que los Heartbeats siempre se omiten.
</Warning>

### Ejemplo multicuenta

Usa `accountId` para apuntar a una cuenta específica en canales multicuenta como Telegram:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  agents: {
    list: [
      {
        id: "ops",
        heartbeat: {
          every: "1h",
          target: "telegram",
          to: "12345678:topic:42", // optional: route to a specific topic/thread
          accountId: "ops-bot",
        },
      },
    ],
  },
  channels: {
    telegram: {
      accounts: {
        "ops-bot": { botToken: "YOUR_TELEGRAM_BOT_TOKEN" },
      },
    },
  },
}
```

### Notas de campos

<ParamField path="every" type="string">
  Intervalo de Heartbeat (cadena de duración; unidad predeterminada = minutos).
</ParamField>

<ParamField path="model" type="string">
  Sobrescritura opcional de modelo para ejecuciones de Heartbeat (`provider/model`).
</ParamField>

<ParamField path="includeReasoning" type="boolean" default="false">
  Cuando está habilitado, también entrega el mensaje separado `Thinking` cuando esté disponible (la misma forma que `/reasoning on`).
</ParamField>

<ParamField path="lightContext" type="boolean" default="false">
  Cuando es true, las ejecuciones de Heartbeat usan contexto de arranque ligero y conservan solo `HEARTBEAT.md` de los archivos de arranque del espacio de trabajo.
</ParamField>

<ParamField path="isolatedSession" type="boolean" default="false">
  Cuando es true, cada Heartbeat se ejecuta en una sesión nueva sin historial de conversación previo. Usa el mismo patrón de aislamiento que Cron `sessionTarget: "isolated"`. Reduce drásticamente el costo de tokens por Heartbeat. Combínalo con `lightContext: true` para obtener el máximo ahorro. El enrutamiento de entrega sigue usando el contexto de la sesión principal.
</ParamField>

<ParamField path="skipWhenBusy" type="boolean" default="false">
  Cuando es true, las ejecuciones de Heartbeat se aplazan en los carriles ocupados adicionales de ese agente: su propio subagente con clave de sesión o trabajo de comandos anidados. Los carriles Cron siempre aplazan los Heartbeats, incluso sin esta opción, para que los hosts de modelos locales no ejecuten prompts de Cron y Heartbeat al mismo tiempo.
</ParamField>

<ParamField path="session" type="string">
  Clave de sesión opcional para ejecuciones de Heartbeat.

  * `main` (predeterminado): sesión principal del agente.
  * Clave de sesión explícita (cópiala de `openclaw sessions --json` o de la [CLI de sesiones](/es/cli/sessions)).
  * Formatos de clave de sesión: consulta [Sesiones](/es/concepts/session) y [Grupos](/es/channels/groups).
</ParamField>

<ParamField path="target" type="string">
  * `last`: entrega al último canal externo utilizado.
  * canal explícito: cualquier canal configurado o id de Plugin, por ejemplo `discord`, `matrix`, `telegram` o `whatsapp`.
  * `none` (predeterminado): ejecuta el Heartbeat pero **no entrega** externamente.
</ParamField>

<ParamField path="directPolicy" type="&#x22;allow&#x22; | &#x22;block&#x22;" default="allow">
  Controla el comportamiento de entrega directa/DM. `allow`: permite la entrega directa/DM de Heartbeat. `block`: suprime la entrega directa/DM (`reason=dm-blocked`).
</ParamField>

<ParamField path="to" type="string">
  Anulación opcional del destinatario (id específico del canal, p. ej., E.164 para WhatsApp o un id de chat de Telegram). Para temas/hilos de Telegram, usa `<chatId>:topic:<messageThreadId>`.
</ParamField>

<ParamField path="accountId" type="string">
  Id de cuenta opcional para canales con varias cuentas. Cuando `target: "last"`, el id de cuenta se aplica al último canal resuelto si admite cuentas; de lo contrario, se ignora. Si el id de cuenta no coincide con una cuenta configurada para el canal resuelto, se omite la entrega.
</ParamField>

<ParamField path="prompt" type="string">
  Anula el cuerpo del prompt predeterminado (no se fusiona).
</ParamField>

<ParamField path="includeSystemPromptSection" type="boolean" default="true">
  Indica si se inyecta la sección del prompt de sistema `## Heartbeats` del agente predeterminado. Establece `false` para mantener el comportamiento de ejecución de Heartbeat (cadencia, entrega, HEARTBEAT.md) mientras omites las instrucciones de Heartbeat del prompt de sistema del agente.
</ParamField>

<ParamField path="ackMaxChars" type="number" default="300">
  Número máximo de caracteres permitidos después de `HEARTBEAT_OK` antes de la entrega.
</ParamField>

<ParamField path="suppressToolErrorWarnings" type="boolean">
  Cuando es true, suprime las cargas de advertencia de errores de herramientas durante las ejecuciones de Heartbeat.
</ParamField>

<ParamField path="timeoutSeconds" type="number" default="global timeout or min(every, 600)">
  Segundos máximos permitidos para un turno de agente de Heartbeat antes de abortarlo. Déjalo sin definir para usar `agents.defaults.timeoutSeconds` cuando esté configurado; de lo contrario, se usa la cadencia de Heartbeat limitada a 600 segundos.
</ParamField>

<ParamField path="activeHours" type="object">
  Restringe las ejecuciones de Heartbeat a una ventana horaria. Objeto con `start` (HH:MM, inclusivo; usa `00:00` para el inicio del día), `end` (HH:MM exclusivo; se permite `24:00` para el final del día) y `timezone` opcional.

  * Omitido o `"user"`: usa tu `agents.defaults.userTimezone` si está configurado; de lo contrario, recurre a la zona horaria del sistema anfitrión.
  * `"local"`: siempre usa la zona horaria del sistema anfitrión.
  * Cualquier identificador IANA (p. ej., `America/New_York`): se usa directamente; si no es válido, recurre al comportamiento de `"user"` descrito arriba.
  * `start` y `end` no deben ser iguales para una ventana activa; los valores iguales se tratan como ancho cero (siempre fuera de la ventana).
  * Fuera de la ventana activa, los Heartbeats se omiten hasta el siguiente tick dentro de la ventana.
</ParamField>

## Comportamiento de entrega

<AccordionGroup>
  <Accordion title="Enrutamiento de sesión y destino">
    * Los Heartbeats se ejecutan en la sesión principal del agente de forma predeterminada (`agent:<id>:<mainKey>`), o en `global` cuando `session.scope = "global"`. Establece `session` para anularla con una sesión de canal específica (Discord/WhatsApp/etc.).
    * `session` solo afecta el contexto de ejecución; la entrega la controlan `target` y `to`.
    * Para entregar a un canal/destinatario específico, establece `target` + `to`. Con `target: "last"`, la entrega usa el último canal externo de esa sesión.
    * Las entregas de Heartbeat permiten destinos directos/DM de forma predeterminada. Establece `directPolicy: "block"` para suprimir los envíos a destinos directos mientras se sigue ejecutando el turno de Heartbeat.
    * Si la cola principal, el carril de la sesión de destino, el carril de Cron o un trabajo de Cron activo están ocupados, el Heartbeat se omite y se reintenta más tarde.
    * Si `skipWhenBusy: true`, el subagente con clave de sesión y los carriles anidados de este agente también aplazan las ejecuciones de Heartbeat. Los carriles ocupados de otros agentes no aplazan este agente.
    * Si `target` no se resuelve a ningún destino externo, la ejecución sigue ocurriendo, pero no se envía ningún mensaje saliente.
  </Accordion>

  <Accordion title="Visibilidad y comportamiento de omisión">
    * Si `showOk`, `showAlerts` y `useIndicator` están todos deshabilitados, la ejecución se omite desde el principio como `reason=alerts-disabled`.
    * Si solo está deshabilitada la entrega de alertas, OpenClaw todavía puede ejecutar el Heartbeat, actualizar las marcas de tiempo de tareas vencidas, restaurar la marca de tiempo de inactividad de la sesión y suprimir la carga de alerta externa.
    * Si el destino de Heartbeat resuelto admite indicación de escritura, OpenClaw muestra que está escribiendo mientras la ejecución de Heartbeat está activa. Esto usa el mismo destino al que el Heartbeat enviaría la salida de chat, y se deshabilita con `typingMode: "never"`.
  </Accordion>

  <Accordion title="Ciclo de vida de sesión y auditoría">
    * Las respuestas solo de Heartbeat **no** mantienen viva la sesión. Los metadatos de Heartbeat pueden actualizar la fila de sesión, pero la expiración por inactividad usa `lastInteractionAt` del último mensaje real de usuario/canal, y la expiración diaria usa `sessionStartedAt`.
    * El historial de Control UI y WebChat oculta los prompts de Heartbeat y los acuses de recibo solo OK. La transcripción de sesión subyacente todavía puede contener esos turnos para auditoría/reproducción.
    * Las [tareas en segundo plano](/es/automation/tasks) separadas pueden poner en cola un evento del sistema y despertar Heartbeat cuando la sesión principal debe notar algo rápidamente. Ese despertar no convierte la ejecución de Heartbeat en una tarea en segundo plano.
  </Accordion>
</AccordionGroup>

## Controles de visibilidad

De forma predeterminada, los acuses de recibo `HEARTBEAT_OK` se suprimen mientras se entrega el contenido de alerta. Puedes ajustar esto por canal o por cuenta:

```yaml theme={"theme":{"light":"min-light","dark":"min-dark"}}
channels:
  defaults:
    heartbeat:
      showOk: false # Hide HEARTBEAT_OK (default)
      showAlerts: true # Show alert messages (default)
      useIndicator: true # Emit indicator events (default)
  telegram:
    heartbeat:
      showOk: true # Show OK acknowledgments on Telegram
  whatsapp:
    accounts:
      work:
        heartbeat:
          showAlerts: false # Suppress alert delivery for this account
```

Precedencia: por cuenta → por canal → valores predeterminados del canal → valores predeterminados integrados.

### Qué hace cada marca

* `showOk`: envía un acuse de recibo `HEARTBEAT_OK` cuando el modelo devuelve una respuesta solo OK.
* `showAlerts`: envía el contenido de alerta cuando el modelo devuelve una respuesta que no es OK.
* `useIndicator`: emite eventos indicadores para superficies de estado de la UI.

Si **las tres** son false, OpenClaw omite por completo la ejecución de Heartbeat (sin llamada al modelo).

### Ejemplos por canal frente a por cuenta

```yaml theme={"theme":{"light":"min-light","dark":"min-dark"}}
channels:
  defaults:
    heartbeat:
      showOk: false
      showAlerts: true
      useIndicator: true
  slack:
    heartbeat:
      showOk: true # all Slack accounts
    accounts:
      ops:
        heartbeat:
          showAlerts: false # suppress alerts for the ops account only
  telegram:
    heartbeat:
      showOk: true
```

### Patrones comunes

| Objetivo                                                          | Configuración                                                                            |
| ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Comportamiento predeterminado (OK silenciosos, alertas activadas) | *(no se necesita configuración)*                                                         |
| Totalmente silencioso (sin mensajes, sin indicador)               | `channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: false }` |
| Solo indicador (sin mensajes)                                     | `channels.defaults.heartbeat: { showOk: false, showAlerts: false, useIndicator: true }`  |
| OK solo en un canal                                               | `channels.telegram.heartbeat: { showOk: true }`                                          |

## HEARTBEAT.md (opcional)

Si existe un archivo `HEARTBEAT.md` en el espacio de trabajo, el prompt predeterminado le indica al agente que lo lea. Piensa en él como tu "lista de verificación de Heartbeat": pequeña, estable y segura para considerar cada 30 minutos.

En ejecuciones normales, `HEARTBEAT.md` solo se inyecta cuando la guía de Heartbeat está habilitada para el agente predeterminado. Deshabilitar la cadencia de Heartbeat con `0m` o establecer `includeSystemPromptSection: false` lo omite del contexto de arranque normal.

En el arnés nativo de Codex, el contenido de `HEARTBEAT.md` no se inyecta en el turno como otros archivos de arranque. Si el archivo existe y tiene contenido que no es solo espacios en blanco, una nota de modo de colaboración de Heartbeat dirige a Codex al archivo y le indica que lo lea antes de continuar.

Si `HEARTBEAT.md` existe pero está efectivamente vacío (solo líneas en blanco, comentarios Markdown/HTML, encabezados Markdown como `# Heading`, marcadores de bloque o stubs de listas de verificación vacías), OpenClaw omite la ejecución de Heartbeat para ahorrar llamadas a la API. Esa omisión se informa como `reason=empty-heartbeat-file`. Si falta el archivo, el Heartbeat sigue ejecutándose y el modelo decide qué hacer.

Mantenlo diminuto (lista de verificación corta o recordatorios) para evitar inflar el prompt.

Ejemplo de `HEARTBEAT.md`:

```md theme={"theme":{"light":"min-light","dark":"min-dark"}}
# Heartbeat checklist

- Quick scan: anything urgent in inboxes?
- If it's daytime, do a lightweight check-in if nothing else is pending.
- If a task is blocked, write down _what is missing_ and ask Peter next time.
```

### Bloques `tasks:`

`HEARTBEAT.md` también admite un pequeño bloque estructurado `tasks:` para comprobaciones basadas en intervalos dentro del propio Heartbeat.

Ejemplo:

```md theme={"theme":{"light":"min-light","dark":"min-dark"}}
tasks:

- name: inbox-triage
  interval: 30m
  prompt: "Check for urgent unread emails and flag anything time sensitive."
- name: calendar-scan
  interval: 2h
  prompt: "Check for upcoming meetings that need prep or follow-up."

# Additional instructions

- Keep alerts short.
- If nothing needs attention after all due tasks, reply HEARTBEAT_OK.
```

<AccordionGroup>
  <Accordion title="Comportamiento">
    * OpenClaw analiza el bloque `tasks:` y compara cada tarea con su propio `interval`.
    * Solo las tareas **vencidas** se incluyen en el prompt de Heartbeat para ese tick.
    * Si no hay tareas vencidas, el Heartbeat se omite por completo (`reason=no-tasks-due`) para evitar una llamada al modelo desperdiciada.
    * El contenido que no es de tareas en `HEARTBEAT.md` se conserva y se agrega como contexto adicional después de la lista de tareas vencidas.
    * Las marcas de tiempo de última ejecución de tareas se almacenan en el estado de sesión (`heartbeatTaskState`), por lo que los intervalos sobreviven a reinicios normales.
    * Las marcas de tiempo de tareas solo avanzan después de que una ejecución de Heartbeat completa su ruta normal de respuesta. Las ejecuciones omitidas por `empty-heartbeat-file` / `no-tasks-due` no marcan las tareas como completadas.
  </Accordion>
</AccordionGroup>

El modo de tareas es útil cuando quieres que un solo archivo de Heartbeat contenga varias comprobaciones periódicas sin pagar por todas ellas en cada tick.

### ¿Puede el agente actualizar HEARTBEAT.md?

Sí, si se lo pides.

`HEARTBEAT.md` es simplemente un archivo normal en el espacio de trabajo del agente, así que puedes decirle al agente (en un chat normal) algo como:

* "Update `HEARTBEAT.md` to add a daily calendar check."
* "Rewrite `HEARTBEAT.md` so it's shorter and focused on inbox follow-ups."

Si quieres que esto ocurra de forma proactiva, también puedes incluir una línea explícita en tu prompt de Heartbeat como: "If the checklist becomes stale, update HEARTBEAT.md with a better one."

<Warning>
  No pongas secretos (claves de API, números de teléfono, tokens privados) en `HEARTBEAT.md`: se convierte en parte del contexto del prompt.
</Warning>

## Despertar manual (bajo demanda)

Usa `openclaw system event` para poner en cola un evento del sistema y, opcionalmente, activar un Heartbeat inmediato:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw system event --text "Check for urgent follow-ups" --mode now
```

| Marca                        | Descripción                                                                                                  |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------ |
| `--text <text>`              | Texto del evento del sistema (obligatorio).                                                                  |
| `--mode <mode>`              | `now` ejecuta un Heartbeat inmediato; `next-heartbeat` (predeterminado) espera al siguiente tick programado. |
| `--session-key <sessionKey>` | Dirige el evento a una sesión específica; el valor predeterminado es la sesión principal del agente.         |
| `--json`                     | Genera JSON.                                                                                                 |

Si no se proporciona `--session-key` y varios agentes tienen `heartbeat` configurado, `--mode now` ejecuta inmediatamente cada uno de esos Heartbeats de agente.

Controles relacionados de Heartbeat en el mismo grupo de CLI:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw system heartbeat last     # show the last heartbeat event
openclaw system heartbeat enable   # enable heartbeats
openclaw system heartbeat disable  # disable heartbeats
```

## Entrega de razonamiento (opcional)

De forma predeterminada, los Heartbeat entregan solo la carga útil final de "respuesta".

Si quieres transparencia, habilita:

* `agents.defaults.heartbeat.includeReasoning: true`

Cuando está habilitado, los Heartbeat también entregarán un mensaje separado con el prefijo `Thinking` (con la misma forma que `/reasoning on`). Esto puede ser útil cuando el agente administra varias sesiones/instancias de Codex y quieres ver por qué decidió hacerte ping, pero también puede filtrar más detalles internos de los que quieres. Es preferible mantenerlo desactivado en chats grupales.

## Conciencia de costos

Los Heartbeat ejecutan turnos completos del agente. Los intervalos más cortos consumen más tokens. Para reducir el costo:

* Usa `isolatedSession: true` para evitar enviar todo el historial de conversación (de \~100K tokens a \~2-5K por ejecución).
* Usa `lightContext: true` para limitar los archivos de arranque solo a `HEARTBEAT.md`.
* Configura un `model` más barato (por ejemplo, `ollama/llama3.2:1b`).
* Mantén `HEARTBEAT.md` pequeño.
* Usa `target: "none"` si solo quieres actualizaciones de estado internas.

## Desbordamiento de contexto después de Heartbeat

Los Heartbeat conservan el modelo de runtime existente de la sesión compartida después de que se completa la ejecución, por lo que un Heartbeat que cambió una sesión a un modelo local más pequeño (por ejemplo, un modelo de Ollama con una ventana de 32k) puede dejar ese modelo activo para el siguiente turno de la sesión principal. Si ese siguiente turno informa un desbordamiento de contexto, y el último modelo de runtime de la sesión coincide con el `heartbeat.model` configurado, el mensaje de recuperación de OpenClaw señala la filtración del modelo de Heartbeat como la causa probable y sugiere una corrección.

Para evitar esto: usa `isolatedSession: true` para ejecutar Heartbeat en una sesión nueva (opcionalmente combinado con `lightContext: true` para el prompt más pequeño), o elige un modelo de Heartbeat con una ventana de contexto lo suficientemente grande para la sesión compartida.

## Relacionado

* [Automatización](/es/automation) - todos los mecanismos de automatización de un vistazo
* [Tareas en segundo plano](/es/automation/tasks) - cómo se hace seguimiento del trabajo desacoplado
* [Zona horaria](/es/concepts/timezone) - cómo la zona horaria afecta la programación de Heartbeat
* [Solución de problemas](/es/automation/cron-jobs#troubleshooting) - depuración de problemas de automatización
