---
task_id: task-2469
type: context-notes
scope: task
created: 2026-05-06
updated: 2026-05-06
status: completed
---

# 맥락노트: task-2469

## 1. 본 task의 본질 (회장 명시)

- **기능 추가 아님**. 우회 불가능성 증명.
- **결과물 = 코드**. 보고서 X. pytest로 매번 자동 실행되는 공격 fixture + 차단 assertion.
- **MD-only PR reject**. +1500+ lines 코드/테스트/fixture 필수.

## 2. 검증 대상 (task-2468 산출물)

- `scripts/lifecycle_guards.py` (14 functions, P0-1~P0-10)
- `scripts/gemini_severity_parser.py` (count_severities + match_high_severity + parse_pr_review_severities)
- `memory/specs/allowed_bot_accounts.json`
- `memory/specs/allowed_approvers.json`
- `memory/orchestration-audit/admin-override.jsonl` (append-only)
- `scripts/taskctl.py` cmd_approve/cmd_merge/cmd_done 통합점 (read-only, 호출 흐름만 추적)

## 3. 3 Step Why

### 1st Why — 왜 이 설계가 필요한가?
**A**: task-2467+3가 4대 silent corruption(`.done` + `.g3-fail` 동시 존재 / Gemini High mismatch / chairman approver를 auto evidence로 인정 / G3 PASS evidence 누락)을 노출했고, task-2468이 이를 차단하는 14개 Guard를 신설했다. **이 Guard 자체가 우회 가능하면 silent corruption은 다시 발생한다.** 따라서 Guard에 대한 공격 시뮬레이션이 자동 테스트로 박제되어야 한다 — 공격 코드를 작성하고 모두 차단됨을 검증하는 방식만이 향후 회귀를 막는다.

### 2nd Why — 왜 A가 최선의 접근인가?
**B**: 대안은 (1) 사람의 보안 리뷰, (2) formal verification, (3) runtime intrusion detection 세 가지다.
(1) 비재현적 + 인적 의존, (2) Python 동적 코드 베이스에 적용 불가능 + 학습 곡선, (3) 사후 탐지로 차단 못함.
**adversarial pytest fixture는 재현 가능 + CI에 자동 통합 + 차단 시점이 PR 단계.** PR이 머지되기 전에 공격이 실패함을 증명한다. Codex/Gemini 리뷰의 정확도에 의존하지 않는다.

### 3rd Why — 왜 B가 다른 대안보다 나은가?
**C**: B = pytest pentest는:
- **반복 실행 가능**: PR마다 자동 실행되어 회귀 즉시 감지.
- **공격 의도 + 차단 결과를 코드에 박제**: 6개월 후 누구든 `cat tests/taskctl/test_lifecycle_penetration.py` → 위협 모델 즉시 파악.
- **0 인프라 비용**: 기존 pytest 인프라에 통합. CI 변경 없음.
- **타 대안 대비 우수**:
  - vs 보안 리뷰(1): 사람이 빠뜨려도 코드는 안 빠뜨림.
  - vs formal verif(2): Python regex/state machine은 fixture로 충분히 검증.
  - vs runtime IDS(3): 사후 탐지가 아닌 사전 차단.
- **부수 효과**: 공격자(악의적 PR)가 어떤 우회를 시도해도 동일한 패턴이면 차단. fixture가 위협 인텔리전스 역할.

**A → B → C 일관성**: ✅ Guard의 우회 불가능성을 증명하는 데 가장 직접적인 방식이 공격 코드를 작성하는 것이다. 코드는 재현 가능하고 자동 실행되며 위협 모델을 박제한다. 다른 대안들은 모두 이 세 속성 중 하나를 잃는다.

## 4. fixture 디자인 결정

- **공격 코드는 fixture로 박제**: 각 시나리오는 (a) 공격 의도 docstring, (b) 공격 input 생성, (c) Guard 호출, (d) `assert r.ok is False` + reason 검증, (e) audit jsonl emit.
- **isolation**: fixture 내부에서 `tmp_events`, `tmp_evidence`, `tmp_path` 사용. production 디렉토리 변조 절대 금지.
- **reproducibility**: 모든 fixture가 random/timestamp 의존 없이 결정적.

## 5. Scenario 테이블 (A-F + G-M)

| ID | 공격 의도 | 차단 Guard | 검증 방법 |
|----|----------|------------|-----------|
| A  | `.done`+`.g3-fail` 동시 | check_g3_fail_blocks_done + check_done_fail_conflict | 마커 4 변형(g3-fail/g3-failed/g3_fail/g3_failed) 모두 차단 |
| B  | Gemini High 은닉 | count_severities | 5계열 패턴 변형(heading/inline/emoji/severity/keyword) 모두 검출 |
| C  | approver spoofing | check_approver_identity | 비허용 + bot-like 이름 + chairman 모두 manual/fail 분류 |
| D  | merge SHA 불일치 | check_merge_commit_sha | empty/null/mismatch/non-main base 4종 모두 차단 |
| E  | admin override 무감사 | check_bypass_audit + production fail-fast | env set + audit 누락/append-only 위반 모두 차단 |
| F  | 보고서 본문 조작 | check_done_g3_pass_evidence + count_severities | report PASS/실제 evidence 부재/stale task_id/sha 모두 차단 |
| G  | allowed_bot_accounts 변조 | check_bot_author_allowlist | fixture 임시 변조본으로 비허용 author 차단 확인 |
| H  | allowed_approvers 변조 | check_approver_identity | fixture 임시 변조본으로 비허용 approver 차단 확인 |
| I  | admin-override.jsonl append-only 위반 | check_bypass_audit | overwrite/truncate 시도가 무결성 깨도 audit 검증 통과 X |
| J  | symlink/path traversal | check_done_g3_pass_evidence | events_dir 외부 evidence symlink → 차단 |
| K  | hidden path `.g3-fail` | find_g3_fail_markers | dot-prefix 디렉토리/`.git` 등 탐지 영역 외 박제 시도 → 차단 (events_dir 격리) |
| L  | xfail 악용 | (메타 테스트) | 신규 pentest를 xfail로 마스킹하면 회귀로 감지 |
| M  | report PASS / log 부재 | check_done_g3_pass_evidence | g3-pass.json 위조해도 result/sha 검증 통과 X |

## 6. 결정 기록

- **2026-05-06 17:55**: 본 task는 backend(토르) + tester(헤임달) 2명 활성화. 프론트(프레이야) / UX(미미르) 비활성. 사유: 보안 pentest는 백엔드/테스트 코드 only.
- **2026-05-06 17:55**: worktree base = `task/task-2468-dev6` (해당 branch가 main에 미머지됐으므로 task-2468 commits 포함). PR 생성 시점에 base 결정.
- **2026-05-06 18:00**: Codex 사전 검증 PASS (medium 보안 리뷰 권장 — 의도된 보안 task이므로 정상).
- **2026-05-06 18:05**: scope 결정 — A/B/C/D/E/F는 직접 Guard API 호출 + assert. G/H는 fixture 임시 변조본 사용. I는 audit jsonl truncate 시도. J/K는 path traversal/hidden path. L은 메타 (xfail decorator 자체 검증). M은 evidence body tamper.

## 7. 외부 검증

- 마아트(DQ): 독립 검증 — 6 mandatory PASS + 회귀 0 + audit jsonl 6+ entries 확인
- Gemini PR review: PR 생성 후 5분 대기 → high 0 / 실 결함 발견 시 surgical fix → 머지

## 8. 위협 모델 박제 (회장 핵심 의도)

> "보고서가 아니라 **자동화된 방어 검증 체계**를 남겨라."

→ test_lifecycle_penetration.py = **위협 인텔리전스 + 회귀 방지 + CI 게이트**의 3중 자산.
