# task-2658 — SPAWN_VISIBILITY_FALSE_NEGATIVE_PREVENTION_GUARD_FULL_IMPLEMENTATION

- Level: Lv.4 (ANU 공통 dispatch/spawn 검증 도구 신규 모듈 + 6 regression · runtime/PreToolUse/Axis 1/2 변경 0)
- 담당: dev6 페룬 (회장 verbatim executor 지정 · task-2657 직 executor)
- base: origin/main 최신 (현재 HEAD d4098b04 task-2642) + Axis 3 canary observer chain 병행 진행 중
- 단일소스 spec: 본 task md + packet `memory/events/spawn-visibility-false-negative-prevention-guard-packet-260525.json`
- chair_authorization_id: **`CHAIR-AUTH-SPAWN-VISIBILITY-20260525-JJONGS-GUARD-001`** (★ 회장 verbatim 1회성 발행 · ANU/봇 임의 생성 0)

## 배경

task-2657 직 후속. ANU가 2026-05-25T11:57:24+09:00에 task-2657 spawn 4 신호 ABSENT 측정 → SPAWN_SILENT_DROP_SUSPECTED 오분류. 실 worktree는 `/home/jay/.cokacdir/workspace/426931FE/wt-2657-dev6`에 정상 spawn됐었음. ANU 측정 location 한정 결함 (★ main repo `.git/worktrees/`만 조회 · cokacdir 봇 컨벤션 누락). 본 guard = ANU 공통 dispatch/spawn 검증 도구로 재발 방지.

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

1. **module location**: `utils/anu_spawn_visibility_guard/*` (★ ANU 공통 dispatch/spawn 검증 도구 · Axis 3 전용 위치 금지)
2. **callback evidence 정의**: result/report/done marker + `memory/.callback_inbox/*.acked` 둘 다 callback recovery evidence 인정 · ★ self-attestation 단독 금지 · 최소 2 source 이상 교차
3. **TRUE_SILENT_DROP hard timeout**: fire 후 30분 · ★ schedule_history pending / result marker present / callback envelope present 중 하나라도 있으면 TRUE_SILENT_DROP 단정 금지
4. **executor**: dev6 페룬
5. **scope**: FULL_IMPLEMENTATION (★ packet만 박제 금지 · 실제 guard 모듈 + regression 구현 강제)
6. **completion target**: `SPAWN_VISIBILITY_FALSE_NEGATIVE_PREVENTION_GUARD_IMPLEMENTED`

## 필수 구현 9 (회장 verbatim 1:1)

1. legacy worktree path 확인 (`/home/jay/workspace/.worktrees/`)
2. cokacdir workspace path 확인 (`/home/jay/.cokacdir/workspace/<schedule_id>/`)
3. schedule_id 기반 workspace dir 확인
4. wt-`<task_id>`-`<team>` 패턴 확인 (★ 두 후보 위치 모두 glob)
5. executor process 확인 (★ ps + pattern match · 별칭 분기 고려)
6. schedule_history 확인 (`/home/jay/.cokacdir/schedule_history/<schedule_id>.log`)
7. result/report/done marker 확인 (memory/events/`<task_id>`.done + memory/events/`<task_id>`.*-result-*.json + memory/reports/`<task_id>`.md)
8. callback inbox ack 확인 (`memory/.callback_inbox/*.acked`)
9. status enum 5 분리:
   - `SPAWN_VERIFIED` (worktree dir + executor process + first response NOT-refusal 3 신호)
   - `SPAWN_PENDING` (fire 후 짧은 시간 · 부분 신호만)
   - `SPAWN_VISIBILITY_GAP` (일부 source 부재 + 다른 source 있음)
   - `CALLBACK_RECOVERED_AFTER_VISIBILITY_GAP` (★ ANU 초기 ABSENT 후 result/report/done 또는 callback envelope 도착 · 2 source 이상 교차)
   - `TRUE_SILENT_DROP` (★ 전 source 부재 + fire 후 30분 경과 + pending/result/callback 부재)

## 필수 regression 6 (회장 verbatim 1:1)

1. legacy `.worktrees/` 위치에 worktree 존재 → `SPAWN_VERIFIED`
2. cokacdir workspace 위치에 worktree 존재 → `SPAWN_VERIFIED`
3. `.worktrees`에는 없고 cokacdir에만 있음 → `SPAWN_VERIFIED` (★ false negative 금지 핵심)
4. process 없음 + result/report/done 있음 → `CALLBACK_RECOVERED_AFTER_VISIBILITY_GAP` (★ 2 source 교차 강제)
5. 전 source 없음 + 30분 경과 → `TRUE_SILENT_DROP`
6. schedule_history pending → `TRUE_SILENT_DROP` 단정 금지 (`SPAWN_PENDING` 분류)

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

1. Axis 3 RUNNING 선언
2. full rollout
3. HARNESS_ENFORCED 전체 선언
4. policy 승격
5. BLOCK 정책 확대
6. PreToolUse runtime 변경
7. Axis 1/2 runtime 변경
8. live settings.json 변경
9. dispatch.py 변경
10. commit/push/PR/merge

## 완료 상태 (회장 verbatim)

- 성공: **`SPAWN_VISIBILITY_FALSE_NEGATIVE_PREVENTION_GUARD_IMPLEMENTED`**
- 실패: **`SPAWN_VISIBILITY_FALSE_NEGATIVE_PREVENTION_GUARD_HOLD_FOR_CHAIR`**

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

1. changed_files
2. guard 적용 위치
3. source priority (★ 8 source 우선순위 + 2 source 교차 룰)
4. TRUE_SILENT_DROP timeout (★ 30분 · 예외 3건)
5. status enum 판정표 (★ 5 enum 입력→출력 매핑)
6. regression 6 결과 (★ R1~R6 개별 PASS/FAIL)
7. forbidden_action_count (target 0)

## expected_files (~10)

- `utils/anu_spawn_visibility_guard/__init__.py`
- `utils/anu_spawn_visibility_guard/path_resolver.py` (★ legacy `.worktrees/` + cokacdir `/home/jay/.cokacdir/workspace/<schedule_id>/wt-<task_id>-<team>/` 두 후보 glob)
- `utils/anu_spawn_visibility_guard/source_collector.py` (★ 8 source 동시 조회 · process / schedule_history / result / report / done / callback_inbox.acked / worktree×2)
- `utils/anu_spawn_visibility_guard/status_classifier.py` (★ 5 enum 판정 · 2 source 교차 룰)
- `utils/anu_spawn_visibility_guard/timeout_gate.py` (★ 30분 hard timeout + 예외 3건)
- `tests/anu_spawn_visibility_guard/test_regression_6.py` (★ R1~R6)
- `memory/events/task-2658.done`
- `memory/events/task-2658.spawn-visibility-guard-result-260525.json` (★ 7 보고 필드 + 13 mandatory)
- `memory/reports/task-2658.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-2658.md"
    - "memory/reports/task-2658.md"
    - "memory/events/task-2658.done"
    - "memory/events/task-2658.spawn-visibility-guard-result-260525.json"
    - "memory/events/spawn-visibility-false-negative-prevention-guard-packet-260525.json"
    - "INDEX.md"
  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/**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*"
    - "**/.env*"
    - "**/credentials*"
  commands:
    - "python3 -m py_compile"
    - "python3 -m json.tool"
    - "python3 -m pytest"
    - "ls"
    - "cat"
    - "stat"
    - "git status"
    - "git diff"
    - "git log"
    - "git checkout"
    - "git branch"
    - "git worktree"
    - "sha256sum"
    - "wc"
    - "printf"
    - "grep"
    - "find"
    - "tail"
    - "cokacdir --cron"
    - "cokacdir --cron-history"
    - "cokacdir --cron-list"
    - "cokacdir --currenttime"
    - "touch"
    - "mkdir"
  merge_policy: "anu_spawn_visibility_guard_tool_module_no_runtime_change"
  ttl_hours: 72
```

## frozen anchors

- ANCHOR-1: "module location = utils/anu_spawn_visibility_guard/* (★ 공통 ANU 도구 · Axis 3 전용 위치 금지)"
- ANCHOR-2: "callback evidence = result/report/done marker + memory/.callback_inbox/*.acked 둘 다 인정 · self-attestation 단독 금지 · 최소 2 source 교차"
- ANCHOR-3: "TRUE_SILENT_DROP hard timeout = fire 후 30분 · schedule_history pending / result marker present / callback envelope present 중 하나라도 있으면 단정 금지"
- ANCHOR-4: "worktree 후보 위치 2종 (`/home/jay/workspace/.worktrees/` + `/home/jay/.cokacdir/workspace/<schedule_id>/wt-<task_id>-<team>/`) 동시 grep · 한쪽 missing 단독 silent drop 단정 금지"
- ANCHOR-5: "status enum 5 분리 · CALLBACK_RECOVERED_AFTER_VISIBILITY_GAP 명시 박제 (★ task-2657 WARN 1 재발 방지)"
- ANCHOR-6: "PreToolUse runtime / Axis 1/2 runtime / dispatch.py / live settings.json / live cokacdir / hooks/* 변경 0 · commit/push/PR/merge 0"
- ANCHOR-7: "회장 본 세션 적용 0 · ANU collector 세션 적용 0 · Axis 3 RUNNING 자동선언 0"

## finalize 프로토콜

1. base = origin/main + Axis 3 canary infra 보존
2. 별도 worktree task-2658-dev6
3. dev6 페룬 봇 작업
4. 9 필수 구현 + 6 regression fixture all PASS
5. result marker 박제 (7 보고 필드 + 13 mandatory)
6. ANU normal callback cron (helper · ★ ANU key c119085addb0f8b7 강제 · self-key 등록 금지 · UTF-8 ≤3900 bytes hard limit · envelope only)
7. .done 발행

## 회장 보고 형식 (verbatim)

성공: **`SPAWN_VISIBILITY_FALSE_NEGATIVE_PREVENTION_GUARD_IMPLEMENTED`**
실패: **`SPAWN_VISIBILITY_FALSE_NEGATIVE_PREVENTION_GUARD_HOLD_FOR_CHAIR`**

끝
