역할분담
3인 팀이 저장소 3개를 나눠 갖는다. 저장소 하나에 주 담당 1명이고, 경계는 계약으로 만난다.
담당
| 저장소 | 주 담당 | 보조 | 하는 일 |
|---|---|---|---|
| heymoa-server | alstn113 | wldnjs8022 | 인증·권한·도메인 12모듈 · 실시간 전사 중계(STOMP·ElevenLabs) · 분석 디스패치와 워치독 · 채팅 SSE passthrough와 승인 게이트 |
| heymoa-web | alstn113 | — | Next.js App Router · 오디오 캡처(AudioWorklet·PCM16) · STOMP 구독과 노트 토픽 · SSE 소비 · 생성 API 클라이언트 |
| heymoa-ai | leeswallow | wldnjs8022 | LangGraph 분석 그래프(섹션 병렬) · 채팅 그래프와 도구 레지스트리 · 임베딩 검색(pgvector) · Langfuse 관측·평가 |
| docs | alstn113 | leeswallow | 아키텍처 4축 · 계약 미러 · 인터페이스 규약 · ADR |
기여 분포
2026-06-10 ~ 2026-08-10, 총 1,762 커밋 · Linear 이슈 APP-411까지.
| 저장소 | 커밋 | 기간 |
|---|---|---|
| heymoa-server | 651 | 2026-06-10 ~ 2026-08-09 |
| heymoa-web | 491 | 2026-06-10 ~ 2026-08-09 |
| heymoa-ai | 419 | 2026-07-21 ~ 2026-08-07 |
| docs | 201 | 2026-06-23 ~ 2026-08-10 |
heymoa-ai는 6주 늦게 시작했다. 그 전까지 분석·챗봇은 heymoa-server 안의 스텁이었고, LLM 호출의 지연·실패 특성이 요청 스레드를 묶는 것이 확인된 뒤 분리했다.
경계의 소유자
담당자가 나뉘어 있으므로 무엇을 누가 정하는가가 계약보다 먼저 정해져 있어야 한다.
| 무엇 | 소유자 | 근거 |
|---|---|---|
| 사용자에게 보일 한국어 오류 문구 | server | 클라이언트가 코드별 문구를 다시 만들면 갈라진다 |
멱등성 키 (analysisId) 발급 | server | 재시도·워치독을 server가 단독 소유하므로 |
| 재시도와 워치독 | server | ai 큐는 인메모리라 프로세스가 죽으면 접수분이 사라진다. ai는 무상태 재시작이 가능해야 한다 |
| 권한 재검증 | server | 승인 재개 직전 현재 멤버십을 다시 검증한다. ai는 권한을 재검증하지 않는다 |
| 외부 OAuth 토큰 보관 | server | tool_connection에 암호화 저장. ai는 갖지 않는다 — 요청 스코프 단기 토큰만 받는다 |
| 프롬프트와 모델 선택 | ai | sections.yml · profiles.yml 데이터로 표현 |
| LLM 관측·평가 | ai | Langfuse tracing · 골든셋 |
| 화면 상태와 재연결 정책 | web | 종료 이벤트 없이 끊기는 것은 web에서 정상 시나리오다 |
외부 시스템의 소유자는 하나씩만. 음성(ElevenLabs)·OAuth(Google·Linear·GitHub)·메일(SES)은 server, LLM(OpenAI)·프롬프트 관측(Langfuse)은 ai. 두 서비스가 같은 외부 시스템에 붙으면 크리덴셜도 둘로 늘어난다.
저장소를 가로지르는 변경은 어떻게
한 기능이 세 저장소를 건드리는 일이 흔하다 — SSE 릴레이(APP-74), 승인 릴레이(APP-107), 내부 인증 경계(APP-122), 회의 생명주기(APP-288).
- 계약을 먼저 고정한다.
contracts/에 PR을 올려 머지한다 - 계약이 머지되면 세 저장소가 병렬로 구현한다. 서로 기다리지 않는다
- 마지막 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)과 섞지 않는다.