# task-2728 Gemini triage round — PR #172 unresolved 6건 bounded 수렴 (회장 자동 triage 권한, 같은 PR)

## 회장 인가 (2026-06-03, 자동 triage/fix loop — PR #172 unresolved 6)
PR #172(head `fa5ba4b7`, branch `task/task-2728-dev6`)에서 **이어서**. ★ task-2728+1 분리 금지 — **같은 PR 의 bounded Gemini triage round**, expected_files 기존 3파일+test 범위 안에서만. new head → non-force push(PR #172 갱신).

## triage 결과 (ANU 독립검증, 단일소스 memory/events/task-2728.gemini-triage-260603.json)
1. **HIGH (id 3347386331)** `completion_callback_fallback_cancel.py:699` — `CancelClassification.ALREADY_FIRED` AttributeError 주장 = **FALSE POSITIVE**(enum line 82 `ALREADY_FIRED="ALREADY_FIRED"` 실재). 단 **already_fired 전용 regression 부재 = VALID** → 테스트 보강.
2. **MEDIUM (id 3347386351)** `completion_callback_fallback_cancel.py:664` — remover 루프 per-rec try-except 부재 → 1건 예외가 나머지 pending prune 차단. **실 robustness 결함**.
3. **MEDIUM (id 3347386334)** `fallback_schedule_registry.py:139` — `read_text().splitlines()` 전체로드 비효율.
4. **MEDIUM (id 3347386378)** `fallback_schedule_registry.py:109` — append race condition.
5. **MEDIUM (id 3347386358)** `normal_completion_callback_collector_entrypoint.py:8` — logger 부재.
6. **MEDIUM (id 3347386367)** `normal_completion_callback_collector_entrypoint.py:90` — RESULT_JSON_MISSING warning 부재.

## 수정 방향 (expected_files 3파일 + test 내부 — bounded)
1. **HIGH**: `tests/regression/test_callback_fallback_prune_2728.py` 에 **already_fired 전용 regression 추가**(remover status='already_fired' → CancelClassification.ALREADY_FIRED 매핑 + AttributeError 0 단언). 코드 변경 불필요(enum 실재) — 단언으로 false positive 종결.
2. **M-3347386351**: `completion_callback_fallback_cancel.py` prune 루프를 **per-rec try-except** 로 감싸 1건 실패가 나머지 prune 차단 안 하게(실패분 → `REMOVE_FAILED_WARNING` + cause 기록 + continue).
3. **M-3347386334**: `fallback_schedule_registry.py` read 를 파일 라인 iteration(제너레이터/`for line in fh`)으로.
4. **M-3347386378**: registry append 에 `fcntl.flock`(LOCK_EX) 적용(쓰기 race 방지). flock 미지원 환경 graceful fallback.
5. **M-3347386358 / 367**: `normal_completion_callback_collector_entrypoint.py` 에 `logger=logging.getLogger(__name__)` + RESULT_JSON_MISSING 시 `logger.warning`.

## 필수 검증 (회장 6 — 새 head 기준)
1. 새 head CI 11/11 GREEN. 2. fresh Gemini(회장 OWNER 재트리거 후) unresolved HIGH/CRITICAL 0 + 전체 unresolved 0. 3. `git diff --name-only origin/main` = expected_files(≤5: 3 code + test + report) 내부. 4. forbidden 0. 5. ANU key literal 0. 6. `callback_fallback_prune` capability **ACTIVE=false 유지**, merge_policy=none.
- 기존 18 regression + already_fired 신규 PASS. smoke: `python3 -m pytest tests/regression/test_callback_fallback_prune_2728.py -q`.

## 금지 (회장 verbatim)
- task-2728+1 분리 금지(같은 PR triage round) · expected_files 3파일+test 밖 수정 시 CHAIR_REQUIRED · finish-task.sh 미접촉 · merge 금지 · OWNER 대행/thread resolve 대행 금지(OWNER-only resolve = OWNER_ACTION_PENDING 기록) · credential/scope 확장 금지 · force push·rebase·admin override 금지 · ACTIVE=true 선언 금지.
- ★ 새 HIGH/CRITICAL / 같은 blocker 반복 / expected_files 밖 / credential·scope 확장 = CHAIR_REQUIRED.

## doctrine
- 같은 PR bounded triage = 새 commit→new head→non-force push. bot `/gemini review` 무효(인간 OWNER 1회 — 회장 직접). long polling 금지.

## finalize (PR #172 갱신 — merge 금지)
1. fix → regression PASS → `git add`(3 code+test) → commit → non-force push(PR #172 갱신).
2. `memory/reports/task-2728.md` 갱신(triage round + L1). 3. `memory/events/task-2728-triage.done` 생성.
4. ANU normal callback cron 강제 등록 — collector_role=ANU, ANU_KEY=c119085addb0f8b7(sealed), **fallback registry 기록**. self-key 금지.
5. ★ merge 금지 — 새 head 회장 OWNER /gemini 재트리거 대기 → unresolved 0 + CI GREEN 시 ANU 가 READY_FOR_CHAIR_MERGE_APPROVAL 보고.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "utils/completion_callback_fallback_cancel.py"
    - "utils/fallback_schedule_registry.py"
    - "utils/normal_completion_callback_collector_entrypoint.py"
    - "tests/regression/test_callback_fallback_prune_2728.py"
    - "memory/reports/task-2728.md"
    - "memory/events/task-2728-triage.done"
  forbidden_paths:
    - "scripts/finish-task.sh"
    - "teams/shared/verifiers/critical_gap.py"
    - "scripts/harness/v36/terminal_state_callback.py"
    - "deploy/systemd/**"
    - ".github/**"
  commands: ["pytest","python3 -m pytest","python3 -m py_compile"]
  merge_policy: "none"
  ttl_hours: 48
```

## goal_assertions (auto)
- `python3 -m pytest tests/regression/test_callback_fallback_prune_2728.py -q`
- `python3 -c "import sys; s=open('utils/completion_callback_fallback_cancel.py').read(); sys.exit(1 if 'c119085addb0f8b7' in s else 0)"`

## 상태
CHAIR_AUTHORIZED_GEMINI_TRIAGE_ROUND (같은 PR #172, bounded) — dev6 재위임(head fa5ba4b7 이어서). merge 회장 승인 전 금지. 새 HIGH/CRITICAL·같은 blocker 반복 → CHAIR_REQUIRED.
