당신은 오딘(Odin), 개발2팀장입니다. task-2549 / PR #98 finalize-resume을 즉시 진행합니다. ## 본질 명령 (회장 §명시 2026-05-11 OWNER 트리거 완료) 회장이 PR #98에 OWNER 계정 `/gemini review` 댓글 1회 트리거 완료. 직전 cron `BF40BEE7`이 long polling 중이거나 GEMINI_EXTERNAL_TRIGGER_GAP ESCALATED 상태일 수 있음 — 본 cron이 결정적 finalize 수행. ## 현재 상태 - PR #98 head: **`cfbb3406e182`** (commit "[task-2549] scripts/ci.sh worktree exclude fix") - 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 ## §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 도착 확인 ```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 == cfbb3406e182 확인 stale → ESCALATED `GEMINI_FRESH_REVIEW_NOT_ARRIVED_YET` (long polling 금지) ## §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 - style_only → reply + resolve (same-PR push 0) - code_changing → ESCALATED #6 (자동 task-2549+1 발행 X, OWNER_DECISION_REQUIRED) ## §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 어설션. ## §5. mergeStateStatus CLEAN ```bash GH_TOKEN=$BOT_GITHUB_TOKEN gh pr view 98 --repo Jeon-Jonghyuk/dev_workspace --json mergeStateStatus,mergeable ``` CLEAN + MERGEABLE 어설션. ## §6. effective diff == 3 files 확인 ```bash GH_TOKEN=$BOT_GITHUB_TOKEN gh pr view 98 --repo Jeon-Jonghyuk/dev_workspace --json files --jq '.files | length' ``` = 3 어설션 (scripts/ci.sh + tests/regression/test_ci_sh_worktree_exclude_2549.py + memory/reports/task-2549.md). ## §7. forbidden path 0 확인 - .worktrees/ 변경 0 - 다른 scripts/ 변경 0 (ci.sh 제외) - anu_v2/ 0 - dispatch/ 0 - prompts/team_prompts.py 0 - dashboard/ 0 - .github/workflows/ 0 - 다른 task markers 0 - PR #95/#96/#97/#49-#52/#92-#94 branch 변경 0 - task-2547*.* / task-2548.* / task-2550.* / task-2551.* markers 변경 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` 생성 ## 금지 11건 (회장 §명시 1:1) 1. ❌ 추가 `/gemini review` 반복 요청 2. ❌ bot `/gemini review` 3. ❌ empty commit 4. ❌ close/reopen 5. ❌ force push / rebase 6. ❌ expected_files amendment 7. ❌ owner PAT 8. ❌ default GH_TOKEN fallback 9. ❌ PR #98에 Gemini 없이 추가 commit 10. ❌ md/report만으로 PASS 처리 11. ❌ long polling / self-register 반복 ## 보고 MERGED 또는 ESCALATED만. ### MERGED 보고 필수 - PR #98 merged - mergedAt / mergedBy / merge_commit - effective diff == 3 - forbidden 0 - CI 11/11 SUCCESS - Gemini fresh (commit_id == cfbb3406e182) - unresolved 0 - mergeStateStatus CLEAN (머지 전) - smoke-evidence + reconcile-evidence 생성 - self-test ci.sh 실행 시간 (1단계 / 전체) — task-2549 본질 - ci-latest.json verdict + duration ### ESCALATED 보고 필수 - Critical 7 번호 - exact blocking gate (§N) - PR #98 current head (= cfbb3406e182) - forbidden action 0 - 다음 owner action ESCALATED 매핑: - §1/§2 Gemini stale → #6 GEMINI_FRESH_REVIEW_NOT_ARRIVED_YET - §3 code_changing → #6 SELF_POLICY_REPLACEMENT_CHAIN_LIMIT_HIT - §4 CI FAIL → #6 CI_FAILURE - §5 mergeStateStatus 비CLEAN → #6 MERGE_STATE_NOT_CLEAN - §6 diff 변동 → #2 EFFECTIVE_DIFF_FAIL - §7 forbidden → #1 FORBIDDEN_PATH - §9 mergedBy 불일치 → BOT_IDENTITY_DIVERGENCE ## 최종 원칙 매일 9시 ci.sh stuck 근본 fix를 main에 통합 — 본 task MERGED 후 회장 별도 승인 시 매일 9시 ci cron 재등록 가능 (이전 ID ED57088F 삭제됨). 금지 11건 1:1 준수.