---
task_id: task-2481
type: plan
scope: task
created: 2026-05-07
updated: 2026-05-07
status: completed
---

# 계획서: task-2481

**task**: task-2481
**목표**: bot-authored / no-admin-override merge flow를 영구 명령(`taskctl pr-open --bot-author`, `handoff-to-bot`, `request-review`, `enqueue-merge --no-admin-override`)으로 구현하고, 본 task 자체 PR을 그 명령으로 머지(dogfooding layer 5).
**승인**: 회장 2026-05-07 "self-approval / base branch policy 충돌 영구 차단"
**근거**: PR #41 (task-2478) base branch policy 충돌, task-2466 시스템 청사진 v3 §15

---

## 목표

PR 작성자(bot)와 승인자(사람)를 구조적으로 분리하여 self-approval과 base branch policy 충돌을 코드 레벨에서 제거한다. 동시에 admin override / force merge / branch protection bypass를 fail-closed 차단한다.

## 범위

### 포함
1. `taskctl pr-open --bot-author` (또는 기존 `--auto`의 별칭) — bot author 강제 PR 생성
2. `taskctl handoff-to-bot --pr <num>` — 사람 author PR을 bot equivalent로 재작성 + audit jsonl mapping
3. `taskctl request-review --pr <num> --reviewer <human>` — approver≠author 강제, self-approval reject
4. `taskctl enqueue-merge --no-admin-override --pr <num>` — merge_queue 진입, admin/force/bypass 차단
5. 보조 유틸: `utils/bot_pr_author.py`, `utils/handoff_to_bot.py`, `utils/merge_queue_client.py`
6. 회귀 테스트 8건 (`tests/scripts/`, `tests/regression/`)
7. dogfooding: 본 task PR을 자체 명령으로 머지

### 제외 (다음 페이즈 이후)
- branch protection 룰 자체의 GitHub 측 변경 (운영 영역)
- merge queue UI 정책 (GitHub 설정)
- 봇 토큰 자동 갱신 systemd timer 변경 (이미 운영중)

## 위임 계획

- 명령 4개 + 유틸 3개 구현: **카르티케야(백엔드)** — taskctl/Python 모듈
- 회귀 테스트 8건: **하누만(테스터)** — pytest + monkeypatch
- 격리 검토 / 인터페이스 일관성: **사라스바티 + 락슈미 (제한적)** — 이번 task는 백엔드 중심

## 검증 기준

- `pytest tests/scripts/test_bot_authored_pr* tests/scripts/test_handoff_to_bot* tests/scripts/test_enqueue_merge* tests/regression/test_no_admin_override* -v` → 8 PASS
- `taskctl pr-open --bot-author --task-id task-2481` → PR author=bot
- `taskctl request-review --pr <PR> --reviewer <human>` → approver≠author 통과
- `taskctl request-review --pr <PR> --reviewer <bot>` → reject (self-approval)
- `taskctl enqueue-merge --no-admin-override --pr <PR>` → merge_queue 진입 evidence
- `taskctl enqueue-merge --admin-override --pr <PR>` → reject + 보안 알람
- 본 task PR `gh pr view <PR> --json author,reviewDecision,mergeStateStatus,mergedAt`
- `grep -c "admin_override" memory/orchestration-audit/admin-override.jsonl` 변화 0건
