Phase 3 외부 작업 종결 + PR #365 close + 누적 이월 2건 (CI Python 3.13 + 하네스 정기점검 시드)

요약Sprint 205 무한 이월 방지 결정 트리거의 첫 실증 — Sprint 204 Phase 3 외부 작업(Discord BOT_TOKEN revoke + 다른 머신 정리)을 종결. (a) BOT_TOKEN Delete App 완료(봇 영구 삭제 — Discord 통합 완전 폐기 결정). (b) 다른 머신 없음 확정(본 머신 단독 사용 + CI는 GitHub-hosted runner). 4-스프린트 정리 파이프라인(Sprint 156→191→202→204→206) 외부 트랙까지 완전 마감. 동시 처리 — PR #365 close 사후 정리 + Sprint 205 누적 이월 2건(CI Python 3.12→3.13 + 하네스 정기점검 체크리스트 자동화 시드).

날짜
영향도치명

목표

  • Sprint 204 Phase 3 외부 작업(Discord BOT_TOKEN revoke + 다른 머신/CI 체크아웃 dormant 파일 정리)을 완전 종결. Sprint 205에서 명문화한 무한 이월 방지 결정 트리거의 첫 실증.
  • Sprint 205 머지 사후 발견된 PR #365 close 사후 정리(PR #366 squash merge가 Sprint 204 변경을 일괄 main 반영했으므로 PR #365는 동일 변경이 main에 있는 채로 DIRTY/CONFLICTING 상태).
  • Sprint 205 신규 패턴 "다회 누적 이월 항목 동시 처리" 적용 — CI PYTHON 3.12→3.13 상향 + 하네스 정기점검 체크리스트 자동화 시드(Sprint 202 신규 패턴 ①).

배경

Sprint 156 RUNBOOK 명문화 → Sprint 191 deprecated 삭제 → Sprint 202 dormant 일부 + 재분류 → Sprint 204 dormant 완전 삭제 + repo-side BOT_TOKEN 평문 처분 → Sprint 205 외부 트랙 재확인 보류(무한 이월 방지 조건 명문화)의 정리 파이프라인이 Sprint 206에서 외부 트랙까지 종결되었다. 사용자 응답으로 (a) BOT_TOKEN을 Discord Developer Portal에서 Delete App 실행(봇 영구 삭제, 통합 완전 폐기) + (b) 다른 머신 없음 확정(본 머신 단독 사용)을 받아 Phase 4 완전 마감 commit이 가능해졌다.

동시에 Sprint 205 신규 패턴(다회 누적 이월 항목 동시 처리)을 본 sprint에 적용 — CI PYTHON 3.12→3.13 상향과 하네스 정기점검 체크리스트 자동화 시드(Sprint 202 ADR §"신규 패턴 ①")를 동시 처리해 별도 sprint 비용을 회피했다.

결정

D0. Phase 3 (a) — BOT_TOKEN Delete App (Discord 통합 완전 폐기)

사용자 응답: Delete App 완료 — Sprint 204 ADR "completely dispose" 방향과 정합. 봇 영구 삭제 + 재활성화 불가. 평문 BOT_TOKEN 잔존 경로 완전 차단.

D1. Phase 3 (b) — 다른 머신 없음 확정

사용자 응답: 다른 머신 없음 — 본 머신만 사용 확정. AlgoSu 작업은 본 머신(/Users/leokim/Desktop/leo.kim/AlgoSu) 단독. CI는 GitHub-hosted runner(ubuntu-latest, .github/workflows/ self-hosted runner 사용 0건)라 매 실행마다 fresh clone, dormant 파일 검증 대상 아님.

D2. _base.md:51 placeholder 보존 결정

Sprint 204 ADR에 명시된 _base.md:51 제거 조건(다른 머신 정리 완료 + 토큰 revoke 완료)은 둘 다 충족되었으나, 플랜 §결정사항 1에 따라 placeholder 보존. 사유: 봇이 영구 삭제되어 호출 시 404로 무력화되더라도, 향후 회귀 차단 + 우발 commit 차단 목적. Auto mode classifier도 동일 사유로 자동 차단 — 사용자 명시적 요청 시에만 제거. 본 sprint에서는 ADR/RUNBOOK 시제만 정합으로 갱신.

D3. PR #365 close 사후 정리

Sprint 205 머지 사후 발견: PR #366가 Sprint 204 final commit(c390f8a) 기준 분기라 PR #366 squash merge(c26b4b4)가 Sprint 204의 모든 변경 포함. PR #365(head 1ee1e16, R5 이전 시점)는 동일 변경이 main에 있는 채로 DIRTY/CONFLICTING. Oracle이 gh pr close 365 --comment "..." 즉시 실행 → 2026-05-27T23:46:54Z CLOSED.

D4. 누적 이월 동시 처리

Sprint 205 신규 패턴 ④ "다회 누적 이월 항목 동시 처리" 적용:

  • CI PYTHON 3.12→3.13.github/workflows/ci.yml:38 PYTHON_VERSION SSOT 1곳 변경(4 사용처 자동 전파) + services/ai-analysis/pyproject.toml 2 line. 호환성은 CI matrix에서 검증.
  • 하네스 정기점검 체크리스트 자동화 시드 — Sprint 202 ADR §"신규 패턴 ①"의 6 자동화 항목을 scripts/harness-checkup.sh + docs/runbook/harness-checkup.md로 시드. 본 sprint는 시드 단계, 실제 정기점검 실행은 다음 정기점검 sprint.

구현

Phase A — BOT_TOKEN Delete App (사용자 직접)

Discord Developer Portal → AlgoSu 봇 → Delete App 실행. 봇 영구 삭제. 사용자 직접 작업.

Phase B — 다른 머신 정리 (사용자 응답: 없음)

본 머신 ls .claude-tools/ empty 확인(Sprint 204부터 검증된 상태 유지). 다른 머신 없음 확정. CI runner는 GitHub-hosted(ubuntu-latest)만 사용 — fresh clone이라 검증 대상 아님.

Phase C — PR #365 close (Oracle 즉시 실행)

Bash
gh pr close 365 --comment "Squash-merged via PR #366 (c26b4b4) — branched off Sprint 204 final commit c390f8a, all Sprint 204 changes are in main. Closing as superseded."

CLOSED at 2026-05-27T23:46:54Z. 변경 파일 없음(GitHub 상태 변경).

Phase D (e9d403a chore(runbook), Oracle 직접) — RUNBOOK Phase 4 종결

docs/runbook/claude-tools.md 5 위치 갱신:

  • line 17 (헤더): Sprint 206 외부 트랙 종결 추가
  • line 22 (§1 Git 정책): Sprint 205 보류 → Sprint 206 종결 시제 정합
  • line 57 (§3 Discord 정책): Sprint 205 보류 → Sprint 206 완전 폐기 + Delete App
  • line 66 (§4 Phase 4 행): "위험 종결 미완료" → "Sprint 206에서 시크릿 노출 위험 완전 종결"
  • line 80 (§5 이력 표): Sprint 206 행 신규 추가 — 종결 결정 + _base.md:51 placeholder 보존 결정 명시

_base.md:51 placeholder는 D2 결정에 따라 보존.

Phase E (e48b1ca chore(ci), Oracle 직접) — CI Python 3.12→3.13

  • .github/workflows/ci.yml:38 PYTHON_VERSION: '3.12''3.13' (SSOT 1곳, 4 사용처 line 306·311·558·1419 자동 전파)
  • services/ai-analysis/pyproject.toml:5 requires-python = ">=3.12"">=3.13"
  • services/ai-analysis/pyproject.toml:9 Ruff target-version = "py312""py313"

호환성: pydantic v2, FastAPI, redis, anthropic, prometheus-client 등 주요 의존성 모두 Python 3.13 공식 지원. CI matrix actions/setup-python@v6가 3.13 자동 프로비저닝.

Phase F (1216020 chore(oracle), Oracle 직접 — Architect dispatch 실패 후 fallback) — 하네스 정기점검 자동화 시드

신규 파일 2개:

  • scripts/harness-checkup.sh (bash, --dry-run + TTY 색상, 6 자동화 항목)
  • docs/runbook/harness-checkup.md (frontmatter + 6 항목 표 + 권장 주기 + 트러블슈팅)

6 자동화 항목 (Sprint 202 신규 패턴 ①):

  1. CLI 백엔드 가용성 (claude/codex/tmux)
  2. SSOT 일치 (.claude-team.json agents[].modeloracle-spawn.sh get_model())
  3. 모델 ID 호환 (claude --model <ID> -p "ping" — 시드 단계 명령 영속화)
  4. dispatch fire 흔적 (최근 7일 정상 종료 로그)
  5. autoCritic 동기화 (.claude-team.json dispatch.codeChangingAgentsoracle-auto-critic.sh CODE_CHANGING_AGENTS 9 에이전트 정합)
  6. dormant 잔재 live caller 검증 (git grep 0건)

본 sprint 실제 실행 결과: PASS=5 / WARN=1(Item 3 시드) / FAIL=0. Item 6 = 0건으로 Sprint 206 Phase 4 종결 효과 자동 검증.

Architect dispatch 실패 후 Oracle 직접 fallbackoracle-spawn.sh architect ... 호출은 정상이나 tmux pane에서 runner 명령이 prompt에 입력만 되고 Enter 미입력 상태로 실행되지 않음. tmux send-keys -t oracle:tier2 Enter 시도도 효과 없음(send-keys 동작 자체가 차단된 것으로 추정). 본 sprint는 시드 단계 + sprint 마감 효율 우선 → Oracle 직접 작성으로 fallback. dispatch 인프라 안정성 점검은 Sprint 207+ 별도 sprint로 분리(본 sprint는 시드만 끝내고 인프라 점검은 외부 트랙으로).

Phase G (이 commit, docs(adr), Oracle 직접) — ADR sprint-206 KR+EN + README 갱신

  • docs/adr/sprints/sprint-206.md (KR, 본 파일)
  • docs/adr-en/sprints/sprint-206.md (EN, KR 1:1 매핑)
  • docs/adr/README.md — 회고형 sprint ADR 카운트 143→144 + sprint range 62205→62206 (트리 + §헤더 2 위치)

검증

  • git log --oneline -5 — Phase D e9d403a / Phase E e48b1ca / Phase F 1216020 / Phase G(본 commit) 4 atomic commit 적층
  • git grep -n "위험 종결 미완료" docs/runbook/claude-tools.md0건 (시제 정합)
  • git grep -n "Sprint 206" docs/runbook/claude-tools.md5 위치 (line 17·22·57·66·80)
  • scripts/harness-checkup.sh --dry-run → 6 항목 명령 영속화 확인
  • scripts/harness-checkup.sh (실제 실행) → PASS=5 / WARN=1 / FAIL=0, exit 0
  • gh pr view 365 --json stateCLOSED (2026-05-27T23:46:54Z)
  • ls .claude-tools/ → empty (본 머신 단독)
  • ADR 인덱스: check-adr-index-count.mjs --strict sprint 144 + check-adr-en-coverage.mjs --lint 153/153 (100%) + check-doc-refs.mjs 0 broken + check-i18n-residue.mjs --strict prose Hangul max ≤8% (PR push 후 CI에서 검증)

Critic (Codex) 라운드

codex review --base c26b4b4 --title "Sprint 206 Critic R1" 호출 (비대화형 모드 — session ID 미출력). Phase D~G 4 atomic commit 일괄 리뷰.

R1 — Critical/High 0 + P2 1건:

  • scripts/harness-checkup.sh:148 Item 6 자기 매칭 — 정상 실행에서 git grep이 본 스크립트 자체의 패턴 literal을 매칭하여 항상 FAIL. commit 직전 실행에서 PASS였던 이유는 git tracked 등록 전이라 grep에 잡히지 않았기 때문. commit 후 정상 실행이 깨짐.
  • 해소: pattern 문자열을 변수로 분리('dis''cord-send|...' 형태로 literal 회피) + git grep pathspec에 ':!scripts/harness-checkup.sh' 명시적 제외 추가.
  • 검증: git grep -nE 'discord-send|oracle-respond|discord-receiver' -- 'scripts/harness-checkup.sh' → 0 hits, 실제 실행 PASS=5/WARN=1/FAIL=0(exit 0) 복원.

R2+ 결과는 placeholder 회귀 차단 결정에 따라 sprint-window/메모리에만 영속화 (Sprint 204 결정 패턴 준수).

신규 패턴

  • 무한 이월 방지 결정 트리거의 종결 분기 실증 — Sprint 205 명문화 패턴이 N+1 sprint(206)에서 종결 분기(Delete App + 다른 머신 없음 확정)로 갈리는 실제 경로를 영속화. 보류 분기는 별도 ADR 사례 확보 필요(다음 외부 트랙 발생 시).
  • dispatch 인프라 우회 패턴(시드 단계 한정) — code-changing 에이전트 dispatch가 막힌 상태에서 시드/작은 작업은 Oracle 직접 fallback 가능. 큰 작업/장기 패치는 dispatch 인프라 안정화 sprint 선행 필요. 본 패턴은 "시드 단계 한정"이라 명시(향후 정책 위반 회피).
  • 시드 자산의 자가 검증 — 하네스 체크업 Item 6이 본 sprint Phase 4 종결을 자동 검증. 시드 단계 자산도 작성 즉시 의미 있는 신호를 제공하도록 설계 가능.