하네스 엔지니어링: 에이전트 우선 세계에서 코덱스 활용

수동으로 작성된 코드가 zéro 인 상황으로의 전환

OpenAI는 zero lines of manually-written code 를 사용하여 내부 소프트웨어 제품을 성공적으로 개발하고 출시했습니다. 다섯 달 동안, 엔지니어 소규모 팀은 Codex 에이전트를 사용하여 애플리케이션 로직, 테스트, CI 구성, 문서화, 관찰 가능성 도구를 생성하여 약 백만 줄의 코드베이스를 만들었습니다. 팀은 이 에이전트 우선 접근 방식이 개발 시간을 수동 코딩이 필요한 시간의 약 1/10로 줄였다고 추정합니다.

엔지니어 역할 재정의: 코딩에서 스캐폴딩으로

인간이 코드 작성을 중단하면, 필요한 도구, 추상화, 내부 구조를 제공하여 에이전트가 유용한 작업을 수행할 수 있도록 하는 것이 주요 엔지니어링 과제가 됩니다.

시스템 우선 개발

실험 초기의 진행은 환경이 충분히 지정되지 않아 느렸습니다. 이를 극복하기 위해 엔지니어들은 깊이 우선 접근 방식을 채택했습니다: 큰 목표를 작은 빌딩 블록으로 나누고, 에이전트에게 이를 구축하도록 프롬프트한 후, 이러한 블록을 사용하여 더 복잡한 작업을 잠금 해제했습니다. 실패가 발생했을 때, 해결책은 프롬프트로 "try harder" 하는 것이 아니라, missing capability 또는 도구를 식별하고 에이전트가 사용할 수 있도록 제공하는 것이었습니다.

에이전트 주도 워크플로

인간은 주로 프롬프트를 통해 시스템과 상호 작용합니다. 일반적인 워크플로는 다음과 같습니다:

  1. 엔지니어가 작업을 설명합니다.
  2. 에이전트가 작업을 실행하고 풀 리퀘스트(PR)를 엽니다.
  3. 에이전트가 로컬에서 자신의 변경 사항을 검토하고 추가 에이전트 리뷰를 요청합니다.
  4. 에이전트는 인간 또는 에이전트 피드백을 기반으로 반복하여 모든 리뷰어가 만족할 때까지 진행합니다.

시간이 지나면서 팀은 거의 모든 리뷰 작업을 에이전트 간 상호 작용으로 전환했으며, 인간은 필요한 경우에만 PR을 검토합니다.

에이전트를 위한 애플리케이션 가독성 향상

인간 QA가 병목 현상이 되는 것을 방지하기 위해 OpenAI는 애플리케이션과 그 télémétrie(텔레메트리) 를 Codex 에이전트가 직접 이해할 수 있도록 만드는 데 중점을 뒀습니다.

  • UI Legibility: 에이전트 런타임에 Chrome DevTools Protocol을 연결하고 git worktree당 앱을 부팅 가능하게 함으로써, 에이전트는 인스턴스를 시작하고, 버그를 재현하고, 수정을 검증하며, DOM 스냅샷과 스크린샷을 사용하여 UI 동작에 대해 추론할 수 있습니다.
  • Observability Legibility: 에이전트는 로컬이고 일시적인 osservability 스택에 접근할 수 있습니다. LogQL을 통해 로그를 쿼리하고 PromQL을 통해 메트릭을 쿼리할 수 있어, "ensure service startup completes in under 800ms." 와 같은 성능 기반 프롬프트를 처리할 수 있습니다.

저장소 지식을 시스템의 기록으로

에이전트 성능은 정확한 컨텍스트 관리에 달려 있습니다. OpenAI는 단일적인 지침 매뉴얼이 작업별 컨텍스트를 밀어내고 빠르게 outdated 되므로 역효과가 난다는 것을 발견했습니다.

지도 대 매뉴얼

거대한 지침 파일 대신, 팀은 약 100줄 정도의 짧은 AGENTS.md 파일을 사용하며, 이는 목차 역할을 합니다. 이 지도는 구조화된 docs/ 디렉터리를 가리키며, 이는 시스템의 기록으로 작동합니다. 이 접근 방식은 점진적 공개를 가능하게 하며, 여기서 에이전트는 작은 진입점으로 시작하고 더 깊은 정보를 찾을 위치를 배우게 됩니다.

지식의 기계적 적용

  • 전용 린터 및 CI 작업: 지식 베이스가 최신 상태이고 교차 연결되었는지 검증하기 위해 사용됩니다.
  • 문서 관리 에이전트: 오래된 문서를 스캔하고 실제 코드 동작과 일치하도록 문서를 조정하는 수정 PR을 엽니다.

아키텍처와 취향 적용

엄격한 아키텍처 레이어

각 비즈니스 도메인은 엄격하게 검증된 의존 방향을 가진 고정된 레이어 세트로 나뉩니다: Types $ ightarrow$ Config $ ightarrow$ Repo $ ightarrow$ Service $ ightarrow$ Runtime $ ightarrow$ UI. 교차 관심사(예: auth, telemetry)는 명시적인 "Providers"를 통해서만 진입합니다. 이러한 제약 조건은 사용자 정의된 에이전트 생성 린터를 통해 기계적으로 적용됩니다.

"취향" 인코딩

인간 엔지니어링의 "취향"—예를 들어 명명 규칙, 구조화된 로깅, 파일 크기 제한—은 사용자 정의 린트에 인코딩됩니다. 규칙이 위반되면, 린터가 에이전트의 컨텍스트에 직접 복구 지침을 주입합니다.これにより 인간 판단을 한 번 포착하여 코드베이스 전체에 보편적으로 적용할 수 있습니다.

자율성과 엔트로피 문제

개발 루프가 완전히 인코딩됨에 따라 Codex는 end-to-end 자율성의 임계점에 도달했습니다. 단일 프롬프트만으로 에이전트는 이제 버그를 재현하고, 실패 비디오를 기록하고, 수정을 구현하고, 앱을 실행하여 검증하고, 해결 비디오를 기록하며 PR을 병합할 수 있습니다.

"AI 슬롭" 관리

완전한 자율성은 저장소 다른 곳에서 발견된 비최적 패턴을 에이전트가 복제할 위험을 도입합니다.これに 맞서 OpenAI는 다음과 같은 "가비지 컬렉션" 프로세스를 구현했습니다:

  1. 골든 원칙: 공유 유틸리티 패키지를 수작업 헬퍼보다 선호하는 것과 같은 의견이 반영된 기계적 규칙이 저장소에 정의됩니다.
  2. 반복적 정리: 백그라운드 Codex 작업이 이러한 원칙에서의 편차를 스캔하고 대상 리팩터링 PR을 엽니다.

커뮤니티 관점과 비판

"아직 이해가 가지 않는 점은 왜 대량의 생성된 코드가 플렉스인지입니다. ... 저는 생성된 코드 라인을 가능한 적게 최적화해야 한다고 주장하며, 부차적 최적화는 인간의 가독성이 되어야 한다고 생각합니다.

비평가들은 백만 줄 코드베이스가 효율성의 예인지 아니면 "bloat"인지 의문을 제기하며, 인간 주도 접근 방식이 훨씬 적은 코드로 동일한 결과를 달성할 수 있었을 것이라고 제안했습니다. 다른 이들은 투명성 부족에 대해 회의감을 표명했는데, 구체적으로 построен된 제품 이름이 jamais 명시되지 않았고 저장소가 비공개로 남아 있기 때문입니다.

그러나 일부 개발자는 에이전트 워크플로에서 유사한 경험을 보고하며, 에이전트가 주요 저자일 때 엄격한 엔지니어링 모범 사례(예: 타입 안전성 및 경계 파싱)의 필요성이 중요해진다고 지적했습니다. 왜냐하면 이러한 제약 조건이 규모에서 신뢰성을 보장할 수 있는 유일한 방법이기 때문입니다.

Sources