κ°μΈμ μΌλ‘ μ λ μ¬μ¨μ λ§€μ° μ’μν©λλ€. μ κ° λνμ μλ¬Έκ³Όλ‘ μ§νν μ΄μ λ μ΄λ±νκ΅ λλΆν° μ¬μ¨μ 보면μ μλΌμκ³ , μ¬μ¨μ ν΅ν΄ λ―Έκ΅ λ¬Ένμ λν΄ κ΄μ¬μ κ°μ§κΈ° μμνλ©΄μ μμ΄μλ κ΄μ¬μ΄ λ§μμ Έ μ§ννμ΅λλ€.
κ·Έ μ€μμλ μ κ° κ°μ₯ μ’μνλ μΊλ¦ν°λ λ¨μ°μ½ λνμμ΅λλ€.

μ΄λκ° λμ¬κ° νλ λΉ μ Έμλ λ―ν νλμ νλ λνλ λ§μΉ μ μ μΈ μ κ°λ¬κΉμβ¦
κ·Έλ°λ° μλ λΆν° μ΄ λνμ μ΄λ¦μ λ΄ claude codeμ νλ¬κ·ΈμΈμ΄ κ°μκΈ° μ±ννκΈ° μμνμ΅λλ€.
μ€λμ μ΄ ralph claude code μ€νμμ€μ μ² νκ³Ό κ·Έ μ리μ λν΄μ νꡬν΄λ³΄κ³ μ ν©λλ€.
λ°λ³΅μ ν΅ν κ°μ
μ¬μ¨μ Ralph wiggumμ΄λΌλ μΊλ¦ν°λ μμμ λ§ν λλ‘ μ΄λκ° λμ¬ νλκ° λΉ μ Έ μλ±ν νλμ΄λ λ§μ νλ μΉκ΅¬μ λλ€.

κ·Έλμ κ·Έλ°μ§ μ΄λ° μ§€λ€λ λ§μ£ .
Geoff Huntleyκ° μ΄ Ralphμ μ΄λ¦μ λ°μ μ μν μ² νμ wiggumμ νλκ³Ό λΉμ·ν©λλ€. μ²μμ λνλΌλ©΄ λμ΄ν°λ₯Ό λ§λ€ λ λ―ΈλλΌνμ λ§λ€κ³ λ°λμͺ½μΌλ‘ μ νν΄μ λ΄λ €μ¬ κ²λλ€. νμ§λ§ λ¨μ΄μ§ μ΄νμλ βλ―ΈλλΌνμ νμΈμβ λΌλ νμ§νμ λΆμ¬λμ κ²λλ€. κ·Έλ¦¬κ³ λ―ΈλλΌνμμ λ€μ μ νν΄μ λ¨μ΄μ§λ€λ©΄ βλ―ΈλλΌνμ μμμ λ΄λ €κ°μΈμβλΌλ νμ§νμ λΆμ΄κ² μ£ .
μ΄λ λ― λνλ μ²μμ κ²°ν¨μ΄ λ§μμ§λ§, μλλ₯Ό λ°λ³΅ν΄ κ°λ©΄μ μ‘°κΈμ© λ λμμ§λλ€. ralph μ² νμ μ΄λ λ― μ²μμλ μλ±νκ³ AIκ° ν 루μλ€μ΄μ μ μΌμΌν¨λ€λκ° μλ±ν μ½λλ₯Ό λ§λ€μ΄λ΄λ νμκ° μ§μλμ§ μκ³ μ€μ€λ‘ μ²μμ μꡬνλ μꡬμ¬νλ€μ κ²°μ μ μΌλ‘ λ§λ€μ΄λ΄κΈ° μν μμ€ν μν€ν μ²μ λλ€.
κΈ°λ³Έμ μΈ μν€ν μ²
λνμ μν€ν μ²λ λ€λ₯Έ 볡μ‘μ±μ΄ ν° AI Agentλ³΄λ€ ν¨μ¬ λ¨μνκ² λμ΄ μμ΅λλ€. λ€μ€ μμ΄μ νΈλ₯Ό μ¬μ©νλ κ²½μ°μ μ΄ λ§μ΄ν¬λ‘μλΉμ€(μμ΄μ νΈ) μμ²΄κ° λΉκ²°μ μ μ΄λΌλ©΄ κ²°κ΅ κ²°κ³Όλ μ’μ§ μμ κ²μ΄κΈ° λλ¬Έμ λλ€. λνλ λͺ¨λ리μ μ ν리μΌμ΄μ μ ꡬ쑰λ₯Ό μ±νν΄ λ¨μΌ νλ‘μΈμκ° μμ§μ μΌλ‘ νμ₯λλ ꡬ쑰μ λλ€. κ·Έλ¦¬κ³ ν λ²μ 루νλ₯Ό λλ λμ νλμ μμ μλ§ μ§μ€ν©λλ€.
보μλ©΄ κ° phaseλ§λ€ ν΄λΉ phaseμ λ§λ μꡬμ¬ν μ 리, Todo List, ꡬνμ μμ
μ λ§‘μ νλμ μμ
μ μ£Όλ‘ μ²λ¦¬νκ³ , ν΄λΉ μμ
μμ μμ°¨μ μΌλ‘ μμ΄μ νΈλ₯Ό νΈμΆν¨μΌλ‘μ¨ κ΅¬ννκ³ μμ΅λλ€
μ΅μ μνμ λ²μΉ
λνμμ κ°μ‘°νλ κ² μ€ ν΅μ¬ μ€ νλλ βλͺ¨λ 루νμμ μ€νμ λμΌν λ°©μμΌλ‘ κ²°μ μ μΌλ‘ ν λΉβ νλ κ²μ λλ€. λ§€ 루νλ§λ€ μ€νμ νμν κ³νκ³Ό μ€νμ ν λΉν©λλ€.
μ΄ κ³Όμ μμ λ§€ 루νλ§λ€ 컨ν μ€νΈλ μ΄κΈ°νλκ³ νμν μνλ§ νμΌλ‘λΆν° λ€μ μ£Όμ ν©λλ€. Context windowλ AIμμ λ§μ κ°λ°μλ€μ΄ μ΅λν λ§μ΄ λ΄μΌλ € νμ§λ§ κ²°κ΅ λ§μ μ½ν μ€νΈλ μμ΄μ νΈλ₯Ό λ ν·κ°λ¦¬κ² νλ κ²μ΄λΌκ³ Geoff Huntleyλ λ§νμ΅λλ€.
λ°λΌμ RalphλΒ μν μμ(Stateless)μ μ§ν₯ν©λλ€. μ¦, AIκ° νλμ μμ μμ μ μλ£ν λλ§λ€ μ΄μ μ λν λ΄μμ λͺ¨λ μμ νκ³ , μ€μ§ νμ¬ μμ μ νμν ν΅μ¬ νμΌκ³Ό μ΅μ μνμ λͺ μΈμ(Spec)λ§μ λ‘λνμ¬Β μμ ν μλ‘μ΄ μ»¨ν μ€νΈμμ μμ μ μμνλ κ²μ΄μ£ .
Backpressure

λν μ² νμμ λ λ²μ§Έ ν΅μ¬μ μμμλ λ§νλ― βνμ§νβμ μΈμ°λ κ³Όμ μΈ Backpressureμ λλ€. λ°ν΄κ° λΉ λ₯΄κ² λλ, μ νμ±μ μΆκ³Ό κ· νμ λ§μΆ°μΌ νλ€λ κ²μ λλ€.
Ralphκ° μμ¨μ μΌλ‘ λ μ μλ μ΄μ λ μ€μ€λ‘ νλ Έλ€λ κ²μ μ μ μκΈ° λλ¬Έμ λλ€. μ΄λ₯Ό μν΄ κ²μ¦ κ³μΈ΅μ μμλλ‘ μμ΅λλ€.
| κ³μΈ΅ | λꡬ μμ | μν |
|---|---|---|
| 1. νμ μμ€ν | TypeScript, Rust | μ»΄νμΌ μμ μ€λ₯ ν¬μ°© |
| 2. μ μ λΆμκΈ° | Dialyzer (Elixir), Pyrefly (Python) | λ°νμ μ λ¬Έμ νμ§ |
| 3. ν μ€νΈ | κ° μΈμ΄μ λ¨μν μ€νΈ λ° ν΅ν©ν μ€νΈ λ± νλ μμν¬ | λμ κ²μ¦ |
| 4. 보μ μ€μΊλ | μ·¨μ½μ μ€μΊλ | 보μ μ΄μ ν¬μ°© |
μ΄ κ³μΈ΅λ€μ΄ λͺ¨λ ν΅κ³Όλμ΄μΌλ§ 루νκ° λ€μ μμ μΌλ‘ λμ΄κ°λλ€. μμ΄μ νΈκ° μ무리 βμλ£νλ€βκ³ λ§ν΄λ, μ»΄νμΌλ¬μ ν μ€νΈκ° ν΅κ³Όνμ§ μμΌλ©΄ μλ£κ° μλλλ€.
μ¬κΈ°μ ν μ€νΈμλ μ€μν κ·μΉμ΄ νλ μΆκ°λ©λλ€. βμ μ΄ ν μ€νΈκ° μ€μνκ°βλ₯Ό λ°λμ λ¬Έμνν΄μΌ ν©λλ€.
βββ
λ°μ΄ν°λ² μ΄μ€ 쿼리 μ΅ν°λ§μ΄μ ν
μ€νΈ.
μ΄ ν
μ€νΈλ€μ μΊμ±κ³Ό λ°°μΉ κΈ°λ₯μ΄ μ¬λ°λ₯΄κ² λμνλμ§ κ²μ¦ν©λλ€.
μΊμ ννΈμ¨μ΄ 90% μ΄νλ‘ λ¨μ΄μ§λ©΄ μ±λ₯ νκ·λ₯Ό μλ―Έν©λλ€.
βββμμμλ λ§νλ― λ¬΄μνμ±μ κ°μ§ λνλ λ€μ 루νμμ μ΄μ 루νμ λνλ₯Ό κΈ°μ΅νμ§ λͺ»νκΈ° λλ¬Έμ ν μ€νΈμ μ΄μ λ₯Ό λ¨κ²¨λμ§ μμΌλ©΄ λ€μ μμ΄μ νΈκ° κ·Έ ν μ€νΈλ₯Ό λΆνμνλ€κ³ νλ¨νκ³ μ§μλ²λ¦΄ μ μμ΅λλ€.
μ΄μ ν¨κ» κ³μν΄μ ν μ€νΈμ λ€μν μ μ νμ λΆμ λ±μ ν΅ν΄ λνκ° κ°λ κΈΈμ κ³μν΄μ λͺ ννκ² ν΄ λκ°λ κ²μ΄ μ€μν λνμ ν΅μ¬μ λλ€.
κ·Έλμ μ΄λ»κ² νλ건λ°?
Ralphμ ν΅μ¬ μ½λλ ν μ€μ λλ€.
while :; do cat PROMPT.md | claude-code ; doneμ΄κ² μ λΆμ
λλ€. λ¨μ bash loopλ‘ λμ΄ μμ£ . PROMPT.mdμ νμ¬ μ»¨ν
μ€νΈ νμΌλ€μ μ°Έμ‘°ν΄λλ©΄, 루νκ° λ λλ§λ€ Claude Codeκ° μ΄λ₯Ό μ½κ³ λ€μ μμ
μ νλ¨ν΄ μ²λ¦¬ν©λλ€.
sequenceDiagram participant User participant Ralph as Ralph Engine (Shell) participant Claude as Claude Code CLI participant FS as File System / Git User->>Ralph: ralph βκΈ°λ₯ ꡬν/λ²κ·Έ μμ μμ²β loop Work Loop (Until Success or Limit) Ralph->>FS: νμ¬ μ»¨ν μ€νΈ(PRD, Progress, Git Diff) μ½κΈ° Ralph->>Claude: 컨ν μ€νΈ + μ§μμ΄ μ λ¬ Note over Claude: μ§μΉ¨ λΆμ λ° λꡬ μ€ν<br/>(File Edit, Shell Command) Claude->>FS: μ½λ μμ λ° ν μ€νΈ μ€ν FS-->>Claude: μ€ν κ²°κ³Ό (Pass/Fail) Claude-->>Ralph: μλ΅ ν μ€νΈ (Status μ λ°μ΄νΈ ν¬ν¨) Ralph->>FS: Git Diff λ° νμΌ λ³κ²½ νμΈ rect rgb(240, 240, 240) Note over Ralph: μν λΆμ (State Analysis) Ralph->>Ralph: 1. μ’ λ£ μ νΈ(EXIT_SIGNAL) νμΈ<br/>2. λμΌ μλ΅ λ°λ³΅ μ¬λΆ νμΈ<br/>3. μν· λΈλ μ΄μ»€(μλ¬ λμ ) μ²΄ν¬ end alt μμ λ―Έμλ£ Ralph->>FS: progress.txt μ λ°μ΄νΈ (λ€μ 루ν μ€λΉ) Ralph->>Ralph: Rate Limit λκΈ° (νμ μ) else μμ μλ£ λλ μ€λ¨ Ralph->>Ralph: Loop νμΆ end end Ralph-->>User: μ΅μ’ κ²°κ³Ό λ³΄κ³ λ° ν΅κ³ μΆλ ₯
Ralph(Shell)λ λ¨μν μ‘°μ¨μμ λλ€. μ€μ νλ¨κ³Ό ꡬνμ Claude Codeκ° ν©λλ€. Ralphλ 컨ν μ€νΈλ₯Ό μ λ¬νκ³ , κ²°κ³Όλ₯Ό νμΈνκ³ , 루νλ₯Ό λ°λ³΅ν λΏμ λλ€.
ν΅μ¬ νμΌλ€
Ralphκ° λ§€ 루νλ§λ€ λ‘λνλ νμΌμ μ ν΄μ Έ μμ΅λλ€.
| νμΌ | μν |
|---|---|
@AGENT.md | λΉλ/μ€ν/ν μ€νΈ λͺ λ Ήμ΄ μ§μΉ¨ |
@fix_plan.md | νμ¬ μμ κ³ν, λ°κ²¬λ λ²κ·Έ λͺ©λ‘ |
@specs/* | κΈ°λ₯ λͺ μΈμλ€ |
μ΄ μΈ νμΌμ΄ Ralphμ λ¨κΈ° κΈ°μ΅μ
λλ€. 루νκ° λλλ©΄ 컨ν
μ€νΈλ μ΄κΈ°νλμ§λ§ μ΄ νμΌλ€μ λ¨μ΅λλ€. μμ΄μ νΈκ° μλ‘μ΄ μ¬μ€μ λ°κ²¬νλ©΄ @AGENT.mdλ @fix_plan.mdλ₯Ό μ§μ μ
λ°μ΄νΈν΄ λ€μ 루νμ μ λ¬ν©λλ€.
Ralphλ μ΄λ° μμΌλ‘ 무νν μ΄μ΄μ§λ μ₯κΈ° νλ‘μ νΈλ₯Ό μ²λ¦¬ν©λλ€. 컨ν μ€νΈ μλμ° νκ³λ₯Ό νμΌ μμ€ν μΌλ‘ μ°ννλ κ²μ΄μ£ . λ¨μνκ²λ§ λ³΄μΌ μλ μκ² μ§λ§ κΈ°μ‘΄ AI Agentμ νκ³λ₯Ό μ νμ νκ³ μ΄λ₯Ό μμ€ν μ μΌλ‘ 보μν μ’μ μ¬λ‘λΌκ³ μκ°ν©λλ€.
λ¨μν¨μ κ°μ μΌλ‘
μ¬μ¨μ λνλ μ’ μ’ μλ±ν λ§μ ν©λλ€. κ·Έλ°λ° κ·Έ μλ±ν¨μ΄ λλ‘λ κ°μ₯ ν΅μ¬μ μ°λ₯΄κΈ°λ ν©λλ€.
Ralph-claude-codeλ λΉμ·ν©λλ€. βκ·Έλ₯ while 루νμμ?βλΌκ³ μκ°ν μ μμ΅λλ€. λ§μ΅λλ€. νμ§λ§ κ·Έ λ¨μν¨μ΄ μ€νλ € κ°μ μ΄μ£ . μ½λλ₯Ό μ½μ μ μκ³ , λλ²κΉ ν μ μκ³ , λ―Ώμ μ μμ΅λλ€. 볡μ‘ν λΈλ λ°μ€μ AI μ€μΌμ€νΈλ μ΄μ λ³΄λ€ ν¬λͺ ν λνκ° ν¨μ¬ κ°λ ₯νκ² μμ©ν μ μμ΅λλ€.
λ§μΉλ©°.. but maintainability?
Geoff Huntleyκ° μ΄ κΈμ λ§μ§λ§ λΆλΆμλ μ΄λ¬ν λ¬Έλ¨μ΄ μμμ΅λλ€.
βAIκ° λ§λ μ½λλ μ μ§λ³΄μκ° μ λμ§ μλμ?β
μ΄ μ§λ¬Έμ λ€μ λλ§λ€ Geoff Huntleyλ λ°λ¬Έν©λλ€. βλκ° μ μ§λ³΄μνλ 건κ°μ?β
μΈκ°μ΄ μ μ§λ³΄μμ κΈ°μ€μ΄μ΄μΌ ν μ΄μ κ° μμκΉμ? μ½λκ° μ΄ν΄νκΈ° μ΄λ ΅λ€λ©΄, AIμκ² λ£¨νλ₯Ό λλ €μ 리ν©ν λ§νλ©΄ λ©λλ€. λ²κ·Έκ° μκΈ°λ©΄, 루νλ₯Ό λ€μ λλ €μ κ³ μΉλ©΄ λ©λλ€. μꡬμ¬νμ΄ λ°λλ©΄, μ€νμ μ λ°μ΄νΈνκ³ λ£¨νλ₯Ό λ리면 λ©λλ€.
AI μλμ μ μ΄λ€λ©΄μ βμ μ§λ³΄μνκΈ° μ’μ μ½λβμ λν μ μλ μ μ κΈ°μ‘΄μ μ μκ° μλ λ€λ₯΄κ² μ μλ₯Ό λ΄λ¦¬λ €λ μλλ€μ΄ 보μ λλ€. μ’μ μ½λλ μΈκ°μ΄ μ½κΈ° μ’μ μ½λκ° μλλΌ, AIκ° λ€μ 루νμμ μ¬λ°λ₯΄κ² μ΄ν΄νκ³ κ°μ ν μ μλ μ½λμΌ μλ μλ€λ μ견μ AIκ° λλΆλΆμ μ½λλ₯Ό μ§λ μ§κΈ λΉμ₯λ 무μν μ μλ μ견μ΄κΈ°λ ν©λλ€.
μ λν κ³μν΄μ μμΌλ‘μ νλ‘κ·Έλλ°μ λ°©ν₯μ λν΄μ κ³ λ―Όνλ©΄μ βμ μ§λ³΄μνκΈ° μ’μ μ½λβμ λν κ³ λ―Όμ λ§μ΄ ν©λλ€. μ²μμλ μΈκ°μ΄ μ μ§λ³΄μνκΈ° μ’μ μ½λμ¬μΌ μμΈμ μν©μμ μμ μ±μκ² μλΉμ€ν μ μλ€λΌλ μ견μ΄μμ§λ§ μ¬μ€ κ²°κ΅ μΈκ°μ΄ μ μ§λ³΄μνλλΌλ λΉκ²°μ μ μΈ νΉμ±μ κ°λ€κ³ μκ°ν©λλ€. κ·Έλ κΈ°μ μμ¦μλ κ·Έ μΈκ°κ³Ό AI λͺ¨λ μ μ΄ν΄ν μ μλλ‘ κ· νμ΄ λ§μΆ°μ§ μ½λλ₯Ό λ§λ€μ΄λκ°λ κ²μ΄ μ€μνλ€κ³ μκ°νλλ°μ, μμΌλ‘λ λ μ΄λ»κ² λ μ§ λͺ¨λ₯΄κ² μ΅λλ€. μ΄ μ§λ¬Έμ κ³μν΄μ κ°λ°μλ€μ΄ ν΄λκ°μΌ ν μ§λ¬Έμ΄ μλκΉ μκ°ν©λλ€. μ¬λ¬λΆλ€λ νλ² μ΄ μ£Όμ μ λν΄μ μκ°ν΄λ³΄μκΈ°λ₯Ό λ°λΌλ©° κΈμ λ§μΉ©λλ€.
μ°Έμ‘°
https://ghuntley.com/ralph/ https://discuss.pytorch.kr/t/ralph-playbook-ralph/8705 https://github.com/frankbria/ralph-claude-code?tab=readme-ov-file