# task-2726+2 — round-2 bounded fix: origin/main 하드코딩 제거, origin/${MAIN_BRANCH} merge-base 일관화 (회장 승인, 마지막 bounded round)

## 회장 인가 (2026-06-03, round-2 bounded fix — PR #171 fresh HIGH 1건)
PR #171(head `041989e4`) OWNER /gemini review fresh HIGH 1건 유효(코드 직접대조):
- **HIGH**: `scripts/finish-task.sh` **line 545에서 MAIN_BRANCH 동적 감지**하면서 **line 548에서 `origin/main` 하드코딩** → 일관성 결함. master-default repo 또는 main 아닌 default branch 환경에서 **merge-base 실패 → fallback/오판** 가능.
★ **task-2726 의 마지막 bounded round(round-2, max_rounds=2 도달).** 이후 같은 blocker 재발 → **LOOP_BOUNDARY**. 새 HIGH/CRITICAL → CHAIR_REQUIRED.

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

## 허용 파일 (expected_files 2개 — 그 외 수정 금지)
1. `scripts/finish-task.sh` ← origin/main 하드코딩 → origin/${MAIN_BRANCH}
2. `tests/regression/test_finish_task_worktree_isolation_2726.py` ← main/master/default branch 회귀 추가

## 수정 방향 (회장 6)
1. `origin/main` **하드코딩 제거**(line 548 및 동일 패턴 전부).
2. line 545 에서 감지한 **`MAIN_BRANCH` 사용** → `origin/${MAIN_BRANCH}` (또는 동등 방식)으로 merge-base 계산. (`git merge-base "origin/${MAIN_BRANCH}" HEAD` 등)
3. main/master/default branch 차이를 **regression 으로 고정**.
4. 기존 `FINISH_TASK_WORKTREE_STRICT` default-off **유지**.
5. **shared main fallback 제거/fail-closed 원칙 유지**(round-0 핵심 — origin/${MAIN_BRANCH} 부재 시에도 shared main silent fallback 금지).
6. **`.done` 위조 금지.**

## 필수 검증 (회장 10)
1. 기존 24 regression 유지(무손상).
2. **master-default repo 에서 `origin/main` 부재 시에도 merge-base 계산 PASS**(origin/${MAIN_BRANCH}=origin/master 로 동작).
3. main-default repo 기존 동작 PASS.
4. **`origin/main` 하드코딩 grep 0**(허용 주석 외 코드 경로 0).
5. diff `git diff --name-only origin/${MAIN_BRANCH}`(또는 origin/main) = expected_files **2파일 내부**.
6. forbidden 0. 7. ANU key literal(`c119085addb0f8b7`) 0. 8. `FINISH_TASK_WORKTREE_STRICT` default-off 유지. 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. **같은 blocker(origin 하드코딩/merge-base 계열) 재발 → LOOP_BOUNDARY.** 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-2 + L1). 3. `memory/events/task-2726+2.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:
    - "scripts/finish-task.sh"
    - "tests/regression/test_finish_task_worktree_isolation_2726.py"
    - "memory/reports/task-2726.md"
    - "memory/events/task-2726+2.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,re; s=open('scripts/finish-task.sh').read(); code=re.sub(r'#.*','',s); sys.exit(1 if 'origin/main' in code else 0)"`
- `python3 -c "import sys; s=open('scripts/finish-task.sh').read(); sys.exit(0 if 'origin/\${MAIN_BRANCH}' in s or 'origin/$MAIN_BRANCH' in s else 1)"`
- `python3 -c "import sys; s=open('scripts/finish-task.sh').read(); sys.exit(1 if 'c119085addb0f8b7' in s else 0)"`

## 상태
CHAIR_APPROVED_ROUND2_BOUNDED_FIX (마지막 bounded round, max_rounds=2 도달) — dev3 재위임(head 041989e4 이어서). merge 회장 승인 전 금지. 같은 blocker 재발 → LOOP_BOUNDARY. 새 HIGH/CRITICAL → CHAIR_REQUIRED.