{
  "schema": "auto_merge_failure_critical7_fixture.v1",
  "track": "Track G — MERGE_QUEUE_AND_AUTO_MERGE_READINESS_AUDIT",
  "ts_kst": "2026-05-21 04:45 KST",
  "mode": "fixture design · proposal-only · 실 merge/PR/credential write 0",
  "purpose": "자동 머지 실패 시 Critical7 분류 fixture 설계 — 실제 머지 없이 분류 로직만 검증",
  "fixture_design": [
    {
      "fixture_id": "AMF1",
      "scenario": "forbidden path 변경 detected (예: .github/workflows/*)",
      "expected_classification": "Critical7 · FORBIDDEN_PATH_TRIGGERED",
      "is_critical7": true,
      "rationale": "회장 verbatim 14조건 #3 'forbidden path 0' 위반 · 즉시 보고",
      "code_wire": "utils/merge_queue_executor.py:detect_forbidden_paths (L473)"
    },
    {
      "fixture_id": "AMF2",
      "scenario": "OWNER_PAT detected as merge token",
      "expected_classification": "FAIL_CLOSED · OWNER_PAT_FALLBACK_BLOCKED",
      "is_critical7": true,
      "rationale": "회장 verbatim 14조건 #12 'OWNER PAT 사용 0' 위반 · doctrine feedback_owner_trigger_only_capability",
      "code_wire": "select_merge_token_decision src='OWNER_PAT' → allow_merge=False (L351-354)"
    },
    {
      "fixture_id": "AMF3",
      "scenario": "HEAD SHA lock mismatch (squash 시 HEAD 가 lock 와 다름)",
      "expected_classification": "FAIL_CLOSED · HEAD_SHA_LOCK_BROKEN",
      "is_critical7": true,
      "rationale": "회장 verbatim 14조건 #10 'HEAD SHA lock match' 위반 · 머지 중단",
      "code_wire": "assert_head_sha_lock (L874) + HEAD_SHA_LOCK_BROKEN (L123)"
    },
    {
      "fixture_id": "AMF4",
      "scenario": "post-merge smoke FAIL",
      "expected_classification": "Critical7 · POST_MERGE_SMOKE_FAILED",
      "is_critical7": true,
      "rationale": "회장 verbatim regression #15 'post-merge smoke failure → Critical7'",
      "code_wire": "POST_MERGE_SMOKE_HOOK + post_merge_smoke_runner.py SmokeStatus.FAIL 분기"
    },
    {
      "fixture_id": "AMF5",
      "scenario": "replacement PR creation 실패 (GitHub API error)",
      "expected_classification": "Critical7 · REPLACEMENT_PR_CREATION_FAILED",
      "is_critical7": true,
      "rationale": "회장 verbatim regression #14 'replacement PR failure → Critical7' (Track F 연계)",
      "code_wire": "Track F — anu_v2/replacement_pr_runner.py + v3 chaining 별도 audit"
    },
    {
      "fixture_id": "AMF6",
      "scenario": "dependency cycle detected",
      "expected_classification": "Critical7 · DEPENDENCY_CYCLE_DETECTED",
      "is_critical7": true,
      "rationale": "회장 verbatim regression #13 'dependency cycle → Critical7'",
      "code_wire": "check_predecessor_merged (L368) · cycle 명시 처리 PARTIAL",
      "note": "PARTIAL — cycle detector 별도 audit"
    },
    {
      "fixture_id": "AMF7",
      "scenario": "credential raw exposure 시도 (token 평문 cron/log/PR comment)",
      "expected_classification": "Critical7 · CREDENTIAL_EXPOSURE",
      "is_critical7": true,
      "rationale": "회장 verbatim '즉시 보고 조건: credential/permission expansion'",
      "code_wire": "bot_merge_identity.py L137-205 raw token logging 차단 + redaction invariant"
    },
    {
      "fixture_id": "AMF8",
      "scenario": "same-branch push 시도 (squash 후 동일 branch 에 amend push)",
      "expected_classification": "FAIL_CLOSED · assert_no_forbidden_git_flags raise",
      "is_critical7": true,
      "rationale": "doctrine feedback_same_pr_push_after_gemini_doctrine_enforcement",
      "code_wire": "assert_no_forbidden_git_flags (L303)"
    },
    {
      "fixture_id": "AMF9",
      "scenario": "shared invariant break 시도 (CLOSED_ALL_SETTLED 산출물 변조 등)",
      "expected_classification": "Critical7 · SHARED_INVARIANT_BROKEN",
      "is_critical7": true,
      "rationale": "회장 verbatim '즉시 보고 조건: shared invariant break'"
    },
    {
      "fixture_id": "AMF10",
      "scenario": "scope expansion 시도 (allowlist 외 파일 변경)",
      "expected_classification": "Critical7 · SCOPE_EXPANSION",
      "is_critical7": true,
      "rationale": "회장 verbatim '즉시 보고 조건: scope expansion'",
      "code_wire": "compare_effective_diff (L445) + _normalize_file_list (L441)"
    }
  ],
  "regression_implementation_proposal": {
    "test_file_candidate": "tests/regression/test_auto_merge_failure_critical7.py (신규)",
    "dependencies": ["utils/merge_queue_executor.py", "utils/post_merge_smoke_runner.py", "utils/bot_merge_identity.py"],
    "execution_mode": "mock-based · 실 GitHub API 호출 0 · subprocess 0 · 실 머지 0",
    "fixture_data": "memory/fixtures/auto_merge_failure_critical7_*.json (AMF1~AMF10 input states)"
  },
  "summary": {
    "total_fixtures": 10,
    "is_critical7_count": 10,
    "fully_wired_count": 8,
    "partial_wired_count": 2,
    "code_evidence_coverage": "8/10 fully wired · 2/10 partial (cycle detector + replacement PR v3 chaining)"
  },
  "auto_progress": false,
  "chair_approval_required": true,
  "scope_invariants_preserved": [
    "fixture design only", "실 execution 0", "실 머지 0", "실 PR open 0",
    "PR/merge/branch/credential write 0", "Track C 미접촉", "zombie cron 미접촉",
    "CLOSED_ALL_SETTLED 산출물 byte-0"
  ]
}
