당신은 페룬(Perun), 개발6팀장입니다. task-2547 task-2487 series corrected clean replacement를 즉시 시작합니다. ## 본질 명령 (회장 §명시 2026-05-11 Option 2 채택) task-2487 series 4 PR (#49/#50/#51/#52)의 stale base + scope contamination을 origin/main 37d52f42 기준 clean worktree에서 corrected replacement로 재구현. 기존 PR은 read-only 보존, 추가 commit/close 금지. ## §0. BOT_GITHUB_TOKEN_RUNTIME_RESOLUTION_STEP0 (4-step) ```bash python3 /home/jay/workspace/scripts/refresh_bot_token.py export $(grep -E "^BOT_GITHUB_TOKEN=" /home/jay/workspace/.env.keys | head -1) [[ -n "$BOT_GITHUB_TOKEN" ]] || exit 1 GH_TOKEN=$BOT_GITHUB_TOKEN gh api /installation/repositories --jq '.repositories[0].full_name' ``` ## §1. clean worktree (origin/main 37d52f42 기반) ```bash cd /home/jay/workspace git fetch origin main git worktree add .worktrees/task-2547-dev6-clean -b task/task-2547-dev6-clean origin/main cd .worktrees/task-2547-dev6-clean git diff origin/main..HEAD # 0 lines 어설션 git rev-parse HEAD # 37d52f42 어설션 ``` ## §2. PR #49/#50/#51/#52 read-only 보존 검증 ```bash for n in 49 50 51 52; do gh pr view $n --repo Jeon-Jonghyuk/dev_workspace --json state,headRefOid \ --jq "{pr:$n,state:.state,head:.headRefOid[0:12]}" done # 어설션: state=OPEN, head 4건 모두 변화 0 # PR #49 head=da9a8e12 / #50=464114bf / #51=0d388b98 / #52=b341e874 ``` ## §3. expected_files 재산정 (origin/main 37d52f42 기준) task-2547.md draft 18 files 시작 → origin/main 실 상태 확인 → 최종 expected_files 산정 → `memory/events/task-2547.dispatch_decision.json`에 박제. draft 18 files (12 source + 6 tests): 1. `dispatch/__init__.py` (task-2530 변경 통합 + V2 hardening) 2. `scripts/auto_merge.py` 3. `scripts/done-watcher.py` 4. `scripts/notify-completion.py` 5. `scripts/pattern-detector.py` 6. `scripts/report_utils.py` 7. `scripts/start_task_guard.py` 8. `scripts/token-tracker.py` 9. `dashboard/helpers.py` (task-2543 변경 통합 + V2 hardening) 10. `report_parser.py` 11. `utils/task_id_parser.py` (task-2502 변경 통합 + verifier SSOT 확장) 12. `teams/shared/verifiers/browser_verify.py` 13. `tests/regression/test_dispatch_hardening_2487.py` 14. `tests/regression/test_legacy_compat_2487.py` 15. `tests/regression/test_scripts_hardening_2487.py` 16. `tests/regression/test_dashboard_report_hardening_2487.py` 17. `tests/regression/test_dotphase_compat_2487.py` 18. `tests/regression/test_task_id_parser_v3.py` ## §4. main 통합 검증 (필수) | 파일 | main 변경 task | 통합 방향 | |------|--------------|---------| | `dispatch/__init__.py` | task-2530 (2026-05-10) | 기존 main 변경 보존 + V2 hardening 추가 | | `dashboard/helpers.py` | task-2543 (2026-05-10) | 기존 mtime fallback off 보존 + Group C hardening 추가 | | `utils/task_id_parser.py` | task-2502 (2026-05-08) | 기존 SSOT export 보존 + verifier SSOT 확장 | PR #49/#52의 dispatch/__init__.py / PR #51/#52의 dashboard/helpers.py / PR #52의 utils/task_id_parser.py를 git show로 참조 가능. 단 main의 현재 상태를 base로 hardening만 추가, main 변경 덮어쓰기 X. ## §5. forbidden_paths (변경 0 어설션, 다음 영역) - `anu_v2/**` (Track A 분리 / dev5 task-2545+2 영역 보호) - `memory/poc/**`, `tests/poc/**`, `tools/poc/**` (POC 분리) - `memory/orchestration/phase_b_termination_classifier_spec_*.md` - `memory/events/task-2487*`, `task-2487+1*` (보존) - `memory/tasks/task-2487.md`, `task-2487+1.md` (보존) - `memory/heartbeats/`, `memory/plans/tasks/task-2485+1/`, `task-2488/`, `task-2489/`, `task-2493/` - `memory/reports/task-2485+1.md`, `task-2488.md`, `task-2489.md`, `task-2493.md` - `memory/tasks/task-2489.md`, `task-2493.md` - `.github/workflows/**` - `memory/orchestration-audit/critical-escalations.jsonl` (직접 수정 X, append-only critical_escalation_reporter만) ## §6. 21단계 finalize sequence 1. §0 token 4-step 2. clean worktree (origin/main 37d52f42) 3. diff 0 어설션 4. PR #49/#50/#51/#52 read-only 보존 검증 5. corrected expected_files 재산정 + dispatch_decision.json 박제 6. core hardening 구현 (dispatch + scripts + dashboard + report_parser + utils + verifiers) 7. main 통합 검증 (task-2530/2543/2502 변경 보존) 8. regression 6 tests 구현 9. effective diff == expected_files 어설션 10. forbidden_paths 변경 0 어설션 11. POC 영역 혼입 0 어설션 12. anu_v2/** 변경 0 어설션 13. pytest regression PASS (10/10+) 14. pyright 0 errors 15. commit + push (BOT_GITHUB_TOKEN, branch=`task/task-2547-dev6-clean`) 16. PR open: title `[task-2547] task-2487 series corrected clean replacement (#49/#50/#51/#52 stale base + scope contamination 복구)` + body에 replacement_lineage JSON 17. Gemini fresh review 도착 + commit_id == head 어설션 (OWNER trigger 필요 시 ESCALATED 보고) 18. unresolved 0 triage (style_only reply+resolve, code_changing은 ESCALATED → task-2547+1) 19. CI 11/11 SUCCESS + mergeStateStatus=CLEAN + BOT identity 재확인 20. `GH_TOKEN=$BOT_GITHUB_TOKEN gh pr merge --squash --auto=false` 21. post_merge_smoke_runner + lifecycle_reconciliation_manager --apply + done.acked + merge-done + lineage 갱신 22. PR #49/#50/#51/#52 close-safe audit (read-only, 결과만 박제, close 액션은 회장 승인 후) ## §7. 산출물 11건 1. `memory/events/task-2547.dispatch_decision.json` (corrected expected_files + forbidden_paths) 2. `memory/events/task-2547.replacement-lineage.json` (chain: #49/#50/#51/#52 → task-2547) 3. `memory/events/task-2547.effective-diff.json` (실제 diff vs expected 검증) 4. `memory/events/task-2547.recovery-decision.json` (schema=anu_v2.recovery_decision.v1) 5. `memory/events/task-2547.smoke-evidence` 6. `memory/events/task-2547.reconcile-evidence` 7. `memory/events/task-2547.done` / `.done.acked` / `.merge-done` 8. `memory/events/task-2547.close-safe-audit.json` (PR #49/#50/#51/#52 4건 audit 결과) 9. `memory/reports/task-2547.md` 10. `memory/orchestration-audit/critical-escalations.jsonl` 1줄 append (REPLACEMENT_PR_MERGED_STALE_BASE_RECOVERED) — append-only ## §8. 금지 15건 1. PR #49/#50/#51/#52 추가 commit 2. PR #49 즉시 BOT merge 3. PR #50/#51 OWNER /gemini review 요청 4. PR #52 finalize 시도 5. 기존 PR close/reopen 6. force push / rebase 7. empty commit 8. expected_files amendment로 기존 PR 살리기 9. old PR diff 그대로 main 밀어넣기 10. POC 영역 혼입 11. anu_v2/** 영역 혼입 12. md/report만 PASS 처리 13. owner PAT 14. default GH_TOKEN fallback 15. long polling / self-register ## §9. 완료 기준 13건 1. task-2547 PR 생성 2. effective diff == corrected expected_files 3. forbidden path 0 4. regression PASS 5. CI all SUCCESS 6. Gemini unresolved 0 7. mergeStateStatus CLEAN 8. mergedBy = app/jeon-jonghyuk-taskctl-bot 9. post-merge smoke PASS 10. reconcile evidence 존재 11. replacement_lineage 존재 12. PR #49/#50/#51/#52 close-safe audit 결과 존재 (head unchanged 검증 + close-safe 판정) 13. 신규 Critical 7 없음 ## §10. 보고 MERGED (mergedBy=app/jeon-jonghyuk-taskctl-bot, 13/13 PASS, PR #49/#50/#51/#52 head unchanged) 또는 ESCALATED (Critical 7 #N) 만 보고. ESCALATED 매핑: - §0 token → #6 BOT_TOKEN_REFRESH_FAILED - §17 Gemini OWNER trigger 필요 → #6 GEMINI_AUTO_REVIEW_NOT_TRIGGERED - §9/10 어설션 fail → #1 FORBIDDEN_PATH 또는 #2 EFFECTIVE_DIFF_FAIL - §7 main 통합 누락 → #6 STALE_BASE_INTEGRATION_FAILED ## 최종 원칙 replacement는 stale base를 그대로 사용하지 않는다. 반드시 origin/main 최신 HEAD 기반 clean worktree에서 시작하고, 그 사이 main에 들어온 변경(task-2530/2543/2502)을 통합한다. 본 사례를 task-2547 lineage 박제로 영구 기록.