---
name: anu-direct-polling-violation-pr-145-260523
description: ANU 본체가 CI/Gemini 상태를 run_in_background + sleep + gh pr view 패턴으로 직접 반복 조회하면 정책 위반. PR #145 task-2642에서 ANU 가 동일 정책 도입 직후 위반 박제. dev6 bridge watcher callback 만 허용 경로.
metadata:
  type: feedback
---

# ★★★ ANU 직접 CI/Gemini polling 위반 박제 — PR #145 task-2642 (2026-05-23)

## Rule
**ANU 본체는 CI/Gemini 상태를 직접 반복 조회하지 않는다.**

- ANU 본체는 `run_in_background + sleep + gh pr view/checks/statusCheckRollup` 패턴으로 terminal state 를 기다리지 않는다.
- CI/Gemini 대기는 **dev bot 또는 `CI_WATCH_HANDOFF_RUNNER` 같은 watcher** 에게 위임한다.
- **watcher 의 background polling 자체는 허용** (contract-bound 면 OK)
- watcher polling 은 task_id / PR number / HEAD SHA / terminal states / TTL / callback target / duplicate policy / owner / collector_role 가진 계약 기반이어야 함
- watcher 가 terminal result 를 callback/envelope/marker 로 ANU 에게 전달
- ANU 는 callback 수신 후에만 consolidated report 작성
- watcher 의 owner / collector_role 이 **ANU 본체이면 fail** (위장 폴링 차단)

## Why
- 회장 verbatim 정확한 분류 (2026-05-23): "background polling 자체를 금지하는 것이 아니다. 금지 대상은 ANU 본체의 session-bound direct polling 이다. 허용 대상은 watcher/delegated runner 의 contract-bound background polling 이다."
- ANU 세션-bound polling 한계 (세션 종료 시 polling 함께 죽음) → 정책 도입 (2026-05-23 19:38 KST, `feedback_anu_no_direct_ci_watch_use_handoff_260523.md`)
- 정책 도입 직후 ANU 가 동일 정책 위반: PR #145 task-2642 CI_WATCH_HANDOFF_RUNNER PR 에서 ANU 본체가 `bzaona6au` (gh pr view 145 polling loop · 15초 간격) 직접 실행 → 본 PR 자체가 정책 dogfood PR 인데 ANU 가 dogfood 자체를 위반한 이중 모순
- 회장 직접 적발 (2026-05-23 20:55 KST 무렵): "bzaona6au의 정체를 즉시 명확히 보고하라"

## How to apply

### 위반 패턴 (forbidden)
```bash
# ANU 본체가 직접 polling 시작 (★ 금지)
(until [ "$(gh pr view <PR> --json statusCheckRollup --jq ...)" = "0" ]; do sleep 15; done) && ...
```
+ run_in_background=true 로 발사
→ session-bound polling. session 종료 시 polling 함께 죽음.

### 허용 패턴 (allowed)
1. **dev bot 발사**: `cokacdir --cron --key <dev-bot-key>` 으로 dev bot 에 watcher 작업 위임. bot 의 task_id 와 owner 가 ANU 가 아님 (dev6 페룬 등).
2. **CI_WATCH_HANDOFF_RUNNER** (task-2643 activation 후): contract-bound watcher. handoff envelope 에 task_id / pr / head_sha / terminal_states / ttl / callback_target / dup_policy 명시.
3. **ANU 는 callback envelope 도착 후에만 consolidated report 작성**.

### 자가 검증 체크리스트 (ANU 가 PR open 직후)
- [ ] `gh pr view` 또는 `gh run watch` 또는 `gh api .../statusCheckRollup` polling 직접 호출 0
- [ ] `run_in_background=true` + `gh pr` 명령 0
- [ ] `until [...]; do sleep N; done` + GH API 0
- [ ] `sleep` + GH API 호출 0 (단일 호출도 자제)
- [ ] watcher 발사 schedule_id 또는 dev bot session id 존재
- [ ] callback envelope 도착 ts 기록

## 사고 사례 (박제)
- ts_kst: 2026-05-23 20:53 KST (정책 도입 ~75분 후)
- 위반 schedule/task: `bzaona6au` (claude-code background task)
- 실행 명령: `cd /home/jay/workspace && (until [ "$(gh pr view 145 ...)" = "0" ]; do sleep 15; done) && gh pr view 145 ...`
- 회장 적발 시간 차: 정책 도입 후 약 75분
- 정책 위반 시점에 dev6 bridge watcher `588CA6A8` (회장 승인 1회성) 가 별도로 정상 발사 상태 — ANU 가 watcher 와 무관 자체 polling 만든 이중 사고
- 회장 verbatim 정정: "background polling 전면 금지로 오해하지 말 것 · ANU 본체 session-bound polling 만 금지 · watcher contract-bound polling 허용"

## 관련 메모리
- [[feedback-anu-no-direct-ci-watch-use-handoff-260523]] — 모정책 (★★★ 메모리 최상위 규칙)
- [[system-ci-watch-handoff-policy-spec-260523]] — 정책 spec single source
- [[system-ci-watch-handoff-runner-spec-260523]] — runner spec (PR #145 산출물)
- [[system-ci-watch-handoff-real-pr-activation-gate-spec-260523]] — task-2643 (회귀 regression 추가 대상)
- [[ci-watcher-session-lifetime-gap-backlog-260523]] — session lifetime 한계 박제

## 단일 소스 / 후속
- event log: `memory/events/anu_direct_ci_polling_violation_pr_145_260523.json` (사고 박제 JSON)
- task-2643 필수 acceptance 추가: `tests/regression/test_anu_direct_polling_violation_guard.py` (forbidden pattern 감지)
- PR #145 body update: "policy violation corrected, not functional failure"
