# B1 pilot spec — dryrun_shadow INDEX.md row 추가 (low-risk pilot · merge 실행 금지) — 260523

회장 결정(2026-05-23 PR #140 ACCEPT 후속): real merge executor wiring OFF-mode main 반영 완료. low-risk PR pilot 1건 B1 승인. **pilot merge 실행은 chair_authorization 최종 승인 후에만**.

기반: `system_real_merge_executor_wiring_spec_260523.md` §11(low-risk PR pilot) + `low_risk_pilot_candidates_inventory_260523.json` (Track B inventory).

---

## 1. pilot 목표
- B1 = `tests/fixtures/dryrun_shadow/INDEX.md` 갱신 (또는 추가 시나리오 doc-only row)
- **production 코드 변경 0 · test/fixture/doc only · rollback trivial**
- real merge executor pilot 1차 검증 channel — 실 GitHub 호출 0 (본 pilot 자체는 dev6 가 만들고 ANU 가 적층/push/PR open 까지만). pilot merge 실행은 별도 회장 최종 승인 후 (chair_authorization 발급 시점).

---

## 2. expected_files (B1 pilot 범위)

신규 또는 갱신 (≤4 files):
- `tests/fixtures/dryrun_shadow/INDEX.md` — 16 시나리오 카탈로그 정리 (현재 머지된 카탈로그 보완 · 시나리오 별 verdict→action 명세 명확화)
- (선택 1) `tests/fixtures/dryrun_shadow/<신규 시나리오>/PROVENANCE.md` — doc 만 (evidence.json/expected.json 신규는 본 pilot 범위 외 · regression 영향 0 유지)
- (선택 2) 본 spec 자체 참조 doc link 추가 (변경 파일 카운트 ≤ 4 보장)

**최소 안전 변경**: INDEX.md 1 file 만. 추가 가능하나 4 file cap 유지.

---

## 3. forbidden_paths (B1 pilot 정적 가드 11+종)

- `utils/replacement_pr_runner.py` · `scripts/finish-task.sh`
- `utils/merge_ready_classifier.py` · `utils/merge_ready_dryrun_executor.py`
- `utils/callback_envelope_schema.py` · `utils/anu_callback_registrar.py`
- `utils/canonical_root_resolver.py` · `utils/anu_collector_action_trigger.py`
- `utils/real_merge_hooks.py` · `utils/activation_flag_validator.py` · `utils/chair_authorization_validator.py` · `utils/gate_snapshot_validator.py` · `utils/real_merge_artifact_schema.py`
- `dispatch/__init__.py` · `dispatch/finalize_hooks.py`
- `.tasks/` · `tests/fixtures/` (단 `dryrun_shadow/INDEX.md` 만 예외) · `tests/regression/`

★ 본 pilot 의 유일한 허용 변경 영역 = `tests/fixtures/dryrun_shadow/INDEX.md` 1 file (+ 선택 시나리오 PROVENANCE.md 1~3 file).

---

## 4. acceptance criteria (owner-provided)

회장 명시 verbatim 결정 = 유일 acceptance source.

| 검증 항목 | 조건 |
|---|---|
| CI 11/11 PASS | 모든 check `conclusion=success` |
| gemini-review-gate PASS | fresh head evidence |
| phase3-merge-gate PASS | 별도 PASS |
| unresolved thread 0 | reviewThreads 전부 resolved |
| mergeStateStatus | CLEAN 또는 MERGEABLE |
| Critical7 hits | 0 |
| BLOCKING_SECRET | 0 |
| expected_files | exact (INDEX.md ± 선택 3 file 한정) |
| forbidden path | 0 |
| admin override | 불필요 (non-admin merge) |
| callback lifecycle artifact | 정상 |
| production code 변경 | 0 |
| 변경 파일 수 | ≤ 4 |
| rollback | trivial (`git revert` 1 commit) |

---

## 5. pilot 실행 조건 (회장 최종 승인 게이트)

본 spec 은 **PR open + gate 확인 + 회장 최종 승인 대기** 까지만 정의:

1. dev6 페룬 task dispatch (B1 pilot 코드화)
2. ANU 적층 + push + PR open
3. CI/Gemini/phase3 GREEN + unresolved 0 + CLEAN 확인 (회장 보고)
4. **회장 chair_authorization JSON 발급 명시 결정 대기**
5. **chair_authorization 발급 후에만**:
   - `ANU_REAL_MERGE_EXECUTOR_ACTIVE=1` env 설정
   - `real_merge_execute` 호출 (gate_snapshot + activation + auth 셋 다 True)
   - artifact 4종 자동 생성
6. real merge 실행 → REAL_MERGE_DONE artifact
7. post-merge smoke (gh fetch + forbidden 무수정 + regression + canonical_root + auto-merge 미활성 재검증)
8. smoke OK → 회장 ACCEPT → pilot success
9. smoke 실패 → POST_MERGE_SMOKE_FAILED + CHAIR_REPORT (자동 rollback 금지 · 회장 결정 영역)

★ 위 5~8 모두 **현재 단계 금지**. 본 spec = 1~3 까지만 허용.

---

## 6. chair_authorization JSON 초안 (★ 실제 발급 0)

**본 초안은 회장 최종 verbatim 결정 시 사용할 template — 즉시 발급 금지 · 회장 명시 후에만 활성화**.

```json
{
  "schema": "anu.chair_merge_authorization.v1",
  "scope": "per_pr",
  "pr_numbers": ["<TBD — B1 PR open 후 확정>"],
  "head_shas": ["<TBD — pre-merge gate snapshot 시점 HEAD>"],
  "expires_at_kst": "<현재 ts + ≤1h>",
  "chair_signature": "<회장 verbatim approval 메시지 텍스트>",
  "issued_at_kst": "<발급 시점 KST>",
  "task_id": "task-2638-b1-pilot",
  "expected_files_snapshot": [
    "tests/fixtures/dryrun_shadow/INDEX.md"
  ],
  "notes": "B1 pilot per_pr scope · TTL ≤1h · production code 변경 0 · test/fixture/doc only · rollback trivial. chair_signature 최종 회장 발급 시점에 채워짐."
}
```

본 JSON template 위치: `memory/specs/chair_authorization_b1_pilot_draft_260523.json` (초안만 · 미발급 마크).

---

## 7. 본 단계 금지 (회장 verbatim)

- batch auto-merge 활성화 금지
- per_pr B1 외 chair_authorization 발급 금지
- `ANU_REAL_MERGE_EXECUTOR_ACTIVE=1` 설정 금지
- real merge 실행 금지
- admin override 금지
- branch protection 우회 금지
- production service task 와 혼합 금지
- foreign dirty 정리 금지
- replacement_pr_runner 수정 금지
- finish-task.sh 수정 금지
- chair_authorization JSON 실 발급 0 (초안만)

---

## 8. 자동수렴

- Gemini medium/style/quality + expected_files 내부 + Critical7 0 + credential expansion 0 → 자동수렴
- expected_files 내부 non-critical HIGH 자동수렴
- 회장 보고 트리거: Critical7 / credential expansion / expected_files 밖 / admin override / post-merge smoke fail (smoke 는 pilot 활성화 후에만 적용)

---

## 9. frozen anchor

- ANCHOR-1: "B1 pilot = INDEX.md row 추가 만 · test/fixture/doc only · production code 변경 0 · 변경 파일 ≤ 4"
- ANCHOR-2: "PR open + gate 확인까지만 본 단계 허용 · pilot merge 실행 = chair_authorization 최종 승인 후"
- ANCHOR-3: "chair_authorization 초안 = template 만 · scope=per_pr · TTL ≤1h · chair_signature 비어있음 (회장 발급 시점에 채움)"
- ANCHOR-4: "forbidden paths 15+종 정적 가드 (real merge wiring stack 전체 포함)"
- ANCHOR-5: "real auto-merge 활성화 미승인 유지 · ACTIVATION_FLAG_DEFAULT=False 유지"
