# task-2706 — P1-B finish-task profile contract 외부 layer 구현

**task_id**: task-2706 (★ v2 정합 numeric · 회장 직접 명시 인가)
**parent_chain**: P1-A ACCEPT_WITH_KNOWN_CAVEATS (260529) ← scope-guard false positive root_cause (anu_new_step_2)
**chair_authorization_id**: CHAIR-AUTH-TASK-2706-V36-FINISH-TASK-PROFILE-LAYER-P1B-260529
**level**: 5 (★ system contract layer · finish-task.sh NO TOUCH 강제)
**actor_role**: lead_integrator (Hermes) + implementer (Vulcan 또는 동등) + verifier (Maat 또는 Codex/Maat · 분리 강제)
**executor (구현 단계)**: dev1 헤르메스 (★ lead + implementer)
**executor (검증 단계)**: dev2 오딘 (★ verifier · executor 와 분리 강제) — ★ 별도 task-2706+1 발의 또는 본 task 내 phase 분리
**model**: claude-opus-4-7[1m] (Hermes) · claude-sonnet-4-6 (verifier)

**★ 초안 상태**: DRAFT (★ 회장 verbatim "dispatch 는 초안 확인 전 금지" 정합 · 본 task md 회장 결재 전 dispatch 0)

---

## 0. allowed_resources (본 task 의 capability)

```yaml
allowed_resources:
  paths:
    - "scripts/harness/v36/finish_task_profile_classifier.py"
    - "scripts/harness/v36/finish_task_profile_judge.py"
    - "scripts/harness/v36/finish_task_profile_preflight.py"
    - "scripts/harness/v36/finish_task_profile_schema.py"
    - "tests/harness/test_v36_finish_task_profile_classifier.py"
    - "tests/harness/test_v36_finish_task_profile_judge.py"
    - "tests/harness/test_v36_finish_task_profile_preflight.py"
    - "tests/harness/test_v36_finish_task_profile_regression.py"
    - "tests/harness/fixtures/v36_task_mode_*.json"
    - "tests/harness/fixtures/v36_task_2703_replay.json"
    - "tests/harness/fixtures/v36_task_2704_replay.json"
    - "tests/harness/fixtures/v36_task_2705plus3_replay.json"
    - "memory/reports/task-2706.md"
    - "memory/events/task-2706.*"
  forbidden_paths:
    - "scripts/finish-task.sh"
    - "scripts/session-watchdog.sh"
    - "scripts/task-scope-guard.sh"
    - "settings.json"
    - "dispatch/__init__.py"
    - ".github/**"
    - "memory/events/task-2705.*"
    - "memory/events/task-2705+1.*"
    - "memory/events/task-2705+2.*"
    - "memory/events/task-2705+3.*"
    - "memory/events/task-2705+4.*"
    - "memory/tasks/task-2705.md"
    - "memory/tasks/task-2705+1.md"
    - "memory/tasks/task-2705+2.md"
    - "memory/tasks/task-2705+3.md"
    - "memory/tasks/task-2705+4.md"
    - "memory/reports/task-2705.md"
    - "memory/reports/task-2705+1.md"
    - "memory/reports/task-2705+2.md"
    - "memory/reports/task-2705+3.md"
    - "memory/reports/task-2705+4.md"
    - "memory/specs/v36_finish_task_profile_contract_design_draft_260529.md"
    - "memory/specs/v36_actor_attribution_contract_design_draft_260529.md"
    - "memory/specs/v36_p1b_task_mode_pass_warn_fail_escalate_matrix_260529.md"
    - "memory/specs/v36_p1c_evidence_level_l1_to_l5_refinement_matrix_260529.md"
    - "memory/capabilities/**"
    - "scripts/harness/v36/dispatch_marker_writer.py"
    - "scripts/harness/v36/task_md_sha_*.py"
    - "scripts/harness/v36/spawn_detector.py"
    - "scripts/harness/v36/watchdog_suppression_gate.py"
    - "scripts/harness/v36/closeout_marker_watcher.py"
  commands:
    - "pytest"
    - "sha256sum"
    - "git log"
    - "git diff"
    - "git add"
    - "git commit"
    - "ls"
    - "cat"
    - "grep"
    - "python3 -m py_compile"
  merge_policy: "manual"
  ttl_hours: 12
```

---

## 1. problem statement (★ 회장 verbatim 항목 1)

`scripts/finish-task.sh` 의 scope-guard 단계 (L431-451) 가 **모든 후속 sub-task 에서 false positive 발생** 위험 HIGH:
- workspace 가 1046 files dirty 누적 상태 → `git diff main..HEAD` 가 task 시작 시점 (lock_sha) 가 아닌 main 과 비교 → prior task lineage 변경 모두 포함
- task-2705+3 case = scope-guard FAIL 25 violations (24 paths 미포함 + 1 forbidden_paths 위반 session-watchdog.sh) 발생 → 모두 prior task lineage 잔여 dirty 가 main..HEAD diff 에 누적 분류된 결과
- 결과: finish-task.sh L451 `exit 1` 즉시 종료 → .done / .done.escalated 미생성 + task-timer running 영구 누적

**해결 방향**: finish-task.sh 0 touch + 외부 preflight/profile layer 가 task_mode 별 PASS/WARN/FAIL/ESCALATE 판단 제공 + finish-task.sh 의 scope-guard 결과를 외부 layer 가 분류 → 회장 보고 시 task_mode 정합 분류 정합화.

---

## 2. root cause: finish-task.sh L435 main..HEAD (★ 회장 verbatim 항목 2)

`scripts/finish-task.sh` L435 verbatim:
```bash
git -C "$SCOPE_PROJ_DIR" diff --name-only "${MAIN_BRANCH}..HEAD" > "$SCOPE_DIFF_FILE" 2>/dev/null \
    || git -C "$SCOPE_PROJ_DIR" diff --name-only HEAD~1 > "$SCOPE_DIFF_FILE" 2>/dev/null \
    || true
```

**root cause 분석**:
- `git diff --name-only main..HEAD` = local main 브랜치 vs 현재 HEAD 의 diff
- SCOPE_PROJ_DIR = `${PROJECT_PATH:-$WORKSPACE}` (★ system task 시 workspace 자체)
- workspace 의 main 브랜치 = origin/main 이후 미커밋된 prior task lineage 변경 모두 포함
- → ★ task 시작 시점 (lock_sha) 비교 0 → prior dirty state 누적 분류
- ★ task-2569 RC-1/RC-2 (lock_sha..HEAD 분기) **미적용** (★ scripts/finish-task.sh lock_sha 0 hits)
- ★ task-2569 RC-3 (stash audit) 만 적용 (★ L31 / L1316)

→ 정확한 task-2569 패턴 재발 정합.

**관련 fact**: `memory/events/anu_new_step_2_scope_guard_false_positive_root_cause_260529.json`

---

## 3. dirty workspace 1046 files fact (★ 회장 verbatim 항목 3)

**현재 workspace dirty state**:
- `git status --porcelain | wc -l` = **1046 lines**
- 미커밋 누적 = task-2300대 부터 task-2705+1 까지 모든 prior task lineage 잔여
- 회장 verbatim "PR 금지 / branch push 금지 / merge 금지" 정합으로 commit/push 0 → 누적 유지

**대표 dirty 파일 예시**:
- `config/constants.json` (M)
- `memory/events/task-2309~2316.done.acked / .done.escalated / .done.notified` (D · 다수)
- `scripts/harness/v36/**` (★ task-2703/2704 산출물)
- `tests/harness/test_v36_**` (★ task-2703/2704 산출물)
- `scripts/session-watchdog.sh` (★ task-2704 commit d96ab6f2)

★ 이 누적 dirty state 가 모든 후속 sub-task 의 main..HEAD diff 에 포함 → scope-guard false positive 영구 재발 위험 HIGH.

**관련 fact**: `memory/events/anu_new_step_2_scope_guard_false_positive_root_cause_260529.json` §confirmed_fact.workspace_dirty_state_audit

---

## 4. task-2705+3 scope-guard 25 false positive case (★ 회장 verbatim 항목 4)

**case study**:
- task-2705+3 = item 9 fix only (★ caller chair_authorization_id 전달)
- 실제 변경 (★ Hermes/Vulcan 의도적 변경): 5 files (★ dispatch/__init__.py + scripts/harness/v36/dispatch_marker_writer.py + tests/harness/fixtures 2 + tests/harness/test_v36_dispatch_marker_contract.py + memory/reports/task-2705+3.md)
- scope-guard violation 분석:
  - 24 / 25 = `paths 미포함 (scope 외 파일)` → prior task lineage (task-2701~2705+1) 잔여 dirty
  - 1 / 25 = `forbidden_paths 위반 scripts/session-watchdog.sh` → task-2704 commit d96ab6f2 잔여
- ★ session-watchdog.sh 5 evidence cross-verification:
  - mtime 2026-05-28 16:15:25 (★ 어제 task-2704 시점)
  - `git diff HEAD scripts/session-watchdog.sh` = **EMPTY** (★ byte-identical with HEAD)
  - git log 마지막 commit d96ab6f2 [task-2704]
  - dispatch.py 내 session-watchdog 참조 0건
  - task md forbidden_paths 명시 박제

→ ★ session-watchdog.sh task-2705+3 변경 0 확정 · scope-guard misfire

**관련 fact**: 
- `memory/events/task-2705+3.scope-violation.json`
- `memory/events/anu_step_0_task_2705plus3_artifacts_recovery_260529.json`
- `memory/events/anu_step_1_scope_guard_25_classification_260529.json`

---

## 5. P1-B 192-cell matrix reference (★ 회장 verbatim 항목 5)

**상위 spec**: `memory/specs/v36_p1b_task_mode_pass_warn_fail_escalate_matrix_260529.md`

**매트릭스 차원**: 6 task_mode × 8 게이트 × 4 등급 = **192 cell**

**6 task_mode**: code / system_hook / local_runtime / read_only / callback_only / closeout_marker_only
**8 게이트**: git_evidence / L1 smoke / scope guard / dirty workspace / qc verification / lineage preservation / actor attribution / callback enforcement
**4 등급**: PASS / WARN / FAIL / ESCALATE

**본 task 구현 범위**: 192-cell 매트릭스의 **runtime classifier + judge** 구현. fixture validation 강제.

---

## 6. expected_files (★ 회장 verbatim 항목 6)

```yaml
expected_files:
  edits_existing: []  # ★ finish-task.sh NO TOUCH · dispatch.py NO TOUCH · 기타 production critical NO TOUCH
  new_modules:
    - path: "scripts/harness/v36/finish_task_profile_classifier.py"
      purpose: "★ task md 의 task_mode 자동 분류 (★ P1-B 설계 초안 §1.1 정합)"
    - path: "scripts/harness/v36/finish_task_profile_judge.py"
      purpose: "★ task_mode 별 8 게이트 평가 + 4 등급 결정 (★ 192-cell 매트릭스 정합)"
    - path: "scripts/harness/v36/finish_task_profile_preflight.py"
      purpose: "★ finish-task 진입 전 preflight 검증 helper (★ task_mode + lock_sha + dirty audit)"
    - path: "scripts/harness/v36/finish_task_profile_schema.py"
      purpose: "★ JSON schema 정의 + validation"
  new_tests:
    - path: "tests/harness/test_v36_finish_task_profile_classifier.py"
      content: "★ 6 task_mode 자동 분류 fixture × N"
    - path: "tests/harness/test_v36_finish_task_profile_judge.py"
      content: "★ 192-cell 매트릭스 sampling fixture (★ 최소 30 case)"
    - path: "tests/harness/test_v36_finish_task_profile_preflight.py"
      content: "★ preflight safe-fail + dirty audit + lock_sha"
    - path: "tests/harness/test_v36_finish_task_profile_regression.py"
      content: "★ task-2703/2704/2705+3 replay fixture 정합 검증"
  new_fixtures:
    - path: "tests/harness/fixtures/v36_task_mode_code.json"
    - path: "tests/harness/fixtures/v36_task_mode_system_hook.json"
    - path: "tests/harness/fixtures/v36_task_mode_local_runtime.json"
    - path: "tests/harness/fixtures/v36_task_mode_read_only.json"
    - path: "tests/harness/fixtures/v36_task_mode_callback_only.json"
    - path: "tests/harness/fixtures/v36_task_mode_closeout_marker_only.json"
    - path: "tests/harness/fixtures/v36_task_2703_replay.json"
    - path: "tests/harness/fixtures/v36_task_2704_replay.json"
    - path: "tests/harness/fixtures/v36_task_2705plus3_replay.json"
  new_marker_artifacts:
    - "memory/events/task-2706.dispatched-*.json (auto by dispatch.py)"
    - "memory/events/task-2706.task-md-sha-decision.json (auto by dispatch_marker_writer)"
    - "memory/reports/task-2706.md (executor self report)"
```

---

## 7. allowed_existing_file_edits (★ 회장 verbatim 항목 7)

- ★ **NONE** (★ 본 task 는 NEW MODULE 만 추가 · 기존 file edit 0 강제)
- ★ 회장 verbatim "finish-task.sh 직접 수정은 아직 금지한다" 정합 강제
- ★ 회장 verbatim "dispatch.py 수정 금지" 정합 강제
- ★ session-watchdog.sh / settings.json / task-scope-guard.sh 모두 NO TOUCH

---

## 8. forbidden_files (★ 회장 verbatim 항목 8)

```yaml
forbidden_files_strict:
  - "scripts/finish-task.sh"
  - "scripts/session-watchdog.sh"
  - "scripts/task-scope-guard.sh"
  - "settings.json"
  - "dispatch/__init__.py"
  - ".github/**"
  - "memory/events/task-2705.*"
  - "memory/events/task-2705+1.*"
  - "memory/events/task-2705+2.*"
  - "memory/events/task-2705+3.*"
  - "memory/events/task-2705+4.*"
  - "memory/tasks/task-2705*.md"
  - "memory/reports/task-2705*.md"
  - "scripts/harness/v36/dispatch_marker_writer.py"
  - "scripts/harness/v36/task_md_sha_*.py"
  - "scripts/harness/v36/spawn_detector.py"
  - "scripts/harness/v36/watchdog_suppression_gate.py"
  - "scripts/harness/v36/closeout_marker_watcher.py"
  - "memory/specs/v36_*_design_draft_260529.md"
  - "memory/specs/v36_p1b_task_mode_*.md"
  - "memory/specs/v36_p1c_evidence_level_*.md"
  - "memory/capabilities/**"
```

**위반 시**: 즉시 task 중단 + violation report 박제 + ANU callback 발사.

---

## 9. task_mode enum 6 (★ 회장 verbatim 항목 9 · P1-B 설계 초안 §1 정합)

```
M1. code                      — production 코드 변경 (PR/머지)
M2. system_hook               — .claude/hooks/ · settings.json · runtime hook
M3. local_runtime             — workspace local runtime (dispatch wrapper · watchdog · taskctl · cron)
M4. read_only                 — 진단/audit/report (mutating 0)
M5. callback_only             — ANU callback 발사 전용 (envelope only)
M6. closeout_marker_only      — 회장 결정 박제 / closeout 운영 마커
```

**자동 분류 알고리즘** (★ §finish_task_profile_classifier.py 구현):
1. task md signal 추출 (★ allowed_resources / expected_files / level / mode)
2. 우선순위: `code > system_hook > local_runtime > closeout_marker_only > callback_only > read_only > UNKNOWN`
3. UNKNOWN 시 safe-fail → 회장 명시 분기

---

## 10. gate enum 8 (★ 회장 verbatim 항목 10)

```
G1. git_evidence              — 코드 변경 + commit author audit + lock_sha..HEAD diff
G2. L1 smoke                  — 서버 재시작 + API curl 또는 Playwright
G3. scope guard               — lock_sha..HEAD diff 가 expected_files 범위 내
G4. dirty workspace           — OWN_DIRTY / INHERITED_DIRTY / EXTERNAL_DIRTY / DAEMON_RECURRENCE / UNKNOWN_DIRTY
G5. qc verification           — qc_verify.py 핵심 게이트 (pyright / spec / test)
G6. lineage preservation      — parent task lineage 산출물 sha 변경 0
G7. actor attribution         — L1~L5 evidence_level 정합 (★ P1-C 정합)
G8. callback enforcement      — ANU-key cron + envelope ≤3,900 bytes + collector spawn 검증
```

**각 게이트 평가**: task_mode 별 4 등급 (PASS / WARN / FAIL / ESCALATE) — `finish_task_profile_judge.py` 구현.

---

## 11. PASS/WARN/FAIL/ESCALATE output schema (★ 회장 verbatim 항목 11)

```json
{
  "schema_version": "v36.finish_task_profile.v1",
  "task_id": "task-NNNN",
  "task_mode": "code | system_hook | local_runtime | read_only | callback_only | closeout_marker_only | UNKNOWN",
  "task_mode_classification_evidence": {
    "signal": "...",
    "priority_applied": "code | ...",
    "confidence": "HIGH | MEDIUM | LOW | UNKNOWN"
  },
  "gates": {
    "G1_git_evidence": {"result": "PASS | WARN | FAIL | ESCALATE", "evidence": "...", "rationale": "..."},
    "G2_L1_smoke": {...},
    "G3_scope_guard": {...},
    "G4_dirty_workspace": {...},
    "G5_qc_verification": {...},
    "G6_lineage_preservation": {...},
    "G7_actor_attribution": {...},
    "G8_callback_enforcement": {...}
  },
  "overall_result": "PASS | WARN | FAIL | ESCALATE",
  "overall_rationale": "★ 최악 등급 우선 (ESCALATE > FAIL > WARN > PASS)",
  "lock_sha_used": "<sha> or null",
  "lock_sha_fallback_reason": "★ main..HEAD 폴백 시 reason",
  "dirty_workspace_classification": "OWN_DIRTY | INHERITED_DIRTY | EXTERNAL_DIRTY | DAEMON_RECURRENCE | UNKNOWN_DIRTY",
  "chair_decision_required": true | false,
  "anu_action_recommended": "PROCEED | CAVEAT_PROCEED | BLOCK | ESCALATE_CHAIR",
  "ts": "ISO-8601",
  "chair_authorization_id_linkage": "<chair_auth_id from task md>"
}
```

---

## 12. safe-fail behavior (★ 회장 verbatim 항목 12)

- ★ 분류 실패 시 → `task_mode: UNKNOWN` + `overall_result: ESCALATE` (★ 회장 명시 분기)
- ★ schema validation 실패 시 → log only + finish-task 본동작 차단 0 (★ NO TOUCH 정합)
- ★ 모듈 import 실패 시 → preflight skip + 회장 보고 (★ 본 layer 활성 0 시 기존 동작 유지)
- ★ 신규 모듈 exception 시 → safe-swallow + log + UNKNOWN 분류
- ★ 회장 verbatim "모르면 UNKNOWN" 정합 강제

---

## 13. regression scenarios (★ 회장 verbatim 항목 13)

### 13.1 task-2703 replay fixture (system_hook 분류 기대)

- input: task-2703 task md signal + scope-diff fixture
- expected: `task_mode=system_hook · G3 scope_guard=PASS (★ .claude/ + harness/ scope 정합) · overall_result=PASS`
- 회귀: ACCEPT_WITH_CONTROL_PLANE_GAPS 분류 정합

### 13.2 task-2704 replay fixture (code 분류 기대)

- input: task-2704 task md signal + scope-diff fixture
- expected: `task_mode=code · G3 scope_guard=PASS · G4 dirty_workspace=WARN (★ INHERITED_DIRTY) · overall_result=WARN`
- 회귀: ACCEPT_WITH_KNOWN_CAVEATS 분류 정합

### 13.3 task-2705+3 replay fixture (★ 핵심 case · scope-guard misfire)

- input: task-2705+3 task md signal + scope-diff fixture (★ 25 violations)
- expected: `task_mode=code · G3 scope_guard=ESCALATE (★ session-watchdog.sh forbidden + main..HEAD misfire) · G4 dirty_workspace=FAIL (★ EXTERNAL_DIRTY 1041+ files) · overall_result=ESCALATE`
- 회귀: ESCALATE_TO_CHAIR_FOR_SCOPE_GUARD_MISFIRE 분류 (★ ANU 측 회장 보고 → ACCEPT_WITH_KNOWN_CAVEATS 정합화 가능)

### 13.4 기존 v36 회귀 유지

- pytest tests/harness/ -q : **285+ PASS 보존** (★ task-2705+3 baseline)
- 신규 tests 추가 시 286~310+ PASS 예상

---

## 14. rollback plan (★ 회장 verbatim 항목 14)

- ★ 본 task 모든 산출물 = **신규 모듈 + 신규 tests + 신규 fixtures 만** (★ 기존 file edit 0)
- rollback 방법: `rm` 명령으로 신규 파일만 제거 (★ 기존 file 영향 0)
- rollback trigger:
  - 회귀 fail (★ 285+ PASS 미달)
  - safe-fail 미작동 (★ exception 시 production 동작 차단)
  - 신규 모듈이 다른 production 동작 영향 확인 시
- rollback 안전성: ★ HIGH (★ finish-task.sh NO TOUCH + dispatch.py NO TOUCH = 본 layer 활성 0 시 기존 동작 100% 유지)

---

## 15. acceptance criteria (★ 회장 verbatim 항목 15)

### 15.1 functional criteria

1. ✅ `finish_task_profile_classifier.py` 가 6 task_mode 정확 분류 (★ §13 fixture 정합)
2. ✅ `finish_task_profile_judge.py` 가 192-cell 매트릭스 sampling 30+ case PASS
3. ✅ `finish_task_profile_preflight.py` 가 safe-fail 정합 동작
4. ✅ `finish_task_profile_schema.py` 가 §11 schema validation 100%
5. ✅ task-2703 / task-2704 / task-2705+3 replay fixture 모두 expected 정합

### 15.2 non-regression criteria

1. ✅ pytest tests/harness/ -q = **285+ PASS** (★ task-2705+3 baseline 보존)
2. ✅ finish-task.sh / dispatch.py / session-watchdog.sh / settings.json 변경 0 (★ git diff 검증)
3. ✅ task-2705 lineage 산출물 sha 변경 0
4. ✅ task-2703 / task-2704 / task-2705+1 / task-2705+2 / task-2705+3 / task-2705+4 lineage 모두 보존

### 15.3 doctrine criteria

1. ✅ Hermes 직접 패치 caveat 박제 (★ P1-C §4 정합)
2. ✅ ALLOWED 대체 표현 사용 (★ P1-C §5.5 정합) — FORBIDDEN 표현 사용 0
3. ✅ verifier 분리 강제 (★ dev1 헤르메스 ≠ dev2 오딘)
4. ✅ ANU callback envelope ≤3,900 bytes (★ collector_key=ANU)

### 15.4 회장 verbatim 박제 criteria

1. ✅ finish-task.sh L431-451 read-only 인용 박제
2. ✅ dirty workspace 1046 files fact 박제
3. ✅ task-2705+3 scope-guard 25 violations case 박제
4. ✅ task-2569 RC-1/RC-2 미적용 박제 + 본 task 가 task-2569 RC-1 대안 박제

---

## 16. finish-task.sh no-touch proof (★ 회장 verbatim 항목 16)

### 16.1 proof method

- ★ git diff scripts/finish-task.sh = **EMPTY** (★ 본 task 진행 전후 byte-identical)
- ★ sha256sum scripts/finish-task.sh 박제 (★ 본 task 시작 sha = 종료 sha)
- ★ allowed_resources paths 에 scripts/finish-task.sh 명시 0
- ★ forbidden_paths 에 scripts/finish-task.sh 명시 박제
- ★ expected_files.edits_existing list = EMPTY (★ §6 정합)
- ★ executor self-report verbatim: "finish-task.sh 변경 0 · git diff 검증"

### 16.2 proof 강제 위치

- task md §6 expected_files (★ edits_existing: [])
- task md §7 allowed_existing_file_edits (★ NONE)
- task md §8 forbidden_files (★ scripts/finish-task.sh 명시)
- self-report §16 (★ git diff 결과 박제)
- Maat verifier report (★ 독립 횡단 검증 시 finish-task.sh sha 박제)

---

## 17. no GitHub write proof (★ 회장 verbatim 항목 17)

### 17.1 proof method

- ★ gh CLI 호출 0건 박제 (★ executor self-report verbatim)
- ★ git push 0건 박제 (★ 회장 verbatim "branch push 금지")
- ★ PR 생성 0건 박제 (★ 회장 verbatim "PR 생성 금지")
- ★ git commit local 만 (★ 회장 verbatim "merge 금지" + merge_policy=manual)
- ★ allowed_resources commands list 에서 `gh` 누락 (★ §0 정합)

### 17.2 proof 강제 위치

- task md §0 allowed_resources.commands (★ gh 부재)
- task md §8 forbidden_files (★ .github/** 명시)
- self-report §17 (★ gh / git push / PR 모두 0 박제)

---

## 18. P1-C out of scope (★ 회장 verbatim 항목 18)

### 18.1 P1-C 명시적 배제

- ★ 본 task = P1-B 만 구현 (★ task_mode + 8 게이트 + 4 등급)
- ★ P1-C actor attribution contract = 구현 0
- ★ P1-C 의 L1~L5 evidence_level 자동 박제 = 구현 0
- ★ P1-C 의 ATTR-001~005 enforcer = 구현 0
- ★ G7 actor_attribution 게이트는 본 task 에서 schema 만 정의 + 실 enforcement 0 (★ P1-C 별도 task 결재 영역)

### 18.2 P1-C 정합 박제 영역만

- ★ G7 actor_attribution 게이트가 P1-C IMPLEMENT 시 활성화 정합 spec
- ★ task md §13 actor attribution caveat 박제 (★ P1-C §4 정합)
- ★ FORBIDDEN/ALLOWED 표현 list 정합 (★ P1-C §4 정합)

---

## 19. linked references

- `memory/specs/v36_finish_task_profile_contract_design_draft_260529.md` (P1-B 설계 초안)
- `memory/specs/v36_p1b_task_mode_pass_warn_fail_escalate_matrix_260529.md` (★ 192-cell 매트릭스)
- `memory/specs/v36_p1c_evidence_level_l1_to_l5_refinement_matrix_260529.md` (★ P1-C 정합 spec)
- `memory/events/p1a_task_md_sha_contract_accepted_with_known_caveats_260529.json` (P1-A 정합)
- `memory/events/anu_new_step_1_task_2705_report_drift_root_cause_investigation_260529.json`
- `memory/events/anu_new_step_2_scope_guard_false_positive_root_cause_260529.json` (★ root_cause source)
- `memory/events/anu_step_1_task_2705plus3_done_qc_warn_investigation_260529.json` (★ finish-task.sh L451)
- `memory/events/anu_step_3_p1b_implementation_assessment_260529.json` (★ IMPLEMENT_LATER 권고)
- `memory/events/task-2705+3.scope-violation.json` (★ 25 violations source)
- `memory/events/task-2705+3.scope-diff.txt` (★ scope-diff source)
- `scripts/finish-task.sh` (★ read-only · L435 main..HEAD)
- `feedback_pr_subtask_worktree_isolation_260513.md` (★ task-2569 박제)

---

## 20. executor 분리 강제 (★ 회장 verbatim "구현자와 검증자는 분리한다")

### 20.1 구현 단계 (★ 본 task-2706)

- **executor**: dev1 헤르메스 (lead_integrator + implementer)
- **Vulcan**: implementer (★ general-purpose subagent · sonnet · 본 task 의 신규 모듈 4 + tests + fixtures 구현)
- **Hermes 직접 패치 캐비엇**: ★ fallback workspace 비-git 시 Hermes 직접 구현 폴백 + caveat 강제 박제 (★ P1-C §4 정합)

### 20.2 검증 단계 (★ 별도 task-2706+1 또는 본 task 내 phase 분리)

- **executor**: dev2 오딘 (Maat verifier)
- **수행**: 본 task-2706 산출물 독립 횡단 검증 (★ read-only)
- **검증 범위**: §15 acceptance criteria 모두 + §16 finish-task.sh no-touch proof + §17 no GitHub write proof
- **회장 결재**: 본 task md 회장 결재 시 task-2706+1 별도 발의 권고 (★ 본 초안 작성 후 회장 결재 영역)

---

## 21. dispatch 진행 절차 (★ 본 초안 회장 결재 시)

회장 verbatim "초안 작성 후 보고해라. dispatch는 초안 확인 전 금지" 정합:

1. ★ 본 task md 초안 작성 완료 → 회장 결재 대기
2. ★ 회장 결재 후 → dispatch.py 1차 단일 발사 (★ executor dev1 헤르메스)
3. ★ 5신호 교차 검증
4. ★ SPAWN_VERIFIED 후 자동 진행 (★ 정지 조건 7 정합)
5. ★ executor 완료 시 ANU normal callback 회수
6. ★ 회장 결재 후 task-2706+1 verifier (Maat) 별도 dispatch

---

## 22. ANU 자체 caveat (★ 정직)

- 본 초안 = ANU read-only 추정 · 운영 검증 필요
- 192-cell 매트릭스 sampling 30 case 가 충분한지 fixture validation 시 검증 필요
- 신규 4 모듈 + N tests + N fixtures = MEDIUM 복잡도 · 실 구현 시 ~12 시간 추정 (★ duration 예측 표현 자체는 추정 박제)
- task-2569 RC-1 의 lock_sha 박제 마커 자체는 본 task 범위 외 (★ dispatch.py 수정 금지 정합)
- 따라서 본 task 의 lock_sha 활용 = `git status` 결과 기반 추정 + task md timestamp 기반 추정 (★ HIGH risk 영역)

---

## 23. ANU normal callback envelope 강제 (★ executor 종료 시)

- collector_key: `c119085addb0f8b7` (ANU)
- envelope size: ≤ **3,900 bytes hard limit** (★ UTF-8 byte 측정)
- envelope-only: 상세는 report.md / decision marker 위임
- self-collector 사용 0 (★ SELF_COLLECTOR_FORBIDDEN 정합)
- self-collector verification 0 (★ SELF_COLLECTOR_VERIFICATION_FORBIDDEN)

---

**P1-B finish-task profile contract 외부 layer 구현 task md 초안 박제 완료. 18 항목 모두 포함. finish-task.sh 0 touch · dispatch.py 0 touch · GitHub write 0 · 자동 발사 0 · 회장 결재 전 dispatch 금지.**

★ 본 초안 = DRAFT (★ 회장 verbatim "초안 작성 후 보고" 정합 · dispatch 0 · 회장 결재 대기).

끝