# merge-ready executor DRY-RUN spec (Track B · read-only/code-free 설계) — 260522

회장 결정(2026-05-22, Track B): merge-ready classifier output 을 입력으로 하는 **dry-run executor** 를 설계한다. **본 단계는 설계(code-free)만** — 실제 merge 실행/GitHub write/branch protection 우회/admin override 자동화 전부 금지. 실 merge executor 는 회장 별도 활성화 후 단계.

기반: [[system_merge_ready_executor_spec_260522]](classifier) + Critical7 + 자동수렴 doctrine + credential 3계층.

설계 원칙: classifier 와 동형 — evidence-only · 결정적 routing · **merge 실행 0 · GitHub write 0**. dry-run = "이 PR을 merge한다면 어떤 경로로 갈지"를 **판정+기록만** 하고 실제로는 아무 것도 실행하지 않는다.

---

## 1. dry-run executor 역할

```
dryrun_route(merge_ready_result, pr_identity) -> routing_artifact
```
- 입력: classifier 의 `classify_merge_ready(...)` 반환 dict + pr_identity{pr, head_sha, task_id, branch}
- 출력: verdict 별 routing artifact 1종 (아래 §2) + `executor_action` (전부 WOULD-* 접두사 = 미실행 표식)
- **절대 실행 안 함**: gh pr merge / git push / cron 발사 / 파일쓰기(artifact 기록 외) 0. branch protection·admin override 호출 0.

verdict → routing:
- `PASS` → **auto_merge_candidate.json** (executor_action=`WOULD_MERGE` · 실제 merge 아님 · 회장 활성화 필요)
- `HOLD` → **remediation_required.json** (executor_action=`WOULD_AUTO_REMEDIATE`)
- `CHAIR_REQUIRED` → **hold_for_chair.json** (executor_action=`WOULD_ESCALATE_CHAIR`)
- `UNKNOWN` → **hold_for_chair.json** with reason=INSUFFICIENT_EVIDENCE (executor_action=`WOULD_REGATHER`)

---

## 2. 출력 artifact schema (3종)

### 2.1 auto_merge_candidate.json
```json
{
  "schema": "merge_ready.auto_merge_candidate.v1",
  "pr": 0, "head_sha": "", "task_id": "", "branch": "",
  "verdict": "PASS",
  "auto_merge_10_conditions": { "...": true },
  "post_merge_smoke_plan": { "defined": true, "runnable": true, "cmd_ref": "" },
  "executor_action": "WOULD_MERGE",
  "actually_executed": false,
  "requires_chair_activation": true,
  "callback_lifecycle_artifact_plan": { "would_generate": true },
  "ts_kst": ""
}
```
의미: 모든 gate green·10조건 충족이지만 **실제 merge 안 함**. 회장이 executor 를 활성화(별도 승인)해야 실 merge 단계로 넘어간다.

### 2.2 remediation_required.json
```json
{
  "schema": "merge_ready.remediation_required.v1",
  "pr": 0, "head_sha": "", "task_id": "",
  "verdict": "HOLD",
  "auto_remediable": ["GEMINI_MEDIUM_WITHIN_EXPECTED", "GEMINI_STALE_EVIDENCE", "CI_PENDING", "UNRESOLVED_MEDIUM_THREAD"],
  "remediation_plan": [
    {"item": "GEMINI_MEDIUM_WITHIN_EXPECTED", "action": "WOULD_AUTO_FIX_REGRESS_PUSH_RESOLVE_RECHECK"},
    {"item": "GEMINI_STALE_EVIDENCE", "action": "WOULD_OWNER_GEMINI_REVIEW_NUDGE"},
    {"item": "CI_PENDING", "action": "WOULD_WAIT_RECHECK"}
  ],
  "loop_boundary_guard": "같은 함수 HIGH 반복/scope 확장 조짐 → CHAIR_REQUIRED 승격",
  "next_recheck": "WOULD_RECLASSIFY_AFTER_REMEDIATION",
  "actually_executed": false,
  "ts_kst": ""
}
```

### 2.3 hold_for_chair.json
```json
{
  "schema": "merge_ready.hold_for_chair.v1",
  "pr": 0, "head_sha": "", "task_id": "",
  "verdict": "CHAIR_REQUIRED",
  "chair_triggers": ["CRITICAL7:<n>", "CREDENTIAL_EXPANSION", "OUT_OF_EXPECTED_FILES", "ADMIN_OVERRIDE_REQUIRED", "REPLACEMENT_PR_FAILURE", "POST_MERGE_SMOKE_FAILURE", "DEPENDENCY_CYCLE", "SERIAL_COLLISION", "MERGE_POLICY_CHANGE", "LIFECYCLE_INCIDENT"],
  "report_envelope": { "one_line": "", "evidence_refs": [], "recommended_options": [] },
  "blocking_reasons": [],
  "executor_action": "WOULD_ESCALATE_CHAIR",
  "actually_executed": false,
  "ts_kst": ""
}
```

---

## 3. dry-run 안전 불변식
- `actually_executed: false` 모든 artifact 강제. executor_action 은 전부 `WOULD_*` 접두사.
- merge/push/PR/cron/branch-protection/admin-override 호출 0 (코드 경로 자체 부재 — 설계상 데이터-only).
- artifact 쓰기는 `memory/events/<task>.merge_ready_route.json` 1개만(추후 구현 시). 본 단계는 schema 설계뿐.
- classifier 가 UNKNOWN 이면 routing 도 보수적(REGATHER) — 추정 0.

## 4. Track A 와의 경계
- B 는 classifier **output schema 만 소비**(코드 의존). Track A expected_files(utils/merge_ready_*·tests/)와 **파일 overlap 0** (B 산출 = memory/specs 문서).
- 실 dry-run executor py 구현은 본 spec 승인 후 별도 task (회장 결정). 그 구현도 merge 실행 0 유지.

## 5. 실 merge executor 로 넘어가기 전 조건 (재확인)
verdict==PASS + 10조건 + queue 선두 + override/우회 불필요 + smoke 존재·실행가능 + lifecycle artifact 생성가능 + **회장 executor 활성화 명시 승인**. dry-run 단계는 이 활성화 전까지 advisory.

**금지(Track B)**: 실 merge 실행 · GitHub write · branch protection 우회 · admin override 자동화 · Track A 파일 수정 · push/PR/merge.
