---
task_id: task-2481R
team: composite-team (로키 + 마아트)
mode: read-only audit
created: 2026-05-08
parent_task: task-2481 (DOGFOODING_PENDING)
related: task-2483 (BOT_GITHUB_TOKEN refresh, MERGED)
---

# task-2481R — task-2481 dogfooding 조건 2-4 read-only audit

## S — Situation

task-2481 본질(bot-authored no-admin-override merge flow + dogfooding layer 5) PASS. 회장 결정으로 ESCALATED → DOGFOODING_PENDING 재분류, 4가지 조건 충족 시 DONE 허용.

- 조건 1 (BOT_GITHUB_TOKEN graphql 401): task-2483 머지로 **LIVE PASS** 재확인. 본 audit에서 `curl bearer $BOT_GITHUB_TOKEN` graphql `{viewer{login}}` → HTTP 200 + `jeon-jonghyuk-taskctl-bot[bot]` 응답 확인.
- 조건 2-4: 미확인 → 본 audit 대상.

## C — Complication

- read-only 제약: 코드/PR/머지/admin override/audit jsonl 신규 발행 금지.
- 검증은 `gh api` GET, 파일 read, BOT 토큰 graphql GET만 사용.
- 보고서(task-2481R.md) write만 허용.

## Q — Question

조건 2 (bot-authored PR 재발행 또는 PR #44 handoff 재시도), 조건 3 (no-admin enqueue-merge 성공), 조건 4 (layer 5 dogfooding evidence)의 현재 차단 원인은?

## A — Answer

### 조건 2 — bot-authored PR 재발행 / handoff 재시도

**현재 상태:**
- PR #44: `state=OPEN`, `author=JonghyukJeon (사람)`, `mergedAt=null`, `mergeable=UNKNOWN`, `headRefName=task/task-2481-dev4`
- handoff-to-bot.jsonl 단 1건: `ts=2026-05-07T12:00:11Z`, `dry_run=true`, `new_pr=null`, `original_commits=10건`, `new_commits=[]`, `outcome=OK`

**차단 원인 후보:**
1. **handoff 실 실행 미발행** — dry_run만 1회. 실제 cherry-pick + bot push + new PR 생성 미시도. (확인됨)
2. **BOT 토큰 push 권한** — graphql viewer은 200이지만 push 권한은 별도 검증 필요. installation token 전용 endpoint(`/installation/repositories`)는 200(보고서 task-2483 §9). 단, branch protection ruleset(15896715)은 `creation/update` 막지 않음 → push는 정책상 가능 추정.
3. **PR #44 close 의존성** — handoff 시 원본 PR close 원자성(`utils/handoff_to_bot.py:208-225` HandoffError raise). PR #44 OPEN 상태에서 새 bot PR 발행 시 close까지 한 트랜잭션. close 실패 시 rollback. 사람 author PR을 머지·close 어느 쪽도 미수행.

**Evidence:**
- `gh pr view 44 --json author,state` → JonghyukJeon, OPEN
- `cat handoff-to-bot.jsonl` → 1 line, dry_run=true

**복구 task 제안 (권고):** task-2481+2 (가칭) — `taskctl handoff-to-bot --pr 44`를 dry_run 없이 실행, new bot PR 발행 + 원본 close audit jsonl 추가. 사전 BOT push 권한 smoke test 1건 필수.

### 조건 3 — no-admin enqueue-merge

**현재 상태:**
- merge-queue.jsonl 단 1건: `ts=2026-05-07T10:42:48Z`, `pr_number=44`, `author=""`, `reviewer=""`, `head_sha=""`, `outcome=BLOCKED_ADMIN_OVERRIDE`, `dry_run=false`
- PR #44 `autoMergeRequest=null`, `reviewDecision=""` (승인 0건)
- ruleset 15896715 "main-protection" **active**, `required_approving_review_count=0`, `required_review_thread_resolution=true`, `required_status_checks=8건`
- PR #44 status checks: **11/11 SUCCESS** (ci/guard, guard, qc-check, hidden-path-audit, lock-in-check, merge-safety-check, gemini-review-gate, cancel-kill-switch, taskctl-state-guard×2, phase3-merge-gate)

**차단 원인 후보:**
1. **enqueue-merge 정책 강제 시연만 1회** (BLOCKED_ADMIN_OVERRIDE) — 실제 `--no-admin-override` 분기로 PR #44 머지 시도 미수행. (확인됨)
2. **PR author = 사람 (JonghyukJeon)** — `assert_bot_author(strict=True)` (taskctl request-review 1단계)가 즉시 reject. **조건 2 선행 필수**.
3. **승인자(reviewer) 부재** — reviewDecision 빈값. ruleset이 `required_approving_review_count=0`이라 승인 없이도 ruleset상 통과 가능. 그러나 `assert_distinct_actors` + `assert_allowed_human_approver` 정책상 사람 reviewer 1명 + author≠reviewer 필요. ruleset 미요구를 정책이 요구.
4. **review thread resolution** — ruleset 요구. 현 PR thread 미확인(GET 추가 필요하지만 audit 스코프 외).

**Evidence:**
- `gh api repos/.../rulesets/15896715` → active, required_approving_review_count=0
- `gh pr view 44 --json reviewDecision,autoMergeRequest,statusCheckRollup` → "", null, 11 SUCCESS
- `cat merge-queue.jsonl` → 1 line, BLOCKED_ADMIN_OVERRIDE

**복구 task 제안 (권고):** 조건 2 완료 후 task-2481+3 — bot PR에 사람 reviewer 1명 지정 + `taskctl enqueue-merge --no-admin-override`로 auto-merge 큐 진입. ruleset만으로 머지 PASS 검증.

### 조건 4 — layer 5 dogfooding evidence

**현재 상태:**
audit jsonl 발행 현황 (read-only):
- `handoff-to-bot.jsonl`: 1건 (dry_run, new_pr=null)
- `merge-queue.jsonl`: 1건 (BLOCKED_ADMIN_OVERRIDE, head_sha 비어있음)
- `bot-token-refresh.jsonl`: 9건 (5/7 13:39~16:09 — refresh 사이클은 정상)

**차단 원인:**
1. **본 task PR(#44)을 본 task 명령으로 자기 검증한 evidence 부재** — handoff/enqueue-merge 모두 시연(dry_run/BLOCKED) 1건만. 실 동작 jsonl 0건.
2. **새 bot PR 발행 + ruleset 통과 머지 + audit append** 3종 세트가 모두 미발행. 조건 2·3의 후속 결과.

**Evidence:**
- `ls memory/orchestration-audit/` → 14개 jsonl 존재. handoff/merge-queue 각 1건만, dogfooding-evidence.jsonl 같은 누적 파일 없음.
- task-2481.dogfooding-pending.conditions §"layer 5 dogfooding evidence 확보" 미충족.

**복구 task 제안 (권고):** 조건 2·3 완료 시 자동 발행. 별도 task 불필요. 단, audit schema(원자성 보장 + append-only)는 본 task 코드에 이미 구현됨(`utils/handoff_to_bot.py`, `utils/merge_queue_client.py`).

## 종합 판정 (마아트)

| 조건 | 판정 | 차단 단계 |
|---|---|---|
| 조건 2 (bot PR 재발행) | **차단** | handoff 실 실행 미수행. dry_run만 1회. |
| 조건 3 (no-admin enqueue-merge) | **차단 (조건 2 의존)** | 사람 author PR이라 정책상 reject. 조건 2 선행 필수. |
| 조건 4 (layer 5 evidence) | **차단 (조건 2·3 의존)** | 실 실행 0건이라 evidence 0건. |

**회장 결정 필요 항목:**
1. 후속 task 발행 승인 (회장 명시 "추가 단독 작업 발행 금지" 해제 필요).
2. handoff-to-bot 실 실행 시 PR #44 close 동의 (원자성 트랜잭션 일부).
3. ruleset `required_approving_review_count=0`임에도 정책 `assert_allowed_human_approver` 강제 유지 여부 — 시연 의도면 reviewer 지정 필요.

## 복구 task 제안 요약 (로키)

권고 2건 (task 번호 미발행, 권고만):

1. **(가칭) task-2481+2 — handoff-to-bot 실 실행**
   - `taskctl handoff-to-bot --pr 44` (dry_run 제거)
   - 사전: BOT push 권한 smoke test 1건
   - 결과: new bot PR 발행 + PR #44 close + handoff-to-bot.jsonl append (실 commits)

2. **(가칭) task-2481+3 — no-admin enqueue-merge 시연**
   - 위 새 bot PR에 회장 reviewer 지정 (allowed_approvers.json 통과)
   - `taskctl enqueue-merge --pr <new> --no-admin-override`
   - 결과: ruleset 8 checks SUCCESS + thread resolved → auto-merge → merge-queue.jsonl append (실 head_sha + outcome=MERGED)

조건 4 evidence는 위 2건 자동 발행으로 충족.

**추측 명시:**
- BOT push 권한은 graphql 200으로부터 추정. 직접 push 검증은 read-only 스코프 외.
- ruleset thread resolution 통과 여부는 PR thread 상세 GET 없이 미확인.
- bot-token-refresh.jsonl 마지막 항목 5/7 16:09인데 현재 graphql 200 = 추가 refresh 발생했으나 audit 미기록 OR 메모리 캐시. 본 audit 스코프 외.

— composite-team (로키 + 마아트), 2026-05-08
