# task-2507 — git_evidence.py worktree/머지/escape/fetch 4종 fix

- 작업 유형: **QC verifier 정밀도 향상 (코드 수정 + 외부 시스템 통합)**
- 작업 레벨: **Lv.2~3** (worktree 폴백 로직 + git escape + fetch + task-timers 통합)
- 담당: **dev5-team (마르두크) + composite ③ 페르소나 모드 (로키 + 마아트)** — task-2488 isolation PoC 경험으로 worktree 영역 적합
- 우선순위: **★★ blocking** — QC false-positive (commit 0건 오판) 자주 발생
- Track: **qc_verifier_precision / git_evidence_fix**
- 일시: 2026-05-08
- 회장 결정: 2026-05-08T12:30 (3안 채택, 분리 진행 승인)
- 회장 §6 git_evidence.py 수정 별도 승인 — 본 task 발행으로 명시 승인됨

## ⚠️ 본 task의 본질 — 회장 명시

> task-2507은 `git_evidence.py` verifier가 worktree 격리 / squash merge author 변경 / regex escape 누락 / fetch 미보장으로 인해 task ID 커밋을 못 찾아 false-positive FAIL을 발생시키는 4가지 결함을 수정한다.

## composite ③ 페르소나 강제 모드

> 본 task는 dev5-team 물리봇이 수행하지만, **dev 본인 페르소나는 OFF**. 다음 횡단조직 agent 페르소나 활성화:
> - **로키 (Loki)** — DA/redteam. worktree/머지 false-positive edge case 적대적 탐색
> - **마아트 (Ma'at)** — QC매니저. git evidence 검증 정확도 + worktree 격리 정합성
>
> composite ③ 코드 미구현 → 페르소나 강제 프롬프트 우회 (`feedback_composite_three_types_260508.md`)

## false-positive 4가지 결함 (이미 분석됨)

### A. 워크트리 격리 — proj_dir 검색 위치 문제
- `_resolve_project_dir(task_id)`가 task의 worktree(`.worktrees/task-XXXX-devN`)을 잡음
- worktree branch가 squash merge 후 삭제되거나 main과 다른 branch에 있으면 그 worktree에서 task ID 커밋이 안 보임
- main worktree(`/home/jay/workspace`)와 task worktree가 격리

### B. squash merge author 변경
- task-2503 commit fc49a9fd: author = `JonghyukJeon` (회장님 계정 — squash 머지 시 변경)
- 봇이 작성한 PR이 squash merge 시 author가 회장 계정으로 변경되어 task assignee로 검색 시 매칭 실패

### C. `--grep=task_id` regex escape 문제
- task_id가 `task-2487+1` 같은 `+`를 포함하면 grep regex에서 1+회 반복 의미로 해석 → 매칭 실패
- 현재 코드: `f"--grep={task_id}"` — escape 없음

### D. `--all` 의미 한정
- `--all`은 모든 local ref + remote ref 포함하나 worktree에 fetch 안 된 remote main의 commit은 못 찾음
- 워크트리에서 origin/main fetch 누락 시 main의 squash commit 안 보임

## 필수 수정 4건

### a. proj_dir 폴백 강화
- worktree에서 commit 못 찾으면 main worktree(`/home/jay/workspace`)에서 재시도
- 추가: workspace 환경변수 `WORKSPACE_ROOT_FALLBACK = "/home/jay/workspace"` 명시
- 헬퍼: `_search_commit_in_workspaces(task_id: str) -> list[str]` — worktree + main worktree 모두 검색
- task-timers.json `worktree_path` 외에 `main_workspace_path` 필드도 참조

### b. task-timers.json mergeCommit 활용
- PR mergeCommit이 task-timers에 기록되어 있으면 그 SHA를 commit existence 증거로 인정
- task-timers 필드 후보: `merge_commit`, `pr_merge_commit`, `mergeCommit`, `merged_commit_sha`
- 헬퍼: `_get_merge_commit_from_timers(task_id: str) -> Optional[str]` 신설
- mergeCommit 존재 시 git log 검색 실패해도 PASS 판정

### c. regex escape
- `f"--grep={task_id}"` → `f"--grep={re.escape(task_id)}"`
- 단 git의 `--grep`은 POSIX 확장 정규표현식 — `re.escape`만으로 부족할 수 있음
- 추가: `--fixed-strings` 옵션 지원 시 사용 (git ≥ 2.4)
- 헬퍼: `_safe_grep_pattern(task_id: str) -> str` 신설 — `+`, `.`, `*`, `(`, `)` 모두 escape

### d. fetch 보장
- verifier 실행 전 `git fetch origin main --quiet` 1회 호출 (timeout 5s)
- origin/main의 최신 squash commit 확보
- 단 fetch 실패는 silent — 기존 ref만으로 검증 진행 (network 의존 최소화)
- 헬퍼: `_ensure_origin_main_fetched(proj_dir: str) -> None` 신설

## 회귀 테스트 (5건 false-positive + 5건 true-positive)

### False-positive (회장 명시 — fix 후 PASS 판정해야 함)
1. **task-2503 squash merge** (author=JonghyukJeon, fc49a9fd, mergeCommit task-timers에 있음) → PASS
2. **task-2487+1 regex escape** (task_id에 `+` 포함, commit message에 `[task-2487+1]` prefix) → PASS
3. **task-2502 worktree 격리** (다그다 worktree에서 검색 시 main worktree 폴백) → PASS
4. **task-2485+1 fetch 후 origin/main commit 발견** → PASS
5. **mergeCommit 단독 evidence** (task-timers `merge_commit` 필드만 있고 git log 검색 실패) → PASS

### True-positive (기존 룰 유지 — fix 후에도 FAIL 판정해야 함)
1. **task ID 커밋 0건 + mergeCommit 0건** → FAIL (실제 commit 부재)
2. **uncommitted 변경 존재** → FAIL (NO_UNCOMMITTED 룰 유지)
3. **빈 commit (변경 파일 0건)** → FAIL (NON_EMPTY_COMMIT 룰 유지)
4. **시스템 자동 파일만 변경** → PASS (현재 로직 유지)
5. **non-code task** → SKIP (현재 로직 유지)

## Merge Topology Gate 7 metadata

```yaml
expected_files:
  - "teams/shared/verifiers/git_evidence.py"  # 4 fix 적용
  - "tests/regression/test_git_evidence_worktree_2507.py"  # 신규 (10건 = 5 FP + 5 TP)

risk_area: "qc_verifier_precision / git_evidence / worktree_isolation"

dependency: []  # 다른 active task와 무관

parallel_policy: "limited_parallel"  # 같은 QC verifier 영역(다른 verifier task-2506)과 limited 병렬

merge_queue_position: 4  # task-2503=완료, task-2503+1=2(보류), task-2506=3, task-2507=4

stale_recheck_required: false  # main 변경 영향 없음 (verifier 단독 파일)

cherry_pick_allowed: false  # 회장 정책
```

## allowed_resources

```yaml
allowed_resources:
  read_only_paths:
    - "memory/tasks/task-2507*"
    - "memory/feedback/feedback_composite_three_types_260508.md"
    - "teams/shared/verifiers/git_evidence.py"  # 기존 read 후 수정
    - "memory/task-timers.json"  # mergeCommit 필드 read
    - "memory/events/task-2502.essence-pass-escalated-verifier-limitation"  # mergeCommit evidence
    - "memory/events/task-2503.classifications"  # mergeCommit fc49a9fd evidence
    - ".env.keys"
  paths:
    - "memory/tasks/task-2507*"
    - "memory/reports/task-2507*"
    - "memory/events/task-2507*"
    - "memory/plans/tasks/task-2507/**"
  workflow_paths:
    - "teams/shared/verifiers/git_evidence.py"  # 4 fix 적용만
    - "tests/regression/test_git_evidence_worktree_2507.py"  # 신규
  forbidden_paths:
    - ".secrets/**"
    - ".github/workflows/**"
    - "scripts/auto_merge.py"
    - "scripts/finish-task.sh"
    - "dispatch.py"
    - "dispatch/**"
    - "utils/merge_topology_gate.py"  # task-2503+1 영역
    - "teams/shared/verifiers/critical_gap.py"  # task-2506 영역 (parallel_policy: limited)
    - "memory/events/task-2487+1*"
    - "memory/events/task-2497*"
    - "memory/events/task-2498*"
    - "memory/events/task-2494*"
    - "memory/events/task-2503*"
    - "memory/events/task-2506*"
    - "dashboard/**"
    - "report_parser.py"
    - "tests/poc/**"
    - "tools/poc/**"
    - "memory/poc/**"
  forbidden_actions:
    - admin_override
    - required_ci_bypass
    - manual_done_creation
    - existing_pr_force_push
    - existing_pr_close_or_delete
    - pr_52_modification
    - pr_49_50_51_modification
    - task_2497_2498_2494_rerun_interference
    - auto_cherry_pick_implementation
    - auto_merge_mixing
    - dashboard_intrusion
    - report_parser_modification
    - rebase
    - workspace_full_sync
    - dispatch_py_modification
    - merge_topology_gate_py_modification  # task-2503+1 영역
    - critical_gap_py_modification  # task-2506 영역
    - amendment_ignore  # ★ 회장 §7 amendment 무력화 재발 방지
    - mid_dispatch_correction_disregard
    - audit_jsonl_real_write_outside_target
    - token_value_logging
```

## 완료 조건

1. ✅ proj_dir 폴백 동작 (worktree → main workspace)
2. ✅ task-timers mergeCommit 활용 동작 (단독 evidence로 PASS 판정)
3. ✅ regex escape 동작 (task-2487+1 같은 `+` 포함 ID)
4. ✅ fetch 보장 동작 (origin/main 최신 commit 확보, fetch 실패 silent)
5. ✅ False-positive 회귀 테스트 5건 ALL PASS
6. ✅ True-positive 회귀 테스트 5건 ALL PASS (기존 룰 유지)
7. ✅ 기존 git_evidence 단위 테스트 0건 회귀
8. ✅ Merge Topology Gate 자기참조 PASS
9. ✅ CI 11/11 SUCCESS
10. ✅ Gemini fresh evidence 확보
11. ✅ 회장 §6 7 공통 금지 위반 0건
12. ✅ task-2506 (critical_gap fix)와 충돌 0건

## ★ amendment 보호 의무 (회장 §7)

> amendment 발생 시 즉시 적용. HOLD/재개 cron 도달하면 즉시 ack 답장. 이미 commit한 코드도 amendment 본문 충돌 시 즉시 회장 보고 + 결정 대기. mid-dispatch correction disregard는 forbidden_action으로 차단.

## 시스템 3문서 참조

- 정책 본체: `memory/feedback/feedback_composite_three_types_260508.md`
- amendment 보호: `memory/feedback/feedback_amendment_not_enforced_260508.md`
- 분석 결과: 이전 아누 분석 — `git_evidence.py:177` `--grep=task_id` 4 결함 + 4 fix 안
- task-2503 머지 evidence: `memory/events/task-2503.classifications` (mergeCommit fc49a9fd, author=JonghyukJeon)
- task-2502 mergeCommit evidence: `memory/events/task-2502.essence-pass-escalated-verifier-limitation` (mergeCommit 46c16bee)
- 시스템 청사진: `/home/jay/.claude/projects/-home-jay--cokacdir-workspace-autoset/memory/system_bot_orchestration_blueprint_260506.md`

## 보고

- SCQA 4섹션
- 4 false-positive 결함 fix 결과 (a/b/c/d 각 회귀 테스트 PASS evidence)
- 회귀 테스트 10건(5 FP + 5 TP) PASS evidence
- 자기참조 PASS evidence
- composite ③ 페르소나 적용 evidence (로키 + 마아트 분석 결과)
- task-2503 squash merge case + task-2487+1 regex escape case 적용 검증
- 회장 §6 공통 금지 위반 0건 명시
- amendment 적용 evidence
- 헤르메스/아누 통합 요약 경유, 회장 직접 장문 보고 X