{
  "task_id": "task-2705+1",
  "captured_at": "2026-05-29T01:50:56.226023",
  "source": "memory/tasks/task-2705+1.md",
  "source_sha256": "7b51a94dfc425c0bb31d70fd71dbce3c21cd73525b448ce761d44d533751fd74",
  "allowed_resources": {
    "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 (★ .strip 시뮬레이션 + DISPATCH_META_SIDECAR + RETRY_HEADER + WHITESPACE_NORMALIZATION)",
      "tests/harness/test_v36_task_md_sha_contract.py (★ 8 fixture + task-2705 1 byte strip replay)",
      "tests/harness/test_v36_task_md_sha_normalize.py",
      "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_2705_1byte_strip.json (★ 본 task 의 핵심 replay fixture · trailing whitespace strip)",
      "tests/harness/fixtures/v36_task_md_sha_replay_task_2703.json",
      "memory/events/task-2705+1.* (보고/마커)",
      "memory/reports/task-2705+1.md"
    ],
    "allowed_existing_file_edits": [
      "dispatch/__init__.py (★ 최소 결선 · L2992/L4029 caller 에 chair_authorization_id + task_md_sha_before 전달 + L4518/L3636 sha 측정 hook · 기존 동작 변경 0 · safe-fail 강제)",
      "scripts/harness/v36/dispatch_marker_writer.py (★ CHAIR_AUTHORIZATION_ID 모듈 상수 제거 + 함수 signature 에 chair_authorization_id arg 추가 + L151 변경 · 기존 marker schema 보존)"
    ],
    "forbidden_files": [
      "scripts/finish-task.sh",
      "scripts/session-watchdog.sh",
      "/home/jay/.claude/settings.json",
      "/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",
      "scripts/harness/v36/actor_attribution*.py",
      "memory/tasks/task-2705.md (★ 기존 task-2705 task md 수정 금지)",
      "memory/events/task-2705.task-md-sha-decision.json (★ task-2705 HOLD 마커 수정 금지)",
      "memory/reports/task-2705.md (★ task-2705 봇 보고서 수정 금지)",
      "PR #158 / #159 / #160 / task-2700·2700+1·2703·2704 branch",
      "workspace_root 외부"
    ],
    "commands": [
      "구현: 신규 py/json/test · dispatch.py + dispatch_marker_writer.py 최소 결선 (safe-fail 강제)",
      "검증: pytest fixture/mock · production load evidence · marker schema validation · task-2705 replay PASS",
      "★ real GitHub write 0 · merge 0 · branch push 0 · PR 생성 0 · finish-task.sh 수정 0",
      "★ task-timers 위조 0 · manual .done 0 · G4 marker 삭제 0"
    ],
    "merge_policy": "task_md_sha_bootstrap_recovery_local_verification_no_remote_writes_no_finish_task_change",
    "ttl_hours": 18,
    "forbidden_paths": [
      "memory/capabilities/**"
    ]
  }
}