# task-1287.1 완료 보고서: 계정 전환 시스템 재설계

**S**: 대시보드의 계정 관리 시스템(drumband/jonghyuk 전환)이 MD5 해시 비교 + 3단계 fallback(MD5 → refreshToken → scopes)으로 활성 계정을 추론하는 구조이며, OAuth 토큰 갱신 시 MD5가 변경되어 활성 계정 식별이 빈번히 실패한다.

**C**: 토큰 갱신 후 `_get_auth_status()`가 활성 계정을 `None`으로 반환하고, `_get_usage_status()`는 3단계 fallback을 거쳐도 잘못된 계정을 표시하는 경우가 발생한다. `switch-account.sh`는 단순 `cp`만 수행하여 상태 추적이 전혀 없다.

**Q**: 토큰 갱신과 무관하게 활성 계정을 100% 정확히 식별하는 단순한 구조로 개선할 수 있는가?

**A**: `~/.claude/.active-account` 상태 파일(계정명만 저장)을 단일 진실 원천(SSOT)으로 도입하여 해결. `_get_auth_status()`의 MD5 비교 1차 제거, `_get_usage_status()`의 3단계 fallback을 상태 파일 읽기 + MD5/refreshToken 2단계 fallback으로 축소. `switch-account.sh`는 동적 계정 목록 + 전환 전 토큰 백업 동기화 + 상태 파일 갱신으로 완전 재작성. pytest 7건 전체 통과, pyright 에러 0건.

## 작업 내용

### 근본 원인
- 활성 계정 식별에 **추론(inference)** 방식 사용 — MD5 비교는 토큰 갱신 시 불일치
- **SSOT(Single Source of Truth)** 부재 — `.credentials.json`이 자격증명 + 식별자 이중 역할

### 개선안: `.active-account` 상태 파일 도입
- `~/.claude/.active-account`에 활성 계정명만 저장 (예: `drumband`)
- 모든 코드가 이 파일을 1차로 읽고, 없을 때만 기존 방식 fallback

### 변경 상세

1. **`_get_auth_status()` (server.py:3553~3580)** — `.active-account` 우선 읽기, MD5 fallback 유지
2. **`_get_usage_status()` (server.py:3676~3711)** — 3단계 fallback → 상태파일 + MD5 + refreshToken 2단계로 축소, scopes 비교(Fallback B) 제거
3. **POST `/api/auth-switch` (server.py:4754~4759)** — `switch-account.sh` 호출 전 `.active-account` 갱신
4. **`switch-account.sh`** — 전면 재작성: 동적 계정 목록, 전환 전 토큰 백업 동기화, 상태 파일 갱신

## 산출물

- `/home/jay/workspace/dashboard/server.py` (수정)
- `/home/jay/workspace/scripts/switch-account.sh` (수정)
- `/home/jay/.claude/.active-account` (신규, drumband로 초기화)

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **빈 `.active-account` 파일 시 fallback 미작동** — `.strip() or None` 패턴으로 빈 문자열을 None 변환
   - 상세: server.py:3557, 3680행 — `.read_text().strip()` 결과가 `""`이면 `is None` 체크 통과하여 fallback 안 탐. `or None` 추가로 해결.
2. **scopes 비교 Fallback B 불필요** — MD5 + refreshToken이면 충분, scopes 비교는 유일 매치 조건이라 false positive 위험. 제거.
3. **`switch-account.sh` 전환 시 토큰 손실** — 활성 계정 토큰이 갱신된 상태에서 다른 계정으로 전환하면, 갱신된 토큰이 백업에 미반영. 전환 전 현재 `.credentials.json`을 이전 계정 백업에 동기화하는 로직 추가.

## 테스트 결과

- pytest: 7 passed in 0.28s (기존 test_server.py 전체 통과)
- pyright: 0 errors, 0 warnings
- black: 포맷팅 적용 완료
- `switch-account.sh` 수동 테스트: 인자 없이 실행 → 계정 목록 정상 출력, 활성 표시 정상

## QC 검증 결과

```json
{
  "test_runner": "PASS (7 passed in 0.28s)",
  "pyright_check": "PASS (0 errors)",
  "style_check": "PASS (black 적용 후)",
  "data_integrity": "PASS"
}
```
