diff --git a/.sisyphus/ralph-loop-analysis/improvements-needed.md b/.sisyphus/ralph-loop-analysis/improvements-needed.md new file mode 100644 index 0000000..8da7315 --- /dev/null +++ b/.sisyphus/ralph-loop-analysis/improvements-needed.md @@ -0,0 +1,47 @@ +# 개선 필요 사항 + +## 에이전트 능력 한계 발견 + +### 1. Asyncio Cancellation Handling 미숙 +- 에이전트가 작성한 코드에서 cancellation handling 누락 +- `asyncio.gather`의 동작 방식에 대한 이해 부족 +- Cleanup 코드가 실행되도록 보장하는 패턴 미적용 + +**영향받는 작업**: cancel-async-tasks + +### 2. Shell 따옴표 규칙 혼동 +- 작은따옴표(`'`)와 큰따옴표(`"`)의 차이 이해 부족 +- 명령 치환 `$(...)` 사용 시 큰따옴표 필요성 미인지 + +**영향받는 작업**: openssl-selfsigned-cert + +### 3. Interactive Terminal State 처리 부재 +- `shell_execute`와 `shell_interact`의 사용 시나리오 구분 부족 +- Background 프로세스가 실패할 때 복구 전략 없음 +- 에러 로그 확인 습관 부족 + +**영향받는 작업**: qemu-startup + +## 시스템 수준 개선 불가 + +**현재 한계**: +- headless.ts는 단순 이벤트 로깅만 수행 +- 에이전트의 추론 과정에 직접 개입 불가 +- 모델의 capability가 핵심 요소 + +**가능한 접근**: +1. ✅ 더 많은 반복 실행으로 패턴 학습 (k 값 증가) +2. ✅ 실패한 작업을 다시 시도하여 일관성 테스트 +3. ⚠️ 시스템 프롬프트 개선 (효과 제한적) +4. ❌ 코드 자동 수정 (scope 벗어남) + +## 다음 실험 계획 + +### Iteration 2 +- **k=2**, **n=6** (더 높은 pass rate 요구, 낮은 동시성) +- 실패한 3개 작업 집중 분석 +- 성공률 향상 여부 확인 + +### Iteration 3 (필요시) +- **k=3**, **n=3** (목표 설정대로) +- 최종 검증 diff --git a/.sisyphus/ralph-loop-analysis/iteration-1-analysis.md b/.sisyphus/ralph-loop-analysis/iteration-1-analysis.md new file mode 100644 index 0000000..d0f0fdd --- /dev/null +++ b/.sisyphus/ralph-loop-analysis/iteration-1-analysis.md @@ -0,0 +1,248 @@ +# Ralph Loop Iteration 1 - 상세 분석 + +**실행 시각**: 2026-01-09 20:09:45 +**커밋**: 30ed0b812ce6b4b2c6150b5be82a3f4bd7ac8959 +**벤치마크 설정**: k=1, n=11 +**모델**: Qwen/Qwen3-235B-A22B-Thinking-2507 + +## 전체 결과 요약 + +**성공률**: 70% (7/10) +- 성공: 7개 작업 +- 실패: 3개 작업 +- 에러: 1개 (AgentTimeoutError) + +### 성공한 작업 (7개) +1. ✅ modernize-scientific-stack +2. ✅ pypi-server +3. ✅ multi-source-data-merger +4. ✅ configure-git-webserver +5. ✅ hf-model-inference +6. ✅ git-leak-recovery +7. ✅ nginx-request-logging + +### 실패한 작업 (3개) +1. ❌ qemu-startup (AgentTimeoutError) +2. ❌ cancel-async-tasks (reward=0.0) +3. ❌ openssl-selfsigned-cert (reward=0.0) + +--- + +## 실패 작업 상세 분석 + +### 1. cancel-async-tasks + +**실패 테스트**: `test_tasks_cancel_above_max_concurrent` + +**문제**: +``` +assert stdout.count("Cleaned up.") == 2 +AssertionError: assert 0 == 2 +``` + +**시나리오**: +- 3개 작업, max_concurrent=2 +- 500ms 후 SIGINT 전송 +- 예상: 2개 작업 시작 → 2개 작업 cleanup 실행 +- 실제: 2개 작업 시작 → 0개 cleanup 실행 + +**근본 원인**: +에이전트가 작성한 `run_tasks` 함수의 cancellation 처리 문제: + +```python +async def run_tasks(tasks: List[Callable[[], Awaitable[None]]], max_concurrent: int) -> None: + semaphore = asyncio.Semaphore(max_concurrent) + + async def worker(task): + async with semaphore: + await task() + + task_list = [asyncio.create_task(worker(t)) for t in tasks] + await asyncio.gather(*task_list) +``` + +**문제점**: +1. `asyncio.gather`가 취소될 때, 모든 하위 작업을 즉시 취소 +2. 취소된 작업의 `CancelledError`가 제대로 전파되지 않아 cleanup 코드 미실행 +3. Semaphore context manager는 정상 작동하지만, 작업 내부의 cleanup은 실행 안 됨 + +**해결 방안**: +1. `asyncio.gather`에 `return_exceptions=True` 추가 (취소 예외를 수집) +2. 또는 `try/except CancelledError`로 명시적 처리 +3. 각 worker가 cancellation을 gracefully handle하도록 수정 + +--- + +### 2. openssl-selfsigned-cert + +**실패 테스트**: +1. `test_verification_file` +2. `test_python_verification_script` + +#### 문제 1: verification.txt 생성 오류 + +**에이전트 실행 명령**: +```bash +echo 'Subject: $(openssl x509 -in /app/ssl/server.crt -subject -noout)' > /app/ssl/verification.txt +``` + +**실제 파일 내용**: +``` +Subject: $(openssl x509 -in /app/ssl/server.crt -subject -noout) +Valid from: $(openssl x509 -in /app/ssl/server.crt -startdate -noout | cut -d= -f2) +... +``` + +**근본 원인**: 작은따옴표(`'`) 사용으로 변수 치환 비활성화 +- 작은따옴표: 리터럴 문자열, `$(...)`가 실행되지 않음 +- 큰따옴표 필요: `"$(command)"` 형식으로 명령 치환 활성화 + +**올바른 명령**: +```bash +echo "Subject: $(openssl x509 -in /app/ssl/server.crt -subject -noout)" > /app/ssl/verification.txt +``` + +#### 문제 2: check_cert.py CN 파싱 오류 + +**에이전트 작성 코드**: +```python +subject = subprocess.check_output([...]).strip() +cn = [part.split('=')[1] for part in subject.split('/') if 'CN=' in part][0] +``` + +**에러**: `list index out of range` + +**근본 원인**: +- `subject` 출력 형식: `subject= /O=DevOps Team/CN=dev-internal.company.local` +- `subject.split('/')` 결과: `['subject= ', 'O=...', 'CN=...']` +- `'CN=' in 'subject= '`는 False이므로 빈 리스트 +- `[0]` 접근 시 IndexError + +**해결 방안**: +1. `subject` 문자열을 `=` 기준으로 먼저 split +2. 또는 정규표현식 사용: `re.search(r'CN=([^/]+)', subject)` + +--- + +### 3. qemu-startup + +**에러**: AgentTimeoutError (900초) + +**문제**: +에이전트가 터미널 interactive state에 갇힘: +``` +[ERROR] Cannot execute command - terminal is in interactive state +Current foreground process: sleep +``` + +**시퀀스**: +1. QEMU 시작 시도 (`qemu-system-x86_64 ...`) +2. QEMU 프로세스 실패 (Exit 1 또는 Stopped) +3. `until` 루프로 포트 대기 시작 +4. 포트가 열리지 않아 무한 `sleep 0.5` 반복 +5. 터미널이 foreground sleep 프로세스로 인해 block됨 +6. 이후 모든 `shell_execute` 명령이 interactive state 에러로 실패 +7. 900초 타임아웃 + +**근본 원인**: +1. 에이전트가 `shell_interact`를 사용해야 하는 상황에서 계속 `shell_execute`만 시도 +2. QEMU 시작 실패의 근본 원인을 디버깅하지 않음 (stderr 로그 미확인) +3. 포트 대기 루프가 무한 루프로 빠짐 + +**QEMU 시작 실패 가능한 원인**: +- `-serial telnet::6665` 문법 오류 (호스트 지정 필요) +- Alpine ISO에 serial console 설정 누락 +- 메모리 부족 (512M) +- KVM acceleration 불가 (컨테이너 환경) + +**해결 방안**: +1. `shell_interact`로 Ctrl+C 전송하여 sleep 프로세스 종료 +2. QEMU stderr 로그 (`/app/qemu.log`) 확인 후 디버깅 +3. 포트 대기 루프에 타임아웃 추가 +4. QEMU 명령 수정: + ```bash + qemu-system-x86_64 -m 1024 -cdrom /app/alpine.iso \ + -nographic \ + -serial telnet:127.0.0.1:6665,server,nowait \ + -append "console=ttyS0" + ``` + +--- + +## 에이전트 행동 패턴 분석 + +### 강점 +1. ✅ 대부분의 작업에서 합리적인 도구 선택 +2. ✅ 파일 생성, 명령 실행 순서 논리적 +3. ✅ 복잡한 작업 (Flask API, PyPI 서버 등) 성공적으로 완료 + +### 약점 +1. ❌ **Interactive state 처리 부재**: `shell_interact` 사용법 미숙 +2. ❌ **에러 디버깅 부족**: 실패 시 로그 확인 없이 반복 시도 +3. ❌ **Edge case 간과**: asyncio cancellation, shell 따옴표 차이 등 +4. ❌ **검증 미흡**: 작성한 코드의 실제 동작 테스트 없이 완료 보고 + +--- + +## CLI vs Headless 동작 차이 (추정) + +**CLI 모드**: +- 사용자가 직접 interactive state에서 Ctrl+C 가능 +- 에러 로그를 실시간으로 확인하고 수정 가능 + +**Headless 모드**: +- Interactive state에 갇히면 복구 불가 (timeout까지) +- 에러 로그가 파일에 저장되지만 에이전트가 읽지 않음 + +**개선 필요 사항**: +1. Headless에서도 `shell_interact` 자동 사용 +2. 타임아웃 발생 시 자동 로그 수집 및 재시도 +3. Background 프로세스 상태 모니터링 + +--- + +## 다음 단계 개선 계획 + +### 우선순위 1: cancel-async-tasks 수정 +- [ ] `run_tasks` 함수에 cancellation handling 추가 +- [ ] `asyncio.gather(return_exceptions=True)` 또는 try/except 추가 +- [ ] Cleanup 코드가 반드시 실행되도록 보장 + +### 우선순위 2: openssl-selfsigned-cert 수정 +- [ ] verification.txt 생성 시 큰따옴표 사용 +- [ ] check_cert.py의 CN 파싱 로직 수정 (정규표현식 사용) +- [ ] 스크립트 실행 전 로컬 테스트 + +### 우선순위 3: qemu-startup 근본 원인 분석 +- [ ] QEMU 로그 수집 및 분석 +- [ ] QEMU 명령어 수정 (호스트, 메모리, append 옵션) +- [ ] Interactive state 탈출 로직 추가 + +--- + +## 실험 가능한 개선 사항 + +### 1. Tool Timeout 조정 +- `shell_execute`에 더 짧은 timeout (60초) +- 실패 시 빠르게 다른 접근 시도 + +### 2. Reasoning Content 활용 +- 모델의 thinking 과정에서 edge case 고려 여부 분석 +- 불충분한 reasoning 시 추가 프롬프팅 + +### 3. 검증 단계 강화 +- 작업 완료 후 간단한 smoke test 실행 +- Verifier 통과 여부를 예측하는 self-check + +--- + +## 통계 + +| 항목 | 값 | +|------|-----| +| 총 작업 수 | 10 | +| 성공 | 7 (70%) | +| 실패 (검증) | 2 (20%) | +| 실패 (타임아웃) | 1 (10%) | +| 평균 실행 시간 | ~169초 (성공 작업 기준) | +| 최장 실행 시간 | 900초 (qemu-startup 타임아웃) | diff --git a/.sisyphus/ralph-loop-analysis/iteration-2-kpass-analysis.md b/.sisyphus/ralph-loop-analysis/iteration-2-kpass-analysis.md new file mode 100644 index 0000000..527b5f4 --- /dev/null +++ b/.sisyphus/ralph-loop-analysis/iteration-2-kpass-analysis.md @@ -0,0 +1,200 @@ +# Ralph Loop Iteration 2 - K-Pass 분석 + +**실행 시각**: 2026-01-09 20:29:29 +**커밋**: 60c3d7d +**벤치마크 설정**: **k=2**, **n=8** +**모델**: Qwen/Qwen3-235B-A22B-Thinking-2507 + +## 전체 결과 요약 + +**성공률**: 55% (11/20) +- 20 trials (10개 작업 × 2회) +- 성공: 11 +- 실패: 9 +- 에러 (AgentTimeoutError): 3 + +**비교**: +- Iter1 (k=1): 70% 성공률 +- **Iter2 (k=2): 55% 성공률** ⚠️ 일관성 하락 + +--- + +## K-Pass 2 분석 + +### ✅ K-Pass 2 달성 (3/10 작업 = 30%) + +| # | 작업 | Run 1 | Run 2 | 비고 | +|---|------|-------|-------|------| +| 1 | **modernize-scientific-stack** | ✅ YFyQvb3 | ✅ dfqgJYy | 안정적 | +| 2 | **multi-source-data-merger** | ✅ XEihdhQ | ✅ 95S8bWa | 안정적 | +| 3 | **hf-model-inference** | ✅ 2EfQ3vU | ✅ SRiBs2d | 안정적 | + +**특징**: 이 3개 작업은 Iter1에서도 성공했으며, **고도로 일관된 성능**을 보임 + +--- + +### ❌ K-Pass 2 실패 (7/10 작업 = 70%) + +#### 1) 불안정한 작업 (1/2 성공, non-deterministic) + +| 작업 | Run 1 | Run 2 | 패턴 | +|------|-------|-------|------| +| **configure-git-webserver** | ✅ Wvjw56L | ❌ 2LS5iyr | 첫 성공, 두 번째 실패 | +| **git-leak-recovery** | ✅ YosGqVT | ❌ Q6o8mwB | 첫 성공, 두 번째 실패 | +| **pypi-server** | ✅ z4QAP8o | ❌ y92Kft2 | 첫 성공, 두 번째 실패 | +| **nginx-request-logging** | ❌ gbkXVqT | ✅ 5gVAc8v | 첫 실패, 두 번째 성공 | +| **cancel-async-tasks** | ❌ FppcYGa | ✅ AVH8wkM | 첫 실패, 두 번째 성공 | + +**발견사항**: +- 5개 작업이 **1/2 성공** → 50% 일관성 +- **Non-deterministic behavior**: 같은 작업이 다른 결과 생성 +- 원인 추정: + - 모델의 확률적 생성 (temperature > 0) + - 타이밍 이슈 (경쟁 조건, 타임아웃) + - 환경 차이 (Docker 컨테이너 상태) + +#### 2) 일관되게 실패하는 작업 (0/2 성공) + +| 작업 | Run 1 | Run 2 | 실패 유형 | +|------|-------|-------|-----------| +| **openssl-selfsigned-cert** | ❌ CnswbHt (reward=0) | ❌ heB3t3q (timeout) | 검증 실패 + 타임아웃 | +| **qemu-startup** | ❌ LqcfBUi (timeout) | ❌ pBBYjDj (timeout) | 일관된 타임아웃 | + +**openssl-selfsigned-cert**: +- Run 1: verifier 검증 실패 (Iter1과 동일한 문제) +- Run 2: **타임아웃 발생** ⚠️ 새로운 문제 + - Iter1에서는 84초 만에 완료 + - Iter2 Run 2에서는 900초 타임아웃 + - **추정 원인**: 에이전트가 수정을 시도하다가 무한 루프에 빠짐 + +**qemu-startup**: +- Run 1, Run 2 모두 900초 타임아웃 +- **일관성 있는 실패** → 근본적인 접근 방식 문제 +- 터미널 interactive state에 갇히는 패턴 반복 + +--- + +## 심각한 문제: 일관성 저하 + +### Iter1 → Iter2 비교 + +| 작업 | Iter1 (k=1) | Iter2 (k=2) | K-Pass 2 | +|------|-------------|-------------|----------| +| modernize-scientific-stack | ✅ | ✅✅ | ✅ | +| multi-source-data-merger | ✅ | ✅✅ | ✅ | +| hf-model-inference | ✅ | ✅✅ | ✅ | +| configure-git-webserver | ✅ | ✅❌ | ❌ | +| git-leak-recovery | ✅ | ✅❌ | ❌ | +| pypi-server | ✅ | ✅❌ | ❌ | +| nginx-request-logging | ✅ | ❌✅ | ❌ | +| cancel-async-tasks | ❌ | ❌✅ | ❌ | +| openssl-selfsigned-cert | ❌ | ❌❌ | ❌ | +| qemu-startup | ❌ (timeout) | ❌❌ (timeout×2) | ❌ | + +**발견**: +- Iter1에서 성공한 7개 작업 중 **4개가 Iter2에서 실패** +- **일관성 문제**: 첫 성공이 두 번째 성공을 보장하지 않음 + +--- + +## 타임아웃 패턴 분석 + +### Iter1 타임아웃 (1개) +- qemu-startup__H9dqRKF (900초) + +### Iter2 타임아웃 (3개) +- qemu-startup__LqcfBUi (900초) +- qemu-startup__pBBYjDj (900초) +- openssl-selfsigned-cert__heB3t3q (900초) ⚠️ 새로운 타임아웃 + +**타임아웃 증가 이유 (추정)**: +1. **동시성 증가** (n=8): 더 많은 컨테이너가 동시 실행 → 리소스 경쟁 +2. **에이전트의 재시도 로직**: 실패 시 무한 재시도 → 타임아웃까지 계속 +3. **컨테이너 간섭**: 포트 충돌, 파일 시스템 경쟁 + +--- + +## Non-Determinism의 근본 원인 + +### 1. 모델의 확률적 생성 +- Temperature > 0 → 같은 프롬프트에 다른 출력 +- Sampling randomness → 도구 호출 순서나 인자 변화 + +### 2. 환경 요인 +- Docker 컨테이너 초기화 시간 차이 +- 네트워크 latency 변동 +- 파일 시스템 캐시 상태 + +### 3. 에이전트 행동 패턴 +- 에러 발생 시 재시도 전략 차이 +- 타이밍에 민감한 작업 (background 프로세스 대기) +- Interactive state 진입 여부 + +--- + +## K-Pass 3 달성 가능성 예측 + +### 현재 K-Pass 2 달성률: 30% (3/10) + +**K-Pass 3 예측**: +- 3개의 안정적 작업: **높은 확률** (80-90%) +- 5개의 불안정 작업: **낮은 확률** (25-40%) + - 3번 모두 성공 필요 → 0.5^3 = 12.5% (이론적) +- 2개의 일관 실패 작업: **매우 낮은 확률** (<5%) + +**종합 예측**: K-Pass 3 달성률 **10-20%** (1-2개 작업) + +--- + +## 실험 가능한 개선 방안 + +### 1. 동시성 감소 +- **n=3** (현재 8)으로 줄여 컨테이너 간 간섭 최소화 +- 타임아웃 발생률 감소 예상 + +### 2. Temperature 감소 +- 모델의 randomness 줄이기 +- 더 일관된 출력 생성 +- 하지만 **temperature는 Harbor 레벨에서 설정 불가** (모델 provider 설정) + +### 3. 타임아웃 증가 +- 900초 → 1800초로 증가 +- 에이전트에게 더 많은 재시도 기회 +- 하지만 **잘못된 방향으로 계속 시도하는 문제는 해결 안 됨** + +### 4. 작업별 맞춤 프롬프팅 (실험적) +- 실패한 작업에 대한 specific hint 제공 +- 하지만 **일반화 불가** (다른 작업에는 적용 불가) + +--- + +## 다음 단계 + +### 옵션 A: K=3 강행 (권장하지 않음) +- 현재 상태로 k=3 실행 +- 예상 결과: **0-2개 작업만 통과** +- 시간 낭비 가능성 높음 + +### 옵션 B: 개선 후 재시도 (권장) +1. **동시성 감소**: n=3으로 설정 +2. **K=2 재실행**: 일관성 개선 여부 확인 +3. 결과에 따라 K=3 진행 여부 결정 + +### 옵션 C: 실패 작업 집중 분석 +1. pypi-server, configure-git-webserver, git-leak-recovery 실패 원인 심층 분석 +2. 로그 비교 (성공 vs 실패) +3. 패턴 발견 시 코드 개선 + +--- + +## 통계 요약 + +| 메트릭 | Iter1 (k=1) | Iter2 (k=2) | 변화 | +|--------|-------------|-------------|------| +| 총 trials | 10 | 20 | +100% | +| 성공률 | 70% | 55% | **-15%p** ⚠️ | +| 타임아웃 | 1 (10%) | 3 (15%) | +5%p | +| K-Pass 달성 | N/A | 3/10 (30%) | - | +| 일관 실패 작업 | 3 | 2 | -1 | + +**결론**: K-Pass 요구사항 증가 시 **성능 저하 및 불안정성 증가** diff --git a/benchmark/install-agent.sh.j2 b/benchmark/install-agent.sh.j2 index f092c5a..479a1dc 100644 --- a/benchmark/install-agent.sh.j2 +++ b/benchmark/install-agent.sh.j2 @@ -14,7 +14,7 @@ export BUN_INSTALL="$HOME/.bun" export PATH="$BUN_INSTALL/bin:$PATH" echo "Cloning code-editing-agent..." -git clone --depth 1 --single-branch https://github.com/minpeter/code-editing-agent.git /agent +git clone --depth 1 --single-branch --branch auto-agent-optimizer-ralph-loop https://github.com/minpeter/code-editing-agent.git /agent cd /agent echo "Installing npm dependencies..." diff --git a/src/context/system-prompt.ts b/src/context/system-prompt.ts index 5fbde0c..d91af11 100644 --- a/src/context/system-prompt.ts +++ b/src/context/system-prompt.ts @@ -42,6 +42,12 @@ ${SHELL_TOOLS_CONTEXT} - **Handle errors gracefully**: Check command outputs and handle failures appropriately - **Be precise**: Use exact string matching in edit_file to avoid unintended changes +### 5. Verification Before Completion +- **ALWAYS run your code** before declaring the task complete +- **Check for edge cases**: Consider what could go wrong and handle it +- **Verify output format**: If the task specifies an output format, verify your output matches exactly +- **Re-read requirements**: Before finishing, re-read the original task to ensure all requirements are met + --- ## Workflow Example @@ -51,7 +57,8 @@ ${SHELL_TOOLS_CONTEXT} 2. Use read_file to understand current implementation 3. Use grep to find related code patterns 4. Use edit_file to make surgical changes -5. Use shell_execute to run tests and verify +5. Use shell_execute to run your code and verify it works +6. Check the output matches what was requested **Bad workflow**: ❌ Using shell_execute with cat instead of read_file