# task-2726+3 — round-3 bounded fix: STRICT mode SCOPE_BASE empty fail-OPEN → fail-CLOSED (회장 A안 승인)

## 회장 인가 (2026-06-03, round-3 bounded fix — PR #171 fresh HIGH 1건)
PR #171(head `80416faa`) 80416faa fresh OWNER /gemini review(submittedAt 12:25:20Z > head commit 08:17:13Z) fresh HIGH 1건 유효(코드 직접대조, FALSE_POSITIVE 아님):
- **HIGH** `scripts/finish-task.sh:~556`: STRICT mode 에서 `SCOPE_BASE` 미감지(빈 값) 시 **`: > "$SCOPE_DIFF_FILE"` (빈 diff 생성) → 이후 scope 검증 자동 스킵 = fail-OPEN**. task-2726 핵심 목표 **fail-closed 원칙 정면 위배** — 미검증 변경 통과 위험.
★ round-3 bounded fix(회장 A안). max_rounds=2 초과 명시 인가. 이후 같은 fail-open/SCOPE_BASE 계열 재발 → LOOP_BOUNDARY/CHAIR_REQUIRED.

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

## 허용 파일 (expected_files 2개 — 그 외 수정 금지)
1. `scripts/finish-task.sh` ← STRICT mode SCOPE_BASE empty → fail-closed
2. `tests/regression/test_finish_task_worktree_isolation_2726.py` ← fail-closed 회귀 추가

## 수정 방향 (회장 7)
1. **목표**: STRICT mode + SCOPE_BASE empty → 반드시 **fail-CLOSED**.
2. SCOPE_BASE 가 비면 빈 diff(`: > "$SCOPE_DIFF_FILE"`) 생성으로 통과시키지 말고, **명시적 error 출력 + `exit 1`**(또는 동등 fail-closed 결과). gemini 제안: `else echo "[ERROR][STRICT] scope-gate: SCOPE_BASE 미감지 — fail-closed" >&2; exit 1`.
3. **non-strict/default-off 동작은 기존 의도대로 보존**(`FINISH_TASK_WORKTREE_STRICT` 미설정/0 → 레거시 `${MAIN_BRANCH}..HEAD` 동작 불변).
4. origin/main 하드코딩 제거·MAIN_BRANCH 일관성·shared-main fallback 제거 원칙 **유지**(round-2 성과 보존).
5. `.done` 위조 금지·finish-task 외 완료 경로 금지.
6. ★ SCOPE_BASE 가 worktree-base.json fallback 으로도 못 구해질 때만 fail-closed (기존 worktree-base.json fallback 경로는 유지 — 그것마저 empty 일 때 exit 1).
7. exit 1 시 actionable marker/메시지(왜 fail-closed 인지) 남길 것.

## 필수 회귀 (회장 10)
1. **STRICT mode + SCOPE_BASE empty → fail-closed**(exit 1 / 검증 스킵 안 함).
2. STRICT mode + valid SCOPE_BASE → 기존 정상 동작(diff 생성).
3. non-strict/default-off → 기존 호환 동작(레거시 diff).
4. main/master default branch regression 유지.
5. **기존 30 regression 유지 또는 증가**.
6. origin/main 하드코딩 코드경로 0.
7. `git diff --name-only origin/${MAIN_BRANCH}` = expected_files **2파일**.
8. forbidden 0. 9. ANU key literal(`c119085addb0f8b7`) 0. 10. shared main/dev4 branch 개입 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/2725 혼입 금지 · PR #169 commit 금지 · shared main stash/reset/clean/delete 금지 · dev4 branch 개입 금지 · systemctl/wake 금지 · force push·rebase·admin override 금지.
- ★ 새 HIGH/CRITICAL / 같은 fail-open·SCOPE_BASE 계열 재발 → CHAIR_REQUIRED/LOOP_BOUNDARY. expected_files 밖/shared main 필요 → CHAIR_REQUIRED.

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

## finalize (PR #171 갱신 → MERGE_APPROVAL_CANDIDATE — merge 금지)
1. fix → 10 회귀 PASS → `git add` 2파일 → commit → **non-force push**(PR #171 갱신).
2. `memory/reports/task-2726.md` 갱신(round-3 + L1). 3. `memory/events/task-2726+3.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 가 새 head owner_gemini_trigger request-only 자동 /gemini review → CI/Gemini watcher → CI 11/11 + fresh unresolved HIGH/CRITICAL 0 + diff 2파일 + forbidden 0 + ANU key 0 + ACTIVE 변화 0 + merge_policy 확인 시 MERGE_APPROVAL_CANDIDATE 보고. 비-blocking MEDIUM = evidence-based resolve automation 가능(fresh 유효 HIGH 는 자동 resolve 금지).

## 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+3.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('scripts/finish-task.sh').read(); sys.exit(0 if 'STRICT' in s and 'exit 1' 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_ROUND3_BOUNDED_FIX (A안, max_rounds=2 초과 명시 인가) — dev3 재위임(head 80416faa 이어서). merge 회장 승인 전 금지. 같은 fail-open/SCOPE_BASE 계열 재발 → CHAIR_REQUIRED/LOOP_BOUNDARY.