# Route Policy — 역할-팀 매핑
#
# 산출물 ② — Phase A. orchestrator_subagent_prompt에서 lookup하는 정책 파일.
# 청사진 출처: system_bot_orchestration_blueprint_260506.md §15 (track 차등), §16 (호환 제약)
# 작성: 2026-05-07 anu-direct 2차 수정안 (조건부 PASS 수정 반영)
#
# version: v1.0-phase-a-propose-only

version: "v1.1"
updated: "2026-05-07"
status: "phase_a_propose_only_corrected"

# ─────────────────────────────────────────────────────────────
# Track 정의 — 청사진 §15
# ─────────────────────────────────────────────────────────────
tracks:
  dev_workspace:
    description: "내부 자동화 / 시스템 hardening / dispatch / taskctl / scripts"
    weight: light
    surface_owners:
      - scripts/**
      - utils/**
      - tests/**
      - .github/workflows/**
      - dispatch.py
      - taskctl.py

  user_service:
    description: "외부 사용자 서비스 (InsuRo, InsuWiki, MediScan, ThreadAuto)"
    weight: heavy
    surface_owners:
      - projects/insuro/**
      - projects/insuwiki/**
      - projects/mediscan/**
      - projects/threadauto/**

  internal_doc:
    description: "메모리/스펙/계획 문서. 코드 실행 변경 없음."
    weight: minimal
    surface_owners:
      - memory/**
      - "*.md"

# ─────────────────────────────────────────────────────────────
# Role → Team 매핑 — 회장 검토 필요 영역 ★
# ─────────────────────────────────────────────────────────────
# 룰: role은 작업 성격, team은 봇 그룹. 1 role -> N team 가능 (선호 순서).
# 봇별 부하/idle 시간은 dispatch.py가 final lookup 시 추가 고려.

roles:
  # ─── 코드 구현 역할 ───
  dev_bot:
    description: "백엔드/프론트 구현. 단일 파일 ~500줄 변경 가능."
    eligible_teams:
      - dev1   # 헤르메스 — 일반 개발
      - dev2   # 오딘 — 시스템 아키텍처 (sonnet, opus 승격 가능)
      - dev3   # 라/다그다 — 인프라/도구
      - dev4   # 비슈누 — 자동화
      - dev5   # 마르둑 — git/state
      - dev6   # 페룬/이참나 — 광고/마케팅 도구
    selection_hint: "task_md.target_team 명시 우선 → surface expertise → idle/available → 최근 실패/중복 surface 회피. 고정 순번만으로 배정 금지."

  # ─── 횡단 검증 역할 (회장 명시 룰) ───
  failure_mode_reviewer:
    description: "redteam / failure-mode 분석 / 회장 명시 'QC/검증 → composite-team'"
    eligible_teams:
      - composite   # 로키 + 마아트 (필수, 단일 정답)
    selection_hint: "회장 룰 강제: QC/검증/감사는 composite만. dev 팀 금지."

  audit_reviewer:
    description: "전수조사 / 감사 / 사후 회귀"
    eligible_teams:
      - composite

  # ─── 디자인 역할 ───
  design_bot:
    description: "비주얼 창작 (배너/카드뉴스/이미지)"
    eligible_teams:
      - design   # ★ 회장 명시: 배너/이미지=디자인팀만, dev팀 절대 금지 (3회 반복 실수)
    selection_hint: "dev 팀 라우팅 금지. design 팀이 idle 아니면 escalate."

  # ─── 마케팅/콘텐츠 역할 ───
  copywriter:
    description: "마케팅 카피 / 광고 / 랜딩 카피"
    eligible_teams:
      - marketing
      - content

  blog_writer:
    description: "블로그 콘텐츠 (네이버/티스토리)"
    eligible_teams:
      - publishing

  consulting_bot:
    description: "컨설팅 / 전략 / RFP"
    eligible_teams:
      - consulting

  # ─── GLM 코딩 역할 ───
  glm_coder:
    description: "GLM-5 기반 코딩. 회장 명시 또는 GLM 실험 task에 한정하여 자동 라우팅."
    eligible_teams:
      - dev8   # ★ 회장 명시: dev8 GLM 반드시 코딩

  # ─── 위임 종착점 (단일 봇) ───
  anu_direct:
    description: "코드 수정 없는 아누 직접 작업 (메모리 정리 / 마커 처리 / 정책 문서 초안). state mutation/dispatch/merge/credential/security 결정 금지."
    eligible_teams:
      - anu-direct

# ─────────────────────────────────────────────────────────────
# Routing Decision Rules — 회장 조건부 승인 반영
# ─────────────────────────────────────────────────────────────
routing_decision_rules:
  dev_bot_selection_order:
    - task_md.target_team_explicit
    - surface_expertise_match
    - idle_or_available_team
    - avoid_recent_failure_or_surface_conflict
  anu_direct_allowed:
    - policy_document_draft
    - memory_cleanup
    - marker_report_cleanup
    - code_change_free_classification_summary
  anu_direct_forbidden:
    - code_modification
    - state_mutation
    - dispatch_execution
    - merge_queue_manipulation
    - credential_or_security_decision
  glm_coder_auto_route_allowed_if:
    - chairman_explicitly_requested_glm
    - task_md_mentions_glm_coding
    - experimental_glm_track
  glm_coder_auto_route_forbidden_if:
    - default_dev_bot_fallback_only


# ─────────────────────────────────────────────────────────────
# Track별 기본 role 풀 — Subagent가 추천 시 고려
# ─────────────────────────────────────────────────────────────
default_roles_per_track:
  dev_workspace:
    primary: [dev_bot]
    cross: [failure_mode_reviewer]   # Lv.3+ 시 강제
  user_service:
    primary: [dev_bot]
    cross: [failure_mode_reviewer, audit_reviewer]
    pre_design: [consulting_bot]     # Lv.3+ + 신규 기능
  internal_doc:
    primary: [anu_direct]            # 회장 검토 필요한 정책 문서는 anu가 1차 초안

# ─────────────────────────────────────────────────────────────
# 차등 강제 룰 (회장 명시 — 위반 시 blocking_issues 발행)
# ─────────────────────────────────────────────────────────────
forbidden_routings:
  - role: design_bot
    forbidden_teams: [dev1, dev2, dev3, dev4, dev5, dev6, dev7, dev8]
    reason: "회장 명시 — 배너/이미지 dev팀 절대 금지 (3회 반복 실수 박제)"

  - role: failure_mode_reviewer
    forbidden_teams: [dev1, dev2, dev3, dev4, dev5, dev6, dev7, dev8]
    reason: "회장 명시 — QC/검증은 composite-team만"

  - role: audit_reviewer
    forbidden_teams: [dev1, dev2, dev3, dev4, dev5, dev6, dev7, dev8]
    reason: "동일 — 전수조사도 composite만"

# ─────────────────────────────────────────────────────────────
# 봇 가용성 lookup 인터페이스 (dispatch.py가 확장)
# ─────────────────────────────────────────────────────────────
# Phase A에서는 추천만. 실제 가용성은 task-timers.json + bot_settings.json 참조.
availability_lookup:
  source: "task-timers.json + bot_settings.json"
  staleness_threshold_seconds: 60
  on_stale: "fall_back_to_idle_time_only"

# ─────────────────────────────────────────────────────────────
# 회장 검토 필요 항목 (CHAIRMAN-REVIEW-REQUIRED)
# ─────────────────────────────────────────────────────────────
chairman_review_required:
  - "roles.dev_bot.eligible_teams는 고정 선호순서가 아니라 target_team → surface expertise → idle → 최근 실패 회피 순으로 해석"
  - "default_roles_per_track 정책"
  - "anu_direct는 코드 변경 없는 문서/정책/정리로 제한. mutation/dispatch/merge 금지"
  - "Lv.3+ user_service에 consulting_bot pre_design 강제 여부"
  - "GLM(dev8)은 회장 명시 또는 GLM 실험 task에 한정. 기본 dev_bot fallback 금지"
