# task-2705 — V3.6_TASK_MD_SHA_CONTRACT_P1A (★ 회장 verbatim 2026-05-28 · P1-A 한정 · 초안 단계 · 발사 전 dispatch 금지)

- Level: **Lv.3 infrastructure** (★ control plane layer 0 · 모든 실행 계약의 기준점)
- type: **coding** (★ md/report 중심 금지 · py/sh/json/schema/test 중심)
- 분류: **v3.6 Control Plane P1-A task md sha contract** (★ task-2704 known caveat #1 직접 후속)
- 담당: **dev1-team 헤르메스 (Hermes)** (★ 회장 verbatim 후보 · bot key c38fb9955616e24d · 선정 이유 verbatim: "task-2703/2704 하네스·control plane 맥락을 가장 많이 보유")
- chair_authorization_id: **`CHAIR-AUTH-TASK-2705-V36-TASK-MD-SHA-CONTRACT-P1A-260528`** (★ 회장 verbatim 발급 확정 2026-05-28)
- 완료 목표: **`V36_TASK_MD_SHA_CONTRACT_P1A_ACTIVE_AND_VERIFIED`**
- 상태: **`TASK_2705_GREENLIGHT_DISPATCH_AUTHORIZED_PRIMARY_ONLY`** (★ 회장 verbatim 발사 승인 2026-05-28 · 1차 dispatch.py 단일 · fallback 조건부)
- option: **P1-A 한정** (★ #6 finish-task profile / #8 actor attribution 범위 밖)

## ★ 분류 / 범위 (회장 verbatim)

> "task-2705 범위는 P1-A task md sha contract만 허용한다."

- **상위 spec**: [[v36_task_md_sha_contract_design_draft_260528]] · [[v36_runtime_harness_control_plane]] layer 0 · [[v36_runtime_harness_decision.schema]]
- **incident origin**: [[anu_operations_layer_incidents_8_post_task2703_260528]] #5 + task-2704 caveat_1_task_md_sha_mismatch

## ★ task-2703/2704 mismatch fact 연결 (★ 회장 verbatim 강제 포함 #10)

### task-2703 실증
- ANU dispatch 직전 측정 sha = `2c7927cb…` (6,823 bytes)
- 봇 read 시 측정 sha = `428f2d05…` (8,081 bytes)
- 봇 검증: mismatch → 내용 verbatim 비교 → 일치 확인 → 진행
- ★ 자연어 판단 "내용은 verbatim과 일치합니다" = enum reason_code 부재

### task-2704 실증 (★ caveat_1)
- ANU dispatch 직전 측정 sha = `629faeea…c211e77` (16,914 bytes)
- 봇 실측 sha 명시 부재 → "ANU 기록 sha와 실측 sha가 다름" 회장 확정
- fallback executor가 실측 sha 내용으로 작업 수행 — 결과 ACCEPT

### 본 task-2705 의 직접 책임
- 위 두 mismatch fact의 구조화 박제 + 재현 fixture + 미래 mismatch 자동 ALLOW/HOLD/DENY 분기

## ★ 허용 범위 10 (★ 회장 verbatim 박제)

1. **`dispatch_pre_sha` / `dispatch_post_sha` / `executor_observed_sha` 3단계 기록**
2. **`metadata_patch_detected` 구조화** (★ 5 patch type enum: `DISPATCH_META_SIDECAR` / `RETRY_HEADER_PREPEND` / `WHITESPACE_NORMALIZATION` / `NO_PATCH` / `FORBIDDEN_SEMANTIC_CHANGE`)
3. **`content_verbatim_match` 판정** (★ normalize 후 byte-identical · enum: `true` / `false` / `unverifiable`)
4. **`continue_allowed` enum: `true` / `false` / `hold`**
5. **`ALLOW` / `HOLD_FOR_CHAIR` / `DENY` decision marker 생성** (★ `memory/events/<task_id>.task-md-sha-decision.json`)
6. **`dispatch/__init__.py` L2994 `task_md_sha_before=None` placeholder 활용** (★ task-2704 가 결선한 placeholder → 본 contract fill-in)
7. **3 결선 위치 sha 측정**: retry header prepend (L1879) + `--task` write (L2837) + dispatch exit 직전 (★ dispatch metadata patch 모두 끝난 후)
8. **fixture/mock 기반 regression** (★ 8 fixture 시나리오 · 설계 초안 §8)
9. **task-2703 / task-2704 sha mismatch 재현 fixture** (★ 실증 fact 기반)
10. **`memory/schemas/v36_runtime_harness_decision.schema.json` 와 호환** (★ `contract_layer=layer_0_task_md_sha` decision class)

## ★ 금지 범위 10 (★ 회장 verbatim 박제)

1. **finish-task.sh 수정 금지** (★ task-2703/2704 패턴 보존)
2. **finish-task profile contract 구현 금지** (★ #6 SEPARATE_VERIFICATION_REQUIRED · 별도 task)
3. **actor attribution contract 구현 금지** (★ #8 P1 backlog · 별도 task)
4. **Goal-to-Done / PHASE_AUTO / Core-Work 이원화 금지**
5. **merge executor activation 금지** (★ activation_flag=False 유지)
6. **PR 생성 / branch push / merge 금지**
7. **settings.json 수정 금지** (★ 본 contract 는 dispatch.py 결선만 · hook 신규 등록 0)
8. **task-2706 자동 발의 금지** (★ 다음 작업 방향 ANU 단정 금지 · 회장 verbatim)
9. **ANU 본체 직접 구현 금지** (★ task-2703/2704 패턴 보존)
10. **"설계 확정" 단정 금지** (★ task-2705 초안은 회장 확인 전까지 draft 상태)

## ★ task md 초안 필수 포함 10 (★ 회장 verbatim 박제)

### 1. expected_files (★ 신규 + 결선)

```yaml
expected_files_new:
  - "scripts/harness/v36/task_md_sha_contract.py (layer 0 · 3 sha 측정 + normalize + ALLOW/HOLD/DENY 판정)"
  - "scripts/harness/v36/task_md_sha_marker_writer.py (★ 12 필드 marker write · safe-fail)"
  - "scripts/harness/v36/task_md_sha_normalize.py (★ DISPATCH_META_SIDECAR / RETRY_HEADER / whitespace normalize)"
  - "tests/harness/test_v36_task_md_sha_contract.py (★ 8 fixture · task-2703/2704 재현)"
  - "tests/harness/test_v36_task_md_sha_normalize.py (★ normalize 단위 테스트)"
  - "tests/harness/fixtures/v36_task_md_sha_fixture_1_allow_no_patch.json"
  - "tests/harness/fixtures/v36_task_md_sha_fixture_2_allow_sidecar.json"
  - "tests/harness/fixtures/v36_task_md_sha_fixture_3_allow_retry_header.json"
  - "tests/harness/fixtures/v36_task_md_sha_fixture_4_allow_whitespace.json"
  - "tests/harness/fixtures/v36_task_md_sha_fixture_5_hold_unverifiable.json"
  - "tests/harness/fixtures/v36_task_md_sha_fixture_6_deny_semantic_change.json"
  - "tests/harness/fixtures/v36_task_md_sha_fixture_7_deny_forbidden_change.json"
  - "tests/harness/fixtures/v36_task_md_sha_fixture_8_e2e_integration.json"
  - "tests/harness/fixtures/v36_task_md_sha_replay_task_2703.json (★ task-2703 mismatch 실증 재현)"
  - "tests/harness/fixtures/v36_task_md_sha_replay_task_2704.json (★ task-2704 caveat 실증 재현)"
  - "memory/events/task-2705.* (보고/마커)"
  - "memory/reports/task-2705.md"
```

### 2. allowed_existing_file_edits (★ 결선 한정)

```yaml
allowed_existing_file_edits:
  - "dispatch/__init__.py (★ 최소 결선 한정 · L2994 placeholder fill-in + L1879 retry header prepend 후 sha 측정 + L2837 --task write 후 sha 측정 + dispatch exit 직전 sha 측정 · 기존 동작 변경 0 · safe-fail 강제)"
  - "scripts/harness/v36/dispatch_marker_writer.py (★ task-2704 결선 dispatch marker 에 3 sha 필드 추가 · 기존 marker 동작 변경 0)"
```

### 3. forbidden_files (★ 절대)

```yaml
forbidden_files:
  - "scripts/finish-task.sh (★ 회장 verbatim 절대 금지)"
  - "scripts/session-watchdog.sh (★ task-2704 결선 보존 · 본 task 범위 밖)"
  - "/home/jay/.claude/settings.json (★ 본 contract 는 settings.json 결선 0)"
  - "/home/jay/workspace/.claude/settings.json (★ 동상)"
  - "utils/merge_queue_executor.py / utils/real_merge_hooks.py (★ activation 0)"
  - "anu_v3/goal_loop_planner.py / phase_auto*.py / core*.py / work*.py (★ 범위 밖)"
  - "scripts/harness/v36/finish_task_profile*.py (★ #6 SEPARATE_VERIFICATION_REQUIRED · 본 task 범위 밖)"
  - "scripts/harness/v36/actor_attribution*.py (★ #8 P1 backlog · 본 task 범위 밖)"
  - "PR #158 / #159 / #160 / task-2700·2700+1·2703·2704 branch"
  - "workspace_root 외부 (★ /home/jay/workspace 만)"
```

### 4. acceptance criteria (★ Definition of Done · 10 항목)

1. **3 sha 측정 결선**: `dispatch_pre_sha` (entry) + `dispatch_post_sha` (exit) + `executor_observed_sha` (봇 read) 모두 측정 + 마커 박제 evidence
2. **5 patch type enum 분류 fixture coverage**: 각 enum 1 fixture 이상
3. **`content_verbatim_match` 3 enum (true/false/unverifiable) 분기 fixture PASS**
4. **`continue_allowed` 3 enum 결정 매트릭스 PASS**
5. **decision marker schema 12 필드 validation PASS** (★ JSON Schema validator)
6. **task-2703 mismatch 재현 fixture PASS** (★ pre=2c7927cb · post=428f2d05 → ALLOW with DISPATCH_META_SIDECAR + content_verbatim_match=true)
7. **task-2704 mismatch 재현 fixture PASS** (★ pre=629faeea → post != pre + content_verbatim_match=true → ALLOW)
8. **e2e 통합 fixture PASS**: 가짜 task-fake-2705 dispatch → 3 sha 측정 → marker 생성 → ALLOW 판정 trace
9. **regression 0 fail** (★ task-2703 246/246 + task-2704 회귀 모두 유지)
10. **forbidden write 0 · settings.json 미수정 · finish-task.sh 미수정 confirmed**

### 5. regression scenarios (★ 8 fixture · 회장 verbatim 박제)

- **fixture-1 ALLOW NO_PATCH**: pre==post==observed → ALLOW
- **fixture-2 ALLOW DISPATCH_META_SIDECAR**: HTML comment sidecar 추가 → ALLOW
- **fixture-3 ALLOW RETRY_HEADER_PREPEND**: retry header prepend (L1879 패턴) → ALLOW
- **fixture-4 ALLOW WHITESPACE_NORMALIZATION**: trailing whitespace / final newline → ALLOW
- **fixture-5 HOLD unverifiable**: task md read 실패 시뮬레이션 → HOLD_FOR_CHAIR
- **fixture-6 DENY semantic change**: 본문 의미 변경 (예: "금지" → "허용") → DENY
- **fixture-7 DENY FORBIDDEN_SEMANTIC_CHANGE**: chair_authorization_id 자동 수정 시뮬레이션 → DENY
- **fixture-8 e2e integration**: 전체 dispatch flow 통합 → 마커 생성 trace

### 6. rollback/safe-fail 기준 (★ task-2703/2704 패턴 보존 + 회장 verbatim hold 분류 세분화)

- **safe-fail 1**: sha 측정 실패 시 dispatch 본동작 차단 0 (★ try/except + log only)
- **safe-fail 2**: marker write 실패 시 dispatch 본동작 차단 0
- **safe-fail 3 (★ 회장 verbatim 정정 2026-05-28)**:
  - normalize 예외 발생 시 `UNKNOWN` mismatch_location + `unverifiable` content_verbatim_match + `continue_allowed=hold` marker 생성
  - ★ **모든 hold 가 즉시 회장 보고는 아니다** (★ 회장 verbatim)
  - **`ESCALATE_CHAIR` 진입 조건** (★ AND): semantic 변경 가능성 / forbidden patch 의심 / executor 가 원문 계약을 신뢰할 수 없는 경우
  - **`HOLD_LOCAL` 분류**: 단순 측정 실패 (★ ESCALATE_CHAIR 아님 · 로그만)
  - **`RETRYABLE_HOLD` 분류**: 일시적 read error (★ ESCALATE_CHAIR 아님 · N회 재시도 후 분류 재평가)
  - ★ **ANU 가 hold 를 임의 ALLOW 로 변경 금지** (★ 회장 verbatim)
- **hold sub-class enum 추가** (★ schema 확장):
  - `ESCALATE_CHAIR` — semantic 의심 / forbidden patch / 계약 신뢰 불가 → 회장 보고
  - `HOLD_LOCAL` — 단순 측정 실패 → 로그만 · ANU 임의 ALLOW 0
  - `RETRYABLE_HOLD` — 일시적 read error → N회 retry 후 재평가 · ANU 임의 ALLOW 0
- **rollback**: 본 contract 결선이 dispatch 동작 회귀 발생 시 dispatch/__init__.py 의 sha 측정 호출만 try/except 처리하여 silent skip (★ task-2704 패턴 동일)
- **회귀 검증**: 246/246 task-2703 회귀 PASS 유지 + task-2704 회귀 PASS 유지

### 7. chair_authorization_id 후보 (★ 회장 verbatim 발급 대기)

- `CHAIR-AUTH-TASK-2705-V36-TASK-MD-SHA-CONTRACT-P1A-260528`

### 8. executor 추천 (★ 회장 verbatim 후보)

- **dev1-team 헤르메스 (Hermes)** · bot key `c38fb9955616e24d`
- 선정 이유 verbatim: "task-2703/2704 하네스·control plane 맥락을 가장 많이 보유"

### 9. 구현자 / 검증자 분리 방식 (★ task-2703/2704 패턴 보존)

- **Hermes (Opus)**: 설계·통합·조정 (★ 직접 코딩 0 self-attestation 한계 표현 강제)
- **Vulcan (Sonnet)**: 구현 executor (sha contract 코어 + normalize + marker writer)
- **Maat (Sonnet · 횡단)**: 독립 검증 (DoD 10 PASS/FAIL · executor 와 분리)
- ★ ANU 본체 단독 closeout 판정 금지 · ANU 자가검증만으로 closeout PASS 처리 금지

### 10. 보고 표현 강제 (★ task-2704 회장 verbatim 박제 보존)

> "Hermes는 주요 feature 구현자가 아니라 통합·조정자, Vulcan은 주요 구현, Maat는 검증. Hermes 소규모 직접 패치 가능성은 self-attestation만으로 완전 배제 불가."

## ★ 발사 방식 (★ task-2704 패턴 보존 · 회장 verbatim)

- 1차 = **dispatch.py 단일 발사** (★ 직접 cron 동시 진행 금지)
- fallback = **5 신호 교차 spawn 검증 후 SPAWN_UNKNOWN/NOT_STARTED evidence 시만 1회 한정**
- fallback 발동 시 **12 필드 marker 강제** (task-2704 패턴 동일)
- ★ ANU fallback safety-net cron 자동 등록 금지

## ★ allowed_resources

```yaml
allowed_resources:
  paths:
    - "scripts/harness/v36/task_md_sha_*.py (신규)"
    - "tests/harness/test_v36_task_md_sha_*.py (신규)"
    - "tests/harness/fixtures/v36_task_md_sha_*.json (신규)"
    - "dispatch/__init__.py (★ 최소 결선 한정 · safe-fail 강제 · L1879/L2837/L2994/dispatch exit)"
    - "scripts/harness/v36/dispatch_marker_writer.py (★ 3 sha 필드 추가 결선)"
    - "memory/events/task-2705.* (보고/마커)"
    - "memory/reports/task-2705.md"
  forbidden_paths:
    - "scripts/finish-task.sh / scripts/session-watchdog.sh"
    - ".claude/settings.json (양 path)"
    - "merge executor / real_merge_hooks activation"
    - "Goal-to-Done / PHASE_AUTO / Core-Work / finish-task profile / actor attribution 관련 파일"
    - "PR #158/#159/#160 / task-2700·2700+1·2703·2704 branch"
    - "workspace_root 외부"
  commands:
    - "구현: 신규 py/json/test · dispatch.py 최소 결선 (safe-fail 강제)"
    - "검증: pytest fixture/mock · production load evidence · marker schema validation"
    - "★ real GitHub write 0 · merge 0 · branch push 0 · PR 생성 0 · finish-task.sh/watchdog.sh/settings.json 수정 0"
    - "★ task-timers 위조 0 · manual .done 0 · G4 marker 삭제 0"
  merge_policy: "task_md_sha_contract_p1a_local_verification_no_remote_writes_no_finish_task_no_settings_change"
  ttl_hours: 12
```

## ★ 절대 금지 (★ 위 금지 범위 10 통합)

- finish-task.sh / session-watchdog.sh / settings.json 수정 0
- finish-task profile / actor attribution / Goal-to-Done / PHASE_AUTO / Core-Work / merge activation 0
- PR / branch push / merge 0
- task-2706 자동 발의 0
- ANU 본체 직접 구현 0
- "Hermes 직접 코딩 0" 단정 0 (★ 보고 표현 강제)
- "설계 확정" 단정 0 (★ 본 초안 = draft 상태 · 회장 확인 후 dispatch)
- ANU 자가검증만으로 closeout PASS 처리 0
- 다음 작업 방향 (사업/P1-B/P1-C/메타) ANU 단정 0

## ★ 종결

성공: **`V36_TASK_MD_SHA_CONTRACT_P1A_ACTIVE_AND_VERIFIED`**

→ task-2703/2704 sha mismatch fact 구조화 박제 + 미래 mismatch 자동 ALLOW/HOLD/DENY 분기 + 3 sha 측정 강제. P1-B finish-task profile + P1-C actor attribution 별도 task 보존.

★ 회장 verbatim 2026-05-28 P1-A 한정. 허용 10 / 금지 10 / 필수 포함 10. 발사 방식 task-2704 패턴 (1차 dispatch.py 단일 + fallback 조건부 1회). 본 초안 = draft · 회장 확인 후 dispatch.

끝