# task-930.2: 스킬 자기학습 시스템 데이터/인프라 파일

## 설계서
- **반드시 먼저 읽을 것**: `/home/jay/workspace/memory/specs/skill-eval-self-learning-design.md` (v1.2)
- 특히 Section 2 (2축 체계), Section 3-3 (평가 축), Section 7 (학습 축적), Section 8 (안전장치)

## 구현 범위

### 1. eval-axes.json (skills/shared/eval-axes.json)

84개 스킬 각각의 평가 축 3~5줄 자동 생성.

**형식**:
```json
{
  "satori-cardnews": {
    "type": "business",
    "axes": ["훅 강도", "시각 밸런스", "CTA 명확성", "정보 밀도", "가독성"]
  },
  "systematic-debugging": {
    "type": "system",
    "axes": ["원인 특정 정확도", "재현 경로 명확성", "수정 안전성"]
  }
}
```

**생성 방법**:
1. `/home/jay/.claude/skills/` 디렉토리에서 84개 스킬 목록 확인
2. 각 스킬의 SKILL.md를 읽고, 스킬의 목적/용도를 파악
3. 해당 스킬 아웃풋을 비교할 때 적합한 평가 축 3~5개 도출
4. business/system 분류도 함께 결정

**분류 기준** (설계서 Section 2 참조):
- **business**: ThreadAuto, 블로그, SEO, 마케팅, 콘텐츠, CRO, 집필, 디자인 관련
- **system**: 개발 워크플로우, 디버깅, 테스트, 배포, 3docs, 미팅, QC 관련
- "shared" 디렉토리는 스킬이 아니므로 제외

### 2. skill-registry.json (skills/shared/skill-registry.json)

84개 스킬의 메타데이터 레지스트리.

**형식**:
```json
{
  "satori-cardnews": {
    "type": "business",
    "description": "카드뉴스/배너/인포그래픽 생성",
    "benchmark_method": "online_expert",
    "has_champion": false
  },
  "systematic-debugging": {
    "type": "system",
    "description": "체계적 디버깅 워크플로우",
    "benchmark_method": "cross_model",
    "has_champion": false
  }
}
```

- `benchmark_method`: business → "online_expert", system → "cross_model"
- `has_champion`: 초기값 false (챔피언 생성 시 output-review.py가 업데이트)

### 3. learnings.jsonl 스키마 + TTL 아카이브 로직

**learnings.jsonl 위치**: `memory/skill-learning/learnings.jsonl`
**archive 위치**: `memory/skill-learning/learnings-archive.jsonl`

**한 줄 형식 (JSON Lines)**:
```json
{"id": "learn-001", "skill_name": "satori-cardnews", "source": "champion-battle", "learning": "CTA를 마지막 슬라이드가 아닌 3번째에 배치하면 시선 흐름이 자연스럽다", "created_at": "2026-03-25T00:15:00", "expires_at": "2026-06-23T00:15:00"}
```

**필수 필드**:
- `id`: 고유 ID (learn-NNN 또는 UUID)
- `skill_name`: 스킬 이름 (격리 필터에 사용)
- `source`: `self-review` / `cross-model` / `jay-feedback` / `online-expert` / `github-learn` / `champion-battle`
- `learning`: 학습 내용
- `created_at`: 생성 시각
- `expires_at`: TTL 만료 시각 (created_at + 90일, 초기 3개월은 60일 권장)

**TTL 아카이브 유틸** (scripts/learnings-archiver.py 또는 output-review.py 내 함수):
- learnings.jsonl에서 expires_at < now인 항목 → learnings-archive.jsonl로 이동
- append-only 보장: 원본에서 삭제만, archive에 추가만
- 실행 시점: output-review.py 실행 시 자동 호출 또는 별도 cron

**스킬별 격리 필터 함수**:
- `get_learnings(skill_name)` → 해당 스킬의 활성 learnings만 반환
- 다른 스킬의 learning은 절대 주입하지 않음 (크로스 오염 방지)

### 4. Source Tagging 구조

6종 태그:
- `self-review`: AI 자가 평가에서 도출
- `cross-model`: Venus/Atlas 검증에서 도출
- `jay-feedback`: 제이회장님 피드백 (immutable — 이 태그의 항목은 아카이브해도 삭제 불가)
- `online-expert`: 온라인 전문가 벤치마킹에서 도출
- `github-learn`: GitHub 외부 스킬 벤치마킹에서 도출
- `champion-battle`: 챔피언 비교에서 도출

**jay-feedback immutable 규칙**: 이 source의 항목은 TTL과 무관하게 영구 유지 (expires_at: null)

### 5. 디렉토리 초기 생성

다음 디렉토리/파일이 없으면 생성:
- `memory/skill-learning/` (디렉토리)
- `memory/skill-learning/learnings.jsonl` (빈 파일)
- `memory/skill-learning/learnings-archive.jsonl` (빈 파일)
- `memory/skill-learning/champions/` (디렉토리)
- `memory/skill-learning/champions-archive/` (디렉토리)
- `memory/skill-feedback/` (디렉토리)

## 제약사항
- 경로: `/home/jay/workspace/` 기준
- 스킬 목록: `/home/jay/.claude/skills/` (shared 제외 = 84개)
- **절대경로 하드코딩 금지**: 환경변수 또는 설정 파일에서 로드
- eval-axes.json 생성 시 각 스킬의 SKILL.md를 실제로 읽고 판단할 것 (대충 추측 금지)

## 테스트
- eval-axes.json: 84개 스킬 전부 포함, 각각 axes 3~5개 확인
- skill-registry.json: 84개 스킬 전부 포함, type/benchmark_method 정합성 확인
- learnings.jsonl: 테스트 항목 추가 → get_learnings 필터 → 올바른 스킬만 반환 확인
- TTL 아카이브: 만료 항목 이동 → 원본에서 제거 + archive에 존재 확인
- jay-feedback: expires_at null → TTL 아카이브에서 제외 확인
