# task-2659 — SPAWN_VISIBILITY_GUARD_CANONICAL_PROMOTION_PHASE_1

- Level: Lv.4 (Phase 1 canonical promotion · main repo utils/tests 디렉터리 신규 추가 · PR 생성 허용 · auto-merge 0)
- 담당: dev6 페룬 (회장 verbatim executor 지정 · task-2658 직 executor 동일 · 본 guard 작성자)
- base: origin/main 최신 (현재 HEAD `d4098b04 task-2642`)
- 단일소스 spec: 본 task md + adoption packet `memory/events/spawn-visibility-guard-adoption-packet-260525.json`
- chair_authorization_id: **`CHAIR-AUTH-SPAWN-VISIBILITY-ADOPT-P1-20260525-JJONGS-CANONICAL-001`** (★ 회장 verbatim 1회성 발행 · ANU/봇 임의 생성 0)

## 배경

task-2658 SPAWN_VISIBILITY_FALSE_NEGATIVE_PREVENTION_GUARD_IMPLEMENTED 회장 인정 완료. 그러나 산출물이 worktree `/home/jay/workspace/.worktrees/task-2658-dev6/` 내부에만 존재 · main repo 공통 경로 부재 → ANU 공통 도구 채택 완료 아님. 본 task = Phase 1 canonical promotion (★ call site integration · ledger 확장은 Phase 2/3 별도 task · 본 라운드 금지).

## 회장 verbatim 결정 (1:1)

- adoption execution = option_a (direct PR via dev bot)
- 이번 라운드 = **Phase 1 canonical promotion만** (★ call site integration X · ledger 확장 X)
- executor = dev6 페룬
- 목표 = task-2658 worktree 내부 utils/tests를 main repo canonical path로 승격

## 소스 파일 위치 (★ task-2658 worktree에서 가져옴)

```
source: /home/jay/workspace/.worktrees/task-2658-dev6/utils/anu_spawn_visibility_guard/
  - __init__.py
  - path_resolver.py
  - source_collector.py
  - status_classifier.py
  - timeout_gate.py
source: /home/jay/workspace/.worktrees/task-2658-dev6/tests/anu_spawn_visibility_guard/
  - __init__.py
  - test_regression_6.py

target: /home/jay/workspace/utils/anu_spawn_visibility_guard/* (main repo · 신규 디렉터리)
target: /home/jay/workspace/tests/anu_spawn_visibility_guard/* (main repo · 신규 디렉터리)
```

★ `__pycache__/*` 제외 (runtime cache · adoption 0)

## 허용 7 (회장 verbatim 1:1)

1. `utils/anu_spawn_visibility_guard/*` canonical promotion
2. `tests/anu_spawn_visibility_guard/*` canonical promotion
3. task-2658 regression 7/7 재실행 (★ main repo 위치에서)
4. main repo에서 import smoke 실행 (★ `python3 -c "from utils.anu_spawn_visibility_guard import ..."`)
5. result/report/done marker 작성
6. PR 생성까지 허용
7. commit/push는 이 Phase 1 PR 생성을 위한 범위에서만 허용

## 금지 12 (회장 verbatim 1:1)

1. existing call site integration (★ utils/canonical_workspace_resolver.py / utils/worktree_resolver.py / utils/callback_collector_helper_integration.py / utils/lifecycle_reconciliation_manager.py / utils/merge_ready_states.py 등 호출 위치 import 추가 0)
2. dispatch.py 변경
3. live settings.json 변경
4. PreToolUse runtime 변경
5. Axis 1/2 runtime 변경
6. Axis 3 RUNNING 선언
7. full rollout
8. HARNESS_ENFORCED 전체 선언
9. policy 승격
10. BLOCK 정책 확대
11. ledger schema 확장
12. **auto-merge** (★ PR 생성만 · merge는 회장 verbatim 별도)

## Phase 분리 (회장 verbatim 명시)

- Phase 1: canonical promotion PR (★ 본 task)
- Phase 2: 기존 ANU spawn verification call site integration (★ 본 task 금지)
- Phase 3: callback ledger source label 확장 (★ 본 task 금지)

Phase 2/3는 별도 회장 승인 전까지 금지.

## 성공 조건 8 (회장 verbatim 1:1)

1. main repo `utils/anu_spawn_visibility_guard/*` 존재
2. main repo `tests/anu_spawn_visibility_guard/*` 존재
3. regression 7/7 PASS (★ task-2658 R1~R6 + R3-bonus)
4. import smoke PASS
5. forbidden_action_count = 0
6. observer chain 영향 0
7. PR 생성 완료
8. auto-merge 0

## 완료 상태 (회장 verbatim)

- 성공: **`SPAWN_VISIBILITY_GUARD_CANONICAL_PROMOTION_PR_READY`**
- 실패: **`SPAWN_VISIBILITY_GUARD_ADOPTION_HOLD_FOR_CHAIR`**

## 보고 필수 7 (회장 verbatim 1:1)

1. PR 번호
2. changed_files
3. regression 결과 (7/7 PASS 개별)
4. import smoke 결과
5. forbidden_action_count
6. observer chain 영향 여부
7. Phase 2/3 미수행 확인

## expected_files (~10)

- `utils/anu_spawn_visibility_guard/__init__.py` (★ main repo 신규)
- `utils/anu_spawn_visibility_guard/path_resolver.py` (★ main repo 신규)
- `utils/anu_spawn_visibility_guard/source_collector.py` (★ main repo 신규)
- `utils/anu_spawn_visibility_guard/status_classifier.py` (★ main repo 신규)
- `utils/anu_spawn_visibility_guard/timeout_gate.py` (★ main repo 신규)
- `tests/anu_spawn_visibility_guard/__init__.py` (★ main repo 신규)
- `tests/anu_spawn_visibility_guard/test_regression_6.py` (★ main repo 신규)
- `memory/events/task-2659.done`
- `memory/events/task-2659.spawn-visibility-guard-canonical-promotion-result-260525.json`
- `memory/reports/task-2659.md`

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "utils/anu_spawn_visibility_guard/**"
    - "tests/anu_spawn_visibility_guard/**"
    - "memory/system/.callback_ledger.jsonl"
    - "memory/system/.callback_dedupe_table.jsonl"
    - "memory/.callback_inbox/**"
    - "memory/tasks/task-2659.md"
    - "memory/reports/task-2659.md"
    - "memory/events/task-2659.done"
    - "memory/events/task-2659.spawn-visibility-guard-canonical-promotion-result-260525.json"
    - "memory/events/spawn-visibility-guard-adoption-packet-260525.json"
    - "INDEX.md"
  source_only_read_from_worktree:
    - "/home/jay/workspace/.worktrees/task-2658-dev6/utils/anu_spawn_visibility_guard/**"
    - "/home/jay/workspace/.worktrees/task-2658-dev6/tests/anu_spawn_visibility_guard/**"
  forbidden_paths:
    - "/home/jay/.claude/settings.json"
    - "/home/jay/.claude/settings.local.json"
    - "/home/jay/.claude/hooks/**"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "schemas/**"
    - "hooks/**"
    - "dispatch.py"
    - "scripts/finish-task.sh"
    - "utils/replacement_pr_runner.py"
    - "utils/canonical_workspace_resolver.py"
    - "utils/worktree_resolver.py"
    - "utils/callback_collector_helper_integration.py"
    - "utils/lifecycle_reconciliation_manager.py"
    - "utils/merge_ready_states.py"
    - "utils/**axis_1**"
    - "utils/**axis_2**"
    - "utils/axis_3_canary_scale_aware_guard/**"
    - "memory/tasks/task-2641*"
    - "memory/tasks/task-2642*"
    - "memory/tasks/task-2643*"
    - "memory/tasks/task-2644*"
    - "memory/tasks/task-2645*"
    - "memory/tasks/task-2646*"
    - "memory/tasks/task-2647*"
    - "memory/tasks/task-2648*"
    - "memory/tasks/task-2649*"
    - "memory/tasks/task-2650*"
    - "memory/tasks/task-2651*"
    - "memory/tasks/task-2652*"
    - "memory/tasks/task-2653*"
    - "memory/tasks/task-2654*"
    - "memory/tasks/task-2655*"
    - "memory/tasks/task-2656*"
    - "memory/tasks/task-2657*"
    - "memory/tasks/task-2658*"
    - "**/.env*"
    - "**/credentials*"
  commands:
    - "python3 -m py_compile"
    - "python3 -m json.tool"
    - "python3 -m pytest"
    - "python3 -c"
    - "ls"
    - "cat"
    - "cp"
    - "stat"
    - "git status"
    - "git diff"
    - "git log"
    - "git checkout"
    - "git branch"
    - "git add"
    - "git commit"
    - "git push"
    - "git worktree"
    - "gh pr create"
    - "gh pr view"
    - "sha256sum"
    - "wc"
    - "printf"
    - "grep"
    - "find"
    - "tail"
    - "cokacdir --cron"
    - "cokacdir --cron-history"
    - "cokacdir --cron-list"
    - "cokacdir --currenttime"
    - "touch"
    - "mkdir"
  merge_policy: "phase_1_canonical_promotion_pr_only_no_auto_merge"
  ttl_hours: 72
```

## frozen anchors

- ANCHOR-1: "Phase 1 only · Phase 2 call site integration / Phase 3 ledger schema 확장 회장 별도 승인 전까지 금지"
- ANCHOR-2: "source = /home/jay/workspace/.worktrees/task-2658-dev6/{utils,tests}/anu_spawn_visibility_guard/* · target = main repo 동일 path · __pycache__ 제외"
- ANCHOR-3: "auto-merge 0 · merge는 회장 verbatim 별도 강제 · PR 생성까지만 허용"
- ANCHOR-4: "existing call site integration 금지 · 기존 5 호출 위치 forbidden_paths 추가 박제"
- ANCHOR-5: "observer chain 영향 0 · utils/axis_3_canary_scale_aware_guard/* 미수정 anchor 유지"
- ANCHOR-6: "회장 본 세션 적용 0 · ANU collector 세션 적용 0"
- ANCHOR-7: "BOT App token 부재 시 (★ ghs_ 없음 / OWNER PAT만) push/PR 불가 → SPAWN_VISIBILITY_GUARD_ADOPTION_HOLD_FOR_CHAIR 분류 + 보고 (★ 회장 결정 대기)"

## finalize 프로토콜

1. base = origin/main 최신 fetch · HEAD `d4098b04 task-2642`
2. 별도 worktree task-2659-dev6
3. dev6 페룬 봇 작업
4. source 디렉터리 cp from `/home/jay/workspace/.worktrees/task-2658-dev6/{utils,tests}/anu_spawn_visibility_guard/` to main repo target (★ `__pycache__` 제외)
5. main repo에서 regression 7/7 재실행 + import smoke
6. forbidden_action_count = 0 확인
7. observer chain 영향 0 확인
8. commit (★ Phase 1 PR 범위 한정)
9. push to remote (★ BOT token 또는 OWNER PAT)
10. gh pr create (★ auto-merge label 부착 절대 금지)
11. result marker 박제 (7 보고 필드)
12. ANU normal callback cron (helper · ★ ANU key `c119085addb0f8b7` 강제 · self-key 등록 금지 · UTF-8 ≤3900 bytes hard limit · envelope only)
13. .done 발행

## 회장 보고 형식 (verbatim)

성공: **`SPAWN_VISIBILITY_GUARD_CANONICAL_PROMOTION_PR_READY`**
실패: **`SPAWN_VISIBILITY_GUARD_ADOPTION_HOLD_FOR_CHAIR`**

끝
