{
  "schema": "memory.events.dispatch-decision.v1",
  "task_id": "task-2556",
  "task_path": "memory/tasks/task-2556.md",
  "team": "dev5-마르둑",
  "lineage": "task-2554+2 → task-2555 → task-2556",
  "predecessor_pr": "#106",
  "predecessor_commit": "cd1aeba418727511ab07afde0c15071327a5acf4",
  "baseline_branch": "origin/main",
  "worktree_path": ".worktrees/task-2556-dev5",
  "branch": "task/task-2556-dev5",
  "level": "Lv.4",
  "track": "A",
  "priority": "P0",
  "expected_files": {
    "code": [
      "anu_v2/executor_scheduler.py",
      "anu_v2/idle_pr_diagnoser.py",
      "anu_v2/merge_queue_executor.py",
      "anu_v2/owner_trigger_only.py",
      "anu_v2/polling_policy.py"
    ],
    "tests": [
      "anu_v2/tests/test_executor_scheduler_pr107_pilot.py",
      "anu_v2/tests/test_executor_first_gemini_trigger_missing.py",
      "anu_v2/tests/test_executor_gemini_stale_on_head.py",
      "anu_v2/tests/test_executor_duplicate_trigger_dedupe.py",
      "anu_v2/tests/test_executor_head_mismatch_fail_closed.py",
      "anu_v2/tests/test_executor_token_unavailable.py",
      "anu_v2/tests/test_polling_policy_long_polling_gate.py"
    ],
    "fixtures": [
      "anu_v2/fixtures/pr107_first_gemini_missing.json",
      "anu_v2/fixtures/gemini_stale_on_head_2556.json",
      "anu_v2/fixtures/executor_duplicate_dedupe.json",
      "anu_v2/fixtures/executor_head_mismatch.json",
      "anu_v2/fixtures/executor_token_unavailable.json",
      "anu_v2/fixtures/executor_bot_session_exit_then_scheduler_resume.json"
    ],
    "supporting": [
      "memory/reports/task-2556.md",
      "memory/events/task-2556.dispatch-decision.json",
      "memory/plans/tasks/task-2556/plan.md",
      "memory/plans/tasks/task-2556/context-notes.md",
      "memory/plans/tasks/task-2556/checklist.md"
    ]
  },
  "forbidden_paths": [
    "PR #98~#107 branch",
    "scripts/ci.sh",
    "dashboard/",
    "dispatch/__init__.py",
    "team_prompts.py",
    ".github/workflows/",
    ".env*",
    "main 직접 push",
    "POC 영역",
    "다른 anu_v2 modules outside expected_files"
  ],
  "chairman_essential_12": {
    "1_open_pr_idle_scan": "ExecutorScheduler.run_one_cycle + snapshot_provider DI",
    "2_pr_state_machine": "IdlePRDiagnoser.diagnose (8 states)",
    "3_first_gemini_trigger_missing": "30min grace boundary in IdlePRDiagnoser",
    "4_gemini_stale_on_head": "latest review commit_id != head_sha branch",
    "5_owner_trigger_required_decision": "emit_owner_trigger_decision reused",
    "6_runner_auto_invocation": "invoke_from_scheduler adapter",
    "7_decision_audit_markers": "record_owner_trigger_outcome + scheduler audit JSONL",
    "8_scheduled_event_driven_recheck": "run_one_cycle single-pass, chat_notifications=0",
    "9_long_polling_forbidden": "polling_policy.py code gate (15min/30min/1 recheck)",
    "10_same_head_dedupe": "audit _has_active_trigger + fcntl _scheduler_lock",
    "11_token_boundary": "assert_scheduler_token_boundary + 5 forbidden token names",
    "12_bot_session_resume": "audit JSONL + markers persisted, external cron re-entry"
  },
  "chairman_forbidden_16_assertions": [
    "markdown_only=0 (5 code + 6 fixture + 7 test created)",
    "memory_marker_only=0",
    "manual_gemini_review_fallback=0",
    "close_reopen=0",
    "force_rebase_admin=0",
    "bot_gemini_review_comment=0 (endpoint hard-block)",
    "same_pr_push_after_fresh=0",
    "auto_plus_one_chain=0",
    "long_polling=0 (polling_policy gate + 14 tests)",
    "worktree_isolation_violation=0 (.worktrees/task-2556-dev5)",
    "owner_pat_live=0",
    "gh_token_fallback=0",
    "other_pr_contamination=0",
    "empty_commit=0",
    "scheduler_chat_notification=0",
    "owner_token_misuse=0"
  ],
  "verification_results": {
    "baseline_anu_v2_tests": 262,
    "new_anu_v2_tests": 53,
    "total_anu_v2_tests_passing": 315,
    "long_polling_violations": 0,
    "chat_notifications_in_audit": 0,
    "pr_98_to_107_branches_changed": 0
  },
  "dispatch_timestamp_utc": "2026-05-12T10:46:23+00:00",
  "executor_chat_id": 6937032012
}
