{
  "schema": "pr132.gemini_auto_remediation.v1",
  "ts_kst": "2026-05-22 18:20 KST",
  "pr": 132,
  "pr_title": "L1+L2: anu_v3 dependency closure + callback enforcement reflection (task-2628/2627)",
  "branch": "task/task-2628-l1l2-anu-v3-callback-reflection",
  "base_main": "4b3fde25",
  "head_before_remediation": "d5688c6f",
  "head_after_remediation": "25ddbf4e",
  "remediation_commit": "25ddbf4e",
  "doctrine": "feedback_gemini_medium_auto_remediation_260522 (회장 2026-05-22)",
  "gemini_medium_count": 5,
  "disposition": {
    "fixed": 4,
    "reasoned_resolve": 1
  },
  "items": [
    {
      "file": "anu_v3/callback_4tuple_registry.py",
      "issue": "_iter_records read_text() 전체 메모리 로딩",
      "action": "FIX",
      "fix": "with open() 라인 스트리밍 전환(메모리 상한 고정). fail-safe(OSError/JSONDecodeError/TypeError skip) 동일. 스모크 검증 완료."
    },
    {
      "file": "anu_v3/dispatch_callback_contract.py",
      "issue": "run_self_check 하드코딩 /home/jay/workspace",
      "action": "FIX",
      "fix": "os.environ.get('WORKSPACE_ROOT', '/home/jay/workspace') env override(repo 컨벤션 동형·기본값 보존). import os 추가."
    },
    {
      "file": "dispatch/normal_fallback_callback_helper.py",
      "issue": "CANONICAL_ROOT 하드코딩",
      "action": "REASONED_RESOLVE",
      "rationale": "launcher 가 canonical_root == CANONICAL_ROOT 로 검증(STATUS_CANONICAL_ROOT_INVALID)하는 +39 canonical-root 고정 보안 불변식. env/cwd 파생 시 '어떤 경로든 valid' 가 되어 검증 무력화 + test 6건이 리터럴에 결합 → blind-apply 부적합. 원문 유지 + 주석 추가(코멘트로 사유 게시)."
    },
    {
      "file": "utils/completion_callback_fallback_cancel.py",
      "issue": "binary /usr/local/bin/cokacdir 하드코딩",
      "action": "FIX",
      "fix": "os.environ.get('COKACDIR_BIN', '/usr/local/bin/cokacdir') env override(기본값 보존). 실 호출은 운영 collector·dry_run=False 만."
    },
    {
      "file": "tests/regression/test_anu_v3_dependency_isolation_2628.py",
      "issue": "SRC 하드코딩 /home/jay/workspace",
      "action": "FIX",
      "fix": "os.environ.get('WORKSPACE_ROOT', '/home/jay/workspace')(tests/conftest.py 동형·기본값 보존 + CI/worktree 이식성)."
    }
  ],
  "verification": {
    "py_compile": "OK (5 files)",
    "targeted_regression_worktree": "L1 isolation 8/8 + L2 enforcement 10/10 = 18 passed (WORKSPACE_ROOT=worktree → worktree 코드 검증)",
    "iter_records_smoke": "유효 레코드 파싱·손상/빈줄/unknown-key fail-safe skip·파일부재 [] 동작 동일 확인",
    "full_regression_worktree": "851 passed / 3 failed(pre-existing test_stash_origin_audit_compat, 본 PR 무관) / 11 skipped / 0 new fail"
  },
  "gates_after_remediation": {
    "ci_checks": "11/11 PASS (cancel-kill-switch·ci/guard·gemini-review-gate·guard·hidden-path-audit·lock-in-check·merge-safety-check·phase3-merge-gate·qc-check·taskctl-state-guard x2)",
    "gemini_review_gate": "PASS (새 HEAD 25ddbf4e 재리뷰, 신규 thread 0)",
    "phase3_merge_gate": "PASS",
    "unresolved_threads": 0,
    "total_threads": 5,
    "mergeStateStatus": "CLEAN",
    "mergeable": "MERGEABLE",
    "diff_files_vs_main": 22,
    "forbidden_path": 0,
    "raw_credential": 0,
    "task_2625_introduction": 0,
    "l3_classifier_conflict": 0
  },
  "push_method": "TASKCTL_BYPASS (lock not provisioned for relayer worktree; evidence .tasks/evidence/task-2628/)",
  "merge_status": "MERGE_READY — 회장 별도 승인 대기 (자체 merge 금지)",
  "same_pr_push_note": "Gemini medium auto-remediation doctrine(260522)에 따른 same-PR push. gemini-review-gate 가 새 HEAD 재리뷰 후 PASS 하여 최종 머지 HEAD 가 Gemini 검증됨(구 same-PR-push 우려 해소, PR #131 51baef22 선례 동일)."
}
