# task-2705+4 — task-2705+3 독립 횡단 검증 (Maat read-only)

**task_id**: task-2705+4 (★ v2 정합 sub-id · task-2706/2707 numeric 자동 발의 0)
**task_semantic_name**: task-2705+3-independent-verification (★ 본 task 의 본질 = task-2705+3 의 Maat 횡단 read-only 검증)
**parent_task**: task-2705+3 (★ 검증 대상)
**parent_chain**: task-2705 (VALID_HOLD) ← task-2705+1 (PROVISIONAL_ACCEPT_PENDING_MAAT_VERIFICATION) ← task-2705+2 (Maat verification PARTIAL_ACCEPT_NEEDS_FOLLOWUP) ← task-2705+3 (item 9 fix · CANDIDATE_FOR_FULL_ACCEPT)
**chair_authorization_id**: CHAIR-AUTH-TASK-2705PLUS3-INDEPENDENT-VERIFICATION-READONLY-260529
**level**: 4 (verifier · 횡단 검증)
**mode**: read_only (★ 회장 verbatim 강제)
**actor_role**: verifier (★ P1-C 설계 §1.1 정합 · 구현자 ≠ 검증자)
**executor**: dev2 오딘 (★ Sonnet 4.6 횡단 · executor dev1 헤르메스 분리 · task-2705+2 verifier 와 동일 봇 인가)
**model**: claude-sonnet-4-6

## allowed_resources (본 task의 capability)

```yaml
allowed_resources:
  paths:
    - "memory/reports/task-2705+4.md"
    - "memory/events/task-2705+4.*"
  forbidden_paths:
    - "scripts/**"
    - "dispatch/**"
    - "scripts/finish-task.sh"
    - "scripts/session-watchdog.sh"
    - "scripts/harness/**"
    - "memory/tasks/**"
    - "memory/events/task-2705.*"
    - "memory/events/task-2705+1.*"
    - "memory/events/task-2705+2.*"
    - "memory/events/task-2705+3.*"
    - "memory/specs/**"
    - "memory/plans/**"
    - "memory/capabilities/**"
    - "settings.json"
    - ".github/**"
    - "tests/**"
  commands:
    - "pytest"
    - "sha256sum"
    - "git log"
    - "git blame"
    - "git diff"
    - "git status"
    - "ls"
    - "cat"
    - "grep"
    - "python3 -m py_compile"
  merge_policy: "manual"
  ttl_hours: 6
```

★ verifier read-only · 산출물 = report.md + decision.json + callback envelope 만.
★ 코드 수정 0 · finish-task.sh 실행 0 · .done 생성 0 · PR/머지 0.

---

## 0. 본 task 의 본질 (★ 회장 verbatim 정합)

회장 verbatim 야간 추가 위임 정합:
- task-2705+3 봇 self-report = "FULL_ACCEPT 가능 권고"
- 회장 verbatim: "task-2705+3 callback 내용은 사실(fact)로만 취급한다 / FULL_ACCEPT 권고는 self-report일 뿐이며 ANU는 승격하지 않는다"
- 현재 분류 = `P1-A CANDIDATE_FOR_FULL_ACCEPT` (★ FULL_ACCEPT 아님)
- 본 task = **독립 횡단 검증** · executor 와 봇/세션 분리 강제

**Maat 역할 정의** (★ P1-C 설계 §1.1·§5.3 + 회장 verbatim "검증자는 구현자가 아니다"):
- declared role: `verifier`
- evidence_level 우선: L3 commit_trailer / L4 runtime_event / L5 tool_call_trace
- self-verification 금지 (★ executor dev1 헤르메스와 별도 봇 dev2 오딘)

---

## 1. 검증 7 항목 (★ 회장 verbatim STEP 2 verification_scope 정합)

각 항목별 PASS/FAIL/PARTIAL + evidence_level + verbatim 근거 인용 필수.

### 항목 1: 12 항목 (★ task-2705+2 Maat 12 항목 + item 9 fix 적용 후 결과)

기존 task-2705+2 Maat 의 12 항목 평가 매트릭스를 본 task-2705+3 fix 적용 후 상태에서 재현 검증.
- 항목 1~12 모두 task-2705+2 verbatim 박제 기준
- 단, item 9 (caller chair_authorization_id 전달) = 본 task-2705+3 fix 핵심 변경 항목

### 항목 2: item 9 fix 확인

- `dispatch/__init__.py` 의 `_safe_extract_chair_authorization_id` helper 존재 확인 (★ task-2705+3 L265 추정)
- caller 2 site (L3046 + L4087 추정) 에서 helper 호출 확인
- `chair_authorization_id=None` 결선 제거 확인
- helper L1 smoke 실행: `_safe_extract_chair_authorization_id('task-2705+3')` → `CHAIR-AUTH-TASK-2705PLUS3-V36-CHAIR-AUTH-CALLER-FIX-260529` 일치 검증

### 항목 3: 기존 P1-A acceptance criteria (★ 9 closeout 기준)

회장 verbatim P1-A closeout 9 기준 재현 검증:
1. caller chair_authorization_id=None 결함 해소 (★ item 9 fix · 항목 2 와 중복)
2. task별 chair_authorization_id 가 marker 에 정확히 기록 (★ 향후 dispatch 가 marker 에 박는지 검증 — read-only)
3. task_md_sha_before null 결함 재발 없음 (★ task-2705+1 _safe_compute_task_md_sha 보존)
4. WHITESPACE_NORMALIZATION ALLOW 유지 (★ scripts/harness/v36/task_md_sha_*.py)
5. semantic DENY fixture 유지 (★ fixture-6/7)
6. unverifiable HOLD fixture 유지 (★ fixture-5)
7. existing v36 회귀 유지 (★ 278/278 → 285/285 PASS 자체 재현)
8. forbidden action 0 (★ session-watchdog.sh / finish-task.sh / settings.json 변경 0 검증)
9. decision.json/report integrity mismatch 분리 (★ 본 task-2705+4 산출물 정합 검증)

### 항목 4: replay fixture (★ 회장 verbatim 허용 8 #7)

- `tests/harness/fixtures/v36_task_md_sha_fixture_N_replay_task_2705_plus_1.json` 존재 확인
- `tests/harness/fixtures/v36_task_md_sha_fixture_N_replay_task_2705_plus_2.json` 존재 확인
- 내용 schema 검증 (★ pre/post sha + decision verbatim)

### 항목 5: regression

- `pytest tests/harness/ -q` read-only 재현
- 봇 self-report 285/285 PASS 정합 검증
- 신규 5 regression test 동작 확인:
  1. test_safe_extract_chair_authorization_id_helper_exists
  2. test_safe_extract_returns_none_for_missing_task
  3. test_safe_extract_parses_chair_authorization_id_from_task_md
  4. test_safe_extract_handles_empty_task_id
  5. test_dispatch_marker_receives_extracted_chair_auth_id

### 항목 6: dispatch marker

- `memory/events/task-2705+3.dispatched-20260528.json` 의 task_md_sha_before 필드 검증 (★ null 0)
- chair_authorization_id 필드 = null (★ 본 task-2705+3 fix 이전 dispatch 시점이므로 expected)
- 향후 dispatch (예: 본 task-2705+4 자체 dispatch marker) 의 chair_authorization_id 가 실제 값 박힘 확인

### 항목 7: chair_authorization_id 전달

- 본 task-2705+4 의 dispatch marker 가 fix 후 dispatch 이므로 `CHAIR-AUTH-TASK-2705PLUS3-INDEPENDENT-VERIFICATION-READONLY-260529` 박힘 검증 (★ 본 task 진입 시 dispatch marker 가 fix 적용된 dispatch.py 로 작성됨)
- 또는 caller 가 None 박는 fallback 케이스 검증

---

## 2. 결과 분류 5 enum (★ 회장 verbatim STEP 3 final classification 정합)

Maat 가 7 검증 + STEP 0 9 항목 + STEP 1 scope-guard 25 분류 종합 평가 후 5 분류 중 정확히 1 선택:

1. **FULL_ACCEPT**: 7 항목 모두 PASS L4+ · scope-guard 25건 모두 A 분류 확인 · caveat 모두 무영향
2. **ACCEPT_WITH_KNOWN_CAVEATS**: 7 항목 핵심 PASS · known caveat 유지 가능 (★ Hermes 직접 코딩 caveat / report.md drift caveat / scope-guard A 분류 caveat 등)
3. **PARTIAL_ACCEPT_NEEDS_FOLLOWUP**: 일부 PASS_PARTIAL · 후속 task 필요
4. **HOLD_FOR_CHAIR**: Maat 판정 모호 · 회장 closeout 결정 필수
5. **REJECT**: 핵심 FAIL · P1-A 승격 불가

**선택 근거**: 7 항목 + STEP 0/1 결과 + ANU 가 박제한 evidence 정합 평가.

---

## 3. 13 금지 항목 (★ 회장 verbatim 야간 위임 [2/2] 정합)

1. finish-task.sh 실행 금지
2. finish-task.sh 수정 금지
3. settings.json 수정 금지
4. session-watchdog.sh 수정 금지
5. GitHub write 금지
6. PR 생성 금지
7. branch push 금지
8. merge 금지
9. task-2706 자동 발의 금지
10. task-2707 자동 발의 금지
11. Goal-to-Done 구현 금지
12. PHASE_AUTO 구현 금지
13. Core/Work 이원화 구현 금지

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

추가 verifier 강제 8 금지:
14. 코드 수정 금지 (★ verifier read-only)
15. .done 수동 생성 금지 (★ system 자동 finalize 외)
16. ANU 자체 FULL_ACCEPT 판정 금지 (★ 본 verifier 봇은 ANU 가 아니나 self-report FULL_ACCEPT 권고 금지 — 5 분류 중 1 객관 선택만)
17. P1-B/P1-C 구현 금지
18. lineage rewrite 금지 (★ task-2705/2705+1/2705+2/2705+3 lineage 산출물 변경 0)

---

## 4. 산출물 표준 (★ 필수 출력)

### 4.1 Maat verification report
- 경로: `memory/reports/task-2705+4.md`
- 내용:
  - 7 항목 evaluation 표 (PASS/FAIL/PARTIAL + evidence_level + verbatim 근거)
  - 5 분류 중 선택 + 선택 근거
  - 18 금지 준수 확인
  - Maat 역할 self-attestation (★ P1-C §5.3 verifier 보고 템플릿 정합)
  - linked markers

### 4.2 Maat decision marker
- 경로: `memory/events/task-2705+4.decision.json`
- schema:
  - marker_version: v1
  - marker_type: task_2705plus4_independent_verification_decision
  - task_id: task-2705+4
  - parent_task_id: task-2705+3
  - chair_authorization_id: CHAIR-AUTH-TASK-2705PLUS3-INDEPENDENT-VERIFICATION-READONLY-260529
  - 7_scope_evaluation: array of 7 items
  - final_classification: enum 5
  - selection_rationale: text
  - 18_prohibitions_compliance: object of 18
  - maat_role_self_attestation: object
  - linked_markers: array

### 4.3 ANU normal callback envelope
- collector_key: `c119085addb0f8b7` (ANU)
- envelope size: ≤ 3,900 bytes hard limit
- envelope-only: 상세는 report.md / decision.json 위임

---

## 5. STEP 0/1 ANU 박제 evidence (★ verifier 참고)

본 verifier 는 ANU 가 박제한 STEP 0/1 evidence 를 read-only 참고할 수 있다. 단, **independent 횡단 재검증** 강제:

- `memory/events/anu_step_0_task_2705plus3_artifacts_recovery_260529.json` (★ STEP 0 9 확인 항목 결과)
- `memory/events/anu_step_1_scope_guard_25_classification_260529.json` (★ STEP 1 A/B/C 분류 · 25 모두 A 박제)

**verifier 의 독립 검증 책무**:
- ANU STEP 0/1 박제 evidence 가 verifier 독립 재현 시 동일한지 검증
- 특히 항목 8 (forbidden write · session-watchdog.sh) 의 5 evidence cross-verification 재현
- ANU 의 분류가 evidence 정합인지 객관 평가

---

## 6. evidence_level 요구 등급 (★ P1-C 설계 §2.1 정합)

| 항목 | 최저 evidence_level | 권고 |
|------|---------------------|------|
| 1 (12 항목) | L4 | L4+ (★ 코드 read + pytest 재현) |
| 2 (item 9 fix) | L4 | L4+ (★ helper 직접 실행 cross-verify) |
| 3 (9 closeout) | L4 | L4 |
| 4 (replay fixture) | L4 | L4 (★ schema read) |
| 5 (regression) | **L4 필수** | L4 (★ pytest 재현) |
| 6 (dispatch marker) | L4 | L4+ (★ JSON read + sha cross-verify) |
| 7 (chair_authorization_id 전달) | **L4 필수** | L4+ (★ 본 task-2705+4 자체 dispatch marker 박제 확인) |

★ L1 self_attestation 단독 항목 0 (★ verifier 역할의 본질).

---

## 7. Maat 역할 self-attestation 표준 (★ P1-C 설계 §5.3 정합)

본 task 완료 시 보고서에 다음 박제 강제:

```
## Maat 역할 보고

### declared
- 선언 role: verifier (★ 횡단 검증 · independent)
- 선언 시점: <dispatch timestamp>
- 모델: claude-sonnet-4-6 (★ executor dev1 헤르메스 = claude-sonnet-4-6 또는 opus-4-7 와 봇 분리)

### observed roles
- verifier (★ 독립 재검증)
  - L4 evidence: 본 보고서 작성 session = dev2 오딘 봇 (executor dev1 헤르메스 봇과 별도 chat·세션)
  - L4 evidence: 모든 측정 명령 read-only
  - 검증 범위: 7 항목 + 5 분류 + 18 금지 준수

### caveat
- (★ Maat self-attestation 한계 인정 · executor 와 분리됐다는 점만 L4 보장)
```

---

## 8. 회장 결재 대기 항목 (★ Maat 보고 시 명시)

Maat 결과 분류 후 회장 결재 사항 명시:
- FULL_ACCEPT 선택 시: task-2705 closeout + P1-A ACCEPTED 승격 결재
- ACCEPT_WITH_KNOWN_CAVEATS 선택 시: caveat 명시 + 회장 closeout 결재
- PARTIAL_ACCEPT_NEEDS_FOLLOWUP 선택 시: 후속 task 후보 박제 + 회장 발의 결재
- HOLD_FOR_CHAIR 선택 시: 회장 직접 분석 위임
- REJECT 선택 시: task-2705+5 재시도 또는 회장 전략 재고

---

## 9. 본 task 의 ANU 자체 caveat

- ANU 가 task-2705+3 산출물에 대한 STEP 0/1 분석 완료 (★ 본 task md §5 박제 evidence)
- 본 task = **독립 verifier 횡단 검증** (★ executor dev1 + ANU chair-facing session 모두 분리)
- ANU 자체 FULL_ACCEPT 판정 0 유지 (★ 회장 verbatim "자동 승격 금지")
- ★ "evidence 만 따라간다" doctrine 정합 — FULL_ACCEPT 결과를 원하는 방향으로 몰지 말 것

---

## 10. linked references

- `memory/tasks/task-2705+3.md` (★ 검증 대상)
- `memory/reports/task-2705+3.md` (★ 봇 self-report)
- `memory/events/task-2705+3.dispatched-20260528.json` (★ dispatch marker)
- `memory/events/task-2705+3.scope-violation.json` (★ scope-guard 25 violations)
- `memory/events/task-2705+3.scope-diff.txt` (★ git diff name-only)
- `memory/events/task-2705+3.qc-result` (★ qc WARN)
- `memory/events/task-2705+3.escalate` (★ scope_guard_violation escalation)
- `memory/events/anu_step_0_task_2705plus3_artifacts_recovery_260529.json` (★ STEP 0)
- `memory/events/anu_step_1_scope_guard_25_classification_260529.json` (★ STEP 1)
- `memory/events/anu_night_delegation_chair_directive_1of2_post_task_2705plus3_260529.json`
- `memory/events/anu_night_delegation_chair_directive_2of2_post_task_2705plus3_260529.json`
- `memory/events/task-2705+2.decision.json` (★ Maat verification 기준)
- `memory/reports/task-2705+2.md` (★ Maat report)
- `memory/specs/v36_actor_attribution_contract_design_draft_260529.md` (★ verifier role 정의 정합)
- `dispatch/__init__.py` (★ helper + caller fix · read-only)
- `scripts/harness/v36/dispatch_marker_writer.py` (★ docstring meta · read-only)
- `tests/harness/test_v36_dispatch_marker_contract.py` (★ regression · read-only)
- `tests/harness/fixtures/v36_task_md_sha_fixture_N_replay_*.json` (★ replay fixture · read-only)

---

**독립 횡단 검증 강제 doctrine 박제 완료. read-only · 코드 수정 0 · 18 금지 절대 준수.**

**callback prompt UTF-8 byte limit ≤ 3,900 bytes hard · envelope-only · 상세는 report.md / decision.json 위임.**