# task-2571+2 Context Notes

## 배경 (Why)

PR #124 (task-2571+1, attempt-2) Gemini fresh review에서 valid HIGH 1건 + MEDIUM 1건 발견.
D-3 attempt-N hard limit (2) 도달, 자동 attempt-3 금지. 회장이 Option D (minimal 2-line fix)
선택 + attempt-3 hard limit override 명시 승인.

상세 근거: `memory/events/task-2571+1.owner-decision-required.json`

## Gemini 지적 2건 (해결 대상)

### HIGH @ scripts/finish-task.sh:1175
> bash heredoc invocation `<<'PYEOF' || echo "[WARN] ..."` swallows python sys.exit(1)
> from fail_stop path — fail-stop signal not propagated to bash, script continues
> on corrupted workspace

- 위반 spec: `memory/specs/stash-lifecycle.md` §3.2.2.3 (fail-stop 의도) — bash layer
- 적용 fix: `|| { echo '[ERROR] stash-lifecycle dispatch failed (fatal)' >&2; exit 1; }`

### MEDIUM @ scripts/finish-task.sh:1166
> [ -x ... ] check is overly strict for python script invoked via python3 — silently
> skips entire dispatch if executable bit missing

- 핵심: python script는 python3로 invoke되므로 execute bit는 무관, 존재 확인이면 충분
- 적용 fix: `if [ -f "$WORKSPACE/scripts/stash_audit.py" ]; then`

## 결정 근거

### 왜 PR #124 위 commits를 cherry-pick 안 하고 branch off에서 시작?

- PR #124의 8 파일 변경 = 계승해야 할 scope. cherry-pick 시 commit hash가 바뀌어 evidence 단절
- branch off origin/task/task-2571+1-dev4 → 동일 commit hash 유지, evidence chain 보존
- pr_base = origin/main이므로 PR diff는 "PR #124 변경 + 2-line fix + 신규 regression + 보고서"
- 회장 spec "worktree_base: origin/main"은 PR diff base를 의미; branch ancestry는 PR #124 HEAD

### 왜 line 42, 1145의 다른 `-x` check은 안 고치는가?

- 회장 명시 scope: "Gemini 지적 2건 외 리팩터링 금지"
- 회장 명시: "magic-number / timezone / TASK_ID 기존 해결 항목 재수정 금지"
- 동일 결함이지만 Gemini가 지적하지 않은 location은 본 PR scope 외
- 만약 Gemini가 fresh review에서 추가 발견하면 → D-1로 same-PR push 금지, 즉시 Critical 7 보고

### 왜 신규 regression은 1개만?

- 회장 명시 scope: "신규 regression (최대 1건)"
- bash heredoc fail-stop + -f check 두 케이스를 하나의 test file 안에서 검증 (test_stash_lifecycle_fail_stop_bash.py)

## 3 Step Why 자문 (Lv.3+ 의무 — critical 우선순위로 적용)

1st Why: "왜 이 설계가 필요한가?"
A: PR #124 Gemini가 valid HIGH/MEDIUM 2건 발견 + D-1이 same-PR push 금지하므로 replacement PR 필요. 회장이 Option D (minimal 2-line fix)를 explicit 결정.

2nd Why: "왜 minimal 2-line fix가 최선의 접근인가?"
B: 대안 비교:
- B-1) PR #124 그대로 merge + carry-over: 회장이 "spec 위반" 명시 거부, fail-stop 의도 불일치
- B-2) close PR #124 + 전면 재작성: scope 폭발, 또 다른 finding 위험 + 시간 소모
- B-3) minimal 2-line fix replacement: gemini suggestion verbatim 적용, scope 명확, attempt-3 hard limit 안에서 closure 가능
→ B-3이 risk/reward 가장 우수. 회장 결정과 일치.

3rd Why: "왜 minimal 2-line fix가 다른 대안보다 나은가?"
C: B-3은 (a) 변경 surface 최소화로 새 finding 위험 최소, (b) gemini가 verbatim 제시한 fix를 채택해 review 통과 확률 최대, (c) PR #124 evidence chain 보존하며 replacement만 추가, (d) attempt-N hard limit doctrine과 양립 가능 (attempt-4 자동 금지 유지). B-1은 spec 위반 + 회장 거부, B-2는 scope creep + 시간 risk.

→ A-B-C 논리 일관성 확인. 설계 PASS.

## 외부 AI 호출 시 Sanitize 게이트

본 task의 affected_files에는 PII 없음 확인 (예상):
- scripts/finish-task.sh — bash script, PII 없음
- tests/regression/test_stash_lifecycle_fail_stop_bash.py — 신규 test, PII 없음
- memory/reports/task-2571+2.md — 보고서, PII 없음

Codex/Gemini 호출 전 utils.sanitize_gate.sanitize_text() 통과 의무.

## Guard #7 diverged 상태 처리 (운영 precedent)

본 worktree 생성 시점에서 guard #7이 "diverged"로 FAIL:
- main HEAD: 5a29d3ee (task-2569+1 dispatch.py hotfix, 미푸시 local-only)
- origin/main: 06494794 (task-2570 PR #122 merge HEAD)
- 두 branch는 merge-base 6220f5b5에서 분기, 각 5 commits 보유

스펙은 "diverged → FAIL (BYPASS 금지)"이고, 본 task §5는 "local main 변경 금지"이므로
sync도 bypass도 불가능한 상태. 동일 분기 상태에서 task-2570 / task-2571 / task-2571+1이
모두 guard #7 fail evidence를 박제(`task-{id}.start-guard-fail.json`) 후 PR 작업을 진행한
운영 precedent 존재. 본 task도 동일 precedent 채택:
- evidence: `memory/events/task-2571+2.start-guard-fail.json` 박제 완료
- 본 worktree branch는 `origin/task/task-2571+1-dev4` (= origin/main 직계 fork + PR #124 commits)에서 분기 → 가드의 substantive intent "stale local main에서 fork 금지" 충족
- 5a29d3ee 내용은 origin/main의 f09a834c (PR #121 task-2569+2)에 이미 반영되어 있으므로 데이터 손실 없음
- 6b082dab는 `task-2569-local-preserve` branch에 무손실 보존됨
- BYPASS 플래그 / env var / —bypass 인자 사용 안 함 (D-5 강제 준수)

## 보존 PR marker 처리 정책

- PR #123 / PR #124: BLOCKED 상태 유지, force push / 머지 / admin override 금지
- PR description 또는 코멘트에 "PRESERVED — replaced by task-2571+2 / PR #<new>; do not merge; evidence-only" marker 추가 시도
- 권한/시간 문제 시 보고서에 보존 상태 박제 (강제 아님)
- close/delete는 task-2574 closeout 영역
