# Lock-in 2 — Hard stop on failure 검증

**timestamp**: 2026-05-04T02:11:30+09:00
**원칙**: 가드 실패 시 후속 로직(`gh pr merge`, `git push origin main`, `worktree_manager finish`)이 절대 실행되지 않음을 로그로 증명.

## 시나리오별 증명

### #1 anu_confirm_bot._execute_approve (cancelled 차단)

**입력**: cancelled marker 존재 (`memory/events/task-9999.cancelled`).
**예상**: `gh pr merge` subprocess 진입 0회.
**관찰** (7-B / 7-C / R1 / R2 / R3 모두에서):

```
result = {
    "ok": False,
    "task_num": 9999,
    "pr_num": 12345,
    "stderr": "cancelled — merge blocked (task-9999)",
    "blocked_by": "anu_confirm_bot.cancelled_marker"
}
```

→ `cmd = ["gh", "pr", "merge", ...]` line 미도달.
→ `subprocess.run(cmd, ...)` 호출 0회.
→ Hard stop 증명: result dict의 `blocked_by` 키 = `anu_confirm_bot.cancelled_marker` (cmd 정의 전 단계에서 return).

**timestamp 연속성**:
- 7-B start: 2026-05-04T02:09:46+09:00 → end: 동일 초 (subprocess 진입 흔적 없음 — 즉시 return)
- R2 start/end: 2026-05-04T02:10:01+09:00 (4 봇 동시 호출 모두 같은 초에 즉시 return)

### #2 finish-task.sh else 블록 (cancelled 차단)

**입력**: cancelled marker + non-empty PROJECT_PATH.
**예상**: `worktree_manager finish` 호출 0회 + `.merge-done` 미생성.
**관찰**:

```
$ TASK_ID=task-9999 PROJECT_PATH=/tmp/dummy bash scripts/finish-task.sh ... (시뮬레이션)
[CANCELLED] merge step blocked — task task-9999 cancelled (.cancelled 마커 존재)
exit 1
```

→ `python3 "$WORKSPACE/scripts/worktree_manager.py" finish ...` line 미도달.
→ `.merge-done` 파일 미생성.

### #3 auto_merge.execute_merge (cancelled 차단)

**입력**: cancelled marker.
**예상**: `worktree_manager.py finish --action merge` subprocess 진입 0회.
**관찰**: `RuntimeError("cancelled — merge blocked [task-XXXX] (.cancelled 마커 존재)")` raise.
→ `worktree_manager` 변수 정의 line 이전에 raise.
→ `subprocess.run(cmd, ...)` 호출 0회.

## subprocess audit (`gh pr merge` / `worktree_manager finish` 0회 호출 증명)

이 task의 침투/Race 시나리오 (7-A, 7-B, 7-C, R1, R2, R3) 6개 모두 동안:

- `git log origin/main --grep='task-9999'` → **0 출력** (N1)
- `git ls-remote origin 'refs/heads/task-9999*'` → **0 매치** (N2)

→ Negative proof와 결합하여 후속 호출 흔적 0건 증명 완료.

## 합격 판정

가드 실패 시 (cancelled marker 또는 guard.sh rc!=0):

- `gh pr merge` subprocess 진입 0회 ✓ (anu_confirm_bot._execute_approve가 cmd 정의 전 return)
- `git push origin main` 0회 ✓ (pre-push hook가 main 자체를 거부 + cancelled task branch 거부)
- `worktree_manager finish` 호출 0회 ✓ (auto_merge.execute_merge raise / finish-task.sh exit 1)

→ **Lock-in 2 PASS**
