start-harness.sh를 진입점으로 하는 Codex-native 자가개선 하네스의 전체 구조 분석.
14단계 파이프라인, 5종 신호 수집, 8가지 통합 smoke test,
그리고 자율 LLM 패치 적용 메커니즘까지.
Codex loopy-era 시스템은 "AI가 스스로 개선 신호를 감지하고, LLM을 호출해 패치를 생성하며, 검증 후 적용하는" 완전 자율 루프입니다. 모든 구성 요소는 ~/.codex/ 아래에 위치하며, cc-sync 프로젝트를 통해 동기화됩니다.
l6_blocker_count (목표 0).skill .codex/skills/start-harness/SKILL.md가 정의한 5개 하위 명령으로 구성됩니다.
# start — 전체 하네스 시작 (가장 많이 사용) bash start-harness.sh start --project-root "$PWD" loop-era-supervisor.sh ensure ← 데몬 존재 보장 ralph-loop.sh start [args] ← 프로젝트 레지스트리 등록 ralph-loop.sh tick --force ← 즉시 1회 실행 pretty_status() ← supervisor + worker 상태 출력 # smoke — 전체 환경 검증 bash start-harness.sh smoke --project-root "$PWD" self-improve-smoke.sh ← 8가지 통합 테스트 loop-era-smoke.sh ← 루프 전용 smoke verify-l6.sh ← L6 blocker 수치 adversarial-review-l6.py ← 적대적 코드 리뷰 # stop — 중지 (--global-supervisor로 데몬까지) bash start-harness.sh stop --project-root "$PWD" [--global-supervisor]
ralph-loop.sh는 loop-era-supervisor.py의 CLI 래퍼입니다. start 시 repo에 자동으로 autoresearch artifact를 시드합니다.
ralph-loop.sh start seed_repo_artifacts() cp ~/.codex/autoresearch/{verify-l6.sh, adversarial-review-l6.py} → .codex/autoresearch/ (없으면 자동 복사) python3 loop-era-supervisor.py register [args] loop-era-supervisor.sh start ralph-loop.sh tick → python3 loop-era-supervisor.py run-once ralph-loop.sh stop → python3 loop-era-supervisor.py cancel ralph-loop.sh status → python3 loop-era-supervisor.py status
loop-era-supervisor.py의 PHASE_ORDER에 정의된 순서대로 실행됩니다. 각 phase의 결과는 phase_history에 기록되며, 메트릭 추이는 results.tsv에 저장됩니다.
self-improve-trigger.sh는 다양한 소스에서 개선이 필요하다는 신호를 수집하여 ~/.codex/pending/self-improve-{key}.json에 저장합니다. 이미 처리된 신호는 ack 상태 파일로 중복 필터링합니다.
| 신호 종류 | 수집처 | 의미 |
|---|---|---|
| fix_commit | git log --grep='^fix:' |
세션 중 발생한 버그 수정 커밋. 어떤 실수가 반복되는지 학습 소스. |
| bug_fixer_retry | .codex/logs/*.jsonl |
bug-fixer 에이전트 재시도 로그. 자동 수정이 반복된 패턴 감지. |
| recurrence | check-recurrence.py |
self-improve 이력 × git fix 커밋 교차 분석. 동일 키워드 2회 이상 발견 시. |
| telemetry | self-improve-telemetry.py |
사용자 불만 패턴 분석. 한국어 정규식 포함 ("아니요", "안 보이", "중복" 등). |
| adversarial_finding | adversarial-review-l6.py |
리뷰에서 발견된 P1/P2 blocker. loop 다음 사이클에 자동 주입. |
# self-improve-trigger.sh 흐름 project-scope.py → project_key 결정 # 신호 수집 git log --since=$SESSION_START --grep='^fix:' → fix_commit[] .codex/logs/*.jsonl | grep "bug-fixer" → bug_fixer_retry[] check-recurrence.py $PROJECT_ROOT → recurrence[] self-improve-telemetry.py --project-root $ROOT → telemetry[] # ack 필터링 (중복 제거) ~/.codex/state/self-improve-acks/{key}.json # 신호가 있으면 pending 파일 저장 ~/.codex/pending/self-improve-{key}.json # 후처리 (있으면 실행) rule-effectiveness-check.sh ← 규칙 효율성 검증 soft-to-hard-promoter.sh ← SOFT→HARD 자동 승격
실제 LLM을 호출하여 개선 패치를 생성하고 적용하는 핵심 컴포넌트. git worktree로 격리된 환경에서 실행하며, 실패 시 자동으로 백업에서 복구합니다.
self-improve-worker.py run --project-root $ROOT │ ├── [쿨다운] CODEX_SELF_IMPROVE_COOLDOWN_SECONDS=900 (15분) ├── [lock] ~/.codex/state/self-improve-workers/{key}.lock │ ├── load_pending() + unacked_signals() 필터링 │ ├── [격리 환경] │ git worktree add --detach HEAD │ backup_codex() → temp/codex-backup/ │ ├── [LLM 호출] │ build_prompt(root, signals[:10], team_context) │ write_schema(output_schema.json) │ codex --model gpt-5.4 -o output.json < prompt │ ├── [결과 검증] │ patch_scope: ["project"] | ["codex"] | ["project","codex"] │ verification_checks: │ file_contains → 파일 내용 포함 여부 │ repo_script → .codex/autoresearch/*.sh 실행 │ codex_smoke → self-improve-smoke.sh │ git_diff_check → diff 확인 │ ├── [패치 적용] │ patch_scope=["codex"] → ~/.codex/ 직접 수정 ✅ │ patch_scope=["project"] → queue 저장 (repo clean 필요) ⚠️ │ ├── self-improve-ack.sh ← 처리된 신호 ack ├── self-improve-smoke.sh ← 적용 후 smoke test └── self-improve-log.sh ← 이력 기록
patch_scope=["project"]는 repo가 clean(git status --porcelain이 비어있어야) 해야만 즉시 적용됩니다. dirty 상태면 ~/.codex/state/self-improve-queues/{key}/에 .patch 파일로 대기합니다.
정량적(verify-l6.sh)과 정성적(adversarial-review-l6.py) 두 레이어로 이중 검증합니다. 두 검증 모두 JSON을 stdout에 출력하며, supervisor가 파싱하여 phase 진행 여부를 결정합니다.
# verify-l6.sh — L6 Blocker Count 측정 필수 파일 17개 존재 확인: .codex/autoresearch/verify-l6.sh .codex/autoresearch/adversarial-review-l6.py .codex/scripts/session-start.sh .codex/scripts/memory-bank-session-end.sh .codex/scripts/self-improve-trigger.sh .codex/scripts/self-improve-check.sh .codex/scripts/self-improve-worker.py .codex/scripts/team-runtime.py .codex/scripts/loop-era-supervisor.py .codex/scripts/init-project-runtime.py .codex/scripts/qa-cycle-runtime.py .codex/scripts/check-recurrence.py .codex/scripts/install-git-hooks.sh .codex/skills/self-improve/SKILL.md .codex/skills/ralph-loop/SKILL.md .codex/skills/team/SKILL.md ... (+1 more) python3 -m py_compile × 10개 ← Python 컴파일 검증 bash -n × 4개 ← Bash 구문 검증 self-improve-smoke.sh ← 통합 smoke (skip 가능) → {"metric": "l6_blocker_count", "value": N, "status": "pass/fail"} # adversarial-review-l6.py — 정성적 리뷰 필수 artifacts 존재 + 비어있지 않음 (10개) apply.sh / sync.sh에 autoresearch 동기화 포함 여부 self-improve-trigger.sh의 Claude 하드의존성 탐지 self-improve SKILL.md의 notifier 경로 체크 self-improve-smoke.sh의 set +e / STATUS=$? / [STATUS -eq 1] 패턴 git-hook → Codex runtime 체인 여부 → {"blocker_count": N, "findings": [...], "status": "pass/fail"}
self-improve-smoke.sh는 단순 구문 검사를 넘어 실제 임시 git repo를 생성하고 전체 파이프라인을 검증하는 통합 테스트를 포함합니다.
STATUS=1이어야 통과.status=stale_running 확인 → worker run --dry-run → running=False 전환.status=backoff, last_result=escalation_required, disabled_until 설정 확인.patch_scope=["codex"] → 즉시 적용. mixed: ["project","codex"] → codex 즉시, project는 queue 대기.| 컴포넌트 | 수준 | 비고 |
|---|---|---|
| 신호 수집 파이프라인 | ✅ 100% | 5종 신호, 한국어 패턴 포함 |
| 자율 worker 실행 | ✅ 100% | worktree 격리, 백업/복구, 4종 검증 |
| L6 blocker 메트릭 | ✅ 100% | 정량적 keep/discard 판정 |
| Smoke Test 하네스 | ✅ 100% | 8가지 통합 테스트 자동화 |
| Supervisor 데몬 | ✅ 100% | PID, launchd, heartbeat, stale 복구 |
| 14단계 Phase 파이프라인 | ✅ 100% | PHASE_ORDER 완전 구현 |
| git worktree 격리 | ✅ 100% | clone 폴백 포함 |
| ack/nack 시스템 | ✅ 100% | 신호 중복 처리 방지 |
| project 패치 적용 | ⚠️ 70% | repo clean 조건 필요 → queue 대기 |
| cross-tool 동기화 | ⚠️ 60% | cc-sync apply.sh/sync.sh 의존 |
| Hard Rule 자동 승격 | ⚠️ 70% | soft-to-hard-promoter.sh 있지만 깊이 제한 |
start-harness.sh부터 14단계 phase 파이프라인, 8가지 통합 smoke test, 5종 신호 수집, worktree 격리, ack 기반 중복 방지까지 매우 정교하게 구축되어 있습니다.