# task-2553+52 — TRACK 3: policy profile DEFAULT DISPATCH ADOPTION (PASS)

> Executor: dev4-team 비슈누 (key 7943afbe12c12f7d, 1회 한정 · clean) · 완료 2026-05-18 19:12:12 · spec sha256 `41029c90…` 검증.
> goal_type `policy_profile_default_dispatch_adoption`. consolidated 입력용 — 단독/중간 보고 0. batch 통합은 독립 ANU 사후.

## 결과: PASS (§7 공통 HOLD 트리거 0)

policy profile engine(C1 +33 정본, byte-0)을 **기본 dispatch planning 경로**
에 연결 완료. 기본 경로에서 chair 가 `policy_profile.name` 을 주지 않아도
**goal_type + boundary 만으로 profile 자동 선택·바인딩** 된다. 9-R 본문 우선
— frozen/tracked in-place 편집 없이 신규 additive resolver/adapter +
mapping/resolver 부트스트랩 + regression 으로 default→engine 경로 입증.

## 결선 위치 (§3.1~3.5 — 신규 모듈 = 연결점)

- `anu_v3/default_profile_resolver.py` — **DEFAULT dispatch-planning resolver**
  - entrypoint: `resolve_default_profile(DefaultDispatchRequest)`,
    `run_default_profile_resolution(raw)`, `run_selected_profile_evidence(raw)`
  - goal_type → policy_profile 단일 결정 테이블 조회 후 C1 engine 정본 API
    (`parse_goal_request` → `resolve_policy`) **read-only 소비**
- `memory/policy_profiles/goal_type_profile_mapping.json` — goal_type →
  policy_profile mapping (1:1 deterministic, `default_path=true`)
- `anu_v3/profile_dispatch_planning_adapter.py` — profile decision →
  dispatch **planning** 입력 (plan_only hard-pinned)
- `anu_v3/profile_coordinator_input_adapter.py` — profile decision →
  batch coordinator 입력 (closeout/merge/auto_confirm hard-pinned False)
- `schemas/goal_type_profile_mapping.schema.json` ·
  `schemas/default_profile_resolution.schema.json` — 정적 meta-schema
- 신 goal_type profile 인스턴스 3종 (read-only/low-risk 기본형):
  `task_2553_final_closeout.json` · `runtime_structure_smoke_pilot.json` ·
  `policy_profile_default_dispatch_adoption.json`

## §3 필수 구현 1~9 (전부 충족)

1. **default profile resolver** — `resolve_default_profile` : goal_type +
   boundary 만으로 RESOLVED + `profile_bound=true` + `auto_apply=true`.
2. **goal_type → policy_profile mapping** — 단일 결정 테이블 `goal_type_profile_mapping.json`
   (meta-schema 검증, 1:1 deterministic, 다중후보=conflict).
3. **boundary → gate/HOLD expansion** — `_boundary_expansion_from_resolution`
   가 engine 산출(gate/HOLD/allowed/forbidden)을 read-only 표면화.
   `test_boundary_expansion_surfaces_engine_resolution` 으로 engine 정본
   어댑터와 **동치** 입증 (재구현 0).
4. **profile decision → dispatch planning adapter** —
   `adapt_for_dispatch_planning` : `plan_only` / `write_authority` /
   `merge_authority` / `pr_branch_authority` / `auto_dispatch` =
   **hard-pinned False** (실 dispatch/PR/merge/branch 자동확정 0).
5. **profile decision → batch coordinator input adapter** —
   `adapt_for_coordinator_input` : `closeout_authority` /
   `merge_authority` / `auto_confirm` = **hard-pinned False**
   (coordinator 가 closeout/merge 자동확정 0).
6. **missing/unknown fail-closed** — `goal_type_missing` /
   `goal_type_not_mapped` / `default_request_not_mapping` /
   `profile_load_fail` → `DEFAULT_RESOLUTION_REFUSED`, 추측·날조 0.
7. **profile conflict fail-closed** — `explicit_profile_conflict`
   (chair 명시 ≠ mapping 산출) · `engine_allowed_forbidden_conflict`
   (engine allowed∩forbidden) · `ambiguous_mapping_conflict` →
   `PROFILE_CONFLICT`, `auto_apply=false`.
8. **selected profile evidence JSON** —
   `memory/events/task-2553+52.selected-profile-evidence.json`
   (`run_selected_profile_evidence`, schema `…selected_profile_evidence.v1`).
9. **regression** — `tests/regression/test_default_profile_resolver_2553plus52.py`
   **27 passed**.

## engine read-only 소비 / byte-0 증거

- 정본 API 만 호출: `parse_goal_request@187` → `resolve_policy@561`
  (`PolicyResolution.to_coordinator_binding/to_decision_dict` read-only).
- engine import-only, 객체 mutation 0. **byte-0 전후 동일**:
  - `policy_profile_engine.py` `2363e291…`
  - `dispatch_profile_selection.py` `54d47cd0…`
  - `coordinator_profile_binding.py` `ee634104…`
  - 기존 profile `test_only_hardening_pr_merge_v1.json` `7e161d7d…`
- resolver/adapter = **strict-additive** (anu_v3 import 은 engine 정본 1개,
  adapter 2종은 파일레벨 contract 만 — anu_v3 import 0, 순수 stdlib).
- mapping/profile JSON read-only (멱등 3회 sha256 무변).

## fail-closed (자동 적용 0) — §3.6/§3.7 / §8

missing goal_type / unmapped goal_type / 요청 불량 / mapped-profile 부재 →
`DEFAULT_RESOLUTION_REFUSED`. explicit≠mapping / engine allowed∩forbidden /
ambiguous mapping → `PROFILE_CONFLICT`. engine HOLD → `HOLD_FOR_CHAIR`.
어느 경로도 `profile_bound=false`, `auto_apply=false`, 예외를 dispatch
lifecycle 로 전파하지 않음 (`DISPATCH_LIFECYCLE_EFFECT="none"` — 실
dispatch/PR/merge/branch 실행 0). **추측·날조 0**.

## regression

- `tests/regression/test_default_profile_resolver_2553plus52.py` — **27 passed**
- 무회귀: `test_policy_profile_engine_2553plus33.py` 31 + `test_dispatch_profile_selection_2553plus38.py` 16 + `test_coordinator_profile_binding_2553plus39.py` 15 → **합산 89 passed**
- 100% offline (network / git mutation / GitHub API / 실 dispatch 0).

## §8 핵심 달성

회장이 긴 gate/HOLD/allowed/forbidden 을 다시 풀어쓰지 않아도 ANU 가
profile engine(+33 정본) + runtime guard 로 자동 산출·검증·통합 가능.
본 Track 이 그 **mapping/resolver 를 신설** → Track1 closeout ·
Track2 pilot 의 engine-자동화 enabler. missing/unknown/conflict =
fail-closed(추측·날조 0).

## 범위 준수 (§2 / §6 금지 verbatim)

production write 0 · 실 PR/merge/branch 0 · planning/prompt generation/
profile selection 까지만 · 문서-only 완료 아님(실행 모듈 3 + regression 27) ·
callback mandatory rule 약화 0 · self-collector guard 우회 0 ·
coordinator closeout/merge 자동확정 0 · expected_files Track1/2 와 DISJOINT
(0 overlap) · allowlist 외 write 0 · frozen anchor touch 0.

## callback (§9 — 독립 ANU key 강제)

정정 표준 (a) MANDATORY normal completion callback. owner = **독립 ANU key
`c119085addb0f8b7`** (chat 6937032012). executor self key
`7943afbe12c12f7d` **절대 금지** (+49 코드 정본). next_action =
normal-callback durable-success event 기준 (고정시각/dead-man 금지).
회수·검증·Codex·adjudication·batch 통합 = 독립 ANU 세션. 4-tuple +
collector_role=ANU 기록.
