# task-1301.1: MoAI-ADK Phase 2 코드화

**팀**: dev1-team (헤르메스)
**레벨**: critical
**일시**: 2026-04-01

---

## SCQA

**S**: MoAI-ADK Phase 1이 완료되어 3개 feature flags(progressive_disclosure, rw_isolation, hooks_enforcement)가 모두 ON 상태이다. Phase 2의 3개 태스크(P2-4 TRUST 5 태그, P2-5 모델 매핑 테이블, P2-3 haiku A/B 준비)의 코드화가 필요하다.

**C**: Phase 2 3개 태스크는 서로 다른 파일(qc_verify.py, team_prompts.py, analyze_ab.py)을 수정하여 독립적으로 구현 가능하나, 각각 feature flag 기반 토글 및 기존 테스트 회귀 방지가 필요하다. 서브에이전트(Sonnet) API 과부하로 팀원 위임 실패, 팀장 직접 구현.

**Q**: Phase 2 3개 태스크를 모두 구현하고, feature flag 활성화 후에도 기존 시스템 회귀 없이 동작하는가?

**A**: 3개 태스크 전체 구현 완료. Phase 2 신규 테스트 26건 전체 통과. 기존 테스트 회귀 없음(team_prompts 111/111, dispatch 141/141). trust5_tagging_enabled=true, model_map_enabled=true로 활성화 완료. haiku_ab_enabled는 A/B 실험 시작 전까지 false 유지.

---

## 구현 내역

### P2-4: TRUST 5 태그
- `teams/dev1/qc/qc_verify.py`에 `TRUST_MAP`, `TRUST_INDEPENDENT` 상수 추가
- `_build_trust_summary()` 함수 추가 — 5차원(Tested/Readable/Unified/Secured/Trackable) + _independent 버킷
- `build_result()` 수정 — feature flag `trust5_tagging_enabled` 분기로 `trust_summary` JSON 키 추가
- 원본 9종 verifier 매핑 불일치율: 0% (전체 매핑 완료)

### P2-5: 모델 매핑 테이블
- `prompts/team_prompts.py`에 `MODEL_MAP` 상수 추가 (8개 역할 + `_updated` 메타키)
- `_build_model_guide()` 함수 추가 — MODEL_MAP 기반 텍스트 자동 생성 + staleness 7일 경고
- `_build_cowork_section()` 수정 — feature flag `model_map_enabled` 분기로 하드코딩 vs 자동 생성 전환

### P2-3: haiku A/B 준비
- `scripts/analyze_ab.py` 생성 — Fisher's exact test, 층화 추출 검증, 판정 로직(ADOPT/REJECT/EXTEND)
- `logs/ab_results.jsonl` 생성 — 스키마 샘플 1건 포함
- A/B 실험 시작은 `haiku_ab_enabled=true` 활성화 후 (별도 Phase)

### Feature Flags 활성화
- `trust5_tagging_enabled`: false → true
- `model_map_enabled`: false → true
- `haiku_ab_enabled`: false (유지)

---

## 산출물 파일

- `/home/jay/workspace/teams/dev1/qc/qc_verify.py` (수정)
- `/home/jay/workspace/prompts/team_prompts.py` (수정)
- `/home/jay/workspace/scripts/analyze_ab.py` (신규)
- `/home/jay/workspace/logs/ab_results.jsonl` (신규)
- `/home/jay/workspace/tests/test_trust_tagging.py` (신규)
- `/home/jay/workspace/tests/test_model_map.py` (신규)
- `/home/jay/workspace/tests/test_ab_analysis.py` (신규)
- `/home/jay/workspace/tests/test_team_prompts.py` (수정 - 1줄 호환성)
- `/home/jay/workspace/.claude/feature_flags.json` (flag 값 변경)

---

## 테스트 결과

- Phase 2 신규 테스트: **26/26 passed** (0.79s)
  - test_trust_tagging.py: 10 passed
  - test_model_map.py: 8 passed
  - test_ab_analysis.py: 8 passed
- 기존 test_team_prompts.py: **111/111 passed** (회귀 없음)
- 기존 test_dispatch.py: **141/141 passed** (회귀 없음)
- 전체 통합: **278/278 passed** (1.63s)

---

## 발견 이슈 및 해결

### 자체 해결 (4건)
1. **서브에이전트(Sonnet) API 과부하 실패** — 3개 서브에이전트 모두 529 Overloaded 에러. 워크플로우 규칙에 따라 팀장 직접 구현으로 전환.
2. **test_feature_flag_off_no_trust_summary 실패** — flag ON 활성화 후 테스트가 실제 flag 상태를 읽어 실패. `tmp_path` + 환경변수 mock으로 flag OFF 상태를 격리 테스트하도록 수정.
   - 수정: `tests/test_trust_tagging.py:135-150`
3. **기존 test_unknown_team_returns_empty_members 회귀** — flag ON 시 "모델 선택 가이드" → "모델 가이드"로 텍스트 변경. assertion을 OR 조건으로 수정.
   - 수정: `tests/test_team_prompts.py:445`
4. **pyright 타입 에러 analyze_ab.py** — `fisher_exact` 반환 튜플의 타입 추론 실패. 인덱스 접근 + `float()` 캐스팅으로 해결.
   - 수정: `scripts/analyze_ab.py:84-87`

### 범위 외 미해결 (1건)
1. **dispatch 테스트 COKACDIR_KEY_ANU 환경변수 의존** — 환경변수 미설정 시 44건 실패. Phase 1 이전부터 존재하는 환경 의존 이슈. 범위 외 사유: 환경 설정 문제이며 본 작업 변경과 무관.

---

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: qc_verify.py, team_prompts.py, analyze_ab.py, ab_results.jsonl, 테스트 3건, test_team_prompts.py(1줄), feature_flags.json
- [x] 2. 엣지 케이스: flag OFF→기존 동작 유지, SKIP verifier→차원 미실패, 빈 JSONL→에러 반환, staleness 경계 7일
- [x] 3. 작업 지시 일치: P2-4/P2-5/P2-3 DoD 전체 충족, flag 활성화 완료
- [x] 4. 에러 처리/보안: try/except로 feature_flags 읽기 실패 방어, JSONDecodeError 복구
- [x] 5. 테스트 커버리지: 26건 (unit)
- [x] 6. 이슈 자체 해결: 4건 해결, 1건 범위 외
- [x] 7. 코드 아키텍처: SOLID/DRY 위반 없음 — feature flag 분기 일관 패턴
- [x] 8. 인터페이스 변경 문서: 기존 API 호환 유지, 신규 함수/상수만 추가

---

## QC 자동 검증

```json
{
  "task_id": "task-1301.1",
  "overall": "WARN",
  "checks": {
    "api_health": "SKIP (서버 작업 아님)",
    "file_check": "PASS (4/4 checks passed)",
    "data_integrity": "PASS",
    "test_runner": "PASS (133 passed in 1.40s)",
    "tdd_check": "SKIP (파일 변경 감지 안 됨)",
    "schema_contract": "SKIP (workers 없음)",
    "pyright_check": "WARN (scipy 타입 스텁 2건, type: ignore 처리)",
    "style_check": "WARN → black 적용 완료",
    "scope_check": "SKIP",
    "critical_gap": "PASS",
    "spec_compliance": "PASS",
    "duplicate_check": "PASS"
  },
  "trust_summary": {
    "Tested": {"passed": true},
    "Readable": {"passed": true},
    "Unified": {"passed": true},
    "Secured": {"passed": true},
    "Trackable": {"passed": true}
  }
}
```
