# task-2726+1 — round-1 bounded fix: test 로컬경로 하드코딩 제거 + finish-task.sh $reason heredoc injection 제거 (회장 승인)

## 회장 인가 (2026-06-03, round-1 bounded fix — PR #171 fresh HIGH 2건)
PR #171(head `520198e2`) OWNER /gemini review fresh HIGH 2건 유효(둘 다 expected_files 내부·코드 직접대조 확인):
1. **HIGH-1 test:28** `REPO = Path("/home/jay/workspace/.worktrees/task-2726-dev3")` 로컬 절대경로 하드코딩 → 타 환경/CI 실패. ★ task-2726 이 없애려던 **WORKSPACE_ROOT_HARDCODE doctrine 재위반**을 테스트가 재도입.
2. **HIGH-2 finish-task.sh:78** `'reason':'$reason'` python heredoc 직접 보간 → reason 에 작은따옴표 포함 시 **SyntaxError → WORKTREE_UNRESOLVED marker 생성 실패**(safety-net 코드가 깨짐).
→ round-1 bounded fix. expected_files 2파일 내부 surgical.

## worktree
- `/home/jay/workspace/.worktrees/task-2726-dev3` (branch `task/task-2726-dev3`, head `520198e2`)에서 **이어서**. new head → **non-force push**(PR #171 갱신).

## 허용 파일 (expected_files 2개 — 그 외 수정 금지)
1. `tests/regression/test_finish_task_worktree_isolation_2726.py` ← REPO 동적 계산
2. `scripts/finish-task.sh` ← $reason sys.argv 전달

## 수정 방향 (회장)
1. **HIGH-1**: test:28 로컬경로 하드코딩 제거. `/home/jay/workspace/.worktrees/task-2726-dev3` 금지. `REPO = Path(__file__).resolve().parents[2]` (또는 tmp_path 기반 임시 repo fixture)로 동적 계산. WORKSPACE_ROOT_HARDCODE doctrine 재위반 방지(다른 로컬 절대경로도 0).
2. **HIGH-2**: finish-task.sh:78 `$reason` heredoc 직접 보간 제거. **sys.argv 또는 환경변수**로 전달 → 어떤 reason 문자열(작은따옴표/공백/특수문자/빈문자/유니코드)에서도 marker 생성이 깨지지 않게. `$tid`/`$EVENTS_DIR` 도 같은 방식 권장(동일 injection 벡터면 함께).
3. **safety-net 불변식**: WORKTREE_UNRESOLVED marker 생성이 empty/null/special-char reason 에서도 crash 0. (gemini 제안: `... " "$EVENTS_DIR" "$tid" "$reason"` argv 전달)

## 필수 검증 (회장 10)
1. 기존 22 regression 유지(무손상).
2. **로컬 절대경로 grep 0** (`/home/jay` 하드코딩 = 0, test/finish-task 양쪽).
3. reason 에 작은따옴표 포함 시 marker 생성 **PASS**(회귀 추가).
4. WORKTREE_UNRESOLVED marker 생성 PASS(정상 reason).
5. `FINISH_TASK_WORKTREE_STRICT` default-off 유지(`${...:-0}`).
6. `git diff --name-only origin/main` = expected_files **2파일 내부**.
7. forbidden 0. 8. ANU key literal(`c119085addb0f8b7`) 0. 9. shared main/dev4 branch 개입 0. 10. `.done` 위조 0.
- smoke: `python3 -m pytest tests/regression/test_finish_task_worktree_isolation_2726.py -q` + `bash -n scripts/finish-task.sh`.

## 금지 (회장 verbatim)
- expected_files 2파일 밖 수정 금지 · merge 금지 · FINISH_TASK_WORKTREE_STRICT 활성화 금지 · task-2727 cleanup 금지 · task-2725 구현 혼입 금지 · PR #169 commit 금지 · shared main stash/reset/clean/delete 금지 · dev4 branch 개입 금지 · task-2724 activation/flag on/pilot 금지 · systemctl/wake 금지 · force push·rebase·admin override 금지.
- ★ 새 HIGH/CRITICAL 발생 시 자동 fix 금지 → CHAIR_REQUIRED. expected_files 밖/ shared main/ merge 필요 시 CHAIR_REQUIRED.

## doctrine
- 회장 명시 bounded fix = 새 commit→new head→**non-force push**(PR #171 갱신, amend 금지). bot `/gemini review` 무효(인간 OWNER 1회). long polling 금지(watcher 위임).

## finalize (PR #171 갱신 → MERGE_READY_CANDIDATE — merge 금지)
1. fix → 10 검증 PASS → `git add` 2파일 → commit → **non-force push**(PR #171 갱신).
2. `memory/reports/task-2726.md` 갱신(round-1 + L1). 3. `memory/events/task-2726+1.done` 생성.
4. ANU normal callback cron 강제 등록 — collector_role=ANU, ANU_KEY=c119085addb0f8b7(sealed, literal 노출 금지). self-key 금지. cron 0+sendfile only=NOT_REGISTERED fail-closed.
5. ★ merge 금지 — ANU/watcher 가 새 head OWNER /gemini review → CI/Gemini watcher → CI GREEN + fresh unresolved HIGH/CRITICAL 0 + diff 2파일 + forbidden 0 + ANU key 0 + STRICT default-off 시 MERGE_READY_CANDIDATE 보고.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "tests/regression/test_finish_task_worktree_isolation_2726.py"
    - "scripts/finish-task.sh"
    - "memory/reports/task-2726.md"
    - "memory/events/task-2726+1.done"
  forbidden_paths:
    - "teams/shared/verifiers/critical_gap.py"
    - "scripts/harness/v36/terminal_state_callback.py"
    - "deploy/systemd/**"
    - ".github/**"
  commands:
    - "pytest"
    - "python3 -m pytest"
    - "python3 -m py_compile"
    - "bash -n"
  merge_policy: "none"
  ttl_hours: 48
```

## goal_assertions (auto)
- `python3 -m pytest tests/regression/test_finish_task_worktree_isolation_2726.py -q`
- `bash -n scripts/finish-task.sh`
- `python3 -c "import sys; s=open('tests/regression/test_finish_task_worktree_isolation_2726.py').read(); sys.exit(1 if '/home/jay/workspace/.worktrees/task-2726-dev3' in s else 0)"`
- `python3 -c "import sys; s=open('scripts/finish-task.sh').read(); sys.exit(1 if 'c119085addb0f8b7' in s else 0)"`

## 상태
CHAIR_APPROVED_ROUND1_BOUNDED_FIX — dev3 재위임(.worktrees/task-2726-dev3, head 520198e2 이어서). merge 회장 승인 전 금지. 새 HIGH/CRITICAL → CHAIR_REQUIRED.