본문으로 건너뛰기

Hatice: Harness Engineering 실현 — OpenAI Symphony를 TypeScript로 재구현

정석

Hatice Orchestration

“Humans steer. Agents execute.”

이 문장이 Hatice의 철학을 관통합니다. OpenAI의 Symphony에서 영감을 받아, Claude Code Agent SDK를 기반으로 TypeScript로 재구현한 자율 코딩 에이전트 오케스트레이션 시스템입니다.

2026년 3월 6일, mksglu (Mert Can Altın)에 의해 탄생했습니다. 매우 최신 프로젝트이지만, 이미 30개 소스 파일, 328개 테스트, 10,817줄의 코드를 갖춘 완성도 높은 시스템입니다.


탄생 배경: Harness Engineering 선언문

Hatice는 단순한 이슈 자동화 도구가 아닙니다. Harness Engineering이라는 철학을 실현하는 시스템입니다.

엔지니어의 새로운 역할

전통적 역할Harness Engineering
직접 코드 작성환경 설계
버그 수정의도 명시
기능 구현피드백 루프 구축
모든 작업 수행에이전트가 실행, 인간이 조종

“Humans steer. Agents execute.” — Hatice의 핵심 철학

모든 코드는 에이전트가 작성합니다. 인간은 방향을 잡고, 환경을 설정하고, 결과를 검증합니다.


Symphony vs Hatice: 두 오케스트레이터의 대결

OpenAI의 Symphony에서 영감을 받았지만, Hatice는 TypeScript 생태계에 맞게 완전히 재설계되었습니다.

기능Symphony (Elixir/Codex)Hatice (TypeScript/Claude)
런타임Elixir/OTP (BEAM VM)Node.js 20+ / Bun
에이전트 SDKCodex JSON-RPCClaude Code Agent SDK query()
웹 프레임워크Phoenix + LiveViewHono + SSE
이슈 트래커Linear만Linear + GitHub Issues
비용 추적없음세션별 USD 추적
MCP 도구없음linear_graphql + github_graphql
TDD 방법론없음.claude/CLAUDE.md 내장
테스트17개 파일30개 파일, 328개 테스트

Hatice만의 독자적 기능

  1. GitHub Issues 지원owner/repo 형식으로 GitHub 이슈도 폴링
  2. Claude Code Agent SDK — 고수준 query() API로 간결한 에이전트 제어
  3. SSE 실시간 대시보드 — HTTP 서버로 실시간 상태 모니터링
  4. 타입드 EventBus — 와일드카드 지원으로 유연한 이벤트 핸들링
  5. 세션별 비용 추적 — 각 에이전트 세션의 USD 비용 추적
  6. 세밀한 도구 제어allowedTools / disallowedTools로 권한 관리
  7. MCP 서버 도구 — Linear/GitHub GraphQL 도구 직접 사용
  8. 내장 TDD 아키텍처.claude/CLAUDE.md에 TDD 방법론 내장

아키텍처: 7개 컴포넌트의 조화

bin/hatice.ts CLI 진입점
    |
    |-- StartupCleanup (오래된 워크스페이스 정리)
    |-- Supervisor (충돌 복구)
    |
    v
Orchestrator (메인 상태 머신)
    |-- OrchestratorState (running/claimed/completed/retry)
    |-- WorkflowStore (WORKFLOW.md 핫 리로드)
    |-- Workspace (격리 디렉토리 + 훅 + 정리)
    |
    |-- AgentRunner (Claude SDK 턴 루프)
    |   |-- SessionLogger (세션별 로그)
    |   |-- RateLimiter (429 추적)
    |   |-- InputHandler (입력 자동 응답)
    |   |-- TurnTimeout (턴별 마감)
    |   '-- PromptBuilder (LiquidJS 템플릿)
    |
    |-- EventBus (11개 이벤트 타입)
    |
    v
HttpServer (Hono)
    |-- GET / (SSE 대시보드)
    |-- GET /api/v1/state
    |-- GET /api/v1/:id
    |-- GET /api/v1/events
    '-- POST /api/v1/refresh

핵심 컴포넌트 분석

Orchestrator — 메인 상태 머신

WorkflowStore — WORKFLOW.md 핫 리로드

Workspace — 격리 디렉토리

AgentRunner — Claude SDK 턴 루프

EventBus — 타입드 이벤트


WORKFLOW.md: 선언적 오케스트레이션 설정

---
tracker:
  kind: linear
  apiKey: $LINEAR_API_KEY
  projectSlug: "MY-PROJECT"
  activeStates: ["Todo", "In Progress"]
  terminalStates: ["Done", "Cancelled"]
  assignee: "me"

workspace:
  rootDir: ~/workspaces

agent:
  maxConcurrentAgents: 5
  maxTurns: 20
  claude:
    permissionMode: bypassPermissions

server:
  port: 4000
---

You are an expert software engineer.
Solve the following issue:

**{{ issue.identifier }}: {{ issue.title }}**

{{ issue.description }}

Work in the provided workspace.
Write tests first, then implement.
Commit when done.

GitHub Issues 설정

tracker:
  kind: github
  apiKey: $GITHUB_TOKEN
  projectSlug: "owner/repo"
  activeStates: ["open"]
  terminalStates: ["closed"]

owner/repo 형식만으로 GitHub Issues를 폴링할 수 있습니다.


설치 및 실행

설치

# 클론
git clone https://github.com/mksglu/hatice.git
cd hatice

# 설치
npm install

데모 모드 (API 키 불필요)

npx tsx bin/hatice.ts start -w ./WORKFLOW.md

HTTP 서버 모드

npx tsx bin/hatice.ts start -w ./WORKFLOW.md --port 4000

API 엔드포인트

엔드포인트설명
GET /api/v1/state전체 오케스트레이터 상태
GET /api/v1/:id단일 이슈 조회
POST /api/v1/refresh즉시 폴링 트리거
GET /api/v1/eventsSSE 이벤트 스트림

SSE 이벤트 구독

const es = new EventSource('http://localhost:4000/api/v1/events');

es.addEventListener('issue:dispatched', (e) => {
  console.log('이슈 디스패치됨:', e.data);
});

es.addEventListener('issue:completed', (e) => {
  console.log('이슈 완료:', e.data);
});

es.addEventListener('state:updated', () => {
  fetch('/api/v1/state')
    .then(r => r.json())
    .then(console.log);
});

11개 이벤트 타입

Hatice의 EventBus는 11개의 타입드 이벤트를 발생시킵니다:

이벤트발생 시점
orchestrator:started오케스트레이터 시작
orchestrator:stopped오케스트레이터 중지
issue:discovered새 이슈 발견
issue:claimed이슈 클레임
issue:dispatched에이전트 디스패치
issue:progress작업 진행
issue:completed작업 완료
issue:failed작업 실패
issue:retry재시도
state:updated상태 변경
error에러 발생

테스트

# 테스트 실행
npx vitest run

# watch 모드
npx vitest

# 타입 체크
npx tsc --noEmit

# 빌드
npx tsup

코드 통계

항목수치
소스 파일30개
테스트 파일30개
테스트 케이스328개
소스 라인4,148줄
테스트 라인6,669줄
타입 에러0
런타임 의존성8개
개발 의존성4개

테스트 라인이 소스 라인보다 많습니다. TDD가 내장된 시스템답게, 테스트 커버리지가 매우 높습니다.


MCP 도구: Linear & GitHub GraphQL

Hatice는 MCP (Model Context Protocol) 서버를 통해 Linear와 GitHub의 GraphQL API에 직접 접근합니다.

linear_graphql

// Linear GraphQL 쿼리 실행
await useMcpTool("linear_graphql", {
  query: `
    query Issues($filter: IssueFilter) {
      issues(filter: $filter) {
        nodes {
          id
          identifier
          title
          description
        }
      }
    }
  `,
  variables: {
    filter: {
      project: { slug: { eq: "MY-PROJECT" } },
      state: { name: { in: ["Todo", "In Progress"] } }
    }
  }
});

github_graphql

// GitHub GraphQL 쿼리 실행
await useMcpTool("github_graphql", {
  query: `
    query($owner: String!, $repo: String!) {
      repository(owner: $owner, name: $repo) {
        issues(first: 100, states: [OPEN]) {
          nodes {
            number
            title
            body
          }
        }
      }
    }
  `,
  variables: {
    owner: "owner",
    repo: "repo"
  }
});

세션별 비용 추적

Hatice는 각 에이전트 세션의 비용을 추적합니다.

interface SessionCost {
  sessionId: string;
  inputTokens: number;
  outputTokens: number;
  costUSD: number;
  duration: number;
}

이를 통해 어떤 이슈가 가장 많은 비용을 소비했는지, 평균 해결 비용은 얼마인지 분석할 수 있습니다.


세밀한 도구 제어

에이전트가 사용할 수 있는 도구를 제한할 수 있습니다.

agent:
  allowedTools:
    - read_file
    - write_to_file
    - list_directory
    - search_files
  disallowedTools:
    - execute_command
    - delete_path

이를 통해 파괴적 명령을 방지하고, 안전한 샌드박스 환경을 구축할 수 있습니다.


내장 TDD 아키텍처

.claude/CLAUDE.md에 TDD 방법론이 내장되어 있습니다.

# Hatice TDD Workflow

## Phase 1: Red
1. Write a failing test first
2. Run the test to confirm it fails
3. Commit the failing test

## Phase 2: Green
1. Write the minimum code to pass
2. Run the test to confirm it passes
3. Commit the passing code

## Phase 3: Refactor
1. Refactor while keeping tests green
2. Run tests after each change
3. Commit the refactored code

에이전트는 자동으로 Red-Green-Refactor 사이클을 따릅니다.


실제 사용 시나리오

시나리오 1: 스타트업 백로그 자동 해결

설정:

워크플로우:

  1. Linear에서 “Todo” 이슈 폴링
  2. 각 이슈를 격리된 워크스페이스에 디스패치
  3. Claude Code 에이전트가 TDD로 구현
  4. 완료 시 “Done”으로 상태 변경
  5. SSE로 실시간 진행 상황 모니터링

시나리오 2: 오픈소스 이슈 트리아주

설정:

워크플로우:

  1. GitHub Issues에서 “open” 이슈 폴링
  2. 버그 리포트 → 재현 → 수정 → PR 생성
  3. 기능 요청 → 설계 → 구현 → PR 생성
  4. 비용 추적으로 ROI 분석

시나리오 3: 엔터프라이즈 QA 자동화

설정:

워크플로우:

  1. QA 이슈 폴링
  2. E2E 테스트 작성
  3. 실행 및 결과 보고
  4. 실패 시 재시도

Symphony에서 Hatice로: 마이그레이션 가이드

Elixir/OTP → TypeScript/Node.js

SymphonyHatice
mix deps.getnpm install
iex -S mixnpx tsx bin/hatice.ts
SupervisorSupervisor (동일 개념)
GenServerEventEmitter + State Machine

Codex → Claude Code

SymphonyHatice
Codex JSON-RPCClaude SDK query()
codex.complete()query(prompt, options)
스트리밍 없음스트리밍 지원

Phoenix LiveView → Hono SSE

SymphonyHatice
WebSocketServer-Sent Events
LiveView 컴포넌트EventSource 클라이언트
EEx 템플릿LiquidJS 템플릿

로드맵


마치며: Humans Steer, Agents Execute

Hatice는 단순한 자동화 도구가 아닙니다. Harness Engineering 철학을 실현하는 플랫폼입니다.

OpenAI Symphony에서 영감을 받았지만, TypeScript 생태계에 맞게 완전히 재설계했습니다. Claude Code Agent SDK, Hono SSE, MCP 도구, 내장 TDD — 모든 것이 TypeScript 네이티브입니다.

특히 인상적인 것은 테스트 커버리지입니다. 328개 테스트, 테스트 라인이 소스 라인보다 많습니다. TDD가 내장된 시스템답게, 프로덕션 준비도가 매우 높습니다.

GitHub Issues 지원도 독특합니다. owner/repo 형식만으로 오픈소스 프로젝트의 이슈를 자동으로 해결할 수 있습니다.

여러 이슈를 동시에 처리하고 싶다면, Hatice를 시도해보세요. 인간은 조종하고, 에이전트는 실행합니다.


🔗 관련 정보

이전
cokacdir: AI 기반 자연어 명령어를 지원하는 모던 터미널 파일 매니저
다음
OpenViking: AI 에이전트를 위한 파일시스템 패러다임 컨텍스트 데이터베이스