{
  "marker_version": "v1",
  "marker_type": "p2_exit_path_coverage_audit_decision_p2a_needs_contract_refinement_260529",
  "recorded_at": "2026-05-29T15:00:00+09:00",
  "recorded_by": "ANU_chair_facing_session_p2_design_verification_read_only",
  "source_attribution": "RECEIVED_INBOUND_THIS_SESSION (★ 회장 verbatim 'P2-A 구현으로 바로 가지 마라 · 먼저 P2 설계 검증을 수행한다' + 'read-only 만 · 코드 수정 금지 · dispatch 금지 · PR 금지 · branch push 금지 · merge 금지' + 'STEP 1~5 형식 verbatim' + 'evidence 만 사용 · 추정은 hypothesis 로 분리' · '끝' sentinel 정합)",

  "scope": "READ_ONLY_DESIGN_VERIFICATION_ONLY",
  "anu_mutating_action_count": 2,
  "anu_mutating_action_details": [
    "1. memory/specs/p2_exit_path_coverage_audit_260529.md (★ audit spec 작성)",
    "2. memory/events/p2_exit_path_coverage_decision_260529.json (★ 본 marker)"
  ],
  "anu_forbidden_action_count": 0,
  "anu_p2a_implementation_count": 0,
  "anu_code_modification_count": 0,
  "anu_dispatch_count": 0,

  "STEP_1_EXIT_PATH_COLLECTION_SUMMARY": {
    "finish_task_sh_total_lines": 1569,
    "total_exit_points_count": 41,
    "classification_9_enum_verbatim": {
      "success_exit_main_bash": [67, 80, 510, 526],
      "success_exit_python_helper": [117, 132, 161, 192, 203, 208, 211, 222],
      "qc_fail": [359, 377],
      "scope_guard_fail": [451, 707],
      "taskctl_fail": [483, 492],
      "dirty_workspace_fail": [1373, 1512],
      "escalation_path": [470, 505, 521, 1012],
      "callback_path": [1149],
      "fail_fast_exit_generic": [282, 321, 531, 535, 571, 616, 717, 779, 804, 976, 1015, 1052, 1088, 1197, 1255, 1290]
    },
    "callback_gate_positions": {
      "layer_1_validator": "L1106-1160 (★ NORMAL-CALLBACK-ENFORCE · envelope check + 4-source validator)",
      "layer_2_registrar": "L1532-1558 (★ task-2626 + task-2661 Phase 2b · helper launch 실제 cron registration)"
    }
  },

  "STEP_2_REACHABILITY_AGGREGATION": {
    "callback_reachable_YES_count": 0,
    "callback_reachable_NO_count": 33,
    "callback_reachable_N_A_nested_helper_count": 8,
    "total": 41,
    "task_2707_production_evidence_path": "L377 fail-fast exit 1 → L1106 미진입 → L1532 미진입 → callback 미등록 (★ memory/events/task-2707.implementation-pass-routing-fail-260529.json)"
  },

  "STEP_3_R1_R5_COVERAGE_JUDGMENT": {
    "R1_callback_before_failfast": {
      "verdict": "NOT_COVERED",
      "evidence": "★ L1106 / L1532 둘 다 fail-fast 이후 위치 · 29 fail_fast exit 1 path 가 모두 L1106 이전"
    },
    "R2_envelope_guarantees_registration": {
      "verdict": "NOT_COVERED",
      "evidence": "★ task-2707 evidence: envelope (800 bytes) 존재 + L377 exit 1 → L1532 helper launch 미실행 · envelope 존재 ≠ 등록 보장"
    },
    "R3_all_exit_path_decisive_pass": {
      "verdict": "NOT_COVERED",
      "evidence": "★ 41 exit 중 callback gate 도달 0건 · success path 4건도 callback 단계 통과 0 (★ L510/L526 BLOCKED/ESCALATED 도 callback gate 우회)"
    },
    "R4_idempotent_registration": {
      "verdict": "NOT_COVERED",
      "evidence": "★ L1550 helper launch 단일 호출 · idempotency key 또는 duplicate-check 코드 0건 · cron_id 패턴 task_id::callback_kind 부분 적용은 task-2626 callback-launch.json verbatim 정합 (★ partial evidence only)"
    },
    "R5_marker_on_failure": {
      "verdict": "PARTIALLY_COVERED",
      "evidence": "★ L1130-1149 emit_not_registered_marker 가 {task_id}.normal-callback-not-registered.json 발행 · 단 L1106-1149 block 내부에서만 작동 · 29 fail_fast exit 1 path 중 28건은 L1106 이전 → marker 미발행 (★ task-2707 evidence: .normal-callback-not-registered.json 부재)"
    },
    "summary": "FULLY_COVERED=0 · PARTIALLY_COVERED=1 · NOT_COVERED=4 · UNKNOWN=0"
  },

  "STEP_4_NEW_CANDIDATE_RULES_9_R6_R14_chair_verbatim_format": {
    "format_chair_verbatim": "candidate_rule + reason + affected_exit_paths (★ 구현안 작성 금지)",
    "candidates": {
      "R6": {
        "candidate_rule": ".cancelled / BLOCKED / ESCALATED success exit 0 경로에서 callback registration 의도를 (a) SKIP 명시 또는 (b) register 강제 둘 중 하나로 명시해야 한다",
        "reason": "GAP-1 — intentional vs accidental skip 분리 0",
        "affected_exit_paths": [67, 80, 470, 510, 526]
      },
      "R7": {
        "candidate_rule": "python helper 내부 sys.exit() 는 main control flow 외부로 spec 적용 대상에서 명시적 제외해야 한다",
        "reason": "GAP-2 — nested helper subprocess exit 적용 회피",
        "affected_exit_paths": [117, 132, 161, 192, 203, 208, 211, 222]
      },
      "R8": {
        "candidate_rule": "callback registration 의 enforcement 위치는 (a) Layer 1 validator (bot self-register 검증) (b) Layer 2 registrar (finish-task 직접 register) 둘을 명확히 분리하고 각 layer 의 enforcement 시점을 spec 에 명시해야 한다",
        "reason": "GAP-3 + GAP-8 — Layer 1 / Layer 2 분리 모호 + recursion 위험",
        "affected_exit_paths": [282, 321, 531, 535, 571, 616, 717, 779, 804, 976, 1015, 1052, 1088, 1197, 1255, 1290, 1149]
      },
      "R9": {
        "candidate_rule": "qc_fail / scope_guard_fail / taskctl_fail / dirty_workspace_fail / escalation_path / generic fail_fast 각 분류마다 callback kind (normal / fail_fast / escalate / hold_for_chair / verifier_result / fallback) 매핑을 명시해야 한다",
        "reason": "GAP-4 + GAP-5 + GAP-6 + GAP-7 + GAP-9 — kind 분류 모호",
        "affected_exit_paths": [359, 377, 451, 707, 483, 492, 505, 521, 1012, 1373, 1512]
      },
      "R10": {
        "candidate_rule": "callback_path 자체 fail (Layer 1 validator self-fail) 시 recursion 회피 spec 명시 + Layer 2 fallback 트리거 여부 결정",
        "reason": "GAP-8 — Layer 1 self-fail recursion 위험",
        "affected_exit_paths": [1149]
      },
      "R11": {
        "candidate_rule": "callback registration 의 '결정성 1회 통과' 정의를 (a) 시도 횟수 (b) 시간 한계 (c) idempotency key 패턴 셋 모두로 spec 에 명시해야 한다",
        "reason": "R3/R4 PARTIALLY/NOT_COVERED 보완",
        "affected_exit_paths": "ALL_41"
      },
      "R12": {
        "candidate_rule": "spec 의 task_type 7종 (code/system_hook/local_runtime/formalization_commit_only/read_only/callback_only/closeout_marker_only) × 9 exit 분류 = 63 cell 매트릭스 작성 spec 필요 (★ P1-B 192-cell matrix 정합 패턴)",
        "reason": "task_type 별 callback kind 매핑 모호",
        "affected_exit_paths": "ALL_41"
      },
      "R13": {
        "candidate_rule": "spec 적용 범위 (in_scope) 와 명시적 적용 제외 (out_of_scope · python helper / nested subprocess / system task) 분리 spec 필요",
        "reason": "GAP-2 + spec drafting boundary 모호",
        "affected_exit_paths": [117, 132, 161, 192, 203, 208, 211, 222]
      },
      "R14": {
        "candidate_rule": "callback marker 와 escalation marker 가 동일 exit point 에서 발행될 때 양 marker 의 우선순위 + 동시 발행 가능 여부 spec 필요",
        "reason": "GAP-7 — marker trail 분리 모호",
        "affected_exit_paths": [505, 521, 1012]
      }
    },
    "anu_self_classification_count": 0,
    "anu_implementation_draft_count": 0,
    "format_compliance_verbatim": "★ candidate_rule + reason + affected_exit_paths 만 · 구현안 0 · 회장 verbatim 정합"
  },

  "STEP_5_FINAL_VERDICT": {
    "verdict_chosen": "P2-A_NEEDS_CONTRACT_REFINEMENT",
    "evidence_count_supporting_verdict": {
      "R1_R5_NOT_COVERED_count": 4,
      "R1_R5_PARTIALLY_COVERED_count": 1,
      "R1_R5_FULLY_COVERED_count": 0,
      "gap_identified_count": 9,
      "new_candidate_rule_count_R6_R14": 9,
      "task_2707_production_evidence_count": 1,
      "callback_reachable_yes_count": 0
    },
    "verdict_p2a_implementation_ready_rejected_reason": "★ R1~R5 4건 NOT_COVERED + 9 GAP 미해소 + 9 candidate rule 신규 필요 → 현재 contract 만으로 P2-A 구현 시 GAP-1~9 의 implicit 결정이 코드에 박힘 (★ doctrine drift 위험)",
    "anu_self_verdict_authority": "★ 0 — 회장 verbatim 2 enum (P2-A_IMPLEMENTATION_READY vs P2-A_NEEDS_CONTRACT_REFINEMENT) 중 evidence-only 선택"
  },

  "HYPOTHESIS_SEPARATED_3_NOT_EVIDENCE": [
    "★ hypothesis 1: Layer 1 validator (L1106) 의 envelope 존재 check 는 bot self-register doctrine 강제 의도 — finish-task 가 직접 register 하지 않는 것이 의도일 수도 있음 (★ 회장 결정 영역 · evidence 0)",
    "★ hypothesis 2: GAP-1 의 cancellation/BLOCKED/ESCALATED success exit 0 에서 callback skip 은 의도일 가능성 (★ task 자체가 cancel 된 경우 ANU 회수 불필요) — 단 spec 명시 0 (★ 회장 결정 영역)",
    "★ hypothesis 3: 9 candidate rule (R6~R14) 모두 P2-A 구현 전 spec 결정 필요한가 vs 일부는 P2-A 이후 별도 round 가능한가 (★ 회장 결정 영역)"
  ],

  "CHAIR_DECISION_PENDING_6_VERBATIM_AREAS": [
    "1. ★ R6~R14 9 candidate rule 채택 여부 (★ 각 rule 별 ACCEPT / REJECT / MODIFY)",
    "2. ★ R8 (Layer 1 validator ↔ Layer 2 registrar 분리) — 현재 두 layer 가 동시 존재하는 의도 / 사고 분리",
    "3. ★ R9 (exit 분류 × callback kind 매핑) — 9 분류 × 6 kind 매핑 회장 결정",
    "4. ★ R12 (task_type 7 × exit 9 = 63 cell matrix) — P1-B 192-cell 패턴 적용 여부",
    "5. ★ P2-A 진입 조건 — R6~R14 중 어디까지 채택되면 P2-A_READY 로 전환",
    "6. ★ task-2707 처리 — P2-A 구현 후 재검증 vs ANU 독립 verifier 대체 vs HOLD_FOR_CHAIR"
  ],

  "anu_self_full_accept_judgment_count": 0,
  "anu_self_p2_implementation_count": 0,
  "anu_self_task_2708_dispatch_count": 0,
  "anu_self_callback_cron_manual_registration_count": 0,
  "anu_self_finish_task_sh_modification_count": 0,

  "linked_markers": [
    "memory/specs/p2_exit_path_coverage_audit_260529.md (★ 본 round audit spec)",
    "memory/specs/p2_finish_task_callback_before_failfast_contract_draft_260529.md (★ R1~R5 verbatim 원본)",
    "memory/events/anu_p2_finish_task_routing_callback_registration_after_failfast_evidence_260529.json (★ STEP 1~4 evidence)",
    "memory/events/task-2707.implementation-pass-routing-fail-260529.json (★ 회장 verbatim 분류 고정)",
    "memory/events/task-2707.formalization-commit-260529.json (★ acceptance 7/7 PASS production evidence)",
    "memory/events/task-2707.escalate (★ system-auto-escalate)",
    "memory/events/p1b_finish_task_profile_contract_accepted_with_known_caveats_260529.json (★ C2 caveat lineage)",
    "scripts/finish-task.sh L1106-1160 (★ Layer 1 NORMAL-CALLBACK-ENFORCE validator)",
    "scripts/finish-task.sh L1532-1558 (★ Layer 2 callback runtime enforcement gate)",
    "scripts/finish-task.sh 41 exit points (★ §1.1 grep verbatim)"
  ]
}
