算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
du-dum【设计与创意】Separate expensive observation from cheap decision-making in autonomous agent loops using a two-clock architecture. A fast clock accumulates data into a digest file; a slow clock reads the digest and acts only when something is pending. Idle cycles cost nothing because the action clock returns immediately after reading an empty digest. Use when build…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Separar observación de acción usando dos relojes corriendo a frecuencias diferentes. El reloj rápido (análisis) recolecta datos de manera barata y escribe un digest compacto. El reloj lento (acción) lee el digest y decide si actuar. Si el digest dice que nada está pendiente, el reloj de acción sale inmediatamente -- costo cero para ciclos inactivos.
El nombre viene del ritmo del latido: du-dum, du-dum. El primer beat (du) observa; el segundo beat (dum) actúa. La mayor parte del tiempo, solo dispara el primer beat.
Separar todo el trabajo en observación (barata, frecuente) y acción (cara, rara).
| Reloj | Perfil de costo | Frecuencia | Ejemplo |
|---|---|---|---|
| Rápido (análisis) | Barato: lecturas API, parseo de archivos, sin LLM | 4-6x/día | Escanear notificaciones GitHub, parsear RSS, leer logs |
| Lento (acción) | Caro: inferencia LLM, operaciones de escritura | 1x/día | Componer respuesta, actualizar dashboard, enviar alertas |
Esperado: Una división clara de dos columnas donde cada operación se asigna a exactamente un reloj. El reloj rápido no tiene llamadas LLM; el reloj lento no tiene recolección de datos.
En caso de fallo: Si una operación necesita tanto lectura como inferencia LLM (p. ej., "resumir nuevas issues"), dividirla: el reloj rápido recolecta las issues crudas en el digest; el reloj lento las resume. El digest es la frontera.
El digest es el mensaje de bajo ancho de banda que une los dos relojes. Debe ser compacto, legible para humanos y parseable por máquina.
pending: none o sección vacía)Estructura de digest de ejemplo:
# Digest — 2026-03-22T06:30:00Z
## Pending
- PR #42 needs review response (opened 2h ago, author requested feedback)
- Issue #99 has new comment from maintainer (action: reply)
## Status
- Last analyzed: 2026-03-22T06:30:00Z
- Sources checked: github-notifications, rss-feed, error-log
- Items scanned: 14
- Items pending: 2
Cuando nada está pendiente:
# Digest — 2026-03-22T06:30:00Z
## Pending
(none)
## Status
- Last analyzed: 2026-03-22T06:30:00Z
- Sources checked: github-notifications, rss-feed, error-log
- Items scanned: 8
- Items pending: 0
Esperado: Una plantilla de digest con estados pending/empty claros. El reloj de acción puede determinar si proceder verificando un solo campo o sección.
En caso de fallo: Si el digest crece demasiado (>50 líneas), el reloj rápido está incluyendo demasiados datos crudos. Mover detalles a un archivo de datos separado y mantener el digest como un resumen con punteros.
Construir los scripts de observación que corren en el calendario rápido.
# Pseudocode: analyze-notifications.sh
fetch_notifications()
filter_actionable(notifications)
format_as_digest_entries(filtered)
atomic_write(digest_path, entries)
log("analyzed {count} notifications, {pending} actionable")
Ejemplo de calendario (cron):
# Fast clock: analyze every 4 hours
30 */4 * * * /path/to/analyze-notifications.sh >> /var/log/analysis.log 2>&1
0 6 * * * /path/to/analyze-pr-status.sh >> /var/log/analysis.log 2>&1
Esperado: Uno o más scripts de análisis, cada uno produciendo o actualizando el archivo digest. Los scripts corren independientemente -- si uno falla, los otros aún actualizan sus secciones.
En caso de fallo: Si una fuente de datos está temporalmente no disponible, el script debe loggear el error y dejar las entradas previas del digest intactas. No limpiar el digest en fallo de fuente -- datos obsoletos son mejores que datos faltantes para el reloj de acción.
Construir el script de acción que lee el digest y decide si actuar.
# Pseudocode: heartbeat.sh (the slow clock)
digest = read_file(digest_path)
if digest.pending is empty:
log("heartbeat: nothing pending, exiting")
exit(0)
# Only reaches here if work exists
response = call_llm(digest.pending, system_prompt)
execute_actions(response)
archive_digest(digest_path)
log("heartbeat: processed {count} items, cost: {tokens} tokens")
Ejemplo de calendario (cron):
# Slow clock: act once per day at 7am
0 7 * * * /path/to/heartbeat.sh >> /var/log/heartbeat.log 2>&1
Esperado: El script de acción sale en menos de 1 segundo en ciclos inactivos (solo una lectura de archivo y verificación vacía). En ciclos activos, procesa items pendientes y limpia el digest.
En caso de fallo: Si la llamada LLM falla, no limpiar el digest. Los items pendientes permanecen para el siguiente ciclo de acción. Considerar implementar un contador de reintentos en el digest para evitar reintentos infinitos en items que fallan permanentemente.
Los ahorros de costo vienen de la detección de inactividad -- el reloj de acción debe distinguir confiablemente "nada que hacer" de "algo que hacer" con sobrecarga mínima.
# Minimal idle check
if grep -q "^(none)quot; "$DIGEST_PATH" || grep -q "pending: 0" "$DIGEST_PATH"; then
echo "$(date -u +%FT%TZ) heartbeat: idle" >> "$LOG_PATH"
exit 0
fi
Esperado: El camino inactivo es una sola lectura de archivo seguida de una coincidencia de string. Sin llamadas de red, sin spawning de procesos más allá del script mismo.
En caso de fallo: Si la verificación de inactividad no es confiable (falsos positivos causando trabajo perdido, o falsos negativos causando llamadas LLM innecesarias), simplificar el formato del digest. Un solo campo booleano (has_pending: true/false) en la parte superior del archivo es el enfoque más confiable.
Calcular el costo esperado para confirmar que la arquitectura de dos relojes entrega ahorros.
fast_runs = 24 / fast_interval_hoursfast_runs * cost_per_analysis_run (debe ser ~$0 si no hay LLM)active_days_fraction * cost_per_action_run(1 - active_days_fraction) * cost_per_idle_check (debe ser ~$0)Comparación de costos de ejemplo:
| Arquitectura | Costo diario (activo) | Costo diario (inactivo) | Costo mensual (80% inactivo) |
|---|---|---|---|
| Loop único (LLM cada 30min) | $13.74/37h | $13.74/37h | ~$400 |
| Du-dum (6 análisis + 1 acción) | $0.30 | $0.00 | ~$6 |
Esperado: Un modelo de costo que muestra que la arquitectura du-dum es más barata que la original por al menos 10x en días inactivos.
En caso de fallo: Si el modelo de costo no muestra ahorros significativos, una de estas es probablemente cierta: (a) el reloj rápido es demasiado frecuente, (b) el reloj rápido incluye llamadas LLM ocultas, o (c) el sistema raramente está inactivo. Du-dum beneficia a sistemas con altos ratios de inactividad. Si el sistema siempre está activo, un enfoque de polling más simple puede ser más apropiado.
manage-token-budget -- marco de control de costos que du-dum hace práctico; du-dum es el patrón arquitectónico, token budget es la capa de contabilidadcircuit-breaker-pattern -- maneja el caso de fallo (herramientas rompiéndose); du-dum maneja el caso normal (nada que hacer). Usar juntos: du-dum para detección de inactividad, circuit-breaker para recuperación de falloobserve -- metodología de observación para el reloj rápido; du-dum estructura cuándo y cómo las observaciones se vuelven accionables vía el digestforage-resources -- capa de exploración estratégica; du-dum es el ritmo de ejecución dentro del cual forage-resources operacoordinate-reasoning -- patrones de señalización estigmérgica; el archivo digest es una forma de estigmergia (coordinación indirecta a través de artefactos ambientales)