Harness engineering: leveraging Codex in an agent-first world
핵심 포인트
- 1이 논문은 OpenAI가 5개월 동안 Codex 에이전트가 작성한 백만 줄의 코드로 소프트웨어 제품을 개발한 실험을 상세히 설명하며, 수동으로 작성된 코드는 전혀 없었음을 강조합니다.
- 2개발팀의 역할은 코딩에서 에이전트가 작업을 수행할 수 있도록 환경을 설계하고, 의도를 명확히 지정하며, 피드백 루프를 구축하는 것으로 변화했으며, 이를 위해 코드와 레파지토리의 legibility를 극대화했습니다.
- 3이 "Harness engineering" 접근 방식은 개발 시간을 1/10로 단축시켰고, 인간 엔지니어의 주요 임무를 scaffolding 및 제어 시스템 설계로 재정의하여 미래 에이전트 기반 소프트웨어 개발의 방향을 제시합니다.
이 논문은 OpenAI가 Codex를 활용하여 '0줄의 수동 작성 코드'로 소프트웨어 제품을 구축하고 배포한 5개월간의 실험에 대한 내용을 상세히 다룹니다. 이 실험의 핵심 목표는 엔지니어링 속도를 기하급수적으로 증가시키기 위해 소프트웨어 엔지니어링 팀의 주된 업무가 코드 작성에서 환경 설계, 의도 지정, 그리고 Codex 에이전트가 신뢰할 수 있는 작업을 수행하도록 피드백 루프를 구축하는 것으로 변화하는 상황을 이해하는 것이었습니다.
핵심 방법론 및 기술적 세부사항:
- 에이전트 중심 개발 (Agent-First Development):
- 코드 생성: 애플리케이션 로직, 테스트, CI/CD 구성, 문서, 관측성(observability), 내부 도구 등 모든 코드가 Codex에 의해 작성되었습니다. 초기 Git 저장소 스캐폴드(저장소 구조, CI 구성, 포맷팅 규칙, 패키지 관리자 설정)조차 GPT-5를 사용하는 Codex CLI에 의해 생성되었습니다.
- 인간의 역할 재정의: 인간 엔지니어는 직접 코드를 작성하지 않고, 에이전트가 효과적으로 작동할 수 있는 환경을 설계하고, 상위 목표를 더 작은 빌딩 블록으로 분해하며, 에이전트에게 이를 구성하도록 프롬프트하고, 결과물을 검토하는 데 집중합니다. 문제가 발생하면 "무슨 기능이 부족한가, 그리고 에이전트에게 어떻게 이를 명확하고 강제할 수 있는가?"를 질문하여 시스템을 개선했습니다.
- 상호작용: 엔지니어는 주로 프롬프트를 통해 시스템과 상호작용하며, 에이전트에게 특정 작업을 부여하고 Pull Request(PR)를 열도록 지시합니다. Codex는 자체 변경 사항을 로컬에서 검토하고, 추가적인 에이전트/인간 검토를 요청하며, 피드백에 응답하고 반복하여 PR을 완료합니다. 이를 위해
gh, 로컬 스크립트, 저장소 내장 스킬(repository-embedded skills)과 같은 표준 개발 도구를 직접 사용합니다.
- 애플리케이션 가독성(Legibility) 증진 (에이전트 중심):
- UI/UX 상호작용: Codex가 애플리케이션의 UI, 로그, 메트릭을 직접 이해하고 상호작용할 수 있도록 시스템을 구축했습니다. 예를 들어, 앱을 Git worktree별로 부팅 가능하게 하여 Codex가 변경 사항마다 격리된 인스턴스를 실행하고 테스트할 수 있도록 했습니다.
- 디버깅 및 검증: Chrome DevTools Protocol을 에이전트 런타임에 연결하고, DOM 스냅샷, 스크린샷, 내비게이션 작업을 위한 스킬을 생성했습니다. 이를 통해 Codex는 버그를 재현하고, 수정 사항을 검증하며, UI 동작을 직접 추론할 수 있었습니다.
- 관측성 통합: 로그, 메트릭, 트레이스는 로컬 관측성 스택을 통해 Codex에 노출되었습니다. Codex는 LogQL로 로그를 쿼리하고 PromQL로 메트릭을 쿼리하여 성능 목표("서비스 시작이 800ms 미만으로 완료")나 SLA("주요 사용자 여정의 어떤 스팬도 2초를 초과하지 않음")를 검증할 수 있습니다.
- 저장소 지식 관리 (Repository Knowledge Management):
- 구조화된 지식 기반: 거대한 단일
AGENTS.md파일의 한계를 인식하고,docs/디렉토리를 구조화된 지식 기반의 시스템으로 채택했습니다.AGENTS.md는 짧은 목차 역할만 하며, 실제 상세 정보는design-docs/,exec-plans/,product-specs/,references/등의 하위 디렉토리에 저장됩니다. - 점진적 공개 (Progressive Disclosure): 에이전트는 작고 안정적인 진입점에서 시작하여 필요한 경우 더 깊은 소스를 참조하도록 학습되었습니다.
- 자동화된 검증: 전용 린터(linter)와 CI 작업이 지식 기반의 최신성, 교차 링크, 구조적 정확성을 검증합니다. "doc-gardening" 에이전트는 오래되거나 쓸모없는 문서를 스캔하여 수정 PR을 엽니다.
- 저장소 내 컨텍스트: 에이전트에게 접근 가능한 유일한 컨텍스트는 저장소 로컬의 버전 관리되는 아티팩트(코드, 마크다운, 스키마, 실행 계획)입니다. Slack 대화나 구두 논의 같은 외부 정보는 에이전트에게는 존재하지 않는 것으로 간주됩니다.
- 구조화된 지식 기반: 거대한 단일
- 아키텍처 및 스타일 강제 (Architecture and Taste Enforcement):
- 불변성(Invariants) 강제: 코드베이스의 일관성을 유지하기 위해 불변성을 강제하지만, 구현 방식에 대해선 마이크로매니징하지 않습니다. 예를 들어, 데이터 형태를 경계에서 파싱하도록 요구하지만 특정 라이브러리(예: Zod)를 강제하지는 않습니다.
- 엄격한 아키텍처 모델: 각 비즈니스 도메인은 고정된 계층(예:
Types→Config→Repo→Service→Runtime→UI)으로 나뉘며, 엄격하게 검증된 의존성 방향과 허용되는 엣지만을 가집니다. - 기계적 강제: 이러한 제약 조건은 Codex가 생성한 커스텀 린터와 구조적 테스트를 통해 기계적으로 강제됩니다. 크로스-커팅(cross-cutting) 관심사(인증, 텔레메트리 등)는 단일
Providers인터페이스를 통해 진입합니다. - '취향 불변성' (Taste Invariants): 구조화된 로깅, 명명 규칙, 파일 크기 제한, 플랫폼별 안정성 요구 사항과 같은 "취향 불변성"도 커스텀 린트를 통해 정적으로 강제됩니다. 린트 오류 메시지에는 에이전트 컨텍스트에 직접 수정 지침이 포함되어 있습니다.
- 지속적인 기술 부채 관리: 배경에서 실행되는 Codex 작업은 이러한 규칙의 위반 사항을 스캔하고, 품질 등급을 업데이트하며, 목표화된 리팩토링 PR을 생성합니다. 이는 기술 부채를 소량씩 지속적으로 상환하는 "가비지 컬렉션" 역할을 합니다.
- 처리량(Throughput) 중심의 병합 철학:
- 에이전트의 높은 코드 생성 처리량으로 인해, 전통적인 엔지니어링 관행이 비효율적이게 됩니다. PR은 짧은 주기로 유지되며, 최소한의 블로킹 병합 게이트(merge gates)를 가집니다. 테스트 실패(flake)는 진행을 무한정 막기보다 후속 실행으로 해결되는 경우가 많습니다. 에이전트 처리량이 인간의 주의를 훨씬 초과하는 시스템에서는 수정 비용이 저렴하고, 기다리는 것이 비쌉니다.
종합적으로, 이 프로젝트는 인간 엔지니어의 역할을 시스템 설계자 및 에이전트 인에이블러로 전환하고, 에이전트가 코드를 효과적으로 생성하고 유지보수할 수 있도록 최적화된 환경과 피드백 루프를 구축하는 데 중점을 둡니다. 이는 복잡한 소프트웨어를 에이전트를 통해 대규모로 구축하고 유지보수하는 새로운 패러다임을 제시하며, 앞으로의 소프트웨어 개발에서 환경 설계와 제어 시스템의 중요성을 강조합니다.