# task-2503+1 REPLACEMENT — 블로커 리포트 (다그다/dev3)

- 시각: 2026-05-08 13:25 KST
- 발신: 다그다 (dev3 팀장)
- 라우팅: 헤르메스/아누 통합 요약 → 회장
- 결정 근거: 회장 A안 §2 (2026-05-08T13:15) 절차 수행 중 검증 충돌 확인

## 1. 진행 결과 (절차 1~3)

| 단계 | 액션 | 결과 |
|------|------|------|
| (1) | `git fetch origin` | OK |
| (2) | clean worktree 생성 | OK — `.worktrees/task-2503+1-dev3-replacement` @ origin/main(46c16bee) |
| (3) | 4개 파일 `cp` 수동 이식 | OK (자동 cherry-pick/rebase 미사용) |
| (4) | effective diff 검증 | **PASS** — `git diff --name-only origin/main` = 정확히 허용 4파일, forbidden_path 0건 |

이식된 파일 (4건, 모두 신규 추가):
- `utils/merge_topology_gate.py` (45,347 B)
- `tests/regression/test_merge_topology_gate_real_world_2503_plus_1.py` (21,624 B)
- `tests/regression/test_merge_topology_gate_classifier_2503.py` (18,336 B)
- `memory/specs/merge-topology-gate-schema.yml` (2,855 B)

## 2. 블로커: 검증 (g) 회귀 PASS 실패

회귀 테스트 `pytest` 결과: **20 PASS / 2 FAIL**

```
tests/regression/test_merge_topology_gate_classifier_2503.py::test_self_reference_task_2503_passes_metadata_extraction FAILED
tests/regression/test_merge_topology_gate_real_world_2503_plus_1.py::test_self_reference_task_2503_plus_1_passes FAILED
```

실패 원인: 두 자기참조 테스트가 외부 fixture에 하드 의존.

```python
# test_merge_topology_gate_classifier_2503.py:358
task_md_path = WORKSPACE / "memory" / "tasks" / "task-2503.md"
assert task_md_path.exists(), ...

# test_merge_topology_gate_real_world_2503_plus_1.py:457
task_md = WORKSPACE / "memory" / "tasks" / "task-2503+1.md"
assert task_md.exists(), ...
```

`memory/tasks/task-2503.md` / `memory/tasks/task-2503+1.md` 두 파일은:
- origin/main에 부재 (`git ls-tree -r origin/main` 확인 — 0 hit)
- 회장 허용 4파일 목록에 부재
- 따라서 본 PR diff에 추가 시 `허용 파일 외 1건` 위반

## 3. 검증 7건 매트릭스

| 검증 | 항목 | 상태 |
|------|------|------|
| a | task-2502.merged satisfied | PASS (test_dependency_task_2502_merged_satisfied_allows) |
| b | task-2503.merged satisfied | PASS (test_dependency_task_2503_merged_satisfied_via_report_evidence) |
| c | merged task active/conflict 제외 | PASS (test_merged_task_excluded_from_active_filter, test_overlap_with_merged_task_does_not_block) |
| d | read-only report overlap 0 → ALLOW | PASS (test_read_only_report_task_allows) |
| e | BLOCK override audit 9 필드 | PASS (test_override_used_audit_record_generated, test_block_with_chair_override_yields_allow_with_chair_override) |
| **f** | **자기참조 ALLOW** | **FAIL** — fixture 부재로 assert 단계에서 stop |
| **g** | **기존 회귀 PASS** | **FAIL** — 위 f와 동일 원인, 2/22 fail |

## 4. 회장 §1 vs 검증 g 충돌 분석

회장 절차의 두 항이 충돌한다:

- **§1 (4)** "허용 파일 외 1건이라도 보이면 PR 생성 금지" → task md fixture 추가 불가
- **§1 (6.f, 6.g)** 자기참조 ALLOW + 회귀 PASS → fixture 없이는 기술적 불가

해결 가능 옵션 (모두 회장 §1 추가 결정 필요):

**A안.** task-2503.md, task-2503+1.md 두 fixture를 허용 목록에 추가 (총 6 파일)
- 장점: 테스트 의도 보존, 코드 미수정
- 단점: 회장 4-file rule 완화

**B안.** 자기참조 테스트 2건을 inline metadata 방식으로 리팩터 (테스트 파일 내부만 수정)
- 장점: 4-file 룰 유지
- 단점: "수동 이식" 원칙 위배 (transplant beyond cp)
- 검증 의도 일부 약화 (실제 파일 파싱 보장 X)

**C안.** 자기참조 테스트 2건에 `pytest.skipif(not task_md.exists())` 추가
- 장점: 4-file 룰 유지, transplant 후 최소 수정
- 단점: CI에서 항상 skip (실효 검증 0)
- task md fixture가 추후 별도 PR로 main에 들어가도, 본 PR 머지 후엔 이미 skip 코드 박제됨

**D안.** 본 PR 보류 → task-2503 PR 별도 선행 (task md 포함) → 그 후 본 PR 재시도
- 장점: 의존 순서 정상화
- 단점: queue position 1 일정 영향

## 5. 회장 §1 금지사항 준수 현황

- 자동 cherry-pick: 미사용 (cp만 사용) ✓
- rebase: 미사용 ✓
- force push: N/A (push 미실행) ✓
- admin override: N/A ✓
- contaminated branch 재활용: 미사용 (origin/main 신규 worktree) ✓
- PR #54 close: 미실행 ✓
- PR #52/49/50/51 수정: 미실행 ✓

## 6. 다그다 권고

회장 §1과 §2(g) 충돌은 회장 단독 결정 사항이라 봅니다. 다그다 단독 판단으로 옵션 A~D 중 하나를 선택하면 §1 (또는 transplant 원칙) 위배 위험. 따라서:

1. 본 PR 미생성 상태로 worktree 보존 (`.worktrees/task-2503+1-dev3-replacement` @ task/task-2503+1-dev3-replacement, push 전)
2. 헤르메스/아누 통합 요약 경유, 회장 추가 결정 요청
3. 결정 수령 후 즉시 옵션 적용 → push → PR 생성 → 7 검증 → 머지 (queue 1)

대기 중 상태:
- branch: `task/task-2503+1-dev3-replacement` (로컬, push X)
- 4 파일 staged 전 (`git add` 미실행)
- queue position 1 점유 대기

회장 결정 받는 즉시 30초 내 PR 생성 가능합니다.
