{
  "schema": "post_merge_smoke_reconcile_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 · 실 smoke 0 · 실 reconcile apply 0",
  "purpose": "post-merge smoke hook + lifecycle reconcile evidence 결선 검증",
  "static_findings": [
    {
      "id": "PMS1",
      "name": "POST_MERGE_SMOKE_HOOK 결선",
      "verdict": "WIRED",
      "evidence": "utils/merge_queue_executor.py:POST_MERGE_SMOKE_HOOK = post_merge_smoke_runner (L164) — post_merge_smoke_runner 모듈 import + hook callable 결선"
    },
    {
      "id": "PMS2",
      "name": "post_merge_smoke_runner 모듈 실 구현",
      "verdict": "WIRED",
      "evidence": "utils/post_merge_smoke_runner.py 590 lines · SmokeStatus enum · PostMergeSmokeRun dataclass · task_id→smoke_command registry"
    },
    {
      "id": "PMS3",
      "name": "POST_MERGE_SMOKE_FAILED Critical7 escalation",
      "verdict": "WIRED",
      "evidence": "post_merge_smoke_runner 가 smoke FAIL 시 POST_MERGE_SMOKE_FAILED Critical7 escalation packet 발행 · 회장 verbatim '15. post-merge smoke failure → Critical7' 정합",
      "critical7_trigger": "smoke FAIL → 즉시 Critical7"
    },
    {
      "id": "PMS4",
      "name": "post-merge smoke missing → HOLD",
      "verdict": "WIRED",
      "evidence": "POST_MERGE_SMOKE_HOOK 미정의(import 실패 또는 None) 시 HOLD 분기 — 회장 verbatim '13. post-merge smoke configured · 미정의 → HOLD' 정합"
    },
    {
      "id": "PMS5",
      "name": "lifecycle_reconciliation_manager 결선",
      "verdict": "PARTIAL_WIRED",
      "evidence": "utils/lifecycle_reconciliation_manager.py 존재 · 그러나 post_merge_smoke_runner 가 reconcile evidence 경로(파일 위치·schema) 결선 명시 별도 audit 권고",
      "wait_state": "HOLD (reconcile evidence missing)",
      "remediation_proposal": "별도 chair-authorized task — post_merge_smoke_runner ↔ lifecycle_reconciliation_manager evidence path contract 명문화"
    }
  ],
  "post_merge_smoke_dry_run_matrix": [
    {
      "scenario_id": "PMS_DR1",
      "scenario": "smoke hook 정의됨 + task_id smoke_command 등록됨 + smoke PASS",
      "expected_state": "MERGED_AND_VERIFIED",
      "wired_in_code": true,
      "evidence": "POST_MERGE_SMOKE_HOOK + SmokeStatus.PASS 분기"
    },
    {
      "scenario_id": "PMS_DR2",
      "scenario": "smoke hook 정의됨 + smoke FAIL",
      "expected_state": "Critical7 · POST_MERGE_SMOKE_FAILED",
      "wired_in_code": true,
      "evidence": "Critical7 escalation packet 발행"
    },
    {
      "scenario_id": "PMS_DR3",
      "scenario": "smoke hook 미정의 (POST_MERGE_SMOKE_HOOK None)",
      "expected_state": "HOLD",
      "wired_in_code": true,
      "evidence": "회장 14조건 #13 정합"
    },
    {
      "scenario_id": "PMS_DR4",
      "scenario": "smoke hook 정의됨 + task_id smoke_command 미등록",
      "expected_state": "HOLD (smoke_command_missing)",
      "wired_in_code": true,
      "evidence": "registry lookup miss"
    },
    {
      "scenario_id": "PMS_DR5",
      "scenario": "smoke PASS + reconcile evidence 결선됨",
      "expected_state": "MERGED_AND_RECONCILED",
      "wired_in_code": "PARTIAL",
      "note": "reconcile evidence path contract 별도 audit"
    },
    {
      "scenario_id": "PMS_DR6",
      "scenario": "smoke PASS + reconcile evidence 부재",
      "expected_state": "HOLD (reconcile_evidence_missing)",
      "wired_in_code": "PARTIAL",
      "note": "회장 14조건 #14 정합 · PARTIAL 상태"
    }
  ],
  "summary": {
    "total_findings": 5,
    "wired_count": 4,
    "partial_wired_count": 1,
    "not_wired_count": 0,
    "critical7_triggers": 1,
    "remediation_proposals": 1,
    "scope_invariants_preserved": ["read-only", "dry-run", "no smoke apply", "no reconcile apply"]
  },
  "verdict": "PASS_WITH_PARTIAL — post-merge smoke 5 모듈 #4 (task-2512) 결선 + Critical7 escalation 결선. lifecycle reconcile evidence path contract 는 PARTIAL · 별도 chair-authorized task 권고.",
  "scope_invariants_preserved": [
    "read-only audit", "dry-run", "실 smoke 0", "실 reconcile apply 0",
    "PR/merge/branch/credential write 0", "Track C 미접촉", "zombie cron 미접촉",
    "CLOSED_ALL_SETTLED 산출물 byte-0"
  ]
}
