{
  "ts_utc": "2026-05-16T02:10:22Z",
  "ts_kst": "2026-05-16T11:10:22+09:00",
  "task_id": "task-2553+1",
  "marker_kind": "anu-predispatch-contract (task spec 완전 동기화 — 회장 정정 4건+Codex 3건 반영, dispatch GO 전)",
  "parent": "task-2553 / PR #102 (SECURITY_SCOPE_REVIEW_REQUIRED, 2 HIGH FAIL)",
  "approved_by": "제이회장 (2026-05-16): fix 배치안 수락 + Option B + F2 (A) in-process HTTP 승인 / (B) 거절 + 정정 4건. dispatch GO는 별도(미발효)",
  "method": "Option B clean replacement PR (동일 자산 보존, 전면 redesign 아님, fresh origin/main base)",
  "task_file": "memory/tasks/task-2553+1.md",
  "task_file_sha256": "624362301bf873f3933c750e8bec8a209e4d7b7321060f7936b9c2a1f6bf0dd0",
  "task_file_sha256_history": ["127250e2... (v1)", "2bc08047... (Codex 3건 반영)", "624362301bf873f3933c750e8bec8a209e4d7b7321060f7936b9c2a1f6bf0dd0 (회장 정정 4건 반영, 현재 권위)"],
  "lineage": {
    "fresh_base_origin_main": "7346df8260803308df30a6d04ec32d66d4cdfa5b (dispatch 시 재확인)",
    "source_asset_pr102_head": "bd5ad74f5d443b354319fc8b3cb006816b8a9025 (owner_trigger_pat.py + 79 tests + plans)",
    "pr102_original_preservation": "PR #102 / branch task/task-2553-dev5 / head bd5ad74f 무변경, same-branch push 0, 신규 branch clean replacement"
  },
  "f2_token_transport_decision": {
    "chair": "(A) in-process HTTP 전환 승인 / (B) 특정 금지 채널 예외 거절",
    "scope": "owner_trigger_pat.py 1파일 내부 token transport mechanism replacement만. 전면 redesign 아님.",
    "A_scope_forbidden": ["기능 범위 확장","endpoint 확장","callback 활성화","PR #102 원본 변경","same-branch push","credential scope 변경"]
  },
  "two_high_fail_targets": {
    "F1_principle5": "forbidden API hard-block fragment blacklist → default-deny allowlist (허용 외 전부 raise, helper bypass 무효화, 실행 직전 strict-equality gate)",
    "F2_principle10": "raw OWNER token non-handling 전체 경계. gh_runner(subprocess) → in-process authenticated HTTPS poster 교체"
  },
  "chair_correction_C1_env_clarify": "env 금지 = '노출/전파 채널로서의 env 금지'. 승인된 secret source에서 현 Python process 1회 read 허용. 금지 = child process env 전달 / env dump / log / marker / report / exception / audit output 노출.",
  "chair_correction_C2_token_order": "F1 allowlist gate 통과 → load_owner_pat() 1회 read → 함수 로컬 변수 only → subprocess 없이 in-process HTTPS Authorization header → 참조 폐기/redaction. F1 deny path에서 load_owner_pat() 호출 0회.",
  "f2_exact_allowed_endpoint_and_body_verbatim": {
    "endpoint": "/repos/{owner}/{repo}/issues/{pr}/comments",
    "method": "POST",
    "body": "/gemini review",
    "note": "단일 endpoint·고정 body만 허용 (Codex LOW 권고 반영 — contract self-contained). 그 외 endpoint/body = F1 default-deny raise. owner/repo/pr는 validated path component only."
  },
  "chair_correction_C3_expected_files_3split": {
    "code_expected_files": ["anu_v2/owner_trigger_pat.py", "tests/regression/test_owner_trigger_2553_plus1_high_fix.py"],
    "evidence_expected_outputs": ["memory/reports/task-2553+1.md", "memory/events/task-2553+1.result.json", "memory/events/task-2553+1.red-evidence.log", "memory/events/task-2553+1.green-evidence.log"],
    "effective_diff_allowed_files": "위 6개 전체. 6파일 밖 변경 = effective diff 누수 = 즉시 HOLD",
    "forbidden": "tests/regression/** broad glob / phase tests 무제한 수정 / 6파일 밖 변경. 기존 79 tests 동일 보존(변경 0)"
  },
  "chair_correction_C4_negative_regression": [
    "helper bypass 시 non-allowlisted endpoint 전건 deny 입증",
    "sentinel raw token이 argv/env/stdin/log/exception/temp file/marker/report/audit output에 없을 것",
    "subprocess 경로에 raw token 전달 0",
    "F1 allowlist 실패 시 load_owner_pat() 호출 0회",
    "Authorization header 외 경로로 raw token 흐름 0"
  ],
  "http_transition_attack_surface_dev_guidance": [
    "TLS 인증서 검증 유지 (verify=false 경로 금지)",
    "redirect 비활성/엄격 제한 (Authorization 타 host/path 전달 금지)",
    "owner/repo/pr 값 path component validation (header/path injection 방지)",
    "retry bounded + timeout/HTTP 실패 시 token-bearing request 객체 log/exception echo 0",
    "exception/redaction이 Authorization 외 token 노출 0 보장 (client debug 포함)",
    "proxy/netrc/default-client credential 전파 경로 미도입 검토"
  ],
  "forbidden_write_targets": ["dispatch.py","scripts/finish-task.sh","task-timer.py","/home/jay/.claude/hooks/post-tool-use.sh","utils/anu_codex_bounded_loop.py","scripts/replacement_pr_dry_run_activation_guard.py","scripts/replacement_pr_dry_run_activation_harness.py","tests/regression/test_anu_codex_bounded_loop_2592.py","tests/regression/test_task_2591_dry_run_activation_harness.py","memory/tasks/task-2591.md","memory/tasks/task-2592.md","memory/tasks/task-2595.md"],
  "executor": "dev2 Odin 1회 한정 (회장 후보 승인, 최종 GO 별도)",
  "ttl_hours": 4,
  "callback_status": "기본값 callback OFF 고정. 회장 별도 명시 승인 없이 적용 0 → marker-only 수동 회수(default). anu scope 임의 확장 0.",
  "completion_criteria": ["기존 79 tests 보존","신규 negative regression(C4 5항목)","RED→GREEN evidence","Codex 독립 13원칙 재audit 원칙5·10 PASS + 11 PASS 유지","least-privilege LEAST_PRIVILEGE","Critical 7 0","forbidden_write_targets 변경 0"],
  "codex_post_fix_reaudit": "필수 — task-2600 13원칙 + adversarial probes A~G 재실행 + http transition attack surface 6항목 검증. PASS 시에만 recover 후보 (recover 실행은 회장 별도 결정)",
  "github_write_points": "신규 branch/commit/push/clean replacement PR open — 회장 최종 dispatch GO 후만. PR #102 close/comment/merge 0. merge 별도 회장 결정.",
  "stage_boundary": "회장 최종 GO 전: dev2 재가동·dispatch·branch·commit·push·PR open·merge·GitHub write·credential·OWNER PAT·실제 API·callback 등록·same-branch push·real write·limited real write·자동 closeout·dev status 변경 전부 0.",
  "no_actor_attribution_change": true
}
