---
task_id: task-2483
type: checklist
scope: task
status: completed
created: 2026-05-07
updated: 2026-05-07
---

# 체크리스트: task-2483

## Pre-flight
- [x] task 파일 읽기 + cancel marker 0건 확인
- [x] git history 검색 → refresh_bot_token.py 0건 (재작성 결정)
- [x] PEM 메인+백업 양쪽 존재 확인
- [x] PyJWT/cryptography 시스템 설치 확인
- [x] worktree `task-2483-dev3` 생성
- [x] 3문서 초안 (plan/context/checklist) 작성

## G1 설계 게이트
- [x] 3 Step Why A-B-C 일관 (context-notes 기록)
- [x] Codex 사전 검증 (5건 risk 중 핵심 2건 설계 반영, 잔여 3건은 정상 처리)
- [x] affected_files 교차 분석 (신규 파일이므로 충돌 0)
- [x] sanitize 게이트 (PII 없음 확인)

## 구현 (Lugh)
- [x] `scripts/refresh_bot_token.py` 작성 (408줄)
- [x] `--dry-run` 옵션
- [x] PEM 메인 부재 → 백업 자동 fallback
- [x] fail-closed (RuntimeError 시 구 토큰 보존)
- [x] audit jsonl append (sha256 + expires_at, 토큰 원문 0)
- [x] 토큰 출력 prefix 12자만
- [x] systemd Type=oneshot 호환 (exit 0 검증)

## 회귀 테스트 (Morrigan)
- [x] JWT RS256 + iat/exp 시계 보정
- [x] PEM 메인 부재 → 백업 fallback
- [x] API 401 시 fail-closed
- [x] audit jsonl append-only
- [x] 토큰 원문 미로깅
- [x] systemd Type=oneshot 호환

## 검증 (smoke)
- [x] `python3 scripts/refresh_bot_token.py` exit 0
- [x] `expires_at` 1시간 미래 (2026-05-07T14:39:25Z)
- [x] `/installation/repositories` 200 (8 repos)
- [x] `gh graphql {viewer{login}}` 200 + login=jeon-jonghyuk-taskctl-bot[bot]
- [x] systemd `systemctl --user start` PASS (status 0/SUCCESS)
- [x] journal "Finished refresh-bot-token.service"

## G2 구현 게이트
- [x] pytest 회귀 6/6 PASS (0.46s)
- [x] Pyright 진단 정리 (✘ 0건)
- [x] L1 스모크 5/5 실측 evidence

## G3 머지 게이트
- [ ] G3 독립 검증 PASS
- [ ] worktree finish --action pr → Gemini 리뷰
- [ ] PR 머지 + .done 생성 (finish-task.sh)

## 보고서 + 후속
- [x] `memory/reports/task-2483.md` SCQA 4섹션
- [x] task-2481 조건 1번 PASS 명시 (조건 2-4는 후속 task)
- [x] 3문서 status → completed
- [ ] `bash scripts/finish-task.sh task-2483 dev3 /home/jay/workspace`
