算法艺术创作
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 快照 · 自动分类 · 以原作者文档为准
Beobachtung von Aktion mit zwei Uhren trennen die mit unterschiedlichen Frequenzen laufen. Die schnelle Uhr (Analyse) sammelt Daten guenstig und schreibt einen kompakten Digest. Die langsame Uhr (Aktion) liest den Digest und entscheidet ob zu handeln ist. Wenn der Digest sagt dass nichts ansteht, beendet die Aktions-Uhr sofort -- null Kosten fuer Idle-Zyklen.
Der Name kommt vom Herzschlag-Rhythmus: du-dum, du-dum. Der erste Schlag (du) beobachtet; der zweite Schlag (dum) handelt. Meistens feuert nur der erste Schlag.
Alle Arbeit in Beobachtung (guenstig, haeufig) und Aktion (teuer, selten) trennen.
| Uhr | Kosten-Profil | Frequenz | Beispiel |
|---|---|---|---|
| Schnell (Analyse) | Guenstig: API-Reads, Datei-Parsing, kein LLM | 4-6x/Tag | GitHub-Notifications scannen, RSS parsen, Logs lesen |
| Langsam (Aktion) | Teuer: LLM-Inferenz, Schreib-Operationen | 1x/Tag | Antwort komponieren, Dashboard aktualisieren, Alarme senden |
Erwartet: Eine klare Zwei-Spalten-Aufteilung wo jede Operation genau einer Uhr zugewiesen ist. Die schnelle Uhr hat keine LLM-Calls; die langsame Uhr hat keine Datensammlung.
Bei Fehler: Wenn eine Operation sowohl Lesen als auch LLM-Inferenz braucht (z.B. "neue Issues zusammenfassen"), aufteilen: die schnelle Uhr sammelt die rohen Issues in den Digest; die langsame Uhr fasst sie zusammen. Der Digest ist die Grenze.
Der Digest ist die Low-Bandwidth-Botschaft die die zwei Uhren ueberbrueckt. Er muss kompakt, menschlich lesbar und maschinen-parsebar sein.
pending: none oder leerer Abschnitt)Beispiel-Digest-Struktur:
# 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
Wenn nichts ansteht:
# 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
Erwartet: Ein Digest-Template mit klaren Pending-/Leer-Zustaenden. Die Aktions-Uhr kann durch Pruefen eines einzelnen Feldes oder Abschnitts entscheiden ob fortzufahren ist.
Bei Fehler: Wenn der Digest zu gross wird (>50 Zeilen), enthaelt die schnelle Uhr zu viele Rohdaten. Details in eine separate Datendatei verschieben und den Digest als Zusammenfassung mit Zeigern halten.
Die Beobachtungs-Skripte bauen die nach dem schnellen Schedule laufen.
# 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")
Schedule-Beispiel (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
Erwartet: Ein oder mehrere Analyse-Skripte, jedes produziert oder aktualisiert die Digest-Datei. Skripte laufen unabhaengig -- wenn eines scheitert, aktualisieren die anderen weiterhin ihre Abschnitte.
Bei Fehler: Wenn eine Datenquelle vorruebergehend nicht verfuegbar ist, sollte das Skript den Fehler loggen und die vorigen Digest-Eintraege intakt lassen. Den Digest nicht bei Quell-Versagen leeren -- veraltete Daten sind besser als fehlende Daten fuer die Aktions-Uhr.
Das Aktions-Skript bauen das den Digest liest und entscheidet ob zu handeln ist.
# 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")
Schedule-Beispiel (cron):
# Slow clock: act once per day at 7am
0 7 * * * /path/to/heartbeat.sh >> /var/log/heartbeat.log 2>&1
Erwartet: Das Aktions-Skript beendet in unter 1 Sekunde bei Idle-Zyklen (nur ein Datei-Read und Leer-Check). Bei aktiven Zyklen verarbeitet es anstehende Eintraege und loescht den Digest.
Bei Fehler: Wenn der LLM-Call scheitert, den Digest nicht loeschen. Die anstehenden Eintraege bleiben fuer den naechsten Aktions-Zyklus. Implementation eines Retry-Counters im Digest in Erwaegung ziehen um unendliche Retries auf permanent scheiternden Eintraegen zu vermeiden.
Die Kostenersparnisse kommen von Idle-Detection -- die Aktions-Uhr muss zuverlaessig "nichts zu tun" von "etwas zu tun" mit minimalem Overhead unterscheiden.
# 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
Erwartet: Der Idle-Pfad ist ein einzelner Datei-Read gefolgt von einem String-Match. Keine Netzwerk-Calls, kein Prozess-Spawning ueber das Skript selbst hinaus.
Bei Fehler: Wenn der Idle-Check unzuverlaessig ist (False Positives die verpasste Arbeit verursachen oder False Negatives die unnoetige LLM-Calls verursachen), das Digest-Format vereinfachen. Ein einzelnes Boolean-Feld (has_pending: true/false) am Anfang der Datei ist der zuverlaessigste Ansatz.
Die erwarteten Kosten berechnen um zu bestaetigen dass die Zwei-Uhren-Architektur Einsparungen liefert.
fast_runs = 24 / fast_interval_hoursfast_runs * cost_per_analysis_run (sollte ~$0 sein wenn kein LLM)active_days_fraction * cost_per_action_run(1 - active_days_fraction) * cost_per_idle_check (sollte ~$0 sein)Beispiel-Kostenvergleich:
| Architektur | Tageskosten (aktiv) | Tageskosten (idle) | Monatskosten (80% idle) |
|---|---|---|---|
| Single-Loop (LLM alle 30min) | $13,74/37h | $13,74/37h | ~$400 |
| Du-dum (6 Analysen + 1 Aktion) | $0,30 | $0,00 | ~$6 |
Erwartet: Ein Kostenmodell das zeigt dass die du-dum-Architektur mindestens 10x guenstiger als das Original an Idle-Tagen ist.
Bei Fehler: Wenn das Kostenmodell keine signifikanten Einsparungen zeigt, ist eines davon wahrscheinlich wahr: (a) die schnelle Uhr ist zu haeufig, (b) die schnelle Uhr enthaelt versteckte LLM-Calls oder (c) das System ist selten idle. Du-dum profitiert Systeme mit hohen Idle-Anteilen. Wenn das System immer aktiv ist, koennte ein einfacherer Polling-Ansatz angemessener sein.
manage-token-budget -- Kostenkontroll-Framework das du-dum praktisch macht; du-dum ist das Architekturmuster, Token-Budget ist die Buchhaltungsschichtcircuit-breaker-pattern -- behandelt den Versagensfall (Tools brechen); du-dum behandelt den Normalfall (nichts zu tun). Zusammen nutzen: du-dum fuer Idle-Detection, Circuit-Breaker fuer Versagens-Recoveryobserve -- Beobachtungs-Methodologie fuer die schnelle Uhr; du-dum strukturiert wann und wie Beobachtungen handlungsfaehig werden via den Digestforage-resources -- strategische Erkundungs-Schicht; du-dum ist der Ausfuehrungs-Rhythmus innerhalb dessen forage-resources operiertcoordinate-reasoning -- stigmergische Signal-Muster; die Digest-Datei ist eine Form von Stigmergie (indirekte Koordination durch Umweltartefakte)