deep dive · codex · loopy-era

Codex
Harness System

start-harness.sh를 진입점으로 하는 Codex-native 자가개선 시스템의 전체 프로세스 분석. 그리고 Claude Code의 핵심 명령 /team · /init-project · /qa-cycle · /qa-scenario-gen이 Codex로 이식되면서 무엇이 바뀌었는지 비교한다.

15
Phase pipeline
7
QA scenarios
4
Skills ported
8
Smoke tests

시스템 전체 진입 경로

ENTRY
start-harness.sh
skill 진입점
5개 명령 지원
DAEMON
loop-era-supervisor.sh
nohup / launchd
heartbeat 감시
REGISTER
ralph-loop.sh
프로젝트 등록
artifact 시드
ORCHESTRATE
loop-era-supervisor.py
15단계 파이프라인
레지스트리 관리
IMPROVE
self-improve-worker.py
LLM 호출
worktree 격리 패치
start-harness .sh start/tick/smoke/stop loop-era-supervisor .sh ensure/start/stop PID · heartbeat · launchd ralph-loop .sh start/tick/stop seed_repo_artifacts() loop-era-supervisor .py 15-phase pipeline register · run-once · status l6_blocker_count metric qa-scenario-gen .py NEW phase 02 7 scenarios · evidence contract self-improve -worker.py worktree · LLM · patch verify-l6.sh 17 artifacts · py_compile · bash -n adversarial-review -l6.py blocker findings team-runtime .py plan+execute parallel workers · worktrees phase 02 self-improve feedback

start-harness.sh — 5개 명령

start-harness.sh 진입점 / 오케스트레이션 start ensure→register→tick→status status supervisor+worker pretty tick ralph-loop run-once smoke 8가지 통합 테스트 stop cancel [+global supervisor] self-improve-smoke loop-era-smoke · verify-l6

15단계 loop-era 파이프라인

loop-era-supervisor.pyPHASE_ORDER에 정의된 순서. 메트릭은 l6_blocker_count이며 0이 목표다. 각 phase의 결과는 phase_history에 누적되고, 최종적으로 results.tsv에 keep/discard로 기록된다.

v2에서 qa_scenario_gen phase가 2번 위치에 추가되어 14단계 → 15단계로 증가했다.

01
init_project
프로젝트 프로파일 생성. 기술 스택, 코딩 패턴, QA 전략 자동 탐지. app_candidates / service_candidates / database_hints 감지 → 시나리오 required 자동 결정.
→ init-project-runtime.py → .codex/loopy-era/init-project.json + project-profile.json
setup
02
qa_scenario_gen NEW
project-profile.json을 읽어 7종 QA 시나리오 필요 여부 자동 결정. UI/API/DB/console 4개 축으로 required=true인 시나리오만 실행 목록에 포함. evidence contract 출력 필수.
→ qa-scenario-gen.py → .codex/loopy-era/qa-scenarios.json
new
03
self_improve_trigger
fix 커밋, bug-fixer retry, recurrence, telemetry 신호 수집 → pending 파일 저장. rule-effectiveness-check, soft-to-hard-promoter 후처리.
→ self-improve-trigger.sh → ~/.codex/pending/self-improve-{key}.json
signal
04
self_improve_worker_initial
미처리 신호가 있을 때만 실행. Codex LLM 호출 → worktree 격리 → 패치 생성 → 4종 검증 → 적용 또는 queue 대기.
→ self-improve-worker.py run (timeout: 2400s)
LLM
05
verify_initial
L6 blocker count 정량 측정. 필수 파일 17개 + Python 컴파일 10개 + Bash 구문 4개 + smoke test.
→ .codex/autoresearch/verify-l6.sh → {metric, value, status}
verify
06
adversarial_review_initial
정성적 리뷰. artifacts 존재·sync·Claude 의존성 잔여물·hook chain·smoke harness 패턴 검사.
→ .codex/autoresearch/adversarial-review-l6.py → {blocker_count, findings[]}
review
07
team_plan
verify + review 결과를 기반으로 병렬 실행 가능한 worker 할당 계획 수립. blocker_total=0이면 status: "skip" 반환. blockers 있을 때 local-critical-path + verification/adversarial/validation worker 생성.
→ team-runtime.py --json (timeout: 1800s) · ThreadPoolExecutor 병렬 실행
plan
08
team_execute
계획 실행. parallel_execution, workers_started, project_patch_allowed 상태로 결과 기록. repo clean 여부가 project_patch_allowed 결정.
→ team-runtime.py --execute --json → .codex/ralph-loop/team-execution-latest.json
exec
09
qa_cycle
빌드 + 타입체크 + 린트 + 단위/통합 테스트. qa-scenarios.json의 시나리오별 command 실행 + evidence contract 검증. failure_labels로 분류.
→ qa-cycle-runtime.py --max-rounds N (timeout: 1200s) · scenario_checks() 포함
QA
10
qa_fix_retry
QA failure 잔류 시 team-runtime으로 자동 수정 → qa_cycle 재실행. repair_command도 프로파일에서 로드. 최대 N라운드 반복.
→ team-runtime.py --execute → qa-cycle-runtime.py (loop)
retry
11
inject_adversarial_findings
review_initial에서 발견된 findings를 pending 신호로 주입. 다음 self-improve 사이클에서 처리.
→ merge_adversarial_findings()
inject
12
self_improve_worker_adversarial
adversarial findings를 신호로 재처리하는 self-improve 사이클. codex 패치 적용 + 검증.
→ self-improve-worker.py run
LLM
13
verify_final
모든 수정 후 최종 L6 blocker count 측정. 이 값이 current_metric_value로 기록됨.
→ verify-l6.sh
verify
14
adversarial_review_final
최종 정성 리뷰. blocker_count=0 이어야 stopping_condition 달성. 잔류 findings는 다음 iteration으로.
→ adversarial-review-l6.py
final
15
closeout
results.tsv append, metrics.jsonl snapshot, action_log 전송, next_run_at 갱신, status → completed/active 결정.
→ results.tsv + loop-era-metrics.jsonl + action-log.sh
done

qa-scenario-gen 아키텍처

qa-scenario-gen.py는 phase 02에서 독립 실행되는 Python 런타임이다. project-profile.jsonapp_candidates, service_candidates, database_hints를 읽어서 7종 시나리오의 required 여부를 자동 결정하고, qa-scenarios.json을 출력한다.

이후 qa-cycle-runtime.pyscenario_checks()가 이 파일을 읽어 각 시나리오 command를 실행하고 evidence contract(JSON 출력)를 검증한다.

qa-scenario-gen → qa-cycle-runtime evidence 흐름
project-profile.json
app_candidates → UI 시나리오
service_candidates → API 시나리오
database_hints → DB 시나리오
*_scenario_command × 7
*_repair_command × 7
qa-scenario-gen.py
candidates 감지 → required=true 자동 결정
7종 시나리오 객체 생성
coverage[] 배열 포함
.codex/loopy-era/qa-scenarios.json 출력
qa-scenarios.json
시나리오별 id, required
command, repair_command
required_coverage[]
evidence_contract 스펙
qa-cycle-runtime.py
scenario_checks() 루프
command 실행 → JSON 파싱
status / executed / coverage 검증
실패 시 repair_command 실행

7종 QA 시나리오

SCENARIO 01
ui-button-event
trigger: app_candidates
coverage: button, event_click, state_change
required when: UI 앱 감지
SCENARIO 02
modal-popup
trigger: app_candidates
coverage: modal_popup, open_close
required when: UI 앱 감지
SCENARIO 03
confirm-dialog
trigger: app_candidates
coverage: confirm_dialog, accept_cancel
required when: UI 앱 감지
SCENARIO 04
alert-dialog
trigger: app_candidates
coverage: alert_dialog, message_visibility
required when: UI 앱 감지
SCENARIO 05
browser-console-clean
trigger: app_candidates
coverage: console_errors, console_warnings
evidence: console_errors: 0 필수
required when: UI 앱 감지
SCENARIO 06
api-flow
trigger: service_candidates
coverage: request, response, error_handling
required when: 서비스 레이어 감지
SCENARIO 07
database-state
trigger: database_hints
coverage: write, read, state_assertion
required when: DB 레이어 감지
Evidence Contract 필수 필드: 각 시나리오 command는 JSON을 stdout으로 출력해야 한다. status: "pass"/"ok"/"success", executed: true, coverage: [...] (required_coverage와 일치), browser-console-clean 종류는 추가로 console_errors: 0 필수. 이 중 하나라도 누락/불일치 시 해당 시나리오 FAIL.
// qa-scenarios.json 구조 예시
{
  "scenarios": [
    {
      "id": "ui-button-event",
      "required": true,
      "command": "python3 .codex/scripts/test-button-event.py",
      "repair_command": "python3 .codex/scripts/repair-button-event.py",
      "required_coverage": ["button", "event_click", "state_change"],
      "evidence_contract": {
        "status": "pass | ok | success",
        "executed": true,
        "coverage": ["...required_coverage 항목들..."]
      }
    },
    {
      "id": "browser-console-clean",
      "required": true,
      "evidence_contract": {
        "console_errors": 0,  // 필수 — 0이어야 PASS
        "coverage": ["console_errors", "console_warnings"]
      }
    }
  ]
}

project-profile.json — QA 제어 필드

init-project-runtime.py가 생성하는 project-profile.json에 시나리오별 command/repair 14개 필드가 추가되었다. 이 필드들이 qa-scenario-gen.pyqa-cycle-runtime.py 전체 QA 체인을 제어한다.

감지 필드 (required 판단 근거)
app_candidates→ UI 시나리오 5종
service_candidates→ api_flow required=true
database_hints→ database-state required=true
시나리오 command 필드 (NEW × 7)
ui_scenario_commandNEW
modal_scenario_commandNEW
confirm_scenario_commandNEW
alert_scenario_commandNEW
browser_console_commandNEW
api_scenario_commandNEW
database_scenario_commandNEW
repair command 필드 (NEW × 7)
ui_scenario_repair_commandNEW
modal_scenario_repair_commandNEW
confirm_scenario_repair_commandNEW
alert_scenario_repair_commandNEW
browser_console_repair_commandNEW
api_scenario_repair_commandNEW
database_scenario_repair_commandNEW
required 판단 로직
app_candidates 감지ui/modal/confirm/alert/console = true
service_candidates 감지api_flow = true
database_hints 감지database-state = true
미감지 시required = false (skip)

자가개선 신호 수집 파이프라인

self-improve-trigger.sh가 5종의 소스에서 신호를 수집하고 중복 ack 필터링을 거쳐 ~/.codex/pending/self-improve-{key}.json에 저장한다. 신호가 있을 때만 worker가 LLM을 호출한다.

🔧
fix_commit
git log
--grep='^fix:'
세션 시작 이후
🔁
bug_fixer_retry
.codex/logs/*.jsonl
agent_spawn
bug-fixer 패턴
⚠️
recurrence
check-recurrence.py
self-improve 이력
× git fix 교차
📊
telemetry
self-improve-
telemetry.py
한국어 불만 패턴
🎯
adversarial_finding
adversarial-
review-l6.py
P1/P2 blocker
self-improve-worker.py 실행 흐름
01
쿨다운 체크
CODEX_SELF_IMPROVE_COOLDOWN_SECONDS=900 (15분). 이전 실행 이후 경과 확인.
02
lock 획득
~/.codex/state/self-improve-workers/{key}.lock — 동시 실행 방지.
03
신호 로드
load_pending() + unacked_signals() — acked_signal_ids로 중복 필터링.

04
worktree 격리
git worktree add --detach HEAD (실패 시 clone 폴백) + backup_codex()
05
LLM 호출
codex -o output.json < prompt — JSON schema 강제 (result/patch_scope/verification_checks)

06
patch_scope 라우팅
["codex"] → ~/.codex/ 즉시 적용
["project"] → queue 저장 (repo clean 필요)
["project","codex"] → codex 즉시 + project queue
07
검증 4종
file_contains · repo_script · codex_smoke · git_diff_check
08
ack + smoke + log
self-improve-ack.sh → self-improve-smoke.sh → self-improve-log.sh

Claude Code → Codex 이식 비교

Claude Code의 /team · /init-project · /qa-cycle · /qa-scenario-gen 4개 핵심 스킬이 Codex 환경에서 어떻게 재구현되었는지 비교한다. 공통 방향은 LLM 자연어 지시 → Python 런타임 실행으로의 전환이다.

/team
Claude Code
  • Phase 0~5 오케스트레이터, /qa-cycle 자동 연계
  • TaskCreate/TaskUpdate 기반 작업 추적
  • frontend/backend/supabase specialist agents 위임
  • Telegram 알림 포함 Phase 5 마무리
  • 오케스트레이터 선택(manager/team) 기준 내장
  • qa-test-plan.md 없으면 qa-scenario-gen 선행 실행
Codex
  • team-runtime.py --execute --json 단일 진입점
  • schema-enforced JSON output (workers/patches/applied)
  • ThreadPoolExecutor 기반 실제 병렬 worker 실행
  • project_patch_allowed 안전 게이트 내장 (repo clean 여부)
  • blocker_total=0이면 plan 단계에서 status: "skip" 반환
  • loop-era supervisor가 자동 호출 (7·8번 phase)
주요 차이점
실행 방식 LLM이 specialist 에이전트 호출 + TaskAPI 추적 Python 런타임이 직접 worker 프로세스 관리 (ThreadPoolExecutor)
병렬성 보장 Promise.all() 패턴, 에이전트 자율 판단 JSON 출력의 parallel_execution: true 명시 확인
패치 안전성 코드 직접 수정, 실패 시 bug-fixer 재시도 HARD project_patch_allowed 게이트, worktree 격리
QA 연계 Phase 4에서 /qa-cycle 스킬 명시 호출 qa_cycle phase (9번)로 supervisor가 자동 실행
/init-project
Claude Code
  • 산출물: .claude/CLAUDE.md, .claude/skills/
  • ~/.claude/skills/{project}-scaffold/ 생성
  • settings.json MCP 서버 설정 포함
  • auto-issue.md, qa-scenarios.md 생성
  • 훅 설정, 스킬 연결 포함
Codex
  • 산출물: .codex/rules/project-conventions.rules
  • .codex/skills/ (backend-patterns, frontend-patterns, qa-strategy)
  • ~/.codex/skills/{project}-scaffold/ 생성
  • NEW project-profile.json에 시나리오 command 14개 필드 포함
  • loopy-era supervisor가 매 반복 시 자동 호출 (1번 phase)
주요 차이점
설정 위치 .claude/ → Claude Code 전용 .codex/ → Codex 전용, .claude/ 미의존
실행 빈도 수동 /init-project 호출 시 1회 AUTO 매 loop iteration 시작 시 자동 실행
시나리오 설정 qa-scenarios.md 텍스트 문서 생성 project-profile.json에 command/repair 14개 필드 포함
MCP 설정 settings.json에 MCP 서버 포함 config.toml으로 분리, init-project 범위 외
/qa-cycle
Claude Code
  • Phase 1~5, 프로젝트 타입 자동 감지 (Node/Python/Flutter/Go/Rust)
  • agent-browser로 실제 UI 인터랙션 검증
  • CRUD 라운드트립 필수, CLICK-CRUD TC 전수 실행
  • push gate: .qa-cycle-passed 파일 기반
  • CRITICAL 발견 시 bug-fixer 자동 호출 최대 5라운드
  • Codex 크로스 리뷰 병행 (코드 품질 이중화)
Codex
  • qa-cycle-runtime.py Python 런타임, JSON 출력
  • failure_labels로 실패 분류, repair_strategy 자동 결정
  • --max-rounds N 파라미터로 반복 제어
  • NEW scenario_checks(): qa-scenarios.json 읽어 7종 시나리오 실행
  • NEW evidence contract 검증: status/executed/coverage/console_errors
  • .codex/loopy-era/qa-cycle-report.json 결과 저장
주요 차이점
UI 테스트 agent-browser + web-qa-tester 실제 브라우저 인터랙션 scenario_checks()가 qa-scenarios.json command 실행 + evidence 검증
실패 분류 CRITICAL/HIGH/MEDIUM/LOW severity 기반 failure_labels (build/type/lint/test) + repair_strategy.source
자동 수정 bug-fixer 에이전트 호출 최대 4회 qa_fix_retry phase에서 team-runtime.py 재실행 + repair_command
push gate HARD .qa-cycle-passed 파일 + 1시간 TTL 해시 검증 loop-era metric으로 추적, 별도 push gate 미구현
/qa-scenario-gen
Claude Code
  • 요구사항 → QA 시나리오(계약) → 구현 검증 흐름
  • docs/qa-test-plan.md 생성 — TC 번호 체계 포함
  • CLICK-CRUD 카테고리 TC 강제 생성 규칙 내장
  • /team이 qa-test-plan.md 없을 때 선행 자동 호출
  • TC 통과 기준: "요소 존재" 아닌 실제 인터랙션
Codex
  • PORTED qa-scenario-gen.py 독립 Python 런타임으로 구현
  • phase 02로 loop-era supervisor에 통합 (자동 실행)
  • project-profile.json 읽어 7종 시나리오 required 자동 결정
  • qa-scenarios.json 출력 → qa-cycle-runtime.py 소비
  • evidence contract 기반 검증 (status/executed/coverage 필수)
/qa-scenario-gen은 Codex에서 qa-scenario-gen.py로 독립 구현되었다. Claude Code의 수동 호출 스킬과 달리, Codex에서는 phase 02로 loop-era supervisor에 완전 통합되어 매 iteration마다 자동 실행된다. TC 번호 체계와 qa-test-plan.md 대신 JSON evidence contract 방식으로 검증 의도를 구조화했다.

현재 실행 상태 — ralph-loop iteration 11

.codex/ralph-loop/state.json 기준. iteration 11에서 l6_blocker_count = 0 달성, stopping_condition 만족으로 status: completed. team_plan은 blockers 없어 skip.

ralph-loop/state.json — iteration 11
iteration11
statuscompleted
metric_namel6_blocker_count
current_metric_value0
stopping_conditionSupervisor/orchestrator verification and adversarial review both reached zero core blockers.
team_plan.statusskip (blocker_total=0)
qa_cycle.statuspass
iteration
11
완료된 반복 횟수
L6 blockers
0
목표 달성, stopping condition 충족
team_plan
skip
blockers 없어 실행 불필요
qa_cycle
pass
모든 시나리오 evidence 충족

Smoke Test — 8가지 통합 테스트

self-improve-smoke.sh는 구문 검사를 넘어 실제 임시 git repo를 생성하고 전체 파이프라인을 검증한다. smoke가 통과해야만 verify-l6.sh의 blocker_count에 영향을 주지 않는다.

TEST 01
구문 검증
bash -n × 10개 스크립트, python3 -m py_compile × 10개. 파싱 불가 스크립트 사전 차단.
exit 0 on success
TEST 02
Pre-Submit Gate
tmp repo + "forbidden prompt" 규칙 → codex-pre-submit-gate.py 호출 → STATUS=1 차단 확인. 차단이 PASS.
blocked = PASS
TEST 03
Git Hook 설치
install-git-hooks.sh → pre-commit/pre-push에 "cc-sync codex hook chain" 포함 확인. 기존 hook은 .local 보존.
hook chain verified
TEST 04
Verify/Review/Status
세 컴포넌트 동시 실행. JSON 필수 필드 존재 확인. [ralph-loop], [self-improve], [team-runtime] pretty 출력 검증.
all fields present
TEST 05
Ralph-Loop 시드
tmp repo → ralph-loop.sh start → .codex/ralph-loop/state.json 생성 확인 → stop. 전체 등록/취소 사이클.
state.json created
TEST 06
Stale Running 복구
2시간 전 started_at + sleep 60 PID 주입 → status=stale_running 확인 → dry-run 실행 → running=False 전환.
stale → recovered
TEST 07
Timeout + Backoff
codex=sleep 2, timeout=1초 → status=backoff, last_result=escalation_required, disabled_until 설정 확인.
backoff activated
TEST 08
Patch Routing
codex-only ["codex"] → ~/.codex/ 즉시 적용. mixed ["project","codex"] → codex 즉시, project는 queue 대기.
routing verified

구현 수준 종합 평가

신호 수집
100%
5종 신호, 한국어 패턴 포함 텔레메트리
15단계 파이프라인
100%
PHASE_ORDER 완전 구현, qa_scenario_gen 추가
Smoke Test
100%
8가지 통합 테스트, stale/timeout 엣지 케이스
Supervisor 데몬
100%
PID·launchd·heartbeat·stale 복구
QA Scenarios
100%
7종 시나리오, evidence contract, repair chain
Project 패치
70%
repo clean 조건 필요 → queue 대기
Claude Code 이식
92%
qa-scenario-gen 이식 완료, UI 테스트·push gate 미이식
이식의 핵심 철학: Claude Code에서 "LLM이 자연어로 판단하던 것"이 Codex에서 "Python 런타임이 JSON으로 결정하는 것"으로 전환되었다. 팀 오케스트레이션, QA 사이클, 프로젝트 초기화 모두 동일한 방향이다. /qa-scenario-gen도 독립 스킬에서 phase 02 런타임으로 완전 이식되어 evidence contract 기반 자동 검증이 가능해졌다. 브라우저 기반 UI 인터랙션 검증과 push gate는 아직 미이식 상태다.