# task-1424.1 완료 보고서: Phase 0 — Config 단일 소스 기반 생성

## SCQA

**S**: 아누 시스템 전체 모듈화(Phase 1~3)를 위해 config 파일의 단일 소스(SSoT)가 필요하다. 현재 chat_id가 83곳에 하드코딩되고, 팀 매핑/색상코드/경로 정보가 파일마다 중복 저장되어 있다.

**C**: 하드코딩된 값 변경 시 영향 범위 파악이 불가능하고, 변경 누락으로 인한 버그 위험이 높다.

**Q**: 4개 JSON config + Python 로더 1개로 단일 소스를 구축하여 Phase 1~3의 하드코딩 제거 기반을 마련할 수 있는가?

**A**: 5개 파일 생성 완료. JSON 4개 모두 문법 검증 통과, loader.py는 dot notation 키 해석, 환경변수 참조, 의존 파일 조회 기능을 갖추며 통합 테스트 12개 assertion 전체 통과. pyright 에러 0건, black/isort 준수. 기존 코드 수정 없이 신규 생성만 수행.

---

## 산출물

- `/home/jay/workspace/config/paths.json`
- `/home/jay/workspace/config/constants.json`
- `/home/jay/workspace/config/design-system.json`
- `/home/jay/workspace/config/module-registry.json`
- `/home/jay/workspace/config/loader.py`

## 작업 내용

### 1. paths.json (754 bytes)
- workspace 루트 7개 경로 (workspace, memory, projects, dashboard, tools, output, config)
- 프로젝트 디렉토리 2개 (ThreadAuto, InsuRo)
- memory 하위 디렉토리 7개 (tasks, reports, events, daily, specs, meetings, research)

### 2. constants.json (2,236 bytes)
- `chat_id`: "6937032012" (dispatch.py에서 추출)
- `cokacdir_key`: "$COKACDIR_KEY" (환경변수 참조만, 실제 값 저장 금지)
- `teams`: 8개 팀 매핑 (dispatch.py TEAM_BOT에서 추출)
- `bots`: 9개 봇 설정 (bot_settings_sync.json에서 추출, 토큰 미포함)
- `team_to_bot`: 8개 팀→봇ID 매핑 (dispatch.py TEAM_TO_BOT_ID에서 추출)
- `work_levels`: 0~4 레벨 정의
- `thresholds`: task_id_gap(1000), idle_hours(3), ghost_hours(4)

### 3. design-system.json (2,877 bytes)
- `palette.team_colors`: 10개 팀 색상 (dashboard JS에서 추출)
- `palette.category_colors`: 10개 카테고리 (배경+전경 쌍)
- `palette.neutral`: 10개 중립 색상 (텍스트/배경/보더)
- `typography`: font_families 5종, recommended_pairs 4종, banned_fonts 6종
- `font_rules`: dq-rules.json 참조 경로만 (중복 저장 금지)

### 4. module-registry.json (1,434 bytes)
- `sources`: 5개 단일 소스 등록 (chat_id, workspace_root, team_bot_mapping, dq_rules, design_palette)
- 각 소스별 used_by 파일 목록 매핑
- `rules`: 수정 영향 경고, 추가 프로토콜

### 5. loader.py (3,115 bytes → black 포매팅 후)
- 싱글톤 ConfigManager 클래스
- `get_path(key)`: dot notation으로 paths.json 조회
- `get_constant(key)`: dot notation + 환경변수($) 자동 해석
- `get_dependents(source_id)`: registry에서 의존 파일 목록 반환
- `reset()`: 테스트용 싱글톤 초기화

## 검증 결과

### 통합 테스트 (12 assertions)
- JSON 문법 검증: 4개 파일 모두 PASS
- `get_path()`: workspace, memory, tasks, insuro 경로 4개 검증 PASS
- `get_constant()`: chat_id, team, threshold, work_level, bot, team_to_bot 6개 검증 PASS
- `get_dependents()`: chat_id 의존 5파일 반환 PASS
- `design-system.json`: team_color, banned_fonts 검증 PASS
- KeyError 발생: 존재하지 않는 키 PASS
- 환경변수 미설정 시 EnvironmentError PASS
- `reset()`: 싱글톤 재생성 PASS

### pyright 타입 체크
- 0 errors, 0 warnings

### black/isort
- black: 준수 (초기 WARN → 수정 완료)
- isort: OK

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **loader.py black 포매팅 미준수** — `black config/loader.py` 실행으로 수정
   - 상세: 팀원 생성 코드가 black 기본 규칙과 다른 포매팅이었음 → black 자동 포매팅 적용
2. **bot_settings_sync.json의 dev7 username 불일치** — dev6_itzamna_bot으로 기록됨 (원본 그대로 반영)
   - 상세: 원본 데이터의 username이 dev6_itzamna_bot인데 dev7 팀. 원본 충실 반영 원칙에 따라 그대로 유지
3. **bot_settings_sync.json의 dev8 username 불일치** — dev3_ra_bot으로 기록됨 (원본 그대로 반영)
   - 상세: 원본 데이터의 username이 dev3_ra_bot인데 dev8 팀. 원본 충실 반영 원칙에 따라 그대로 유지

### 범위 외 미해결 (1건)
1. **chat_id 83곳 하드코딩 제거** — 범위 외 사유: Phase 1~3에서 수행 예정 (이 Phase에서는 config 생성만)

## 3 Step Why
- 왜 4개 JSON 파일인가? → 역할 분리: 경로(paths) / 상수(constants) / 디자인(design-system) / 의존성 추적(module-registry)
- 왜 역할을 분리하는가? → 단일 파일이면 변경 충돌 + 파싱 오버헤드. 역할별 분리 시 독립 수정 가능
- 왜 loader.py가 필요한가? → JSON 직접 파싱을 각 모듈에서 하면 중복 코드 발생. 통합 로더로 접근 API 일원화

## 모델 사용 기록
- 팀원: 불칸 / 작업 내용: paths.json + constants.json 생성 / 사용 모델: sonnet / 정당성: -
- 팀원: 이리스 / 작업 내용: design-system.json 생성 / 사용 모델: sonnet / 정당성: -
- 팀원: 불칸 / 작업 내용: module-registry.json + loader.py 생성 / 사용 모델: sonnet / 정당성: -

## 마아트 독립 검증

- 검증자: 마아트 (QC 매니저)
- 검증 일시: 2026-04-04 18:52
- 최종 판정: **PASS** (산출물 5개 + 보고서 품질 기준 충족)
- 검증 항목:
  - JSON 문법 검사: 4/4 PASS
  - 명세 대조 (paths.json): roots 7개, project_dirs 2개, memory_dirs 7개 모두 일치
  - 명세 대조 (constants.json): chat_id, cokacdir_key, teams, bots, team_to_bot, work_levels, thresholds 모두 일치
  - 명세 대조 (design-system.json): palette, typography, font_rules 모두 일치
  - 명세 대조 (module-registry.json): 5개 소스 + rules 모두 일치
  - loader.py 실행 테스트: get_path, get_constant, get_dependents, KeyError, EnvironmentError 모두 정상
  - 보안 검증: cokacdir_key에 실제 값 미저장 확인
  - 기존 파일 수정 여부: config/ 기존 5개 파일 타임스탬프 미변경 확인
  - pyright: 0 errors, 0 warnings
  - style: black OK, isort OK

## QC 자동 검증 결과
```json
{
  "task_id": "task-1424.1",
  "overall": "PASS (file_check FAIL은 보고서/.done 미생성 시점)",
  "checks": {
    "api_health": "SKIP (서버 작업 아님)",
    "file_check": "PASS (5/5 파일 존재 + 크기 정상)",
    "data_integrity": "PASS",
    "test_runner": "SKIP (관련 테스트 파일 0개)",
    "tdd_check": "SKIP (Lv.1 설정 작업)",
    "schema_contract": "SKIP (workers 미포함)",
    "pyright_check": "PASS (0 errors, 0 warnings)",
    "style_check": "PASS (black 수정 후)",
    "scope_check": "SKIP"
  },
  "trust_summary": "T:PASS R:PASS U:PASS S:PASS T:PASS"
}
```
