{
  "schema": "queue_head_dry_run.v1",
  "track": "Track G — MERGE_QUEUE_AND_AUTO_MERGE_READINESS_AUDIT",
  "ts_kst": "2026-05-21 04:45 KST",
  "mode": "read-only · dry-run · 실 merge 0 · PR open 0 · branch/commit/push 0",
  "purpose": "queue head 판정 결선 + dependency chain validation + serial_only lock 결선 검증",
  "static_findings": [
    {
      "id": "QH1",
      "name": "check_predecessor_merged 결선",
      "verdict": "WIRED",
      "evidence": "utils/merge_queue_executor.py:check_predecessor_merged (L368) — dependency 항목 중 .merged 상태 task 모두 main 반영 여부 확인 + main_log_grep callable 주입 가능",
      "wait_state": "WAITING_FOR_PREDECESSOR (L121)"
    },
    {
      "id": "QH2",
      "name": "QueueDecision dataclass 결선",
      "verdict": "WIRED",
      "evidence": "utils/merge_queue_executor.py:QueueDecision class (L223) — dependency/serial_only/merge_state 등 분기 결정 carrier"
    },
    {
      "id": "QH3",
      "name": "serial_only collision 분리 검증",
      "verdict": "PARTIAL_WIRED",
      "evidence": "QueueDecision/TaskSpec class 의 serial_only flag 처리 · 명시 함수(check_serial_lock 류) 별도 audit 권고",
      "wait_state": "WAITING_FOR_SERIAL_LOCK (가정)",
      "remediation_proposal": "별도 chair-authorized task — serial_only collision detector 명시 함수 + unit fixture"
    },
    {
      "id": "QH4",
      "name": "dependency cycle detection",
      "verdict": "PARTIAL_WIRED",
      "evidence": "check_predecessor_merged 가 cycle 명시 처리 별도 audit 필요 · dependency list 순회는 정상이나 cycle 발견 시 Critical7 분류 분기 별도 명문 부재",
      "remediation_proposal": "별도 chair-authorized task — dependency cycle detector + Critical7 fixture"
    }
  ],
  "queue_head_dry_run_matrix": [
    {
      "scenario_id": "QHD1",
      "scenario": "dependency 없음 (queue head)",
      "expected_state": "MERGE_CANDIDATE_READY (나머지 13조건 충족 가정)",
      "wired_in_code": true,
      "evidence": "check_predecessor_merged 가 빈 dependency 시 즉시 True 반환"
    },
    {
      "scenario_id": "QHD2",
      "scenario": "dependency 1건 · 선행 task .merged 상태 + main 반영 완료",
      "expected_state": "MERGE_CANDIDATE_READY",
      "wired_in_code": true,
      "evidence": "main_log_grep callable 로 main 반영 검증"
    },
    {
      "scenario_id": "QHD3",
      "scenario": "dependency 1건 · 선행 task .merged 미달성",
      "expected_state": "WAITING_FOR_PREDECESSOR",
      "wired_in_code": true,
      "evidence": "pending 리스트 누적 · wait_state L121 분기"
    },
    {
      "scenario_id": "QHD4",
      "scenario": "dependency 2건 (병렬 선행) · 모두 .merged",
      "expected_state": "MERGE_CANDIDATE_READY",
      "wired_in_code": true,
      "evidence": "리스트 순회 + 누적 검증"
    },
    {
      "scenario_id": "QHD5",
      "scenario": "serial_only=True + 다른 serial_only task 동시 진행",
      "expected_state": "WAITING_FOR_SERIAL_LOCK",
      "wired_in_code": "PARTIAL",
      "note": "QueueDecision flag 처리 · 명시 lock 함수 별도 audit"
    },
    {
      "scenario_id": "QHD6",
      "scenario": "dependency cycle (A → B → A)",
      "expected_state": "Critical7 · DEPENDENCY_CYCLE_DETECTED",
      "wired_in_code": "PARTIAL",
      "note": "cycle detector 명시 분기 별도 audit"
    }
  ],
  "summary": {
    "total_findings": 4,
    "wired_count": 2,
    "partial_wired_count": 2,
    "not_wired_count": 0,
    "remediation_proposals": 2,
    "scope_invariants_preserved": ["read-only", "dry-run", "no PR/merge/branch/credential write"]
  },
  "verdict": "PASS_WITH_PARTIAL — queue head core (check_predecessor_merged + QueueDecision) WIRED. serial_only collision detector + dependency cycle detector 명시 함수는 PARTIAL, 별도 chair-authorized task remediation proposal 발행.",
  "scope_invariants_preserved": [
    "read-only audit", "dry-run", "실 merge 0", "PR open 0",
    "branch/commit/push 0", "GitHub write 0", "credential raw exposure 0"
  ]
}
