| name | team-youtube |
| description | YouTube팀 오케스트레이터. Pipeline + 병렬 패턴으로 4명 조율. YouTube 콘텐츠 제작 요청 시 호출. |
| user_invocable | false |
| auto_trigger | false |
Team YouTube Orchestrator (YouTube팀)
의존성 (task-139 — task-136 활성화)
이 팀은 task-139 (insane-search) plugin 활성 + yt-dlp 설치 상태에서만 진짜 동작.
데이터 수집 도구 (task-136 보강)
| 에이전트 | 핵심 도구 | 용도 |
|---|
| yt-researcher | yt-dlp --dump-json + --flat-playlist + Naver Search Phase 0 | 경쟁 영상/채널 메타 |
| yt-writer | yt-dlp --write-auto-subs --sub-lang ko | 참고 영상 자막 추출 |
| yt-seo | yt-researcher 위임 (haiku 모델 부담 완화) | 단순 최적화만 |
| yt-designer | yt-dlp --dump-json (썸네일 URL) + curl 다운로드 | 비주얼 패턴 분석 |
Graceful degradation
command -v yt-dlp 실패 시 → 4 에이전트 모두 "수동 자료 입력 부탁" 안내 (각 에이전트 정의에 명시).
산출물 임시 디렉토리
_workspace/yt-researcher/{meta,playlists}/
_workspace/yt-writer/subtitles/
_workspace/yt-designer/thumbnails/
- 작업 완료 후 cleanup 의무 (다음 호출 stale 회피)
패턴: Pipeline (순차 파이프라인)
3명의 에이전트를 순차 실행하여 리서치 -> 대본 작성 -> SEO 최적화 파이프라인을 수행한다.
각 단계의 산출물이 다음 단계의 입력.
고정 편성 (4명)
| 순서 | 에이전트 | 모델 | 역할 | 산출물 |
|---|
| 1 | yt-researcher | sonnet | 키워드/트렌드 리서치 | 키워드 분석, 경쟁 채널 분석, 트렌드 보고서 |
| 2a | yt-writer | sonnet | 대본/스토리보드 작성 | 영상 대본, 스토리보드 |
| 2b | yt-designer | haiku | 썸네일/비주얼 디자인 | 썸네일 컨셉, 비주얼 가이드 |
| 3 | yt-seo | haiku | SEO 최적화 | 제목/설명/태그/썸네일 텍스트 최적화 |
실행 흐름
1. YouTube 콘텐츠 제작 요청 수신
2. yt-researcher 실행 (직렬)
├── 키워드 리서치 (검색량, 경쟁도 분석)
├── 경쟁 채널/영상 트렌드 분석
└── 타겟 키워드 + 콘텐츠 방향 제안 → research-brief.md
3. 병렬 실행 (Fan-out — researcher 산출물 의존)
├── yt-writer: 대본 + 스토리보드 (researcher 브리프 기반)
└── yt-designer: 썸네일 컨셉 + 비주얼 가이드 (researcher 브리프 기반)
4. 완료 대기 → 결과 통합 (Fan-in)
5. yt-seo 실행 (직렬 — writer + designer 산출물 모두 수신)
├── 제목 최적화 (CTR 극대화)
├── 설명문 + 태그 구성
├── 썸네일 텍스트 SEO 최적화 (designer 컨셉 기반)
└── 업로드 체크리스트 생성
6. 최종 콘텐츠 패키지 보고
산출물 형식
## YouTube 콘텐츠 패키지
### 리서치 요약
- 타겟 키워드: {keywords}
- 예상 검색량: {volume}
- 경쟁도: {competition}
### 대본
[씬별 대본 내용]
### 스토리보드
[씬별 비주얼 가이드]
### SEO 메타데이터
- 제목: {title}
- 설명: {description}
- 태그: {tags}
- 썸네일 텍스트: {thumbnail_text}
### 업로드 체크리스트
[체크리스트 항목]
에러 핸들링
| 실패 단계 | 처리 |
|---|
| yt-researcher 실패 | 1회 재시도 -> 실패 시 사용자 제공 키워드로 직접 진행 |
| yt-writer 실패 | 1회 재시도 -> 실패 시 리서치 결과만 보고 |
| yt-seo 실패 | 1회 재시도 -> 실패 시 대본만 전달 (SEO 수동) |
Agentic Loop (자가 수정 루프)
각 에이전트 작업 완료 후 자가 검증을 실행한다. 검증 실패 시 자율 수정 루프:
- 에이전트가 작업 완료 보고
- 에이전트의
## 자가 검증 bash 스크립트 실행
- 위반 0건 → PASS → 다음 단계 진행
- 위반 발견 → 에이전트에게 수정 지시 (구체적 위반 내용 전달)
- 수정 후 재검증 (2~4 반복, 최대 3회)
- 3회 실패 → 사용자 에스컬레이션 (AskUserQuestion)
핵심 원칙: "검증 통과 없이 다음 단계 진행 금지"
Agentic Loop → Brain 기록
- 자가 수정 성공:
reflect(context="[KAIROS-YT] Agentic Loop: {위반유형} → {수정횟수}회 만에 해결", domain="kairos-youtube", category="insight")
- 3회 실패:
reflect(context="[KAIROS-YT] Agentic Loop: {위반유형} → 3회 실패 에스컬레이션", domain="kairos-youtube", category="mistake")
- reflect 실패 시 무시하고 진행
KAIROS Probes
팀 실행 완료 시 아래 메트릭을 자동 측정하고 Brain에 observation으로 기록한다.
| Probe ID | 메트릭 | 소스 | 임계값 |
|---|
| yt-pipeline | 파이프라인 완주율 (리서치→스크립트→SEO 3단계 중 완료 비율) | 산출물 존재 여부 | < 100% |
Probe 실행 프로토콜
- YouTube 팀 실행 완료 후 3단계 산출물 존재 여부 확인
- 완주율 계산 → yt-pipeline 메트릭
- Brain observation 기록 (반드시 아래 형식 준수):
- domain:
kairos-youtube (필수 — 이 형식이 아니면 트렌드 분석에서 누락됨)
- outcome:
위반: {value} 또는 정상: {value} (필수 — "위반" 키워드로 breach 판별)
- context:
[KAIROS] youtube/yt-pipeline: {value}% (threshold: 100%)
- 100% 미만 시 누락 단계 리포트에 포함
Team Memory Protocol
세션 시작 시
~/.claude/teams/youtube/team_memory.md 읽기
~/.claude/teams/youtube/patterns/ 최근 3개 파일 읽기
- 팀 컨텍스트를 에이전트 프롬프트에 주입 (Injected Zone)
세션 종료 시 (작업 완료 보고 직전)
~/.claude/teams/youtube/session_log/{date}-step{N}.md 작성:
- 태스크 요약 (1~2줄)
- 투입 에이전트 목록
- 핵심 결정 사항
- 발견된 이슈
- 수정된 파일 경로
- team_memory.md의 "알려진 함정" 갱신 (반복 이슈 발견 시)
트리거 조건
- YouTube 콘텐츠 제작 요청 시
- 영상 기획/대본/SEO 작업 요청 시
- team-orchestrator에서 콘텐츠 작업 위임 시
Self-Healing Memory Protocol
팀별 성공/실패 패턴을 Brain에 축적하고, 다음 실행 시 자동 주입한다.
실행 시작 시 (recall)
recall(domain="kairos-youtube", query="{미션 요약}", token_budget=4000) 호출
- 경험이 1건 이상이면 에이전트 프롬프트에
## 과거 패턴 (Brain recall) 섹션으로 주입
- 경험이 0건이면 주입 생략
- recall 실패 시 무시하고 진행
실행 완료 시 (reflect + feedback)
reflect(context="[KAIROS-YT] {task_id}: {결과}", action="{에이전트}: {행동}", outcome="{결과}", domain="kairos-youtube", category="insight"|"mistake", session_id="{task_id}-youtube")
feedback(experience_ids="", success={완성여부})
- 실패 시 무시하고 진행