# TASK2757 non-matching thin gate 분리 merge 전략 packet (260617)

상태: `TASK2757_NON_MATCHING_THIN_GATE_SPLIT_STRATEGY_PACKET_ACTIVE_FALSE` · ACTIVE=false · merge 금지(별도 승인 전)

## 0. 회장 결정 (2026-06-17)
matching 축 4회차 종료(`TASK2757_MATCHING_AXIS_4CYCLE_STOPPED_DESIGN_REVIEW_REQUIRED_ACTIVE_FALSE`). (가)lookaround·(나)구조화입력·(다)현코드 격하 전부 즉시 불승인. **승인 경로 = matching 컴포넌트 보류 + 나머지 thin gate 분리 merge 검토**. 새 PR 생성 전 본 계획 보고. 분리 PR은 **새 goal_id**. merge는 별도 승인 전 금지.

## 1. 코드 단위 매핑 (base = task/task-2757+3 fd7ce69f, v2_13_gate.py 기준)

### A. 살림 (matching 무관 — 구조화 입력/순수 함수)
| 컴포넌트 | 위치 | matching 의존 |
|---|---|---|
| GateVerdict enum / GATE_VERDICTS | gate.py:22-49 | 무 |
| ROLLBACK_FLOOR_TABLE·COST_ORDER·_cost_rank·rollback_floor·max_rollback_cost·effective_floor | gate.py:349-429 | 무(touched_axes는 입력 인자) |
| build_escalation_packet·ESCALATION_PACKET_FIELDS | gate.py:432-499 | 무 |
| classify_gate Step1 provenance / Step3 rollback floor violation / Step4 budget / Step6 semantic residue / Step7 allowed | gate.py:527-665 | 무(rs/contract 구조화 입력) |
| classify_gate control_db / promotion 분기 — **rs flag 부분만**(`rs.control_db_op`·`rs.promotion_self_approval`) | gate.py:561-583 | 무 |
| control_db_guard.py (DB write guard 전체) | 파일 | 무 |
| promotion_guard.py (promotion self-approval guard) | 파일 | 무 |
| correction_budget.py (budget ledger) | 파일 | 무 |
| migrate_capability_matrix_v213.py (matrix migration) | 파일 | 무 |
| goal_contract_schema.json (contract schema) | 파일 | 무 |

### B. 보류 (ad-hoc 텍스트/경로 매칭 = HIGH 4회차 근원)
| 컴포넌트 | 위치 |
|---|---|
| detect_allowlist_axis (diff/tool_calls 비정형 텍스트에서 forbidden op/path 추출) | gate.py:309-345 |
| _extract_touched_files·_glob_match·_match_forbidden_paths·_is_word_form_op·_phrase_in_tokens·_match_forbidden_ops·normalize_path·_normalize(matching용) | gate.py:135-308 |
| classify_gate Step2 ALLOWLIST_AXIS_CHAIR_REQUIRED 분기 + `touched_axes = detect_allowlist_axis(...)` | gate.py:556-602 |
| control_db/promotion 분기의 `"control_db_write"/"promotion_approved" in touched_axes` 보조조건(touched_axes=matching 유래) | gate.py:561,577 |

### C. 회장 판단 필요 (경계 — 구조화 입력이나 보류 후보와 인접)
1. **classify_gate Step5 goal expansion**(gate.py:626-650): `rs.touched_files`(호출자 제공 구조화 list) vs `contract.expected_files`를 **normalize_path**로 정규화 후 set 비교. ★ad-hoc 텍스트 추출 아님(구조화 list 비교)이나, normalize_path 함수(보류군) 의존. 
   - 옵션 C1: **살림** — normalize_path의 r4 안전버전(`a/`·`b/` strip 안 함, `./`·중복slash·sep만)만 분리 잔존. 구조화 입력이라 HIGH 4회차 텍스트-매칭 위험과 무관.
   - 옵션 C2: **보류** — normalize_path 일괄 보류, Step5도 보류(goal expansion 기능 빠짐).
2. **external_probe 분기**(gate.py:586-595): `rs.external_probe_required` flag 기반 강제 판정(probe 구현 아님). 회장 "external probe 확장 금지"는 daemon/probe 구현 금지이고 이 분기는 판정만 — 살림 가능하나 회장 확인 요청.

## 2. 보고 항목 (회장 요청 형식)
### 2.1 남기는 기능
A 전체 + (C1 채택 시) Step5 goal expansion + normalize_path 안전버전 + external_probe 판정분기(회장 승인 시). → verdict: INVALID_CONTRACT_PROVENANCE / CONTROL_DB_DIRECT_WRITE_BLOCKED(flag) / PROMOTION_SELF_APPROVAL_BLOCKED(flag) / ROLLBACK_COST_FLOOR_VIOLATION / BUDGET_EXCEEDED_CHAIR_REQUIRED / (GOAL_EXPANSION_BLOCKED) / SEMANTIC_RESIDUE_CHAIR_DEFAULT / GOAL_ENABLING_CORRECTION_ALLOWED.

### 2.2 제거·비활성화하는 기능
B 전체. classify_gate에서 `touched_axes = detect_allowlist_axis(...)` 호출 제거 → `touched_axes = []`(또는 control_db/promotion은 rs flag 단독 판정). ALLOWLIST_AXIS_CHAIR_REQUIRED verdict 미도달(enum은 보존하되 trigger 경로 제거 = dead-trigger 명시 주석). matching 함수군 **파일에서 삭제**(dead code 잔존 시 Gemini 재지적·혼란 → 삭제).

### 2.3 테스트 재구성
test_v213_phase1_gate_2757.py(147) → matching 테스트(detect_allowlist_axis·forbidden op/path·normalize strip·glob·touched_files 추출) **분리 제거**, 나머지(floor·budget·control_db·promotion·escalation·schema·migrate·provenance·semantic) **유지**. (C1 채택 시 Step5 expected_files set 비교 테스트 유지). 제거 후 전수 PASS 확인.

### 2.4 matrix 반영
`automation_capability_matrix.json`:
- `v2_13_phase1_thin_gate` → split: `non_matching_thin_gate`{implemented:candidate, matching_dependency:removed}, `matching_axis`{status:DESIGN_REVIEW_REQUIRED, recurrence:4, blocked_reason:adhoc_text_matching_bypass}.
- ACTIVE=none·WIRED=none 유지.

## 3. 분리 PR 실행 계획 (회장 승인 후)
- 새 goal_id: **task-2758**(non-matching thin gate split). base clean main 8420a763. fresh branch. dev2 위임 isolated worktree.
- 산출 = A(+승인된 C) 코드만, B 삭제, 테스트 재구성, matrix split. 7파일 동일 경계.
- CI/Gemini inline 직접 확인 → **HIGH 0 시에만** merge-ready candidate packet. merge 별도 승인.
- matching 설계 과제 = 별도 goal_id로 분리 보류(task-2759 reserved, 본 packet §1B/C 입력).

## 4. 금지/안전
r5 미세수정 0 · lookaround 단독 패치 0 · PR #235~238 재활용 0 · matching HIGH 잔존 merge-ready 선언 0 · systemd 0 · callback/wake 확장 0 · C(event strategy) 즉시 착수 0 · ACTIVE=true 0. canonical 8420a763 · flag OFF · cron 0 · merge 0. P0B event strategy는 본 정리 후 별도 goal_id 복귀.

## 5. 회장 결정 요청 (3건)
1. C1(Step5 goal expansion + normalize_path 안전버전 **살림**) vs C2(보류) — ANU 권고 **C1**(구조화 입력, HIGH 위험 무관, goal expansion은 thin gate 핵심).
2. external_probe 판정분기 살림 vs 보류 — ANU 권고 **살림**(판정만, probe 구현 아님).
3. 분리 PR goal_id=task-2758 착수 승인 여부.
