# 캠페인(Campaign) 정의 스펙
> 버전: 1.1 | 작성일: 2026-03-25 | 합의: task-1005.1 에이전트 미팅 3사이클 (전원 만장일치)

---

## 1. 명칭

| 항목 | 값 |
|------|-----|
| 한국어 명칭 | 캠페인 |
| 영문 키워드 | campaign |
| 약어 | CMP |
| ID 체계 | CMP-{NNN} (예: CMP-001, CMP-002) |

### 명칭 선정 근거
- 직관성: 프로젝트/프로그램 혼동 방지 (제이회장님 판단: "캠페인이 더 직관적")
- 한국어 자연스러움: "집필 캠페인", "광고전략 캠페인", "세미나 캠페인"
- 네임스페이스 충돌 없음: 기존 project, task와 겹치지 않음
- 탈락 후보: 프로그램(프로젝트와 혼동), 미션(태스크 혼동), 이니셔티브(한국어 어색)

---

## 2. 정의

**캠페인(Campaign)**: 복수의 프로젝트 또는 지속적 업무 영역을 포괄하는 상위 단위.
독립적인 목표, 마일스톤, 생명주기를 가지며, 코드 산출물(git repo) 없이도 성립한다.

### 3계층 구조

```
캠페인 (Campaign)    — 목표 달성형 추진 과제 묶음
  └── 프로젝트 (Project)  — 독립 산출물(코드/서비스) 빌드
        └── 태스크 (Task)     — 단위 실행 (dispatch 1회 = 1 세션)
```

### 예시 분류

- "보험 유튜브 채널 운영" → **캠페인** (지속적 업무 영역, 복수 프로젝트 포함 가능)
- "InsuWiki 개발" → **프로젝트** (독립 git repo, 코드 산출물)
- "특정 보고서 작성" → **태스크** (단일 실행, 단기)
- "보험 전문서 집필" → **캠페인** (복수 단계, 마일스톤 기반)
- "TOP사업단 리쿠르팅 광고전략" → **캠페인** (전략 수립 + 실행 + 성과 측정)
- "지점 세미나 기획 및 운영" → **캠페인** (기획 → 준비 → 실행 → 후속)

---

## 3. 판별 규칙 (3문항)

```
Q1. 복수의 프로젝트 또는 지속적 업무 영역을 포괄하는 상위 단위인가?
    YES → 캠페인 후보로 진행

Q2. 독립적인 산출물(deliverable)과 명확한 완료 시점이 있는가?
    YES → 프로젝트
    NO (+ Q1 YES) → 캠페인

Q3. 단일 행동 또는 단기 실행 항목인가?
    YES → 태스크
```

### 속성 비교

| 속성 | 캠페인 | 프로젝트 | 태스크 |
|------|----------|----------|--------|
| ID 형식 | CMP-{NNN} | 슬러그 문자열 | task-{N}.{N} |
| git repo | 없음 | 필수 | 해당없음 |
| 저장 위치 | memory/campaigns/ | /home/jay/projects/ | memory/tasks/ |
| 시간 단위 | 주~월 | 월~년 | 분~시간 |
| 코드 산출물 | 선택 | 필수 | 선택 |
| 마일스톤 | 있음 | 있음(Phase) | 없음 |
| 생성 방식 | 수동 (제이회장님 지시) | 수동 | dispatch.py 자동 |

---

## 4. 생명주기 (State Machine)

### 상태 정의

```
planning → active → paused → completed → archived
              ↕
           paused
```

| 상태 | 의미 | 허용 전이 |
|------|------|-----------|
| planning | 기획 중, 미시작 | → active |
| active | 현재 실행 중 | → paused, completed |
| paused | 일시 중단 (재개 예정) | → active, completed |
| completed | 목표 달성, 종료 | → archived |
| archived | 장기 보관 (최종 상태) | 없음 (일방향) |

### 상태 전이 규칙

```python
CAMPAIGN_STATE_TRANSITIONS = {
    "planning":  ["active"],
    "active":    ["paused", "completed"],
    "paused":    ["active", "completed"],
    "completed": ["archived"],
    "archived":  [],  # 흡수 상태 (absorbing state)
}
```

---

## 5. 디렉토리 구조

```
/home/jay/workspace/memory/campaigns/
├── INDEX.md                    # 전체 캠페인 목록 + 상태
└── CMP-001/                    # 개별 캠페인
    ├── campaign.json           # 필수: 핵심 메타데이터
    ├── overview.md             # 필수: 목표 및 배경 서술
    ├── progress.md             # 권장: 진행 현황 및 회고
    └── linked_projects.md      # 권장: 연결 프로젝트 상세
```

### campaign.json 스키마 (v1.0)

```json
{
  "schema_version": "1.0",
  "id": "CMP-001",
  "name": "캠페인 표시 이름",
  "status": "planning",
  "priority": "high",
  "description": "캠페인 한 줄 설명",
  "goal": "달성 목표",
  "milestones": [
    {
      "id": "m1",
      "name": "마일스톤 이름",
      "target_date": "YYYY-MM-DD",
      "status": "pending",
      "linked_tasks": []
    }
  ],
  "linked_projects": [],
  "tags": [],
  "owner": "jay",
  "created_at": "YYYY-MM-DD",
  "updated_at": "YYYY-MM-DD",
  "completed_at": null
}
```

### INDEX.md 형식

```markdown
# Campaigns Index
> 최종 수정: YYYY-MM-DD

| ID | 이름 | 상태 | 우선순위 | 목표일 |
|---|---|---|---|---|
| CMP-001 | 집필 완성 | active | high | 2026-09-30 |
| CMP-002 | 광고전략 수립 | planning | medium | 2026-06-30 |
```

### 태스크 연결

기존 task 파일(memory/tasks/task-ID.md)에 선택적 필드 추가:

```
campaign_id: CMP-001   # 소속 캠페인 (없으면 빈 문자열 "")
```

---

## 6. 시스템 통합 (최소 변경 원칙)

### 변경 필요

| 대상 | 변경 내용 | 규모 |
|------|-----------|------|
| memory/ 디렉토리 | campaigns/ 신설 | 파일 추가만 |
| dispatch.py | --campaign, --milestone 옵션 추가 | 소규모 |
| task 파일 | campaign_id 필드 선택적 추가 | 점진적 |

### 변경 불필요

| 대상 | 이유 |
|------|------|
| task-timer.py | 태스크 단위 타이머, 변경 불필요 |
| chain.py | 태스크 체인 로직, 변경 불필요 |
| 기존 프로젝트 git repo | 구조 무관 |
| task-ID 체계 | 변경 없음 |
| memory/tasks/, reports/, events/ | 기존 구조 유지 |

### dispatch.py 확장 명령어 (향후 구현)

```bash
# 캠페인 관리
python3 dispatch.py campaign create --name "집필 완성" --goal "2026 Q3 탈고"
python3 dispatch.py campaign list
python3 dispatch.py campaign status CMP-001 active
python3 dispatch.py campaign link CMP-001 insuwiki

# 태스크 위임 시 캠페인 연결
python3 dispatch.py --team dev1-team --task-file task.md --campaign CMP-001 --milestone m1
```

---

## 7. 3문서 시스템 매핑

캠페인에도 아누 가이드의 3문서 시스템을 적용한다:

| 3문서 | 캠페인에서의 역할 | 파일 |
|-------|---------------------|------|
| 계획서 | 캠페인 전체 목표, 마일스톤, 성공 기준 | overview.md |
| 맥락노트 | 결정 로그, 블로커, 배경 정보 | campaign.json + overview.md |
| 체크리스트 | 마일스톤별 진행 현황, 연결 태스크 목록 | progress.md |

---

## 8. 알려진 제약 및 향후 과제

### 수용 가능한 리스크 (DA 검증 완료)
- `linked_projects` 배열의 수동 동기화: 프로젝트 디렉토리명 변경 시 자동 업데이트 미지원
  - 해결 방안: 향후 dispatch.py에 project rename 연동 로직 추가

### 향후 구현 과제 (우선순위 순)
1. memory/campaigns/ 디렉토리 구조 생성 + 기존 업무 등록
2. dispatch.py에 --campaign 옵션 추가
3. 텔레그램 봇에 /campaign 조회 명령어 추가
4. 캠페인 대시보드 탭 추가 (선택)

---

## 변경 이력

| 버전 | 일시 | 변경 내용 |
|------|------|-----------|
| 1.0 | 2026-03-25 | 초안 — task-1005.1 에이전트 미팅 3사이클 합의 기반 |
| 1.1 | 2026-03-25 | 명칭 변경: 프로그램→캠페인 (task-1009.1, 제이회장님 지시) |

## 합의 참여자

| 참석자 | 역할 | 판정 |
|--------|------|------|
| 프로메테우스 | 전략 센터 | 동의 |
| 크로노스 | 회고분석 | 동의 |
| 아테나 | UX/UI | 동의 |
| 미미르 | 정보구조 | 동의 |
| 로키 | DA (Devil's Advocate) | 동의 (DA 검증 통과) |
