返回技能列表

manage-engagement-buffer

pjt222
更新于 Yesterday
6 次查看
17
2
17
在 GitHub 上查看
general

关于

This skill manages a queue for incoming engagement items by handling ingestion, prioritization, rate-limiting, and deduplication. It generates periodic digests and enforces cooldown periods, operating between observation/action cycles set by a separate du-dum skill. Use it to buffer and process cross-platform engagement data before scheduled action beats.

快速安装

Claude Code

推荐
主要方式
npx skills add pjt222/agent-almanac -a claude-code
插件命令备选方式
/plugin add https://github.com/pjt222/agent-almanac
Git 克隆备选方式
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/manage-engagement-buffer

在 Claude Code 中复制并粘贴此命令以安装该技能

技能文档

Manage Engagement Buffer

Ingerir, deduplicar, priorizar y limitar la tasa de items entrantes de engagement entre plataformas, luego entregar un digest compacto al reloj de acción. El buffer se sienta entre las señales crudas de plataforma y la acción deliberada: absorbe ráfagas, fusiona duplicados, hace cumplir cooldowns y asegura que el agente actúa en los items de mayor valor primero. Sin un buffer, un agente autónomo o procesa items en orden de llegada (perdiendo los urgentes enterrados en ruido) o intenta todo a la vez (alcanzando límites de tasa y pareciendo spammer).

Esta habilidad compone con du-dum: du-dum decide cuándo observar y actuar; esta habilidad decide qué merece acción. El buffer es la cola que acumula entre los beats de du-dum.

Cuándo Usar

  • Un agente autónomo recibe más engagement del que puede procesar por ciclo
  • Items duplicados o casi-duplicados desperdician el presupuesto de acción
  • El engagement necesita ordenamiento por prioridad antes de que el reloj de acción dispare
  • Se necesitan períodos de cooldown para prevenir over-engagement o rate limiting
  • Múltiples fuentes de plataforma (GitHub, Slack, email) alimentan en un solo loop de acción del agente

Entradas

  • Requerido: buffer_path — ruta al archivo buffer JSONL
  • Opcional: platform_config — límites de tasa por plataforma y configuraciones de cooldown
  • Opcional: digest_size — número de items top en el digest (predeterminado: 5)
  • Opcional: ttl_hours — tiempo de vida para items no actuados (predeterminado: 48)
  • Opcional: cooldown_minutes — cooldown por hilo después de la acción (predeterminado: 60)

Procedimiento

Paso 1: Definir el Schema del Buffer

Diseñar la estructura del item de engagement. Cada item en el buffer es una sola línea JSON con estos campos:

{
  "id": "gh-notif-20260408-001",
  "source": "github:pjt222/agent-almanac",
  "timestamp": "2026-04-08T09:15:00Z",
  "content_summary": "PR #218 review requested by contributor",
  "priority": 4,
  "state": "new",
  "dedup_key": "github:pjt222/agent-almanac:pr-218:contributor-name",
  "thread_id": "pr-218",
  "ttl_hours": 48
}

Definiciones de campos:

CampoTipoDescripción
idstringIdentificador único (prefijo de fuente + fecha + secuencia)
sourcestringPlataforma y canal (github:repo, slack:channel, email:inbox)
timestampISO 8601Cuándo se ingirió el item
content_summarystringDescripción de una línea del item de engagement
priorityint 1-5Prioridad compuesta (ver Paso 4)
stateenumnew, acknowledged, acted, cooldown, merged, expired
dedup_keystringClave compuesta: source + thread + author
thread_idstringIdentificador del hilo de conversación para rastreo de cooldown
ttl_hoursintHoras hasta que el item expire si no es actuado (predeterminado: 48)

Almacenar como un archivo JSON Lines (un objeto JSON por línea). Este formato soporta escrituras append-only, procesamiento línea-por-línea y poda fácil reescribiendo sin las líneas expiradas.

Esperado: Un archivo buffer JSONL inicializado en buffer_path con el schema documentado en un comentario o encabezado complementario. El schema es lo suficientemente estable para soportar todos los pasos descendentes.

En caso de fallo: Si el archivo buffer no se puede crear (permisos, problemas de ruta), recurrir a una lista en memoria para el ciclo actual y loggear el error de sistema de archivos. No descartar items silenciosamente — bufferarlos en algún lado, incluso temporalmente.

Paso 2: Implementar la Ingestión

Aceptar items de adaptadores de plataforma y añadirlos al buffer con asignaciones iniciales de prioridad.

Asignación de prioridad por tipo de item:

TipoPrioridadRazón
Mención directa (@agent)5Alguien pidió atención explícitamente
Solicitud de revisión4Bloqueando el trabajo de alguien más
Reply en hilo rastreado3Conversación activa en la que el agente participa
Notificación (asignado, suscrito)2Informativo, puede requerir acción
Broadcast (release, anuncio)1Solo conciencia, raramente accionable

Para cada item entrante:

  1. Construir el JSON del item con campos del schema
  2. Asignar prioridad inicial basada en la tabla de tipos arriba
  3. Establecer state a new
  4. Establecer timestamp al tiempo UTC actual
  5. Generar dedup_key desde source + thread + author
  6. Añadir la línea JSON al archivo buffer
# Pseudocode: ingest from GitHub adapter
for notification in github_adapter.fetch():
    item = build_item(notification)
    item.priority = priority_by_type(notification.reason)
    item.state = "new"
    append_jsonl(buffer_path, item)
    log("ingested {item.id} priority={item.priority}")

Esperado: Items nuevos aparecen en el archivo buffer con prioridades correctas y state=new. Cada adaptador produce items bien formados independientemente — los fallos del adaptador no bloquean otros adaptadores.

En caso de fallo: Si un adaptador de plataforma falla (auth expiró, rate limited, red caída), loggear el fallo y saltar esa fuente para este ciclo. No limpiar items existentes del buffer — items obsoletos de un fetch exitoso anterior son mejores que un buffer vacío.

Paso 3: Deduplicar

Escanear el buffer por items que comparten el mismo dedup_key dentro de una ventana configurable (predeterminado: 24 horas). Mantener la instancia de mayor prioridad y marcar las otras como merged.

  1. Agrupar items por dedup_key
  2. Dentro de cada grupo, ordenar por prioridad descendente, luego timestamp descendente
  3. Mantener el primer item (mayor prioridad, más reciente); marcar el resto como state=merged
  4. Detectar ráfagas de hilo: mismo thread_id con diferentes autores dentro de 1 hora indica una ráfaga de actividad — consolidar en un solo item con un conteo de participantes añadido a content_summary
# Dedup logic
groups = group_by(buffer, "dedup_key", window_hours=24)
for key, items in groups:
    if len(items) > 1:
        keeper = max(items, key=lambda i: (i.priority, i.timestamp))
        for item in items:
            if item.id != keeper.id:
                item.state = "merged"

# Thread burst detection
thread_groups = group_by(buffer, "thread_id", window_hours=1)
for thread_id, items in thread_groups:
    active_items = [i for i in items if i.state == "new"]
    if len(active_items) >= 3:
        keeper = max(active_items, key=lambda i: i.priority)
        keeper.content_summary += f" ({len(active_items)} participants)"
        for item in active_items:
            if item.id != keeper.id:
                item.state = "merged"

Esperado: El buffer no contiene entradas duplicadas de dedup_key dentro de la ventana. Las ráfagas de hilo se colapsan en items únicos con conteos de participantes. Los items merged permanecen en el archivo (para auditoría) pero son excluidos del procesamiento descendente.

En caso de fallo: Si la deduplicación produce merges inesperados (items distintos legítimos compartiendo una clave), estrechar la ventana de dedup o refinar la construcción de la clave. Añadir un hash de contenido al dedup key puede distinguir items que comparten source + thread + author pero tienen contenido genuinamente diferente.

Paso 4: Priorizar

Re-ordenar el buffer por puntaje compuesto incorporando decaimiento por recencia y escalación.

Fórmula de puntaje compuesto:

score = base_priority * recency_weight * escalation_factor

recency_weight = 0.9 ^ hours_since_ingestion
escalation_factor = 1.0 + (resubmission_count * 0.2)

# Cap effective priority at 5
effective_priority = min(5, score)

Comportamiento:

  • Un item de prioridad-3 ingerido hace 0 horas: 3 * 1.0 * 1.0 = 3.0
  • Un item de prioridad-3 ingerido hace 8 horas: 3 * 0.43 * 1.0 = 1.29 (decayó por debajo de items de prioridad-2)
  • Un item de prioridad-2 reenviado dos veces: 2 * 1.0 * 1.4 = 2.8 (escalado cerca de prioridad-3)

Ordenar todos los items state=new por effective_priority descendente. Este orden ordenado es lo que el digest (Paso 6) presenta a du-dum.

Esperado: El buffer está ordenado por puntaje compuesto. Items frescos de alta prioridad están en el top. Items viejos han decaído. Items reenviados han escalado. Ningún item excede la prioridad 5.

En caso de fallo: Si la fórmula de puntaje produce rankings poco intuitivos (p. ej., un item de prioridad-2 de 1 hora rankea por encima de un item fresco de prioridad-3), ajustar la tasa de decaimiento. Un decaimiento de 0.95 por hora es más suave; 0.85 por hora es más agresivo. Sintonizar para que coincida con el tempo de engagement.

Paso 5: Hacer Cumplir Límites de Tasa y Cooldowns

Prevenir que el agente sobre-engaje haciendo cumplir límites de escritura por plataforma y cooldowns por hilo.

Límites de tasa por plataforma (configurable vía platform_config):

PlataformaLímite predeterminadoVentana
Comentarios GitHub1 por 20 segundosrolling
Reviews GitHub3 por horarolling
Mensajes Slack1 por 10 segundosrolling
Replies de email5 por horarolling

Cooldown por hilo: Después de que el agente actúe en un hilo, ese hilo entra en cooldown por cooldown_minutes (predeterminado: 60). Durante el cooldown, los nuevos items para ese hilo son ingeridos pero no surgen en el digest.

Backoff de error: Al recibir una respuesta 429/rate-limit de cualquier plataforma, doblar el cooldown para esa plataforma. Resetear al predeterminado después de una acción exitosa.

# Rate limit check before action
def can_act(platform, thread_id):
    if rate_limit_exceeded(platform):
        return False, "rate limited"
    if thread_in_cooldown(thread_id):
        return False, "thread cooldown active"
    return True, "clear"

# After action
def record_action(platform, thread_id):
    increment_rate_counter(platform)
    set_cooldown(thread_id, cooldown_minutes)

# After rate-limit error
def handle_rate_error(platform):
    current_cooldown = get_platform_cooldown(platform)
    set_platform_cooldown(platform, current_cooldown * 2)

Esperado: El agente nunca excede los límites de tasa de plataforma. Los hilos tienen períodos de cooldown forzados. Los errores de rate-limit disparan backoff automático. El buffer acumula items durante el cooldown sin perderlos.

En caso de fallo: Si los límites de tasa se alcanzan a pesar del cumplimiento (skew de reloj, agentes concurrentes), aumentar el margen de seguridad — establecer límites al 80% del límite real de la plataforma. Si los cooldowns son demasiado agresivos (perdiendo hilos sensibles al tiempo), reducir cooldown_minutes para hilos de alta prioridad solamente.

Paso 6: Generar Digest

Producir un resumen compacto para el beat de acción de du-dum. El digest es el punto de entrega: du-dum lee esto, no el buffer crudo.

Contenidos del digest:

  1. Total pendiente: conteo de items state=new
  2. Top-N items: los items de mayor prioridad (predeterminado N=5 desde digest_size)
  3. Expirando pronto: items dentro del 20% de su TTL
  4. Hilos en cooldown: cooldowns activos con tiempo restante
  5. Salud del buffer: total de items, conteo merged, conteo expirado
# Engagement Digest — 2026-04-08T12:00:00Z

## Pending: 12 items

### Top 5 by Priority
| # | Priority | Source | Summary | Age |
|---|----------|--------|---------|-----|
| 1 | 5.0 | github:pr-218 | Review requested by contributor | 2h |
| 2 | 4.2 | github:issue-99 | Maintainer question (escalated) | 6h |
| 3 | 3.0 | slack:dev | Build failure alert | 1h |
| 4 | 2.8 | github:pr-215 | CI check feedback (3 participants) | 3h |
| 5 | 2.1 | email:inbox | Collaboration inquiry | 8h |

### Expiring Soon
- github:issue-85 — 4h remaining (TTL 48h, ingested 44h ago)

### Cooldowns Active
- pr-210: 22 min remaining
- issue-92: 45 min remaining

### Buffer Health
- Total items: 47 | New: 12 | Merged: 18 | Acted: 11 | Expired: 6

Escribir el digest a una ruta conocida (p. ej., buffer_path.digest.md) que el reloj de acción de du-dum lee.

Esperado: Un digest bajo 50 líneas que du-dum puede parsear en una lectura. El digest contiene suficiente información para decidir sobre qué actuar, pero no el buffer completo. Si nada está pendiente, el digest lo dice claramente.

En caso de fallo: Si el digest crece más allá de 50 líneas, reducir digest_size o resumir las secciones de expirando/cooldown más agresivamente. El digest es un resumen — si se acerca al tamaño del buffer, ha perdido su propósito.

Paso 7: Rastrear Transiciones de Estado

Después de que du-dum procese items del digest, actualizar sus estados y mantener el rastro de auditoría.

Máquina de estado:

new → acknowledged → acted → cooldown → expired
         ↑                       │
         └───── (re-ingested) ───┘

merged → (terminal, no further transitions)
expired → (terminal, archived)

Para cada transición de estado:

  1. Actualizar el campo state del item en el archivo buffer
  2. Añadir una entrada de log de transición: {"item_id": "...", "from": "new", "to": "acknowledged", "timestamp": "...", "reason": "du-dum digest pickup"}
  3. Después de actuar, establecer el cooldown del hilo (alimenta de vuelta al Paso 5)

Retención y poda:

  • Archivar items con state=acted o state=expired mayores a 7 días (configurable)
  • Archivar moviendo a un archivo separado (buffer_path.archive.jsonl), no eliminando
  • Podar items state=merged mayores a 24 horas (han servido su propósito de dedup)
  • Ejecutar la poda al final de cada ciclo, después de las actualizaciones de estado
# End-of-cycle maintenance
for item in buffer:
    if item.state == "new" and age_hours(item) > item.ttl_hours:
        transition(item, "expired", reason="TTL exceeded")
    if item.state in ("acted", "expired") and age_days(item) > retention_days:
        archive(item)
    if item.state == "merged" and age_hours(item) > 24:
        archive(item)
rewrite_buffer(buffer_path, active_items_only)

Esperado: Cada transición de estado se loggea con un timestamp y razón. El archivo buffer contiene solo items activos (new, acknowledged, cooldown). Los items archivados se preservan separadamente para auditoría. El buffer no crece sin límite.

En caso de fallo: Si el archivo buffer se vuelve corrupto durante la reescritura (escritura parcial, crash), restaurar desde el respaldo pre-reescritura. Siempre escribir a un archivo temporal y renombrar atómicamente — nunca reescribir en el lugar. Si el archivo crece demasiado grande, comprimirlo o rotarlo mensualmente.

Validación

  • El schema del buffer incluye todos los campos requeridos (id, source, timestamp, content_summary, priority, state, dedup_key, thread_id, ttl_hours)
  • La ingestión asigna prioridades iniciales correctas por tipo de item
  • La deduplicación fusiona items que comparten un dedup_key dentro de la ventana configurada
  • Las ráfagas de hilo son detectadas y consolidadas con conteos de participantes
  • El puntaje compuesto aplica decaimiento por recencia y escalación, capeado en prioridad 5
  • Los límites de tasa por plataforma son forzados antes de cualquier acción de escritura
  • Los cooldowns por hilo previenen el re-engagement dentro de la ventana de cooldown
  • El digest es compacto (<50 líneas), incluye items top-N y tiene un estado vacío claro
  • Las transiciones de estado son loggeadas con timestamps para auditoría
  • Los items expirados y actuados son archivados, no eliminados
  • El archivo buffer no crece sin límite sobre múltiples ciclos

Errores Comunes

  • Sin TTL en items: El buffer crece sin límite; los items obsoletos desplazan a los frescos. Cada item necesita un TTL, y el paso de poda debe ejecutarse en cada ciclo.
  • Ignorar cooldowns de hilo: Replies rápidos en el mismo hilo se sienten spammers para otros participantes. Los cooldowns son una norma social, no solo una tecnicidad de límite de tasa.
  • Prioridad sin decaimiento: Items viejos de alta prioridad bloquean a los más nuevos indefinidamente. El decaimiento por recencia asegura que el buffer refleje la relevancia actual, no la importancia histórica.
  • Ventana de dedup demasiado estrecha: Una ventana de 1 hora pierde duplicados que llegan con horas de diferencia (p. ej., una notificación seguida por un recordatorio). Comenzar con 24 horas y estrechar solo si items legítimos están siendo merged incorrectamente.
  • Acoplar la lógica del buffer a una sola plataforma: Diseñar para el patrón de adaptador desde el inicio. Cada adaptador de plataforma produce items de buffer estándar; el buffer mismo es agnóstico de plataforma.
  • Saltarse el paso de digest: Du-dum necesita un resumen, no el buffer crudo. Pasar el buffer completo al reloj de acción derrota el propósito de la arquitectura de dos relojes — el reloj de acción debe leer un digest compacto y decidir rápidamente.

Habilidades Relacionadas

  • du-dum — patrón de cadencia con el que este buffer compone; du-dum decide cuándo observar y actuar, esta habilidad decide qué merece acción
  • manage-token-budget — contabilidad de costos; el buffer respeta restricciones de presupuesto de tokens al dimensionar digests y limitar throughput de acción
  • circuit-breaker-pattern — manejo de fallos para adaptadores de plataforma alimentando el buffer; cuando el circuito de un adaptador se abre, la ingestión degrada elegantemente
  • coordinate-reasoning — señales estigmérgicas entre buffer y sistemas de acción; el archivo buffer mismo es un artefacto estigmérgico
  • forage-resources — descubrimiento de nuevas fuentes de engagement para alimentar a los adaptadores de ingestión del buffer

GitHub 仓库

pjt222/agent-almanac
路径: i18n/es/skills/manage-engagement-buffer
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

相关推荐技能

content-collections

Content Collections 是一个 TypeScript 优先的构建工具,可将本地 Markdown/MDX 文件转换为类型安全的数据集合。它专为构建博客、文档站和内容密集型 Vite+React 应用而设计,提供基于 Zod 的自动模式验证。该工具涵盖从 Vite 插件配置、MDX 编译到生产环境部署的完整工作流。

查看技能

polymarket

这个Claude Skill为开发者提供完整的Polymarket预测市场开发支持,涵盖API调用、交易执行和市场数据分析。关键特性包括实时WebSocket数据流,可监控实时交易、订单和市场动态。开发者可用它构建预测市场应用、实施交易策略并集成实时市场预测功能。

查看技能

creating-opencode-plugins

该Skill帮助开发者创建OpenCode插件,用于接入命令、文件、LSP等25+种事件。它提供了插件结构、事件API规范和JavaScript/TypeScript实现模式,适合需要拦截操作、扩展功能或自定义事件处理的场景。开发者可通过它快速构建响应式模块来增强OpenCode AI助手的能力。

查看技能

sglang

SGLang是一个专为LLM设计的高性能推理框架,特别适用于需要结构化输出的场景。它通过RadixAttention前缀缓存技术,在处理JSON、正则表达式、工具调用等具有重复前缀的复杂工作流时,能实现极速生成。如果你正在构建智能体或多轮对话系统,并追求远超vLLM的推理性能,SGLang是理想选择。

查看技能