اوایل ۲۰۲۶ یک تکنیک به اسم Ralph Wiggum وایرال شد و شیوه کار خیلی از توسعهدهندهها با ایجنتها را عوض کرد. ایده به طرز مشکوکی ساده است: ایجنت کدنویس محبوبت — Claude Code، یا هر ایجنت دیگری — را بردار و داخل یک حلقه اجرایش کن. همین. ولی پشت این سادگی، یک راهحل هوشمندانه برای بزرگترین ضعف مدلهای زبانی پنهان است.
اسکلت حلقه: ralph.sh
کل تکنیک در یک اسکریپت Bash خلاصه میشود. یک پارامتر میگیرد (تعداد Iteration، پیشفرض ۱۰)، و در هر دور Claude Code را در Print Mode با محتوای `prompt.md` اجرا میکند:
#!/bin/bash
ITERATIONS=${1:-10}
for i in $(seq 1 $ITERATIONS); do
echo "=== Iteration $i of $ITERATIONS ==="
RESULT=$(claude -p "$(cat prompt.md)")
echo "$RESULT"
if [[ "$RESULT" == *"ALL TASKS COMPLETE"* ]]; then
echo "All tasks completed after $i iterations."
break
fi
doneحافظه بیرونی: سه فایل Markdown
هر دور حلقه، یک Session کاملاً تازه است. پس حافظه مدل را به فایلها منتقل میکنیم:
| فایل | نقش |
|---|---|
| prompt.md | دستورالعمل ثابت هر دور: «مهمترین وظیفه را از project.md پیدا کن و انجام بده» |
| project.md | فهرست وظایف پروژه با چکباکس — کارنامه «چه باید بشود» |
| progress.md | گزارش پیشرفت — کارنامه «تا حالا چه شده» |
خود `prompt.md` چیزی شبیه این است:
Find the highest-priority task in project.md and implement it.
Append your progress to progress.md.
Check off the completed task in project.md.
Commit and push your changes.
Guidelines:
- Work on exactly ONE task per run.
- If every task is complete, output exactly: ALL TASKS COMPLETEدو قید مهم در همین پرامپت است: مدل در هر دور فقط حق دارد روی «یک» وظیفه کار کند، و فقط وقتی همهچیز تمام است Magic String را چاپ کند.
نمونه واقعی: یک اپ Vue با چهار وظیفه
در ویدیوی اول سری، `project.md` یک پروژه کوچک تعریف میکند:
# Project: Vue playground
- [ ] Bootstrap a Vue 3 app in ./app
- [ ] Add a /hello-agent route that renders "Hello World 🤖"
- [ ] Link to /hello-agent from the index page
- [ ] Add confetti when the title is clickedقبل از اجرا، در `.claude/settings.json` مدل را برای موفقیت آماده میکنیم — همان فایلی که در ویدیوی اول روی صفحه بود:
{
"permissions": {
"allow": [
"Bash(npm install)",
"Bash(npm create *)",
"Bash(npm run *)"
],
"deny": [
"Bash(rm *)",
"Bash(git rm *)"
]
}
}فصل ۴ این لیستها را عمیق میکند. بعد روی یک Branch تازه، `./ralph.sh` را اجرا میکنیم. حدود ۳۰ ثانیه بعد اولین تیک در `project.md` میخورد؛ چند دور بعد همه وظایف تماماند، مدل Magic String را چاپ میکند و حلقه بعد از پنج Iteration میایستد. نتیجه؟ روت `/hello-agent` کار میکند و کلیک روی تیتر، Confetti میریزد.
چرا حلقه؟ مشکل Context Window
مدلها Context Window محدودی دارند. وقتی پر شود، مدل مجبور است خانهتکانی (Compaction) کند و عملاً بخشی از حافظهاش را از دست میدهد. بدتر اینکه ثابت شده کارایی مدل با پر شدن Context افت میکند: مدل در نیمه اول پنجرهاش میدرخشد و بعد از آن سرازیری است — حتی با پنجرههای یک میلیون توکنی.
حلقه Ralph این را دور میزند: هر Iteration یک Session نو با Context خالی است. حافظه، بیرون از مدل و داخل `project.md` و `progress.md` زندگی میکند. و یک سود دوم هم دارد: خودِ تو — انسان — از حلقه خارج میشوی و میتوانی سراغ کار دیگری بروی.
به زبان ساده
Ralph یعنی ایجنت را در یک حلقه بیندازی: هر دور از صفر شروع میکند، یک کار کوچک میکند، تیک میزند و Commit میکند. حافظهاش روی کاغذ است نه توی سرش.
مثال واقعی
اپ Vue با چهار تیک: ساخت پروژه، روت hello-agent، لینک از صفحه اول، Confetti روی کلیک. بعد از پنج دور Magic String چاپ شد و حلقه ایستاد — روت کار میکرد و کلیک، Confetti میریخت.