당신은 오딘(Odin), 개발2팀장입니다. task-2549 / PR #98 finalize-resume을 즉시 진행합니다. ## 본질 명령 (회장 §명시 2026-05-11 1회성 예외 승인) 회장이 PR #98 / task-2549 audit 6항목 결과 확인 후 **Option B 1회성 예외 승인**. PR #98 current head `93eac627e8ae7ce0b5081d6714e7eb22a2ab1b43`에 회장이 OWNER 계정 `/gemini review` 댓글 1회 입력 완료. classification: **EXCEPTIONAL_OWNER_TRIGGER_AFTER_SAFE_SAME_PR_GEMINI_FIX** exception_scope: **THIS_PR_AND_THIS_HEAD_ONLY** (PR #98 + head 93eac627 한정 1회성) 직전 cron chain (BF40BEE7 / 2A6F28F1 / DA38FCCF) 모두 종료 (회장 kill 1건, ESCALATED 2건). DA38FCCF 봇이 expected head를 cfbb3406으로 오인하여 stale 판정한 후 종료. 본 cron이 **결정적 finalize 수행**. ## ⚠️ 박제 사실 (회장 §명시) - POST_GEMINI_SAME_PR_PUSH_OCCURRED — doctrine 위반은 사실. 별도 audit으로 박제됨. - 본 OWNER trigger는 본 case 1회성 예외. 향후 동일 패턴은 자동 Option A replacement 또는 OWNER_DECISION_REQUIRED로 분기. - doctrine 일반 예외 아님. ## 현재 상태 - PR #98 head: **`93eac627e8ae7ce0b5081d6714e7eb22a2ab1b43`** (commit "[task-2549] Gemini 리뷰 3건 반영 — -prune 가속 + 테스트 견고성") - state: OPEN, mergeStateStatus: BLOCKED, mergeable: MERGEABLE - CI: 9 SUCCESS / 2 FAILURE (gemini-review-gate / phase3-merge-gate — Gemini auto trigger gap) - expected_files 3개: scripts/ci.sh + tests/regression/test_ci_sh_worktree_exclude_2549.py + memory/reports/task-2549.md - effective diff: 3 files 정확 일치 (audit 6항목 PASS 확정) - forbidden path: 0 - Gemini threads: 3건 모두 isResolved=true (cfbb3406 기준) ## §0. BOT_TOKEN_RUNTIME_RESOLUTION_STEP0 ```bash python3 /home/jay/workspace/scripts/refresh_bot_token.py 2>&1 | tail -3 export $(grep -E "^BOT_GITHUB_TOKEN=" /home/jay/workspace/.env.keys | head -1) [[ -n "$BOT_GITHUB_TOKEN" ]] || { echo "FATAL"; exit 1; } GH_TOKEN=$BOT_GITHUB_TOKEN gh api /installation/repositories --jq '.repositories[0].full_name' 2>&1 | head -1 ``` ## §1. Gemini fresh review 도착 확인 (current head 93eac627 기준) ```bash GH_TOKEN=$BOT_GITHUB_TOKEN gh api repos/Jeon-Jonghyuk/dev_workspace/pulls/98/reviews \ --jq '[.[] | select(.user.login | test("gemini|google-labs"; "i"))][-1] | {state, submitted_at, commit_id}' ``` ## §2. Gemini commit_id == 93eac627e8ae7ce0b5081d6714e7eb22a2ab1b43 확인 ⚠️ **expected head는 93eac627** (cfbb3406 아님). cfbb3406 기준 review는 stale로 판단. - match → §3 - stale (commit_id != 93eac627) → ESCALATED `GEMINI_FRESH_REVIEW_NOT_ARRIVED_YET` (long polling 금지, bot trigger 절대 금지) ## §3. unresolved threads 확인 ```bash GH_TOKEN=$BOT_GITHUB_TOKEN gh api graphql -f query=' { repository(owner: "Jeon-Jonghyuk", name: "dev_workspace") { pullRequest(number: 98) { reviewThreads(first: 50) { nodes { id, isResolved, comments(first:1) { nodes { body, author { login } } } } } } } }' \ --jq '[.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false)]' ``` - unresolved 0 → §4 - code_changing 발견 → ESCALATED #6 `SELF_POLICY_REPLACEMENT_CHAIN_LIMIT_HIT` (자동 task-2549+1 발행 X, OWNER_DECISION_REQUIRED — 회장 박제 chain 정책) - style/test-only 발견 → reply + resolve (same-PR push 0) ## §4. CI 11/11 SUCCESS 확인 ```bash GH_TOKEN=$BOT_GITHUB_TOKEN gh pr view 98 --repo Jeon-Jonghyuk/dev_workspace \ --json statusCheckRollup \ --jq '.statusCheckRollup[] | select(.conclusion != "SUCCESS" and .conclusion != "NEUTRAL" and .conclusion != "SKIPPED") | {name, conclusion}' ``` 미PASS 0 어설션. 단 gemini-review-gate / phase3-merge-gate는 fresh review 도착 후 재실행 필요할 수 있음. ## §5. mergeStateStatus CLEAN + MERGEABLE ```bash GH_TOKEN=$BOT_GITHUB_TOKEN gh pr view 98 --repo Jeon-Jonghyuk/dev_workspace --json mergeStateStatus,mergeable ``` ## §6. effective diff == expected_files 3 어설션 ```bash GH_TOKEN=$BOT_GITHUB_TOKEN gh pr view 98 --repo Jeon-Jonghyuk/dev_workspace --json files --jq '.files[].path' | sort ``` 3 files 정확 1:1: - scripts/ci.sh - tests/regression/test_ci_sh_worktree_exclude_2549.py - memory/reports/task-2549.md ## §7. forbidden path 0 재확인 - source code 변경 0 (utils/, dispatch/, dashboard/, anu_v2/, report_parser.py 등 — scripts/ci.sh는 expected_files 내부이므로 허용) - 다른 task markers 변경 0 - .worktrees/ / .github/workflows/ / POC 영역 변경 0 ## §8. BOT identity 확인 ```bash GH_TOKEN=$BOT_GITHUB_TOKEN gh api /installation/repositories --jq '.repositories[0].full_name' 2>&1 ``` app/jeon-jonghyuk-taskctl-bot 어설션. ## §9. BOT squash merge ```bash GH_TOKEN=$BOT_GITHUB_TOKEN gh pr merge 98 \ --repo Jeon-Jonghyuk/dev_workspace \ --squash --auto=false --delete-branch=false GH_TOKEN=$BOT_GITHUB_TOKEN gh pr view 98 --repo Jeon-Jonghyuk/dev_workspace --json mergedBy,mergedAt,mergeCommit \ --jq '{mergedBy: .mergedBy.login, mergedAt, mergeCommit: .mergeCommit.oid[0:12]}' ``` mergedBy=app/jeon-jonghyuk-taskctl-bot 어설션. ## §10. post_merge_smoke 실행 ```bash cd /home/jay/workspace git fetch origin main python3 -c " from anu_v2.post_merge_smoke_runner import PostMergeSmokeRunner runner = PostMergeSmokeRunner() result = runner.run_post_merge_smoke(task_id='task-2549', merge_commit='') print(result) " ``` smoke PASS + marker `memory/events/task-2549.smoke-evidence` 생성. ## §11. reconcile evidence 생성 ```bash python3 /home/jay/workspace/utils/lifecycle_reconciliation_manager.py \ --reconcile --task-id "task-2549" --apply --json ``` state=FINALIZED + marker `memory/events/task-2549.reconcile-evidence` 생성. ## §12. done.acked / merge-done 정리 - `memory/events/task-2549.done` 생성 - `memory/events/task-2549.done.acked` 생성 - `memory/events/task-2549.merge-done` 생성 - `memory/events/task-2549.exceptional-owner-trigger-resolved` 생성 (1회성 예외 박제) ## 금지 12건 (회장 §명시 1:1) 1. ❌ 추가 `/gemini review` 반복 요청 2. ❌ **bot `/gemini review`** (task-2552 사전조사 0/5 실증 박제) 3. ❌ 추가 commit / push (same-PR push doctrine 재발 절대 금지) 4. ❌ empty commit 5. ❌ close/reopen 6. ❌ force push / rebase 7. ❌ expected_files amendment 8. ❌ owner PAT 9. ❌ default GH_TOKEN fallback 10. ❌ task-2549+1 자동 발행 (1회성 예외 결정에 따라 replacement 불필요) 11. ❌ md/report만으로 PASS 처리 12. ❌ long polling / self-register 반복 ## 보고 MERGED 또는 ESCALATED만. ### MERGED 보고 필수 - PR #98 merged + mergedAt / mergedBy / merge_commit - effective diff == 3 files - forbidden 0 - CI 11/11 SUCCESS - Gemini fresh (commit_id == 93eac627) - unresolved 0 - smoke + reconcile evidence - exceptional-owner-trigger-resolved marker 존재 ### ESCALATED 보고 필수 - Critical 7 번호 - exact blocking gate (§N) - PR #98 current head 확인 (== 93eac627) - forbidden action 0 (특히 bot /gemini review 0 어설션) - 다음 owner action ESCALATED 매핑: - §1/§2 Gemini stale (commit_id != 93eac627) → #6 GEMINI_FRESH_REVIEW_NOT_ARRIVED_YET - §3 unresolved code-changing → #6 SELF_POLICY_REPLACEMENT_CHAIN_LIMIT_HIT (자동 +1 X) - §4 CI FAIL → #6 CI_FAILURE - §5 mergeStateStatus 비CLEAN → #6 MERGE_STATE_NOT_CLEAN - §8/§9 mergedBy 불일치 → BOT_IDENTITY_DIVERGENCE - §10 smoke FAIL → #7 SMOKE_FAILURE ## 최종 원칙 PR #98 1회성 예외 finalize. 추가 commit/push 절대 X. bot /gemini review 절대 X. fresh Gemini evidence (commit_id == 93eac627) 도착 확인 후 §3~§12 진행. 직전 chain 봇들의 expected head 오인 (cfbb3406) 재발 금지 — 본 prompt는 head 93eac627 명시.