# task-2559 context notes

## 핵심 매핑 사실 (런타임 검증)
- `cokacctl.json`: tokens list + install_path. chat_id 매핑 없음.
- `memory/bot_settings_sync.json`: bot_key (16자 hex) → display_name (dev3_Dagda_bot 등) + last_sessions{chat_id: workspace_dir}
- `schedule_history/<schedule_id>.log` JSONL line: `{chat_id, schedule_id, bot_key_verifier(sha256), workspace_path, ts, status, prompt}`
- `bot_key_verifier` ≠ sha256(bot_key) 단순. cokacdir 바이너리 stripped — 직접 디코딩 불가.

## 매핑 전략 결정
- chat_id 격리: 6937032012만 인정 (`DASHBOARD_CHAT_ID` 기존 상수 재사용)
- bot_verifier_cache: `memory/events/bot_verifier_mapping.json` (선택) — 관측된 verifier ↔ bot_key 캐시. 없어도 동작.
- 1차 매핑: cwd 패턴 → cron 봇은 schedule_id로 식별, dispatch 봇은 worktree dir name으로 dev_id+task_id 직접 추출.
- 2차 매핑: prompt 본문에서 task_id 추출 → task-timers.json bot 필드 lookup → display_name 추정.
- 3차 폴백: display_name unknown → schedule_id만 노출, dashboard에서 generic "cron 봇 활성" 표시.

## cwd 패턴 정규식
- cron 봇: `^/home/jay/\.cokacdir/workspace/([A-F0-9]{8})/?$`  → schedule_id (대문자 hex 8자)
- dispatch 봇: `^/home/jay/workspace/\.worktrees/(task-[\w\d\-+]+)-(dev\d+)(?:-[\w]+)?/?$` → task_id + dev_id

## /proc 접근 보안
- psutil.Process는 권한 부족 시 AccessDenied 발생 → 무시하고 다음 PID 계속
- /proc/<pid>/cwd readlink는 jay user 본인 프로세스만 readable (Linux 기본). 다른 user 봇 못 보임.

## subagent (Layer 2) 식별
- psutil.Process(lead_pid).children(recursive=False) → claude 프로세스 child PID 목록
- child cmdline: `claude ... --system-prompt-file /tmp/system_prompt_<hash>_<parent_pid>.md` 패턴
- 또는 환경변수 CLAUDE_AGENT_NAME / CLAUDE_SUBAGENT_TYPE
- 식별 안 되면 generic "subagent active (PID=<X>)" 노출 — count만으로 spec 2.2 충족 가능 (병렬 child 수)

## hybrid mode 우선순위 결정 트리
```
member 상태 결정 시:
  1. bot_process_collector.get_active_lead_bots() 조회
  2. lead bot 활성 → 팀장 작업중
     - Layer 2 children 있음 → 해당 팀원 작업중 (id 매핑 가능 시), 나머지 standby
     - Layer 2 children 0 → 팀원 전원 standby
  3. lead bot 없음:
     - task-timers.json running 엔트리 있어도 stale → idle (spec §9.7 ❌2)
     - 단 task-2536 idle_base 부착은 유지
  4. break/explicit status는 그대로 우선
```

## 라이브 검증 시나리오
- cron 봇 한 개 발사 (예: task-2559 자체 봇)
- 대시보드 `/api/member-status` 호출 → 해당 팀장 working + 팀원 standby
- 봇 종료 후 다시 호출 → 전원 idle

## 봇 직접 행동 doctrine 매핑
- 4번(CI 11 checks SUCCESS) + 5번(Gemini unresolved 0) + 6번(BOT squash merge) 전부 자동 chain
- capability 6번째 (ExecutorScheduler) 활용 가능

## .done 마커 처리
- `.done` 마커는 spec §9.3 보조 신호 — 실시간 신호는 봇 프로세스 종료
- archive 박제는 그대로 유지 (task-XXX.done 파일이 .worktrees/.archive 디렉토리에 박제됨)
