# v3.1 Phase 3 Implementation Readiness — Integrated Packet (task-2676)

- spec_id: v3_1_phase_3_implementation_readiness_packet_260526
- task_id: task-2676
- track: J (★ V3_1_PHASE_3_IMPLEMENTATION_READINESS)
- 담당: dev5 마르둑
- chair_authorization_id: CHAIR-AUTH-V3-1-PHASE-3-IMPLEMENTATION-READINESS-PACKET-20260526-JJONGS-READINESS-001
- scope: ★ readiness packet only · 코드 구현 0 · PR 생성 0 · merge 0 · runtime 변경 0
- generated_at: 2026-05-26
- 단일소스: task-2676 task md + task-2668 Phase 2 packet 7종 + Phase 1 Core (task-2662)

## 0. 회장 verbatim anchor

- "범위: Phase 3 readiness packet only"
- "코드 구현 / PR / merge / runtime 변경 금지"
- "Phase 3 구현 별도 chair signature 강제" (보고 9항 권고)

## 1. Executive Summary

task-2668 V3_1_CODEX_MICRO_REFINEMENT_PHASE_2_PACKET_READY_WORKTREE_VERIFIED 확정(7 specs · 4-source PASS) 이후 Phase 3 구현 진입 전 readiness 검증 단계. 본 통합 packet은 4개 sub-spec(module_mapping / regression_candidates / integration_plan / paths_proposal)을 묶어 회장 single source로 제공한다. Phase 3 구현은 별도 task md + 별도 chair_authorization_id 발급 시점에 본 packet을 참조하여 시작한다.

## 2. 포함 6 (회장 verbatim 충족)

### 2.1 구현 대상 모듈 후보 (최소 6 module)
1. `utils/finding_v2_validator.py` — finding v2 schema (6 mandatory + 4 optional) 검증
2. `utils/loop_boundary_detector.py` — convergence-stuck (3-round 동일 finding 또는 10-round 3-medium 동일) 검출
3. `utils/pass_with_recommendations_processor.py` — 3-branch (A auto-remediation / B HOLD / C GO_READY) 로직
4. `utils/critical_7_cross_checker.py` — C7 7 enum 존재 여부 cross-check + history 누적
5. `utils/critical_7_hold_reason_prioritizer.py` — 8-stage hold_reason 우선순위 해소
6. `utils/ci_watch_handoff_builder.py` — micro_refinement_result → CI_WATCH_HANDOFF v1 12-field adapter

옵션 7번째: `utils/anu_callback_renderer.py` — UTF-8 ≤3900 bytes envelope helper(단순 json.dumps 충분 시 생략 가능)

기존 수정 1종 (additive only): `utils/anu_codex_micro_refinement_loop.py`
- `GATE_TO_HOLD_REASON` 3종 확장 (CREDENTIAL_EXPANSION / BLOCK_POLICY_EXPANSION / RUNTIME_POLICY_CHANGE)
- `run_micro_refinement` LOOP_BOUNDARY 체크 + PASS_WITH_RECOMMENDATIONS branching 호출
- `_build_go_ready_packet` / `_build_hold_packet`에 `phase_2_extension: Optional[Dict]` 인자 추가
- 신규 상수: `C7_ENUM_KEYS` (7-tuple), `HOLD_REASON_PRIORITY` (8-tuple), `TERMINAL_STATES` (5-list)

신규 schema 1종: `schemas/anu_v3_1_finding_v2.json` (JSON Schema draft-07)

상세 → `memory/specs/v3_1_phase_3_implementation_readiness_module_mapping_260526.md`

### 2.2 regression 후보 (Phase 3 추가될 케이스)

R20~R29 10건 — Phase 1 R1~R19 네이밍 컨벤션 그대로 (`test_R<NUM>_<snake_case>()`, fixture `_target()`, `_round()`):

- R20: LOOP_BOUNDARY — 3 consecutive rounds 동일 `path:line:subject`, auto_remediation_eligible=True, codex FAIL/UNKNOWN → `hold_reason="LOOP_BOUNDARY"`
- R21: LOOP_BOUNDARY — 10 rounds, 마지막 3 rounds 동일 medium recommendations → `hold_reason="LOOP_BOUNDARY"`
- R22: PASS_WITH_RECOMMENDATIONS Branch A — all medium + auto_remediation_eligible + within expected_files + C7 NEGATIVE → re-lint round entry → 다음 round PASS → GO_READY + `phase_2_extension.auto_remediation_applied` 박제
- R23: PASS_WITH_RECOMMENDATIONS Branch B — ≥1 HIGH finding → 즉시 HOLD_FOR_CHAIR
- R24: PASS_WITH_RECOMMENDATIONS Branch C — medium/low + 일부 path expected_files 외부 + C7 NEGATIVE → GO_READY + `remaining_findings` 보존
- R25: Critical7 cross-check NEGATIVE — 모든 gate_classification="none" → `critical_7_cross_check.result="NEGATIVE"`, `positive_gates_in_history=[]`
- R26: Critical7 cross-check POSITIVE — `gate_classification="forbidden_path"` → HOLD, `hold_reason="FORBIDDEN_WRITE_TARGET"` (priority 1), `c7_enum_triggered=["forbidden_path"]`
- R27: CI_WATCH_HANDOFF builder — GO_READY result + expected_files + watcher_owner → 12-field payload, `terminal_state="MERGE_READY"`, `gemini_nudge_policy.hard_limit=1`
- R28: Packet phase_2_extension.auto_remediation_applied — Branch A 결과에 `round` + `findings_remediated[].finding_id/priority/auto_remediation_eligible/path` 모두 포함
- R29: Packet phase_2_extension.critical_7_cross_check + ci_watch_handoff_hint — HOLD 결과에 `c7_enum_triggered` + `loop_boundary_triggered` + `critical_7_cross_check.result` + `ci_watch_handoff_hint.expected_terminal_state="CHAIR_REQUIRED"`

기존 R1~R19 회귀 0건 유지 (Phase 1 단일 파일 동결).

상세 → `memory/specs/v3_1_phase_3_implementation_readiness_regression_candidates_260526.md`

### 2.3 Critical7 hold integration plan

신규 상수 (Phase 1 Core에 additive):
- `C7_ENUM_KEYS = ("path_permission_expansion", "credential_expansion", "block_policy_expansion", "scope_expansion", "real_write_or_merge", "forbidden_path", "runtime_policy_change")`
- `HOLD_REASON_PRIORITY = ("FORBIDDEN_WRITE_TARGET", "CREDENTIAL_EXPANSION", "REAL_WRITE_REQUIRED", "GITHUB_WRITE_REQUIRED", "BLOCK_POLICY_EXPANSION", "RUNTIME_POLICY_CHANGE", "PERMISSION_EXPANSION", "SCOPE_EXPANSION", "ALLOWED_WRITE_PATH_VIOLATION", "CRITICAL_7")`

통합 지점:
- `run_micro_refinement` round_gates 수집 직후, recommendations 순회: `gate_classification ∈ C7_ENUM_KEYS` 또는 `priority == "HIGH"` 시 게이트 추가 + decision_items에 finding v2 7 필드 박제
- HOLD 결정 시 `prioritize_hold_reason(round_gates, c7_enums)` 호출
- `_build_hold_packet` 호출 시 `phase_2_extension={"c7_enum_triggered": [...], "loop_boundary_triggered": bool, "critical_7_cross_check": {...}, "ci_watch_handoff_hint": {...}}` 전달
- `_decision_item_for_gate(gate, offending_paths, finding=None)` — finding 인자 추가, finding=None인 경우 빈 문자열 또는 null (backward compat)

backward compat: Phase 1 R1~R19 통과 유지(additive only), safety_probe 8 키 검출 로직 변경 0, `enforce_allowed_write_paths` 시그니처 변경 0.

상세 → `memory/specs/v3_1_phase_3_implementation_readiness_integration_plan_260526.md`

### 2.4 PR watcher integration plan (CI_WATCH_HANDOFF 12 필드)

신규 builder: `utils/ci_watch_handoff_builder.py`
- `build_ci_watch_handoff_from_micro_refinement_result(result, target, *, pr_number, head_sha, branch, watcher_owner) -> Dict[str, Any]`
- `_infer_expected_terminal_state(result) -> str` (MERGE_READY / CHAIR_REQUIRED / LOOP_BOUNDARY / CI_FAILED_NON_REMEDIABLE / GEMINI_EXTERNAL_TRIGGER_STALE)

12 필드 매핑 (input → output):
1. `pr_number` (int) ← argument
2. `head_sha` (str, 40-char hex) ← argument (gh pr view 기반)
3. `branch` (str) ← argument or `target.pr_head_ref`
4. `expected_files` (list[str]) ← `target.allowed_write_paths` (verbatim copy)
5. `forbidden_paths` (list[str]) ← `target.forbidden_write_targets` (verbatim copy)
6. `watcher_owner` (str) ← argument (dev bot session id 또는 "cron-watcher")
7. `max_watch_minutes` (int) ← 상수 `DEFAULT_MAX_WATCH_MINUTES = 120`
8. `poll_interval_seconds` (int) ← 상수 `DEFAULT_POLL_INTERVAL_SECONDS = 60`
9. `gemini_nudge_policy` (dict) ← 상수 `DEFAULT_GEMINI_NUDGE_POLICY = {"router":"OWNER_GEMINI_TRIGGER_ROUTER","hard_limit":1,"fallback":"chair_ui_last_resort"}`
10. `auto_remediation_policy` (dict) ← 상수 `DEFAULT_AUTO_REMEDIATION_POLICY = {"scope":"expected_files_internal","priorities":["medium","low"],"hard_block":["HIGH","critical_7","credential_expansion","forbidden_path","real_write_or_merge","block_policy_expansion","runtime_policy_change"]}`
11. `callback_on_terminal_state` (bool) ← True (default)
12. `terminal_states` (list[str]) ← 상수 `TERMINAL_STATES = ["MERGE_READY","CHAIR_REQUIRED","GEMINI_EXTERNAL_TRIGGER_STALE","CI_FAILED_NON_REMEDIABLE","LOOP_BOUNDARY"]`

ANU callback 발사 책임 분리:
- 본 Phase 3 builder는 payload **생성**만 (ANU 자체 발사 0)
- 실제 callback 발사는 watcher 측 (dev bot 또는 cron-watcher) 책임 — Phase 3 범위 외
- 별도 schema(옵션): `schemas/anu_v3_ci_watch_terminal_callback.json` (payload v1 schema)

안전: ANU는 GitHub/CI 폴링 0 (`system_ci_watch_handoff_policy_spec_260523` §3 금지 4 준수), ANU key `c119085addb0f8b7` 단일 사용, BOT_GITHUB_TOKEN 사용 0.

상세 → `memory/specs/v3_1_phase_3_implementation_readiness_integration_plan_260526.md`

### 2.5 expected_files 후보 (Phase 3 task md용 verbatim)

```yaml
allowed_resources:
  paths:
    - "utils/finding_v2_validator.py"
    - "utils/loop_boundary_detector.py"
    - "utils/pass_with_recommendations_processor.py"
    - "utils/critical_7_cross_checker.py"
    - "utils/critical_7_hold_reason_prioritizer.py"
    - "utils/ci_watch_handoff_builder.py"
    - "utils/anu_callback_renderer.py"
    - "utils/anu_codex_micro_refinement_loop.py"
    - "schemas/anu_v3_1_finding_v2.json"
    - "schemas/anu_v3_ci_watch_terminal_callback.json"
    - "tests/anu_codex_micro_refinement_loop/test_finding_v2_schema.py"
    - "tests/anu_codex_micro_refinement_loop/test_loop_boundary.py"
    - "tests/anu_codex_micro_refinement_loop/test_pass_with_recommendations_branches.py"
    - "tests/anu_codex_micro_refinement_loop/test_critical_7_hold.py"
    - "tests/anu_codex_micro_refinement_loop/test_ci_watch_handoff_integration.py"
    - "tests/anu_codex_micro_refinement_loop/test_packet_examples_phase_2.py"
    - "memory/tasks/task-<Phase3_id>.md"
    - "memory/events/task-<Phase3_id>.*"
    - "memory/reports/task-<Phase3_id>.md"
    - "INDEX.md"
```

상세 → `memory/specs/v3_1_phase_3_implementation_readiness_paths_proposal_260526.md`

### 2.6 forbidden_paths 후보 (Phase 3 task md용 verbatim)

```yaml
  forbidden_paths:
    - "/home/jay/.claude/**"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "hooks/**"
    - "dispatch.py"
    - "dispatch/**"
    - "scripts/finish-task.sh"
    - "scripts/**"
    - "utils/anu_callback_registrar.py"
    - "utils/canonical_workspace_resolver.py"
    - "utils/worktree_resolver.py"
    - "utils/callback_collector_helper_integration.py"
    - "utils/**axis_1**"
    - "utils/**axis_2**"
    - "utils/axis_3_canary_scale_aware_guard/**"
    - "**/.env*"
    - "**/credentials*"
    - "memory/specs/v3_1_codex_micro_refinement_phase_2_*.md"
    - "memory/specs/system_ci_watch_handoff_policy_spec_260523.md"
    - "memory/specs/v3_6_*.md"
    - "memory/specs/backlog_*.md"
    - "memory/specs/worktree_promotion_*.md"
    - "memory/specs/pr_watcher_terminal_callback_*.md"
    - "memory/events/task-2662*"
    - "memory/events/task-2663*"
    - "memory/events/task-2664*"
    - "memory/events/task-2665*"
    - "memory/events/task-2666*"
    - "memory/events/task-2667*"
    - "memory/events/task-2668*"
    - "memory/events/task-2669*"
    - "memory/events/task-2670*"
    - "memory/events/task-2671*"
    - "memory/events/task-2672*"
    - "memory/events/task-2673*"
    - "memory/events/task-2674*"
    - "memory/events/task-2675*"
    - "memory/events/task-2676*"
```

상세 → `memory/specs/v3_1_phase_3_implementation_readiness_paths_proposal_260526.md`

## 3. sub-spec 4종 인덱스

- `memory/specs/v3_1_phase_3_implementation_readiness_module_mapping_260526.md` (#1 module mapping)
- `memory/specs/v3_1_phase_3_implementation_readiness_regression_candidates_260526.md` (#2 regression R20~R29)
- `memory/specs/v3_1_phase_3_implementation_readiness_integration_plan_260526.md` (#3 Critical7 hold + PR watcher integration)
- `memory/specs/v3_1_phase_3_implementation_readiness_paths_proposal_260526.md` (#4 expected_files + forbidden_paths)

## 4. 의존성 및 단일소스

- 본 task md: `memory/tasks/task-2676.md` (sha256: `ebcdf34bd67466cc8f52b3af451af3643f1b32e606cb63fe188a2faafdabba2e`)
- task-2668 Phase 2 packet 7종 (read-only reference):
  - planning_packet / critical_7_immediate_hold / pr_watcher_integration / input_schema_extension / pass_with_recommendations_policy / relint_loop_round_policy / go_ready_hold_packet_examples
- Phase 1 Core (task-2662 read-only):
  - `utils/anu_codex_micro_refinement_loop.py` / `utils/codex_cc_decision_loop.py` / `tests/anu_codex_micro_refinement_loop/test_regression_10.py`
- CI watch handoff governance (read-only):
  - `memory/specs/system_ci_watch_handoff_policy_spec_260523.md`

## 5. file overlap 검증

- task-2668 spec 7종 변경 0 (read-only reference만, forbidden_paths로 차단 확인)
- task-2670~2675 event/spec 변경 0 (forbidden_paths로 격리)
- task-2676 자체 readiness packet 5개 신규 파일 + result/report/done — 신규만, 충돌 0

## 6. forbidden_action_count

0 (코드 구현 0 / PR 생성 0 / merge 0 / runtime 변경 0 / utils·hooks·dispatch.py 변경 0 / live settings.json 변경 0 / task-2668 spec 변경 0)

## 7. recommended next action

★ **Phase 3 구현은 별도 task md + 별도 chair_authorization_id 발급 필수**

권장 절차:
1. 회장 1:1 보고 — 본 readiness packet 5종 확인
2. 회장 verbatim 결정: Phase 3 구현 진입 여부
3. GO 시: 신규 chair_authorization_id 발급 (예: `CHAIR-AUTH-V3-1-PHASE-3-IMPLEMENTATION-<DATE>-<MARKER>`)
4. 신규 task md (예: task-2700) 발급 — 본 readiness packet의 `allowed_resources` / `forbidden_paths` verbatim 복사
5. 권장 level: Lv.3 (utils 신규 6 + 회귀 테스트 6 — Phase 1/2와 동일 규모)
6. depends_on: [task-2668, task-2662]
7. merge_policy: "pr_with_gemini_review_required"
8. ttl_hours: 72

## 8. 안전 anchor

- 본 readiness packet의 chair_authorization_id는 **packet 작성용 한정승인**. 구현 권한 0.
- 회장 세션 적용 0 / ANU collector 적용 0
- task-2668 spec 7종 변경 0 (★ 핵심 anchor)
- code/utils/hooks/dispatch.py/scripts/finish-task.sh/.github/** 변경 0
- `/home/jay/.claude/**` / `/usr/local/bin/cokacdir` 변경 0
- ANU normal callback cron — helper 사용 (ANU key c119085addb0f8b7), self-key 0, UTF-8 ≤3900 bytes, envelope only, 절대 timestamp now+30s

## 9. 종결

성공: **`V3_1_PHASE_3_IMPLEMENTATION_READINESS_PACKET_READY`**

끝
