당신은 마르둑(Marduk), 개발5팀장입니다. task-2539+1 / PR #91 finalize recovery + recovery_decision instance 생성을 즉시 진행하세요. ## 본질 명령 (회장 §명시 2026-05-11 결정) PR #91은 EXTERNAL_TRIGGER_REQUIRED가 아니다. - current head: d843a72329c112 - Gemini evidence commit: d843a72329c112 (current head 일치, fresh) - classification = MERGEABLE_RECOVERY - external_trigger_required = false - allowed_action = AUTO_GEMINI_TRIAGE_THEN_FINALIZE 신규 /gemini review 대기 / 추가 polling / self-register 절대 금지. ## §1. recovery_decision instance 생성 (필수) 파일: memory/events/task-2539+1.recovery-decision.json (memory/events 영역, PR effective diff에 포함 X) 회장 §명시 fixture 1:1 적용 (실제 GitHub 상태를 직접 조회하여 검증, mismatch 시 mismatch_reason 기록): ```json { "schema_version": "anu_v2.recovery_decision.v1", "task_id": "task-2539+1", "pr_number": 91, "runner": "merge_queue_executor", "classification": "MERGEABLE_RECOVERY", "current_head": "", "base_branch": "main", "expected_files": [ "anu_v2/post_merge_smoke_runner.py", "anu_v2/tests/test_post_merge_smoke_runner_2539.py", "anu_v2/fixtures/post_merge_smoke_pass_task_2524.json", "anu_v2/fixtures/post_merge_smoke_warn_to_pass_task_2537.json" ], "effective_diff_files": "", "forbidden_path_count": 0, "checks": { "success": "", "failure": "<...FAILURE count>", "pending": "<...PENDING count>", "failed_checks": ["gemini-review-gate", "phase3-merge-gate"] }, "gemini": { "evidence_exists": true, "evidence_commit": "", "evidence_fresh": "", "threads_total": "", "threads_unresolved": "" }, "mergeability": { "merge_state_status": "", "behind": "", "clean": "" }, "classification_reason": [ "Gemini evidence exists on current head", "Gemini evidence is fresh, not stale", "External trigger is not required", "Gemini unresolved threads remain", "Recovery can proceed through auto_gemini_triage" ], "allowed_actions": [ "AUTO_GEMINI_TRIAGE", "RESOLVE_FALSE_POSITIVE_OR_STYLE_ONLY_THREADS", "RUN_REGRESSION", "SYNC_BASE_WITHOUT_REBASE", "VERIFY_CHECKS", "BOT_SQUASH_MERGE", "RUN_POST_MERGE_SMOKE", "WRITE_RECONCILE_EVIDENCE" ], "forbidden_actions": [ "WAIT_FOR_NEW_GEMINI_REVIEW", "BOT_GEMINI_REVIEW", "EMPTY_COMMIT", "CLOSE_REOPEN", "FORCE_PUSH", "REBASE", "ADMIN_OVERRIDE", "EXPECTED_FILES_AMENDMENT", "TASK_2545_PR_92_MIXIN", "ORIGINAL_TASK_2539_CONTAMINATED_DIFF_REUSE" ], "next_runner": "auto_gemini_triage", "critical_7": { "is_critical": false, "categories": [] }, "mismatch_reason": "<값 불일치 시 명시, 일치 시 빈 문자열>", "created_at": "" } ``` ## §2. PR #91 finalize recovery 실행 (회장 §3 19단계 1:1) decision.classification == MERGEABLE_RECOVERY && external_trigger_required == false && evidence_fresh == true 인 경우에만 진행: 1. PR #91 current head d843a72329c112 확인 2. Gemini review commit_id d843a72329c112 확인 3. Gemini unresolved 2건을 auto_gemini_triage 4 분류 (false_positive / style_only / minor_fix_in_scope / scope_expansion) 4. false_positive / style_only / no_code_change → reply로 dismiss + thread resolve 5. code-changing real bug → ★ same-PR push 금지 우선, replacement_pr_runner 전환 여부 판단 6. 단 same-PR 수정 불가피 시 expected_files 4개 내부 최소 수정만 허용, stale risk를 decision/marker에 기록 7. expected_files 정확 4개 유지: anu_v2/post_merge_smoke_runner.py + tests + fixtures 2건 8. forbidden path 0 (dashboard/** + task-2537/2524 영역 + anu_v2/fixtures/__init__.py 등 모두 0) 9. **BEHIND 해소: `git fetch origin main && git merge origin/main` (rebase 절대 X)** 10. regression 12/12 재실행 + 전체 관련 smoke 11. CI 11/11 SUCCESS / gemini-review-gate / phase3-merge-gate PASS 12. Gemini unresolved 0 13. mergeStateStatus CLEAN 14. **BOT_GITHUB_TOKEN identity 강제 검증** (회장 §명시: BOT_GITHUB_TOKEN 없이 default GH_TOKEN으로 머지 금지 — fail-fast) 15. `GH_TOKEN=$BOT_GITHUB_TOKEN gh pr merge 91 --squash --auto=false` 16. post_merge_smoke_runner 실행 17. memory/events/task-2539+1.smoke-evidence marker 생성 (task-2524 박제 형식 1:1) 18. memory/events/task-2539+1.reconcile-evidence marker 생성 19. lifecycle_reconciliation_manager --apply ## §3. 회장 §명시 절대 금지 (14건) - ❌ 신규 Gemini review 대기 / /gemini review 호출 / 추가 polling / self-register - ❌ empty commit / close-reopen / force push / rebase - ❌ admin override / owner_pat - ❌ expected_files amendment (★ task-2539+1.md 변경 0, expected_files 4개 그대로) - ❌ task-2545 / PR #92 혼입 - ❌ original task-2539 오염 diff 재사용 (task/task-2539-dev3 worktree 절대 사용 X) - ❌ md/report만으로 완료 판정 (회귀 + marker + check_run + PR diff 실제 검증만) - ❌ 회장 직접 머지 전제 (BOT identity 강제) - ❌ BOT_GITHUB_TOKEN 없이 default GH_TOKEN으로 머지 (★ 환경 변수 fail-fast 검증) - ❌ task-2539+1.md amendment / commit - ❌ chat=6937032012 외 chat record 참조 ## §4. 회장 §명시 완료 기준 (13건) 1. ✅ PR #91 merged 2. ✅ mergedBy = app/jeon-jonghyuk-taskctl-bot 3. ✅ checks 11/11 SUCCESS 4. ✅ Gemini unresolved 0 5. ✅ effective diff == task-2539+1 expected_files 4개 6. ✅ forbidden path 0 7. ✅ memory/events/task-2539+1.recovery-decision.json 존재 8. ✅ decision.schema_version == anu_v2.recovery_decision.v1 9. ✅ decision.classification == MERGEABLE_RECOVERY 10. ✅ decision.external_trigger_required == false 11. ✅ decision.allowed_actions에 AUTO_GEMINI_TRIAGE 포함 12. ✅ post-merge smoke PASS marker 존재 13. ✅ reconcile marker 존재 + Critical 7 escalation 0 ## §5. recovery_decision contract 본체 분리 (★ 별도 후속 task 발행 권고) 회장 §1 "ANU v2 공통 recovery_decision schema 또는 contract 구현"은 별도 산출물 (anu_v2/schemas/recovery_decision.schema.json 또는 anu_v2/contracts/recovery_decision_contract.py) → PR #91 본질 4 files에 포함하지 X. ★ 본 cron 작업에서는 **decision instance만 생성** (memory/events/task-2539+1.recovery-decision.json). contract 본체는 PR #91 머지 직후 별도 task-2546 (recovery_decision_contract_v0)로 발행 권고. 작업 봇은 instance만 박제 후 finalize 진행. ## §6. fixture화 — FRESH_GEMINI_EVIDENCE_BUT_FINALIZE_CHAIN_STOPPED PR #91 사례를 향후 회귀 테스트 fixture로 박제. **별도 후속 task에서 처리** (본 PR #91에 fixture 파일 추가 X — expected_files amendment 금지). 박제 의도 (decision.classification_reason에 명시): - Gemini evidence current head 기준 fresh - external trigger 불필요 - unresolved Gemini threads 잔존 - bot finalize chain 중단 - merge_queue_executor가 MERGEABLE_RECOVERY 자동 분류 - auto_gemini_triage가 unresolved threads 처리 - BOT finalize가 smoke/reconcile까지 자동 완료 향후 사용 모듈: merge_queue_executor / auto_gemini_triage / gemini_stale_prevention_runner / replacement_pr_runner / critical_escalation_reporter ## §7. 보고 (회장 chat 6937032012) - **MERGED 시**: `task-2539+1 PR_91_MERGEABLE_RECOVERY_PASS — mergeCommit , mergedBy=app/jeon-jonghyuk-taskctl-bot, recovery-decision.json 박제, smoke marker + reconcile marker, Critical 7종 0건` - **ESCALATED 시**: 사유 + Critical 7종 분류 #N + decision.mismatch_reason 명시 - **무변화/진행중 반복 보고 금지** ## task md 참조 /home/jay/workspace/memory/tasks/task-2539+1.md (변경 0 — amendment 금지) worktree: /home/jay/workspace/.worktrees/task-2539p1-dev5-replacement (이전 작업 상태 보존) 작업 시작.