deep dive · codex · loopy-era

Codex
Harness System

start-harness.sh라는 시작 명령 한 줄로 켜지는 '하네스(harness)' 시스템을 처음부터 끝까지 뜯어봅니다. 하네스란, AI가 스스로 코드를 고치고 "다 됐다"고 말할 때 정말 됐는지 증거로 검사해 통과 못 하면 막아 주는 자동 감시·실행 장치입니다. 이 시스템은 스스로 실수를 찾아 규칙과 코드를 고쳐 나가며, Codex(오픈AI의 코딩 AI) 위에서 돌아갑니다. 여기에, 원래 Claude Code(앤트로픽의 코딩 AI 도구)에서 쓰던 핵심 명령 네 가지 /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
켜는 시작 지점
명령 5개 제공
DAEMON
loop-era-supervisor.sh
nohup / launchd
생존 신호 감시
REGISTER
ralph-loop.sh
프로젝트 등록
기본 파일 심기
ORCHESTRATE
loop-era-supervisor.py
15단계 순차 처리
등록 목록 관리
IMPROVE
self-improve-worker.py
AI에 수정 요청
격리 사본에서 수정
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.py라는 지휘 프로그램 안의 PHASE_ORDER라는 목록이 15단계의 실행 순서를 정해 둡니다. 이 시스템이 잘 돌아가는지 재는 잣대는 l6_blocker_count인데, 이건 "아직 남은 치명적 문제(blocker)의 개수"이고 0이 목표입니다. 각 단계의 결과는 phase_history라는 기록에 차곡차곡 쌓이고, 마지막에는 results.tsv에 "살림(keep)"인지 "버림(discard)"인지로 남습니다.

이 시스템의 두 번째 버전(v2)에서 qa_scenario_gen이라는 단계가 두 번째 자리에 새로 끼면서, 원래 14단계였던 흐름이 → 15단계로 늘었습니다.

01
init_project
이 프로젝트가 어떤 프로젝트인지 "프로필"을 만듭니다. 어떤 기술을 쓰는지, 코딩 습관은 어떤지, 품질 검사(QA)는 어떻게 할지를 자동으로 알아냅니다. app_candidates / service_candidates / database_hints 즉 화면·서비스·데이터베이스의 흔적을 찾아내고, 그에 맞춰 어떤 검사를 꼭 해야 할지를 자동으로 정합니다.
→ 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)·브라우저 콘솔 오류 이렇게 4가지 축으로 나눠, "꼭 필요함"으로 표시된 검사만 실행 목록에 넣습니다. 각 검사는 통과했다는 증거를 정해진 형식(evidence contract, 증거 계약)으로 반드시 남겨야 합니다.
→ qa-scenario-gen.py → .codex/loopy-era/qa-scenarios.json
new
03
self_improve_trigger
"고칠 게 있다"는 신호를 모으는 단계입니다. 버그를 고친 커밋(fix), 자동 수리 도구(bug-fixer)의 재시도, 같은 문제의 반복, 사용 중 남은 기록(telemetry) 등을 모아 대기 파일(pending)에 저장합니다. 이어서 규칙이 실제로 효과가 있는지 점검하고, 자주 걸리는 규칙은 더 강하게 강제하는 규칙으로 승격하는 뒷정리를 합니다.
→ self-improve-trigger.sh → ~/.codex/pending/self-improve-{key}.json
signal
04
self_improve_worker_initial
아직 처리 안 한 신호가 있을 때만 돕니다. Codex(AI)에게 수정안을 물어보고, git의 별도 작업 사본(worktree)에서만 손대 원본을 지키고, 수정 조각(패치)을 만든 뒤, 4가지 검증을 통과하면 적용하고 아니면 대기열(queue)에 넣어 둡니다.
→ self-improve-worker.py run (timeout: 2400s)
LLM
05
verify_initial
남은 치명 문제(blocker)의 개수를 숫자로 잽니다. 꼭 있어야 할 파일 17개가 있는지, 파이썬 코드 10개가 오류 없이 컴파일되는지, Bash 스크립트 4개의 문법이 맞는지, 그리고 전체가 돌아가는지 빠른 통합 점검(smoke test)까지 확인합니다.
→ .codex/autoresearch/verify-l6.sh → {metric, value, status}
verify
06
adversarial_review_initial
숫자로는 안 잡히는 부분을 눈으로 뜯어보는 리뷰입니다. 필요한 산출물이 다 있는지, 서로 맞게 동기화됐는지, 옛 Claude Code에 기대던 흔적이 남았는지, 검문 스크립트(hook)들이 제대로 이어졌는지, 통합 점검 틀이 규칙대로인지를 살핍니다.
→ .codex/autoresearch/adversarial-review-l6.py → {blocker_count, findings[]}
review
07
team_plan
앞의 측정과 리뷰 결과를 보고, 여러 일꾼(worker)을 동시에 돌릴 수 있게 작업 배분 계획을 짭니다. blocker_total=0이면(남은 문제가 없으면) status: "skip" 을 돌려주고 이 단계를 건너뜁니다. 문제가 있으면 가장 급한 경로부터, 그리고 검증·반박 리뷰·확인용 일꾼을 만들어 붙입니다.
→ team-runtime.py --json (제한시간 1800초) · 여러 일꾼을 동시(병렬) 실행
plan
08
team_execute
짠 계획을 실제로 실행합니다. 동시 실행 여부(parallel_execution), 시작된 일꾼 수(workers_started), 프로젝트 코드에 손대도 되는지(project_patch_allowed)를 결과에 기록합니다. 이때 저장소에 커밋 안 된 변경이 없는 "깨끗한 상태(repo clean)"인지가, 코드에 손대도 되는지를 가릅니다.
→ team-runtime.py --execute --json → .codex/ralph-loop/team-execution-latest.json
exec
09
qa_cycle
실제 품질 검사(QA)를 돕니다. 빌드가 되는지, 타입이 맞는지, 코드 스타일 검사(린트)를 통과하는지, 단위·통합 테스트가 도는지 확인합니다. qa-scenarios.json에 적힌 검사별 명령을 실행하고, 통과 증거(evidence contract)가 규격대로 나왔는지 검증합니다. 실패는 종류별 이름표(failure_labels)로 분류합니다.
→ qa-cycle-runtime.py --max-rounds N (제한시간 1200초) · 시나리오 검사 scenario_checks() 포함
QA
10
qa_fix_retry
QA에서 실패가 남아 있으면 team-runtime이 자동으로 고친 뒤 QA를 다시 돌립니다. 고치는 명령(repair_command)도 프로필에서 불러옵니다. 최대 N번까지 반복합니다.
→ team-runtime.py --execute → qa-cycle-runtime.py (loop)
retry
11
inject_adversarial_findings
앞선 리뷰(6단계)에서 찾은 지적 사항을 다음 개선 대기 신호로 집어넣습니다. 이것들은 다음 자가개선 회차에서 처리됩니다.
→ merge_adversarial_findings()
inject
12
self_improve_worker_adversarial
방금 넣은 리뷰 지적 사항을 신호 삼아 다시 도는 자가개선 회차입니다. Codex가 만든 수정 조각(패치)을 적용하고 검증합니다.
→ self-improve-worker.py run
LLM
13
verify_final
모든 수정을 마친 뒤, 남은 치명 문제(blocker) 개수를 마지막으로 잽니다. 이 값이 "현재 성적(current_metric_value)"으로 기록됩니다.
→ verify-l6.sh
verify
14
adversarial_review_final
마지막으로 눈으로 보는 리뷰입니다. 남은 문제 개수(blocker_count)가 0이어야 "이제 멈춰도 된다"는 완료 조건(stopping_condition)을 채웁니다. 아직 남은 지적은 다음 반복 회차로 넘깁니다.
→ adversarial-review-l6.py
final
15
closeout
마무리 단계입니다. 결과를 results.tsv에 덧붙이고, 지표를 metrics.jsonl에 그 순간 상태로 남기고, 활동 기록(action_log)을 보내고, 다음 실행 시각(next_run_at)을 갱신한 뒤, 상태를 "완료(completed)" 또는 "진행 중(active)"으로 정합니다.
→ results.tsv + loop-era-metrics.jsonl + action-log.sh
done

qa-scenario-gen — 무엇을 검사할지 자동으로 정하는 부품

qa-scenario-gen.py는 위 흐름의 2단계에서 따로 실행되는 파이썬 프로그램입니다. 하는 일은 "무엇을 검사할지"를 자동으로 정하는 것입니다. project-profile.json이라는 프로필 파일에서 app_candidates, service_candidates, database_hints, 즉 화면·서비스·데이터베이스의 흔적을 읽어, 7가지 검사(시나리오) 각각이 required 즉 "꼭 필요한지"를 자동으로 정하고, qa-scenarios.json이라는 검사 목록 파일을 만들어 냅니다.

그다음 qa-cycle-runtime.py안의 scenario_checks()라는 함수가 이 목록 파일을 읽어 각 검사 명령을 실제로 돌리고, 통과 증거(evidence contract, JSON으로 출력)가 규격대로 나왔는지 확인합니다.

검사 목록이 만들어져 실제 검증까지 흘러가는 과정
project-profile.json
app_candidates → 화면(UI) 검사
service_candidates → 서버 통신(API) 검사
database_hints → 데이터베이스(DB) 검사
*_scenario_command × 7
*_repair_command × 7
qa-scenario-gen.py
흔적 감지 → "꼭 필요함" 자동 표시
검사 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() 반복 검사
검사 명령 실행 → 결과(JSON) 읽기
통과·실행 여부·항목 검증
실패하면 고치는 명령 실행

7가지 QA 검사 항목

SCENARIO 01
ui-button-event
trigger: app_candidates
coverage: button, event_click, state_change
필요 조건: 화면(UI) 앱이 감지될 때
SCENARIO 02
modal-popup
trigger: app_candidates
coverage: modal_popup, open_close
필요 조건: 화면(UI) 앱이 감지될 때
SCENARIO 03
confirm-dialog
trigger: app_candidates
coverage: confirm_dialog, accept_cancel
필요 조건: 화면(UI) 앱이 감지될 때
SCENARIO 04
alert-dialog
trigger: app_candidates
coverage: alert_dialog, message_visibility
필요 조건: 화면(UI) 앱이 감지될 때
SCENARIO 05
browser-console-clean
trigger: app_candidates
coverage: console_errors, console_warnings
evidence: console_errors: 0 오류 0 필수
필요 조건: 화면(UI) 앱이 감지될 때
SCENARIO 06
api-flow
trigger: service_candidates
coverage: request, response, error_handling
필요 조건: 서버 통신 부분이 감지될 때
SCENARIO 07
database-state
trigger: database_hints
coverage: write, read, state_assertion
필요 조건: 데이터베이스 부분이 감지될 때
통과 증거(evidence contract)에 반드시 있어야 할 항목: 각 검사 명령은 결과를 정해진 형식(JSON)으로 화면에 출력해야 합니다. 즉 status: "pass"/"ok"/"success", executed: true, 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": ["...확인해야 할 항목들..."]
      }
    },
    {
      "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에는, 검사별로 "실행 명령"과 "고치는 명령"을 담는 항목이 14개 새로 들어갔습니다. 이 항목들이 qa-scenario-gen.pyqa-cycle-runtime.py 로 이어지는 QA 전체 과정을 조종합니다.

감지 항목 (무엇을 검사할지 정하는 근거)
app_candidates→ 화면(UI) 검사 5종
service_candidates→ api_flow required=true
database_hints→ database-state required=true
검사 실행 명령 항목 (새로 추가 × 7)
ui_scenario_commandNEW
modal_scenario_commandNEW
confirm_scenario_commandNEW
alert_scenario_commandNEW
browser_console_commandNEW
api_scenario_commandNEW
database_scenario_commandNEW
고치는 명령 항목 (새로 추가 × 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
무엇을 꼭 검사할지 정하는 규칙
화면(UI) 앱 감지되면ui/modal/confirm/alert/console = true
서버 통신 부분 감지되면api_flow = true
데이터베이스 부분 감지되면database-state = true
아무것도 감지 안 되면required = false (skip)

"고칠 게 있다"는 신호를 모으는 과정

self-improve-trigger.sh가 5군데에서 "고칠 게 있다"는 신호를 모읍니다. 이미 처리한 신호는 걸러내(중복 방지) ~/.codex/pending/self-improve-{key}.json라는 대기 파일에 저장합니다. 이렇게 모인 신호가 있을 때만, 일꾼(worker)이 AI(LLM)에게 수정을 요청합니다.

🔧
fix_commit
git log
--grep='^fix:'
작업 시작 이후 생긴 것
🔁
bug_fixer_retry
.codex/logs/*.jsonl
agent_spawn
자동 수리 재시도 흔적
⚠️
recurrence
check-recurrence.py
과거 개선 기록
× 버그 수정 이력 대조
📊
telemetry
self-improve-
telemetry.py
한국어 불만 표현
🎯
adversarial_finding
adversarial-
review-l6.py
P1/P2 blocker
self-improve-worker.py가 실제로 도는 순서
01
쉬는 시간 확인
다시 돌기 전 강제로 쉬는 시간은 15분(900초)입니다. 지난 실행 뒤 그만큼 지났는지 확인합니다.
02
잠금 걸기
잠금 파일(~/.codex/state/self-improve-workers/{key}.lock)로 같은 작업이 동시에 두 번 도는 것을 막습니다.
03
신호 불러오기
대기 중인 신호를 불러오되, 이미 처리했다고 표시된 것은 걸러내 중복을 막습니다.

04
작업 사본 격리
git worktree add --detach HEAD (실패하면 통째로 복제해서 대신, 그리고 원본 백업)
05
AI에 요청
codex -o output.json < prompt — 답은 정해진 형식(JSON)으로만 받도록 강제 (결과·수정 범위·검증 항목)

06
수정 범위별 처리
["codex"] → 하네스 자체(~/.codex/)는 바로 적용
["project"] → 프로젝트 코드는 대기열에 저장 (저장소가 깨끗해야 적용)
둘 다면 → 하네스는 바로, 프로젝트 코드는 대기열로
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

같은 명령을 Codex로 옮겼을 때 무엇이 달라졌나

Claude Code에서 쓰던 /team · /init-project · /qa-cycle · /qa-scenario-gen 이 네 가지 핵심 명령이 Codex 환경에서 어떻게 다시 만들어졌는지 비교합니다. 공통된 방향은 하나입니다 — AI에게 말로 시키던 것을, 파이썬 프로그램이 직접 실행하도록바꾼 것입니다.

/team
Claude Code
  • 0~5단계로 전체를 지휘하고, /qa-cycle 를 자동으로 이어서 실행
  • 작업 생성·갱신 기능으로 진행 상황 추적
  • 프런트엔드·백엔드·DB 전문 에이전트에게 나눠 맡김
  • 마지막 5단계에서 텔레그램 알림까지 보내며 마무리
  • 규모에 따라 조율 방식(manager/team)을 고르는 기준이 들어 있음
  • 검사 계획서(qa-test-plan.md)가 없으면 검사 항목부터 먼저 만듦
Codex
  • team-runtime.py --execute --json 이라는 명령 하나로 실행
  • schema-enforced JSON output (workers/patches/applied)
  • ThreadPoolExecutor (파이썬 병렬 실행 도구)로 여러 일꾼을 실제 동시 실행
  • 프로젝트 코드에 손대도 되는지 검문하는 안전장치 내장 (저장소가 깨끗한지 확인)
  • blocker_total=0이면(문제가 없으면) 계획 단계에서 status: "skip" 을 돌려주고 건너뜀
  • loop-era 지휘 프로그램이 7·8단계에서 자동으로 부름
핵심 차이
실행 방식 AI가 전문 에이전트를 불러 쓰고, 작업 추적 기능으로 진행을 따라감 파이썬 프로그램이 일꾼 프로세스를 직접 관리 (병렬 실행 도구 사용)
동시 실행 보장 Promise.all() 방식으로 묶어 실행하되, 실제 동시 실행 여부는 에이전트 판단에 맡김 결과(JSON)에 parallel_execution: true 라고 분명히 적혀 있는지 확인
수정 안전성 코드를 바로 고치고, 실패하면 자동 수리 도구로 재시도 HARD 손대도 되는지 검문하는 게이트 + 별도 작업 사본에서만 수정
QA 연결 4단계에서 /qa-cycle 명령을 직접 불러 실행 9단계 qa_cycle에서 지휘 프로그램이 자동 실행
/init-project
Claude Code
  • 만들어지는 것: .claude/CLAUDE.md, .claude/skills/
  • ~/.claude/skills/{project}-scaffold/ 자동 생성
  • settings.json 에 외부 도구 연결(MCP) 설정 포함
  • auto-issue.md, qa-scenarios.md 자동 생성
  • 검문 스크립트(hook) 설정과 스킬 연결까지 포함
Codex
  • 만들어지는 것: .codex/rules/project-conventions.rules
  • .codex/skills/ (backend-patterns, frontend-patterns, qa-strategy)
  • ~/.codex/skills/{project}-scaffold/ 자동 생성
  • NEW project-profile.json에 검사용 명령 14개 항목 포함
  • loop-era 지휘 프로그램이 반복 때마다 1단계에서 자동으로 부름
핵심 차이
설정 위치 .claude/ → Claude Code 전용 폴더 .codex/ → Codex 전용 폴더, .claude/ 에 기대지 않음
실행 빈도 사람이 직접 /init-project 불렀을 때 한 번 AUTO 매 반복 회차 시작 때 자동 실행
검사 항목 설정 qa-scenarios.md 라는 텍스트 문서로 생성 project-profile.json에 실행·수정 명령 14개 항목으로 담음
외부 도구 연결(MCP) 설정 settings.json안에 외부 도구 서버 포함 config.toml이라는 별도 파일로 분리, 이 단계 담당 아님
/qa-cycle
Claude Code
  • 1~5단계로 진행, 프로젝트 종류 자동 감지 (Node/Python/Flutter/Go/Rust)
  • agent-browser로 실제 화면을 눌러 보며 검증
  • 저장·조회 왕복(CRUD) 확인 필수, 클릭+데이터 처리 검사를 전부 실행
  • push gate: .qa-cycle-passed 라는 통과 표시 파일로 관리
  • 치명 문제(CRITICAL) 발견 시 자동 수리 도구를 최대 5번까지 호출
  • Codex가 교차로 다시 리뷰 (품질을 이중으로 점검)
Codex
  • qa-cycle-runtime.py 라는 파이썬 프로그램, 결과는 JSON으로 출력
  • 실패에 이름표(failure_labels)를 붙여 분류하고, 고치는 방법을 자동으로 정함
  • --max-rounds N 값으로 반복 횟수 조절
  • NEW scenario_checks(): 검사 목록을 읽어 7가지 검사 실행
  • NEW 통과 증거(evidence contract) 검증: 통과 여부·실행 여부·항목·콘솔 오류 수
  • .codex/loopy-era/qa-cycle-report.json 에 결과 저장
핵심 차이
화면(UI) 테스트 agent-browser + web-qa-tester 로 실제 브라우저에서 눌러 보며 확인 scenario_checks()가 검사 목록의 명령을 실행하고 증거를 검증
실패 분류 심각도(치명·높음·보통·낮음) 기준 failure_labels (build/type/lint/test) + repair_strategy.source
자동 수정 자동 수리 에이전트를 최대 4번 호출 qa_fix_retry 단계에서 team-runtime.py를 다시 돌리고 고치는 명령 실행
push gate HARD 통과 표시 파일 + 1시간 유효 해시 검증으로, 통과 못 하면 올리기(push)를 막음 지표로만 추적하고, 올리기를 막는 검문소는 따로 없음
/qa-scenario-gen
Claude Code
  • 요구사항 → QA 검사(계약) → 구현이 그 계약을 지키는지 검증하는 흐름
  • docs/qa-test-plan.md 생성 — 테스트 항목(TC)마다 번호를 매김
  • 클릭+데이터 처리 검사를 반드시 만들게 하는 규칙 내장
  • /team이 검사 계획서가 없으면 이걸 먼저 자동으로 부름
  • 통과 기준: 화면에 "요소가 있다"가 아니라 실제로 눌러서 동작해야 함
Codex
  • PORTED qa-scenario-gen.py 라는 독립 파이썬 프로그램으로 구현
  • 2단계로 loop-era 지휘 프로그램에 통합 (자동 실행)
  • project-profile.json 을 읽어 7가지 검사 중 무엇이 필요한지 자동 결정
  • qa-scenarios.json 파일 출력 → qa-cycle-runtime.py 가 그 파일을 받아 사용
  • 통과 증거(evidence contract) 기준으로 검증 (통과 여부·실행 여부·항목 필수)
/qa-scenario-gen은 Codex에서 qa-scenario-gen.py라는 독립 프로그램으로 다시 만들어졌습니다. Claude Code에서는 사람이 필요할 때 직접 부르는 명령이었지만, Codex에서는 2단계로 loop-era 지휘 프로그램에 완전히 통합되어 매 반복마다 자동으로 실행됩니다. 테스트 항목 번호나 검사 계획서(qa-test-plan.md) 대신, JSON 형식의 통과 증거(evidence contract)로 "무엇을 확인해야 하는지"를 구조화했습니다.

지금 상태 — 11번째 반복에서 목표 달성

.codex/ralph-loop/state.json 라는 상태 파일 기준입니다. 11번째 반복에서 l6_blocker_count = 0 즉 "남은 치명 문제 0개"를 달성했습니다. "멈춰도 된다"는 완료 조건을 채워 상태는 status: completed(완료)가 됐고, 작업 배분(team_plan)은 남은 문제가 없어 건너뛰었습니다.

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
남은 문제 0 — 완료 조건 충족
team_plan
skip
남은 문제가 없어 실행 불필요
qa_cycle
pass
모든 검사의 통과 증거 충족

통합 점검(Smoke Test) — 전체가 진짜 도는지 보는 8가지

self-improve-smoke.sh는 문법만 보는 게 아니라, 진짜로 임시 git 저장소를 하나 만들어 전체 흐름이 처음부터 끝까지 도는지 확인합니다. 이 통합 점검(smoke)을 통과해야만, 앞서 본 "남은 문제 개수" 측정(verify-l6.sh)에서 문제로 잡히지 않습니다.

TEST 01
문법 검사
Bash 스크립트 10개와 파이썬 코드 10개의 문법이 맞는지 봅니다. 읽다가 깨지는 스크립트를 미리 걸러냅니다.
exit 0 on success
TEST 02
Pre-Submit Gate
임시 저장소에 "금지된 요청" 규칙을 넣고 제출 직전 검문(codex-pre-submit-gate.py)을 부릅니다. 검문이 STATUS=1로 막아 내면 성공입니다 — 여기서는 "막는 것"이 통과(PASS)입니다.
blocked = PASS
TEST 03
Git 검문 설치
커밋·올리기 직전에 자동으로 도는 검문(git hook)을 설치하고, 그 검문 목록이 제대로 들어갔는지 확인합니다. 원래 있던 검문은 .local로 따로 보존합니다.
hook chain verified
TEST 04
Verify/Review/Status
세 부품을 한꺼번에 돌립니다. 결과(JSON)에 꼭 있어야 할 항목이 다 있는지, 그리고 상태 요약이 보기 좋게 출력되는지 확인합니다.
all fields present
TEST 05
Ralph-Loop 등록
임시 저장소에서 반복 루프를 켜서 상태 파일(state.json)이 만들어지는지 확인하고 다시 끕니다. 등록부터 취소까지 한 바퀴를 점검합니다.
state.json created
TEST 06
멈춘 작업 복구
2시간 전에 시작한 것처럼 꾸미고 60초짜리 가짜 프로세스를 넣어, 시스템이 "오래 멈춤(stale)" 상태로 알아채는지 봅니다. 이어서 실제로는 안 건드리는 시험 실행(dry-run)으로 이를 풀어 "실행 안 함"으로 되돌립니다.
stale → recovered
TEST 07
Timeout + Backoff
AI 호출 제한이 1초인데 2초 걸리게 만들어 일부러 시간 초과를 냅니다. 그러면 시스템이 잠시 물러서는 상태(backoff)로 바뀌고, "사람이 봐야 함"으로 표시하며, 얼마간 실행을 멈추는지 확인합니다.
backoff activated
TEST 08
Patch Routing
수정 대상이 하네스 자체(["codex"])면 ~/.codex/에 바로 적용하고, 하네스와 프로젝트가 섞여 있으면(["project","codex"]) 하네스는 바로, 프로젝트 코드는 대기열에서 기다리게 하는지 확인합니다.
routing verified

얼마나 완성됐나 — 종합 평가

신호 수집
100%
5가지 신호, 한국어 불만까지 잡는 기록 수집
15단계 자동 흐름
100%
정해진 순서 전부 구현, qa_scenario_gen 단계 추가
Smoke Test
100%
통합 점검 8가지, 멈춤·시간초과 같은 예외 상황까지
상시 감시 데몬
100%
프로세스 관리·자동 시작·생존 신호·멈춤 복구
QA Scenarios
100%
검사 7종, 통과 증거 규칙, 자동 수정 연결
프로젝트 코드 수정
70%
저장소가 깨끗해야 적용 → 아니면 대기열에서 기다림
Claude Code에서 이식
92%
qa-scenario-gen은 옮김 완료, 화면 테스트·올리기 검문은 아직
옮기면서 지킨 핵심 원칙: Claude Code에서는 "AI가 말로 판단하던 일"을, Codex에서는 "파이썬 프로그램이 정해진 형식(JSON)으로 결정하는 일"로 바꿨습니다. 팀 지휘, QA 반복, 프로젝트 초기 설정 모두 같은 방향입니다. /qa-scenario-gen도 따로 부르던 명령에서 2단계 프로그램으로 완전히 옮겨져, 통과 증거(evidence contract)에 따른 자동 검증이 가능해졌습니다. 다만 브라우저로 화면을 직접 눌러 보는 검증과, 코드 올리기를 막는 검문소(push gate)는 아직 옮기지 못했습니다.