---
task_id: task-2457
type: context
scope: task
created: 2026-05-05
updated: 2026-05-05
status: completed
---

# 맥락 노트: task-2457

**task**: task-2457

---

## 결정 근거

### 결정 1: 기존 pre-push hook 보존 + enhance
- 기존 `scripts/git-hooks/pre-push`는 task-2449에서 도입된 자산 (main direct push 거부 + taskctl status 체크 + guard.sh pre-push).
- 신규 스펙은 그 위에 (a) lock 존재 검증, (b) allowed_resources 기반 scope_check, (c) TASKCTL_BYPASS evidence를 추가해야 한다.
- 대안: 처음부터 새로 작성. **기각 이유**: 기존 가드 거버넌스(guard.sh + pre_push_guard.py)와 단절되면 dev1/dev2 팀의 다른 task push가 깨진다.

### 결정 2: pre-commit은 신규 작성 (BASH only, 외부 helper 호출 최소화)
- 신규 hook은 commit 단계라 IO가 가벼워야 하고, taskctl/guard helper에 의존하면 forbidden_paths 가드와 충돌 가능.
- 모든 검증을 self-contained bash로 구현. lock 파싱은 `python3 -c` 1라인으로 처리(jq 미설치 환경 호환).
- 대안: python script로 구현. **기각 이유**: hook 호출당 python 인터프리터 부팅 오버헤드(60~100ms), commit 빈도 고려시 bash가 더 적합.

### 결정 3: taskctl_verify 미존재 시 fallback 정책
- Phase 2-A 시점에는 `scripts/taskctl_verify.py` 미존재. push 가드는 fallback 모드로 동작:
  - lock 존재 + scope_check PASS → 가드 통과 (verify 자체는 skip 표시 evidence 기록)
- Phase 2-D Integration에서 taskctl_verify.py 호출로 전환. 인터페이스: `python3 scripts/taskctl_verify.py <task-id>` exit 0=PASS / 1=FAIL.
- 대안: verify 미존재 시 무조건 FAIL. **기각 이유**: Phase 2-A 단독으로 main 진입 가능해야 함(회장 결정 — 단일 Phase 머지).

### 3 Step Why 자문

1. **왜 git hook으로 차단하는가?**
   → A: dispatch 외부 경로(수동 commit/push)에서 mixed task / 가드 우회 / main direct가 발생해도 git 클라이언트 단계에서 막아야 일관성 유지.

2. **왜 lock 파일 기반이 최선인가?**
   → B: lock은 start_task_guard가 만드는 1차 산출물이며, 변조 비용이 명확(파일 권한+heartbeat). branch 이름만으로는 mixed task 감지가 불가능.

3. **왜 하드 차단 + bypass evidence가 다른 대안(경고만, retroactive audit)보다 나은가?**
   → C: 회장 명시 "차단 안 되면 의미 없음". 다만 운영상 진짜 긴급 우회는 evidence 기록 강제로 사후 추적 가능. 경고만 두면 무시될 위험. retroactive audit은 사고 후 복구 비용이 높음.

A-B-C 일관성: ✅ 외부 경로 차단 → lock으로 식별 → 강제 차단(+evidence) 흐름이 동일 목표(silent corruption 차단)에 정렬.

## 참조 자료

- 기존 pre-push: `scripts/git-hooks/pre-push` (task-2449 자산)
- guard.sh: `scripts/guard.sh` (Guard MVP Phase 1)
- start_task_guard: `scripts/start_task_guard.py` (lock 포맷 정의)
- task-scope-guard 참조: `scripts/task-scope-guard.sh` (capability snapshot 매칭 로직)
- handoff schema: `memory/specs/handoff-schema.json` v1.0

## 주의사항

- ★ Phase 1 산출물(start_task_guard.py / create_handoff.py / handoff-schema.json) 절대 수정 금지
- ★ scripts/taskctl.py / taskctl_verify.py / mixed_commit_detector.py는 Phase 2-B owner. 호출만 가능, 수정 금지
- ★ TASKCTL_BYPASS=1 사용 시 evidence 4필드(bypass / timestamp / actor / reason) 누락이면 가드 자체 FAIL
- ★ pre-commit / pre-push hooks는 자체 셸 스크립트로 외부 의존 최소화 (jq 의존 금지, python3 1라인 허용)
- ★ 메인 워크스페이스 main HEAD diverge(check #7 fail) — task-2456 미푸시 상태라 외부 사유. 워크트리 내부 가드는 1~6 PASS. 락은 수동 생성하고 evidence에 기록.
