당신은 마르둑(Marduk), 개발5팀장입니다. task-2545+1 replacement PR을 즉시 생성하세요. ## 본질 명령 (회장 §명시 2026-05-11) PR #92 (task-2545)는 자기정책 same-PR push 금지 → clean replacement PR로 fix. fix scope: anu_v2/gemini_stale_prevention_runner.py 1개 파일, Gemini 4건 (3 code_changing + 1 style). ## 사전 진단 (당신이 직접 박제한 결과) - PR #92 head: 15cf6ad011e184ca298996d47253501152700287 (보존, 절대 수정 X) - Gemini review id: 4259466790, COMMENTED, 2026-05-10T14:16:45Z - fix 4건 (당신이 분류): - line 245 HIGH: bucketize 결함, outside_expected_files 무시 → Critical #3 보고 누락 위험 - line 723 medium: proposed_fixes_for_critical 일관성 결함 - line 735 medium: expected_files_original 추출 버그 - line 760 style_only: 리스트 컴프리헨션 효율 (code_changing 3건 처리 중 자연스럽게 포함 가능 시만) ## §1. clean worktree (BEHIND 회피) 1. `.worktrees/task-2545p1-dev5-replacement` 또는 dev5 worktree에 clean base 2. **첫 번째 명령**: `git fetch origin main && git checkout origin/main` 3. **어설션**: `git diff origin/main..HEAD = 0 lines` (PASS 후 진행) 4. branch: `task/task-2545-plus-1-dev5` ## §2. expected_files (정확 1개) ``` anu_v2/gemini_stale_prevention_runner.py ``` ## §3. forbidden_paths (변경 0 어설션) - `anu_v2/fixtures/__init__.py` (task-2544 사고 재발 방지) - `anu_v2/post_merge_smoke_runner.py` (task-2539+1) - `anu_v2/replacement_pr_runner.py` (task-2537) - `anu_v2/auto_gemini_triage.py` (task-2538) - `anu_v2/merge_queue_executor.py` (task-2531/2532) - `anu_v2/critical_escalation_reporter.py` (task-2540 미발행) - `anu_v2/executor_self_resume.py` (task-2541 미발행) - `anu_v2/recovery_decision_contract.py` (task-2546 미발행) - `memory/tasks/task-2545.md` (original task amendment 금지) - `memory/events/task-2545.*` (original markers 보존) - `anu_v2/tests/test_gemini_stale_prevention_runner_2545.py` (회귀 재실행만, 수정 0) - `anu_v2/fixtures/gemini_stale_*.json` (5 fixture 변경 0) - `memory/orchestration-audit/critical-escalations.jsonl` (audit append 1줄만 허용 — REPLACEMENT_PR_MERGED 박제) ## §4. fix 4건 (1:1 적용) **Fix 1 — line 245 (HIGH)**: bucketize 함수가 `outside_expected_files`를 명시적으로 분류하고 Critical #3 후보로 보고. 자기 모듈 본질 결함 직접 수정. **Fix 2 — line 723 (medium)**: Critical 7 종별 1:1 매핑 또는 명시적 분기 처리로 일관성 확보. **Fix 3 — line 735 (medium)**: task md에서 expected_files 추출 parser 수정 (정규식/파싱). **Fix 4 — line 760 (style)**: list comprehension / generator. 별도 commit X, code_changing 3건 처리 중 포함 가능할 때만. ## §5. 산출물 (필수 박제) `memory/events/task-2545+1.replacement-lineage.json`: ```json { "original_pr": 92, "original_task": "task-2545", "original_head": "15cf6ad011e184ca298996d47253501152700287", "replacement_task": "task-2545+1", "replacement_reason": "REPLACEMENT_REQUIRED_BY_SELF_POLICY", "self_policy_module": "GEMINI_STALE_PREVENTION_RUNNER", "self_policy_rule": "same_pr_push_forbidden_for_code_changing_fix_after_fresh_gemini_evidence", "evidence_summary": { "gemini_review_id": 4259466790, "code_changing_count": 3, "style_only_count": 1, "high_priority_lines": [245], "medium_priority_lines": [723, 735, 760] } } ``` `memory/events/task-2545+1.recovery-decision.json` (schema=anu_v2.recovery_decision.v1, 회장 §1 1:1) ## §6. 14단계 finalize sequence 1. clean base + git fetch origin main 2. diff 0 어설션 3. branch 생성 4. edit 1 file (Fix 1~4) 5. regression 재실행 (test_gemini_stale_prevention_runner_2545.py 회귀 10건 PASS) 6. effective diff == 1 file 어설션 7. forbidden_paths 변경 0 어설션 8. commit + push 9. PR open: title "[task-2545+1] anu_v2 GEMINI_STALE_PREVENTION_RUNNER fix (PR #92 Gemini 4건 fresh fix replacement)" 10. PR body에 replacement_lineage JSON 1:1 명시 11. CI 11/11 SUCCESS 대기 12. Gemini fresh review 도착 (replacement PR에서 새로 판단) 13. mergeStateStatus=CLEAN + Gemini unresolved 0 + BOT_GITHUB_TOKEN fail-fast 검증 14. `GH_TOKEN=$BOT_GITHUB_TOKEN gh pr merge --squash --auto=false` ## §7. 봇 직접 행동 8항목 1. git fetch origin main + checkout origin/main 2. diff 0 어설션 3. expected_files 1개만 변경 4. replacement_lineage.json 박제 5. recovery_decision.json 박제 6. BOT_GITHUB_TOKEN fail-fast 7. post_merge_smoke_runner 실행 + smoke-evidence 8. lifecycle_reconciliation_manager --apply 실행 + reconcile-evidence + done + done.acked + merge-done ## §8. 금지 14건 1. PR #92 추가 commit push 2. PR #92 close/reopen 3. PR #92 force push / rebase 4. empty commit 5. bot /gemini review (신규 발사) 6. expected_files amendment 7. owner_pat / admin override 8. default GH_TOKEN fallback merge 9. md/report만 PASS 처리 10. 기존 escalate / audit marker 삭제 11. 다른 PR 또는 task-2540/2541/2546 혼입 12. long polling / self-register 반복 13. test_gemini_stale_prevention_runner_2545.py 수정 14. fixture gemini_stale_*.json 변경 ## §9. 완료 기준 11건 1. replacement PR merged 2. mergedBy=app/jeon-jonghyuk-taskctl-bot 3. effective diff == 1 file 4. forbidden path 0 5. CI all SUCCESS 6. Gemini unresolved 0 7. post-merge smoke PASS 8. reconcile evidence 존재 9. PR #92 original 보존 (state=OPEN, head=15cf6ad0 unchanged) 10. replacement_lineage 존재 11. 신규 Critical 7 없음 (audit jsonl 1줄만 append: REPLACEMENT_PR_MERGED_GEMINI_REAL_BUG_RECOVERED) ## §10. 보고 MERGED (mergedBy=app/jeon-jonghyuk-taskctl-bot 검증, 11/11 완료 기준 PASS) 또는 ESCALATED (Critical 7종 #N 매핑) 만 보고. 무변화 polling / 회장 chat 노출 X. ## 최종 원칙 ANU v2 runner가 PR state / Gemini evidence / check_run / diff / marker를 직접 조회하여 분류·결정·finalize까지 자동 수행하는 구조를 만든다. 본 task-2545+1은 task-2545 GEMINI_STALE_PREVENTION_RUNNER의 자기참조 정책 첫 실제 적용 사례이며, replacement_lineage 박제로 영구 기록된다.