# task-41.1: dispatch.py 개선 + 조직도 JSON 수정

## 수정 대상 파일
1. `/home/jay/workspace/dispatch.py`
2. `/home/jay/workspace/prompts/team_prompts.py`
3. `/home/jay/workspace/memory/organization-structure.json`

## 수정 항목

### A. dispatch.py — task_id 충돌 방지 (최우선)
현재 `generate_task_id()`에 파일 락이 없어서, 연속 dispatch 시 같은 task_id 생성됨.
- `fcntl.flock` 또는 별도 lock 파일 사용하여 atomic increment 구현
- 또는 task-timers.json에 새 task를 먼저 기록(placeholder) 후 id 반환

### B. dispatch.py — --project 선택적 + 시스템 작업 처리
현재: `--project` 필수, 모든 작업에 프로젝트 격리 규칙 적용됨.
수정:
- `--project` 옵션을 optional로 변경 (기본값: 없음)
- `--project` 미지정 시: 격리 규칙 없이, 기본 작업 디렉토리는 `teams/<팀명>/` 사용
- `--project` 지정 시: 해당 프로젝트 디렉토리에 격리

### C. team_prompts.py — 프로젝트 격리 규칙 조건부 적용
현재: `_build_direct_prompt()`와 `_build_glm_prompt()`에서 항상 "프로젝트 격리" 문구 삽입.
수정:
- `project_id`가 None이면 격리 규칙 제거, 대신 "코드는 /home/jay/workspace/teams/<팀명>/ 또는 지시된 경로에 작성" 문구 사용
- `project_id`가 지정되면 기존처럼 격리 규칙 적용

### D. organization-structure.json — 1팀/2팀 코워크 모델 반영
현재 1팀/2팀 백엔드·프론트·UX 팀원이 `glm-4.7-flash` (z.ai)로 표기됨.
실제로는 코워크(Task tool) 방식 → sonnet/haiku 서브에이전트.
수정:
- dev1-team, dev2-team의 backend/frontend/ux-ui 멤버:
  - model: "claude-sonnet-4-6" (기본, 복잡한 작업) / "claude-haiku-4-5" (단순 작업)
  - 표기: model 필드에 "claude-sonnet-4-6" 기재 (팀장 판단으로 haiku 전환 가능)
  - engine: "anthropic"
  - invoke: "Task (subagent_type: general-purpose, model: sonnet)"
  - caller: 팀장 id (hermes / odin)
- dev3-team 멤버는 변경 없음 (GLM 유지)
- engine_summary도 함께 업데이트:
  - claude-sonnet-4-6: 기존 6명(팀장+횡단) + 6명(1팀/2팀 비테스터 멤버) = 12명
  - glm-4.7-flash: 기존 9명 → 3명 (3팀 멤버만)
  - total: 20 (변동 없음)
- 1팀 팀장(헤르메스) model도 확인: 현재 bot_settings.json에서 Opus로 변경되었으나, org JSON은 아직 sonnet일 수 있음. 확인 후 일치시킬 것.

### E. dispatch.py — level critical 시 안내 문구 (낮은 우선순위)
critical 레벨 시 "Opus 팀장이 배정됨" 같은 자동 전환은 현재 봇 설정 변경이 필요하므로, 우선 프롬프트에 "이 작업은 중요도 critical입니다. 품질 우선으로 작업하세요." 문구만 추가.

## 절대 건드리지 말 것
- dispatch.py의 cokacdir 명령 실행 로직
- team_prompts.py의 GLM 프롬프트 워크플로우 (done 파일 폴링 등)
- 기존 테스트가 있다면 깨뜨리지 말 것

## 완료 기준
- dispatch.py --project 없이 실행 가능
- 연속 dispatch 시 task_id 충돌 없음 (테스트: generate_task_id를 2번 연속 호출하여 다른 ID 확인)
- organization-structure.json의 engine_summary가 실제 팀 구성과 일치
- 기존 dispatch 기능 정상 동작
