Harness Engineers에 대한 나의 첫 시도
Source: Dev.to
위에 제공된 내용 외에 번역할 텍스트가 없습니다. 번역하고 싶은 전체 텍스트를 알려주시면 한국어로 번역해 드리겠습니다.
소개
우리 팀이 BypassHire를 만들기 위해 나섰을 때 — 지원 시간을 45분에서 5분 이하로 줄여주는 AI 도구 — 우리는 흥미로운 엔지니어링 과제가 모델 자체가 아니라는 것을 곧 깨달았습니다. 모델은 쉬운 부분이었습니다. 어려운 부분은 그 주변 모든 것이었습니다.
Martin Fowler는 최근 그 주변 레이어를 harness engineering이라고 명명했습니다. 하네스는 모델 자체를 제외한 코딩‑에이전트 설정의 모든 요소 — 가이드, 센서, 규칙, 그리고 에이전트가 신뢰할 수 있는 결과를 생성하는지 판단하는 스캐폴딩을 의미합니다. 우리는 스프린트의 상당 부분을 바로 그것을 설계하는 데 사용했으며, 이 포스트에서는 우리가 만든 것과 그 이유를 설명합니다.
Harness Mechanisms
Fowler는 하네스 메커니즘을 두 가지 범주로 나눕니다.
Guides (feed‑forward controls)
Guides는 문제를 미리 예측하고 행동을 사전에 형성합니다.
-
Project‑level instruction file:
CLAUDE.md는 우리의 규칙, 강제 워크플로 순서 (/plan → /tdd → /build‑fix → /code‑review → /verify), 보안 규칙, 그리고 커버리지 임계값을 인코딩합니다. 모든 세션은 Claude가 이 파일을 읽음으로써 시작되며, 코드가 생성되기 전에 게임 규칙을 설정합니다. -
Specialized sub‑agents:
architectplannertdd‑guidecode‑reviewersecurity‑reviewer(OWASP‑범위, 인증 라우트, DB 쿼리, 또는 Claude API 프롬프트가 포함된 PR에 대해 작동)build‑error‑resolver
하나의 범용 에이전트가 모든 결정을 내리는 대신, 우리는 좁은 전문성을 가진 전문가 위원회를 만들었습니다. 전문화는 각 에이전트가 고려해야 할 범위를 줄여 신뢰성을 높입니다.
-
MCP server integrations: GitHub, Playwright, Vercel은 에이전트가 외부 시스템에 접근하도록 확장하지만 가드레일을 완화하지는 않습니다. 에이전트는 배포 상태를 확인하거나 브라우저 테스트를 실행할 수 있지만, 검토되지 않은 변경을 프로덕션에 적용할 수는 없습니다.
Sensors (feedback controls)
Sensors는 생성된 결과를 관찰하고 수정 신호를 보냅니다. 여기서 Claude Code의 훅 시스템이 인프라가 됩니다.
우리는 세션 라이프사이클에 연결된 네 가지 훅을 실행합니다:
- Lint on edit –
ESLint와Prettier는.ts또는.tsx파일이 수정될 때마다 즉시 실행됩니다. 피드백 루프가 밀리초 수준으로 단축됩니다. - Test‑runner guard on exit – Claude가 세션을 종료하려 할 때
npm test가 자동으로 실행됩니다. 테스트가 실패하면 세션 종료가 차단됩니다. “나중에 고칠게요”라는 상황이 구조적으로 불가능해집니다. - Green‑test commit signal – 테스트 러너 Bash 호출이
0으로 종료되면, 훅이 체크포인트 여부를 묻는 알림을 삽입합니다. 이 신호는 제안일 뿐이며, Claude가 결정하고 훅 자체가git commit을 실행하지는 않습니다. - Task‑completion commit signal – todo가 completed 상태로 전환될 때, 스냅샷 차이가 동일한 알림을 해당 작업 조각에 대해 발생시킵니다.
Fowler는 computational sensors(빠르고 결정적인: 린터, 타입 체커, 테스트)와 inferential sensors(AI 기반, 느리지만 의미적으로 풍부함)를 구분합니다. 우리의 훅은 계산형 센서이며, code‑reviewer와 security‑reviewer 서브‑에이전트는 추론형 센서로, 린터가 포착하지 못하는 아키텍처 및 행동 문제를 잡아냅니다.
활용 가능성
모든 코드베이스가 동일하게 활용하기 쉬운 것은 아니다. Fowler는 이를 harnessability — 시스템을 에이전트가 읽기 쉽게 만드는 구조적 특성이라고 부른다.
우리는 TypeScript, Prisma, Zod, 그리고 Next.js App Router를 의도적으로 선택했다. 강력한 타입, 스키마‑검증 ORM, 그리고 모든 API 경계에서의 런타임 입력 검증은 인간 리뷰어와 에이전트 센서 모두에게 정확하고 기계‑읽기 가능한 계약을 제공한다. 활용도는 잡는 표면만큼이나 좋다.
스티어링 루프
Fowler가 가장 중요하게 통찰한 점은 하네스에는 steering loop이 필요하다는 것이다 — 인간이 반복적인 실패를 모니터링하고 그에 따라 제어를 강화한다.
첫 번째 스프린트 이후, 우리는 Claude가 인증 패턴에서 가끔씩 벗어나는 것을 발견했다; 그래서 @clerk/nextjs/server에서 직접 임포트를 금지하는 ESLint 규칙을 추가하여 모든 인증을 src/lib/auth 래퍼를 통해 수행하도록 했다. 하네스는 우리가 실패 지점을 관찰함에 따라 더 똑똑해졌다.
그 루프 — observe → encode → enforce — 는 하네스 엔지니어의 실제 업무이다. 모델은 생성 작업을 담당하고, 우리는 생성 결과를 정직하게 유지하는 시스템을 담당한다.