본문으로 건너뛰기

역할분담

3인 팀이 저장소 3개를 나눠 갖는다. 저장소 하나에 주 담당 1명이고, 경계는 계약으로 만난다.

담당

저장소주 담당보조하는 일
heymoa-serveralstn113wldnjs8022인증·권한·도메인 12모듈 · 실시간 전사 중계(STOMP·ElevenLabs) · 분석 디스패치와 워치독 · 채팅 SSE passthrough와 승인 게이트
heymoa-webalstn113Next.js App Router · 오디오 캡처(AudioWorklet·PCM16) · STOMP 구독과 노트 토픽 · SSE 소비 · 생성 API 클라이언트
heymoa-aileeswallowwldnjs8022LangGraph 분석 그래프(섹션 병렬) · 채팅 그래프와 도구 레지스트리 · 임베딩 검색(pgvector) · Langfuse 관측·평가
docsalstn113leeswallow아키텍처 4축 · 계약 미러 · 인터페이스 규약 · ADR

기여 분포

2026-06-10 ~ 2026-08-10, 총 1,762 커밋 · Linear 이슈 APP-411까지.

저장소커밋기간
heymoa-server6512026-06-10 ~ 2026-08-09
heymoa-web4912026-06-10 ~ 2026-08-09
heymoa-ai4192026-07-21 ~ 2026-08-07
docs2012026-06-23 ~ 2026-08-10

heymoa-ai는 6주 늦게 시작했다. 그 전까지 분석·챗봇은 heymoa-server 안의 스텁이었고, LLM 호출의 지연·실패 특성이 요청 스레드를 묶는 것이 확인된 뒤 분리했다.

경계의 소유자

담당자가 나뉘어 있으므로 무엇을 누가 정하는가가 계약보다 먼저 정해져 있어야 한다.

무엇소유자근거
사용자에게 보일 한국어 오류 문구server클라이언트가 코드별 문구를 다시 만들면 갈라진다
멱등성 키 (analysisId) 발급server재시도·워치독을 server가 단독 소유하므로
재시도와 워치독serverai 큐는 인메모리라 프로세스가 죽으면 접수분이 사라진다. ai는 무상태 재시작이 가능해야 한다
권한 재검증server승인 재개 직전 현재 멤버십을 다시 검증한다. ai는 권한을 재검증하지 않는다
외부 OAuth 토큰 보관servertool_connection에 암호화 저장. ai는 갖지 않는다 — 요청 스코프 단기 토큰만 받는다
프롬프트와 모델 선택aisections.yml · profiles.yml 데이터로 표현
LLM 관측·평가aiLangfuse tracing · 골든셋
화면 상태와 재연결 정책web종료 이벤트 없이 끊기는 것은 web에서 정상 시나리오

외부 시스템의 소유자는 하나씩만. 음성(ElevenLabs)·OAuth(Google·Linear·GitHub)·메일(SES)은 server, LLM(OpenAI)·프롬프트 관측(Langfuse)은 ai. 두 서비스가 같은 외부 시스템에 붙으면 크리덴셜도 둘로 늘어난다.

저장소를 가로지르는 변경은 어떻게

한 기능이 세 저장소를 건드리는 일이 흔하다 — SSE 릴레이(APP-74), 승인 릴레이(APP-107), 내부 인증 경계(APP-122), 회의 생명주기(APP-288).

  1. 계약을 먼저 고정한다. contracts/에 PR을 올려 머지한다
  2. 계약이 머지되면 세 저장소가 병렬로 구현한다. 서로 기다리지 않는다
  3. 마지막 PR과 함께 아키텍처 문서를 갱신한다

계약이 먼저 머지되지 않으면 web이 server를 기다리고 ai가 server를 기다린다. 순서가 아니라 계약이 병렬성을 만든다.

작업 방식

세 저장소 모두 AI 에이전트가 구현하고 사람이 리뷰한다. 각 저장소에 CLAUDE.md(+AGENTS.md)와 .claude/rules·.claude/skills가 있고, heymoa-ai는 하네스를 harness/v00N-<날짜>/로 버전 관리하며 게이트와 지표를 원장(gates-ledger.tsv·metrics.tsv·findings-ledger.md)에 남긴다.

작업 방식에 대한 결정은 scope: harness로 분류해서 제품 코드 결정(ADR)과 섞지 않는다.