{
  "schema": "anu_v2.dispatch_decision.v1",
  "task_id": "task-2562",
  "track": "C",
  "rank": 3,
  "team": "dev1",
  "team_persona": "헤르메스",
  "level": "Lv.3",
  "level_kind": "control-plane",
  "dispatch_ts_utc": "2026-05-12T15:33:00Z",
  "owner_directive_ref": "회장 §명시 2026-05-12 Track C 발사 승인",
  "draft_ref": "memory/tasks/task-2562.md",
  "readiness_audit_ref": "memory/events/dispatch-readiness-audit.task-2562.20260512T151519Z.json",
  "predecessors": [
    {
      "track": "A",
      "task_id": "task-2560",
      "pr": 113,
      "merge_commit": "345b102025533702b6295785caa712d7b13f628c",
      "evidence_ref": "memory/events/task-2560.reconcile-evidence.json"
    },
    {
      "track": "B",
      "task_id": "task-2561",
      "pr": 112,
      "merge_commit": "4fffc55b7431c739d0e86c97320d1c4be98e9374",
      "evidence_ref": "memory/events/task-2561.reconcile-evidence.json"
    }
  ],
  "essence": "Pre-PR Gemini CLI 단발 gate (OAuth-personal). 공식 merge gate 아님.",
  "core_decisions": {
    "task_id_basis": "task-2559는 dashboard 신호등 task로 사용 중이므로 금지 (회장 §명시)",
    "fix_loop_count_max": 2,
    "integration_point": "scripts/finish-task.sh line 830 부근 (G3 PASS 직후, .done 이전, Lv.4 보안 감사 이전)",
    "gate_policy": "Lv 기반 mixed",
    "gate_policy_detail": {
      "lv_1_2": "soft (warning + PR open 허용)",
      "lv_2_risk_trigger": "hard (보안 민감 파일 / affected_files>5 / danger 키워드 충족 시 승격)",
      "lv_3_plus": "hard (.done 차단 + PR open 금지)"
    },
    "scope_violation_policy": "즉시 ESCALATED, fix_loop 진입 0",
    "auth_mode": "OAuth-personal (Gemini CLI 0.31.0 binary)",
    "api_key_use": "FORBIDDEN (GEMINI_API_KEY env var 거부 — 즉시 abort)",
    "github_gemini_app_call": "FORBIDDEN (PR open 전 단계)",
    "polling_mode": "single shot, max wait < 60s (long polling 0)"
  },
  "final_preflight_4": {
    "preflight_1_task_2560_supersede_verdict": "PASS — MERGED_SUPERSEDES_STALE_ESCALATED",
    "preflight_2_task_2561_intended_skip": "PASS — post_merge_smoke.skip_reason contains 'INTENDED'",
    "preflight_3_expected_files_finalized": "PASS — 8 mandatory + 2 conditional 분리 박제, 본 dispatch에서 OD_3 (a) 채택 → conditional 2건 승격",
    "preflight_4_conditional_policy": "PASS — 수정 시 expected_files 승격, 미수정 시 actual_changed_files 포함 금지 (본 dispatch는 수정 채택 → 승격)"
  },
  "expected_files": [
    "scripts/gemini_cli_gate_check.py",
    "tests/regression/test_gemini_cli_gate_check_2562.py",
    "anu_v2/tests/test_g4_integration_2562.py",
    "memory/reports/task-2562.md",
    "memory/events/task-2562.dispatch-decision.json",
    "memory/plans/tasks/task-2562/plan.md",
    "memory/plans/tasks/task-2562/context-notes.md",
    "memory/plans/tasks/task-2562/checklist.md",
    "scripts/finish-task.sh",
    "prompts/gate_instructions.py"
  ],
  "expected_files_count": 10,
  "expected_files_mandatory_count": 8,
  "expected_files_conditional_promoted_count": 2,
  "forbidden_paths": {
    "pr_branches_98_to_113_untouched": true,
    "dispatch_module_lock": [
      "dispatch/",
      "prompts/team_prompts.py",
      ".github/workflows/",
      ".env",
      ".env.keys"
    ],
    "task_2558_area_lock": ["anu_v2/auto_gemini_triage.py"],
    "task_2560_area_lock": ["anu_v2/executor_scheduler.py"],
    "task_2561_area_lock": ["anu_v2/tests/test_post_merge_smoke_runner_2539.py"],
    "task_2559_area_lock": ["dashboard/", "traffic-light-spec.md"],
    "owner_trigger_lock": [
      "anu_v2/owner_trigger_only.py",
      "anu_v2/owner_trigger_audit.py",
      "anu_v2/owner_trigger_decision.py",
      "anu_v2/owner_trigger_pat.py"
    ],
    "control_plane_lock": [
      "scripts/codex_gate_check.py (import만 허용, 본문 변경 0)",
      "scripts/g3_independent_verifier.py"
    ]
  },
  "regression_commands": {
    "pytest": [
      "pytest tests/regression/test_gemini_cli_gate_check_2562.py -v",
      "pytest anu_v2/tests/test_g4_integration_2562.py -v"
    ],
    "static": [
      "ruff check scripts/gemini_cli_gate_check.py tests/regression/test_gemini_cli_gate_check_2562.py anu_v2/tests/test_g4_integration_2562.py",
      "python3 -m py_compile scripts/gemini_cli_gate_check.py",
      "python3 scripts/gemini_cli_gate_check.py --help"
    ],
    "oauth_personal_smoke": [
      "gemini --version",
      "GEMINI_API_KEY=dummy python3 scripts/gemini_cli_gate_check.py --task-id task-2562 (non-zero exit 어셀션)"
    ],
    "g4_self_check": {
      "applied": false,
      "rationale": "본 task = G4 자체 구현 → G4 self-apply 0 (무한루프 회피, 회장 §명시 일관)",
      "applied_gates": ["G1 Codex", "G2 마아트+로키", "G3 verifier"]
    }
  },
  "escalation_map": {
    "G4_GATE_REGRESSION": "#6",
    "FINISH_TASK_SH_REGRESSION": "#6",
    "FIX_LOOP_CAP_VIOLATION": "#6",
    "LV_BASED_GATE_REGRESSION": "#6",
    "FORBIDDEN_PATH_HIT": "#1",
    "FORBIDDEN_PATH_HIT_ORIGINAL_PR_BRANCH": "#1",
    "OUT_OF_SCOPE_MUTATE": "#1",
    "ADMIN_OVERRIDE_ATTEMPT": "#2",
    "FORBIDDEN_CAPABILITY_USE": "#1"
  },
  "completion_conditions_10": [
    "PR MERGED, mergedBy = app/jeon-jonghyuk-taskctl-bot",
    "final preflight 4건 PASS",
    "G4 gate 코드 + Lv 기반 mixed gate 분기 + fix_loop max=2 박제",
    "finish-task.sh line 830 부근 G3 PASS 직후 hook 추가",
    "pytest regression PASS (G4 신규 + 기존 anu_v2 suite + finish-task.sh test)",
    "effective diff == expected_files (dispatch_decision.json authoritative)",
    "forbidden path 0",
    "PR #98~#113 head unchanged + task-2558/2559/2560/2561 영역 mutate 0",
    "CI 11 checks all SUCCESS / CLEAN",
    "회장 수동 입력 0 어셀션"
  ],
  "report_format_1to1": {
    "Track": "C",
    "상태": "MERGED 또는 ESCALATED",
    "task_id": "task-2562",
    "수정/PR": "PR # / merge_commit",
    "expected_files": "10/10 strict (dispatch_decision.json authoritative)",
    "forbidden_path": 0,
    "Gemini_상태": "fresh + unresolved 0",
    "CI_상태": "11/11 / CLEAN",
    "핵심_evidence": "final preflight 4건 PASS + Lv 기반 mixed gate 박제",
    "회장_결정_필요": "N (완료 조건 10건 충족 시) / Y (preflight FAIL 시)"
  }
}
