算法艺术创作
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 快照 · 自动分类 · 以原作者文档为准
異なる頻度で動く 2 つのクロックを使って観察と行動を分離する。速いクロック(解析)はデータを安く集めて簡潔なダイジェストを書く。遅いクロック(行動)はダイジェストを読んで行動するか決める。ダイジェストが何も保留中でないと言えば、行動クロックは即座に終了する — アイドルサイクルのコストはゼロ。
名前は心拍リズムから: du-dum、du-dum。最初の拍(du)が観察し、二つ目の拍(dum)が行動する。ほとんどの時間、最初の拍だけが発火する。
すべての作業を観察(安い、頻繁)と行動(高い、稀)に分離する。
| Clock | Cost profile | Frequency | Example |
|---|---|---|---|
| Fast (analysis) | Cheap: API reads, file parsing, no LLM | 4-6x/day | Scan GitHub notifications, parse RSS, read logs |
| Slow (action) | Expensive: LLM inference, write operations | 1x/day | Compose response, update dashboard, send alerts |
期待結果: すべての操作が正確に 1 つのクロックに割り当てられる明確な 2 列分離。速いクロックには LLM 呼び出しなし、遅いクロックにはデータ収集なし。
失敗時: 操作が読み取りと LLM 推論の両方を必要とするなら(例: 「新しい issue を要約」)、分割する: 速いクロックが生 issue をダイジェストへ集め、遅いクロックがそれらを要約する。ダイジェストが境界。
ダイジェストは 2 つのクロックを橋渡しする低帯域メッセージ。簡潔、人間可読、機械解析可能でなければならない。
pending: none または空セクション)ダイジェスト構造例:
# 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
何も保留中でないとき:
# 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
期待結果: 明確な pending/empty 状態を持つダイジェストテンプレート。行動クロックは単一フィールドまたはセクションを確認することで進むかを決められる。
失敗時: ダイジェストが大きくなりすぎる(>50 行)なら、速いクロックが生データを含めすぎている。詳細を別データファイルへ移し、ダイジェストはポインタ付き要約として保つ。
速いスケジュールで動く観察スクリプトを構築する。
# 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")
スケジュール例(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
期待結果: 1 つ以上の解析スクリプト、各々がダイジェストファイルを生成または更新する。スクリプトは独立に動く — 1 つが失敗しても他がそれぞれのセクションを更新する。
失敗時: データソースが一時的に利用不能なら、スクリプトはエラーをログし以前のダイジェストエントリをそのまま残すべき。ソース失敗でダイジェストをクリアしない — 古いデータの方が、行動クロックにとってデータ欠如よりまし。
ダイジェストを読んで行動するか決める行動スクリプトを構築する。
# 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")
スケジュール例(cron):
# Slow clock: act once per day at 7am
0 7 * * * /path/to/heartbeat.sh >> /var/log/heartbeat.log 2>&1
期待結果: 行動スクリプトはアイドルサイクルでは 1 秒未満で終了する(ファイル読み取りと空チェックだけ)。アクティブサイクルでは保留アイテムを処理しダイジェストをクリアする。
失敗時: LLM 呼び出しが失敗したら、ダイジェストをクリアしない。保留アイテムは次の行動サイクルに残る。永続的に失敗するアイテムでの無限リトライを避けるため、ダイジェストにリトライカウンタの実装を検討する。
コスト節約はアイドル検出から来る — 行動クロックは「することがない」と「することがある」を最小オーバーヘッドで確実に区別しなければならない。
# 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
期待結果: アイドルパスは単一ファイル読み取りに続く文字列マッチ。スクリプト自体を超えるネットワーク呼び出しもプロセス生成もない。
失敗時: アイドルチェックが信頼できない(偽陽性で作業を逃す、偽陰性で不必要な LLM 呼び出し)なら、ダイジェストフォーマットを単純化する。ファイル先頭の単一ブール値(has_pending: true/false)が最も信頼できるアプローチ。
期待コストを計算して、2 クロックアーキテクチャが節約をもたらすか確認する。
fast_runs = 24 / fast_interval_hoursfast_runs * cost_per_analysis_run(LLM なしなら ~$0 のはず)active_days_fraction * cost_per_action_run(1 - active_days_fraction) * cost_per_idle_check(~$0 のはず)コスト比較例:
| Architecture | Daily cost (active) | Daily cost (idle) | Monthly cost (80% idle) |
|---|---|---|---|
| Single loop (LLM every 30min) | $13.74/37h | $13.74/37h | ~$400 |
| Du-dum (6 analyses + 1 action) | $0.30 | $0.00 | ~$6 |
期待結果: du-dum アーキテクチャがアイドル日に元より少なくとも 10 倍安いことを示すコストモデル。
失敗時: コストモデルが顕著な節約を示さないなら、次のいずれかが真な可能性: (a) 速いクロックが頻繁すぎる、(b) 速いクロックに隠れた LLM 呼び出しがある、(c) システムがほとんどアイドルでない。du-dum はアイドル比率が高いシステムに利益をもたらす。常にアクティブなシステムにはより単純なポーリングアプローチが適切かもしれない。
manage-token-budget — du-dum を実用的にするコストコントロール枠組み; du-dum はアーキテクチャパターン、トークン予算は会計層circuit-breaker-pattern — 失敗ケース(ツールが壊れる)を扱う; du-dum は通常ケース(することがない)を扱う。一緒に使う: アイドル検出に du-dum、失敗回復に circuit-breakerobserve — 速いクロック用の観察方法論; du-dum は観察がいつどうダイジェストを介して行動可能になるかを構造化するforage-resources — 戦略的探索層; du-dum は forage-resources が動作する実行リズムcoordinate-reasoning — スティグマージック信号パターン; ダイジェストファイルはスティグマージーの一形式(環境成果物を介した間接的調整)