算法艺术创作
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 快照 · 自动分类 · 以原作者文档为准
Split observe/act → 2 clocks diff freq. Fast (analysis) = cheap → writes digest. Slow (action) = reads digest → acts if pending. Digest empty → exit immediate. Zero cost idle.
Name = heartbeat: du-dum. First beat (du) observes. Second (dum) acts. Mostly only first fires.
Split work → observe (cheap, freq) vs act (exp, rare).
| Clock | Cost | Freq | Example |
|---|---|---|---|
| Fast (analysis) | Cheap: API read, parse, no LLM | 4-6x/day | GitHub notifs, RSS, logs |
| Slow (action) | Exp: LLM, write | 1x/day | Compose reply, dashboard, alert |
→ Clean split. Every op on 1 clock. Fast = no LLM. Slow = no gather.
If err: op needs both → split. Fast collects raw → digest. Slow summarizes. Digest = boundary.
Digest = low-bandwidth msg between clocks. Compact, human-readable, parseable.
pending: none)Example:
# 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
Empty:
# 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
→ Template w/ clear pending/empty. Slow clock decides by single check.
If err: digest >50 lines → too much raw. Move details to data file, digest = summary + pointers.
Observation scripts on fast schedule.
# 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
→ Analysis scripts update digest. Indep → 1 fails, others continue.
If err: source down → log + keep prev entries. Never clear on source fail → stale > missing.
Reads digest, decides act.
# 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
→ Script exits <1s idle. Active → processes + clears.
If err: LLM fails → no clear. Items retry next cycle. Consider retry counter → no infinite retry.
Savings = idle detect. Distinguish "nothing"/"something" min overhead.
# 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
→ Idle = 1 file read + str match. No net, no spawn.
If err: unreliable check (false pos = missed work, false neg = waste LLM) → simplify digest. Single bool field (has_pending: true/false) most reliable.
Calculate → confirm savings.
fast_runs = 24 / fast_interval_hoursfast_runs * cost_per_analysis_run (~$0 no LLM)active_days_fraction * cost_per_action_run(1 - active_days_fraction) * cost_per_idle_check (~$0)| Architecture | Daily (active) | Daily (idle) | Monthly (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 |
→ Model shows ≥10x cheaper on idle days.
If err: no savings → (a) fast too freq, (b) fast has hidden LLM, (c) rarely idle. Du-dum wants high idle ratio. Always active → simpler polling.
manage-token-budget — cost framework du-dum makes practical; du-dum = pattern, budget = accountingcircuit-breaker-pattern — failure case (tools breaking); du-dum = normal case (nothing to do). Together: du-dum idle, circuit-breaker failobserve — methodology for fast clock; du-dum structures when observes become actionable via digestforage-resources — strategic explore layer; du-dum = execution rhythmcoordinate-reasoning — stigmergic signaling; digest = stigmergy (indirect coord via env artifact)