{
  "schema": "replacement_pr_runner_baseline_reaudit.result.v1",
  "task_name": "TRACK_F_REPLACEMENT_PR_BASELINE_REAUDIT",
  "ts_kst": "2026-05-21 09:45 KST",
  "mode": "read-only audit only · 자동 remediation 0",
  "trigger": "ANU 직전 audit baseline error 정정 (회장 2026-05-21 결정) · task-2623 페룬 HOLD_SPEC_DRIFT_DETECTED F2 finding",
  "verdict": "BASELINE_INVERTED — 직전 audit '0 lines stub · anu_v2 가 실 구현' 결론 역전 · 실제 utils v1 (718L) = production sole source · anu_v2 (442L) = parallel · main repo caller 0",
  "10_chair_check_items": {
    "1_utils_HEAD_blob_sha_line": {
      "blob_sha": "1fa8b2d2d9b25288e7e55152fa73b763aad4551b",
      "line_count": 718,
      "verdict": "v1_PRODUCTION_BODY"
    },
    "2_origin_main_blob_sha_line": {
      "blob_sha": "1fa8b2d2d9b25288e7e55152fa73b763aad4551b",
      "line_count": 718,
      "verdict": "IDENTICAL_TO_HEAD"
    },
    "3_working_tree_sha_line": {
      "hash_object": "1fa8b2d2d9b25288e7e55152fa73b763aad4551b",
      "line_count": 718,
      "dirty": false,
      "verdict": "CLEAN_IDENTICAL · 3-way 완전 일치"
    },
    "4_active_callers": {
      "v1_utils_callers": [
        {"path": "utils/merge_queue_executor.py", "lines": [63, 84, 102, 162, 1120, 1255, 1745], "form": "import + REPLACEMENT_PR_RUNNER_HOOK + instance attribute + ReplacementPRRunner(runner=runner, dry_run=args.dry_run)", "type": "PRODUCTION_WIRED"},
        {"path": "tests/e2e/test_auto_merge_e2e_replay_2515.py", "lines": [41, 116, 689, 697], "form": "import + instantiate + wiring assertion", "type": "TEST"},
        {"path": "tests/regression/test_replacement_pr_runner_2510.py", "lines": [1, 20], "form": "import 다수 symbols", "type": "TEST_19_CASES"},
        {"path": "tests/regression/test_orchestration_runtime_2514.py", "lines": [87], "form": "import", "type": "TEST"}
      ],
      "anu_v2_callers_in_main_repo": [],
      "anu_v2_callers_note": "anu_v2.replacement_pr_runner 참조는 전부 .worktrees/* (옛 dev 작업 leftover) + anu_v2/tests/test_replacement_pr_runner_2537.py 자체 test 뿐. main repo (utils/dispatch/scripts/tests/regression/tests/e2e) caller = 0"
    },
    "5_existing_regression": {
      "test_replacement_pr_runner_2510": {"result": "19 passed in 0.15s", "exit_code": 0, "interpretation": "v1 production baseline intact · BH known issue 아님"},
      "anu_v2_test_2537": {"location": "anu_v2/tests/test_replacement_pr_runner_2537.py", "note": "v2 자체 test · main repo 외 isolated"}
    },
    "6_api_diff_v1_vs_v2": {
      "artifact_ref": "memory/events/replacement_pr_runner_api_diff_matrix.json",
      "summary": "v1 = 20 module-level funcs + ReplacementPRRunner(runner=None, dry_run=False, ...) + execute(pr_number, task_spec). v2 = 5 classes + 5 constants + ReplacementPRRunner(*, gh_runner, git_runner, audit_writer, ...) + 분리 메서드. init kwargs disjoint · execute interface 다름."
    },
    "7_module_level_functions": {
      "v1_count": 20,
      "v1_funcs": ["compare_effective_diff", "detect_forbidden_paths", "assert_no_forbidden_git_flags", "load_task_spec", "_default_runner", "assert_no_cherry_pick", "fetch_pr_metadata", "compute_effective_diff", "detect_contamination", "create_clean_replacement_branch", "transplant_expected_files", "commit_local", "push_branch", "commit_and_push", "precheck_local_replacement_diff", "assert_clean_working_tree", "open_replacement_pr", "post_replaced_comment", "validate_replacement_diff", "build_escalation_packet"],
      "v1_class": "ReplacementPRRunner (L402) + execute (L443)",
      "v1_cli": "main(argv) (L700)",
      "v2_count_module_funcs": 2,
      "v2_funcs": ["_now_iso", "_coerce_stream", "_extract_pr_number"],
      "v2_class": "ReplacementPRRunner (L116) + 5 dataclasses · class methods only (detect_contamination/preserve_original_pr/create_clean_replacement_pr/classify_failure/build_executor_contract)"
    },
    "8_v1_v2_coexistence_state": {
      "v1_location": "utils/replacement_pr_runner.py (718L)",
      "v1_role": "PRODUCTION_SOLE_SOURCE · merge_queue_executor 가 import + instantiate (L1745) · 곧 v3 import path 자체",
      "v2_location": "anu_v2/replacement_pr_runner.py (442L · sha256 303d55dee11daa87d4b7d2b3b0fe41b07ee6463be5774241940385244fdcd032)",
      "v2_role": "ISOLATED_PARALLEL · one-way isolation (anu_v2/* only) · main repo production caller 0 · 자체 test 만",
      "coexistence_verdict": "v1 = live · v2 = parallel/possibly-orphan. 두 모듈은 disjoint signature 로 공존하나 production path 는 v1 단일."
    },
    "9_merge_queue_usage": {
      "wire_point": "utils/merge_queue_executor.py L1745",
      "form": "replacement_runner=ReplacementPRRunner(runner=runner, dry_run=args.dry_run) if ReplacementPRRunner is not None else None",
      "hook_const": "REPLACEMENT_PR_RUNNER_HOOK = 'replacement_pr_runner' (L162)",
      "invocation": "W2 ctx.replacement_runner.execute() 호출 (L1255) · effective diff != expected_files 시 분기 (L11)",
      "verdict": "v1 이 merge queue 에서 실 사용 · dry_run 플래그 지원"
    },
    "10_safe_migration_option": {
      "artifact_ref": "memory/events/replacement_pr_runner_migration_options.json",
      "recommended": "OPT_V (NO_MIGRATION_NEEDED) — v1 이 이미 production sole source · utils/replacement_pr_runner.py 가 곧 v3 import path · 'v3 shim' 자체가 false-gap (직전 audit baseline error 산물). anu_v2 deprecation 검토는 별도 LOW backlog (OPT_W)."
    }
  },
  "baseline_error_root_cause": {
    "anu_prior_conclusion": "utils/replacement_pr_runner.py = 0 lines stub · anu_v2 가 실 구현",
    "measurement_method_flaw": "working-tree `wc -l` 단독 측정 · git ls-tree HEAD / origin/main blob 미확인",
    "actual_cause": "측정 시점 file 이 stash@{0} 'task-2623 stash other dirty files' 또는 과거 stash@{3} 'task-2569 ... utils/replacement_pr_runner.py' 로 빠져있던 중간상태",
    "correction": "3-way blob sha (HEAD=origin/main=working-tree=1fa8b2d2) 모두 718 lines · v1 production body 확정",
    "meta_lesson": "audit baseline 확정 시 working-tree wc -l 단독 신뢰 금지 → HEAD blob / origin/main blob / working-tree 3-way 교차검증 필수 (feedback_merge_status_cross_verify 의 audit 버전)"
  },
  "downstream_impact": {
    "invalidated_artifacts": [
      "memory/events/replacement_pr_dry_run_matrix.json (utils stub 가정)",
      "memory/events/auto_pr_creation_readiness.result.json (v3 module gap 가정)",
      "memory/events/replacement_pr_v3_gap_closure.result.json (0 lines 재확인 가정)",
      "memory/events/replacement_pr_v3_adapter_proposal.json (thin shim 가정)",
      "memory/events/replacement_pr_dry_run_fixture_matrix.json (anu_v2 sole source 가정)"
    ],
    "still_valid_artifacts": [
      "memory/events/merge_gate_14_condition_matrix.json (utils/merge_queue_executor.py 직접 audit · replacement runner 무관)",
      "memory/events/merge_queue_14_condition_matrix_v2.json",
      "memory/events/bot_token_redacted_preflight.json",
      "memory/events/reconcile_evidence_contract_proposal.json"
    ],
    "task_2623_status": "BOARDED_HOLD → 회장이 보류 결정 · 기존 spec REJECT",
    "task_2624_reconcile_evidence": "독립적으로 진행 가능 (replacement runner baseline 과 무관)"
  },
  "critical7_assessment": {
    "is_critical7": false,
    "rationale": "read-only audit · 코드 변경 0 · PR/merge/credential write 0 · baseline error 정정은 거버넌스 정합 (페룬 9-R doctrine + 회장 cross-verify)",
    "shared_invariant_broken": false
  },
  "scope_invariants_preserved": [
    "read-only audit only", "자동 remediation 0",
    "코드 변경 0", "PR open 0", "branch 0", "commit/push 0", "merge 0",
    "GitHub write 0", "credential raw exposure 0",
    "anu_v2 변경 0", "utils replacement runner 변경 0",
    "Track C 미접촉", "zombie cron 미접촉",
    "CLOSED_ALL_SETTLED 산출물 byte-0"
  ],
  "auto_progress": false,
  "chair_approval_required": true
}
