# task-2493 audit-result (Lugh 검증 결과)

## 토큰 메타
- token_sha256_prefix: fba78943776c
- token_type: installation_token (ghs_ prefix 확인, /user → 403 "Resource not accessible by integration", /installation/repositories → 200)
- expires_at: 2026-05-07T17:09:33Z (bot-token-refresh.jsonl 마지막 기록 기준; 현재 토큰은 만료 로그 이후에도 응답 중 — 재발급 후 미로그 가능성)

## Step 1. 토큰 유효성: PASS
- 증거: `GH_TOKEN=$TOKEN gh api /rate_limit` → HTTP 200, core remaining 5000
- rate_limit_remaining: 4996 (core), 4997 (graphql)
- `/installation/repositories` → HTTP 200, total_count=8, repository_selection=all

## Step 2. viewer.login: PASS
- graphql viewer 쿼리 결과: `{"data":{"viewer":{"login":"jeon-jonghyuk-taskctl-bot[bot]"}}}`
- bot login: jeon-jonghyuk-taskctl-bot[bot]

## Step 3. App permissions: PARTIAL-PASS (정정 2026-05-08)
- `x-accepted-github-permissions` 헤더는 "이 endpoint가 요구하는 최소 권한"을 뜻한다. Bot이 보유한 권한 목록이 아님.
  - GET /pulls → `x-accepted-github-permissions: pull_requests=read` : 이 endpoint를 읽으려면 read면 충분하다는 뜻
  - GET /git/refs → 헤더 출력 없음 (permissionless access 가능)
- **pull_requests:write**: **실증됨** — PR #33, #34, #35 (user.type=Bot, user.login=jeon-jonghyuk-taskctl-bot[bot])가 존재. POST /repos/.../pulls 성공 = write 권한 부여 증거.
- **contents:write (branch push)**: 직접 증거 없음 — bot authored PR들의 head commits가 전부 JonghyukJeon(사람) authored. Bot이 직접 push한 commit 흔적 미확인.
- checks: none (GET /check-suites → 404, /check-runs → 404) — 변동 없음
- **정정 판정**: pull_requests:write PASS (실증), contents:write 불확실 (직접 증거 없음)

## Step 4. gh auth status: PASS
- `gh auth status` 결과: `✓ Logged in to github.com account jeon-jonghyuk-taskctl-bot[bot] (GH_TOKEN)`
- rate limit remaining: 4996 (core)
- core remaining: 4996

## Step 5. branch push 권한: INDETERMINATE (정정 2026-05-08)
- repo permissions.push: false (`gh api /repos/Jeon-Jonghyuk/dev_workspace` → `"push": false`) — 이는 **collaborator 관점 권한**이며 App installation token에는 항상 false 반환됨. App 자체 push 권한을 나타내지 않는다.
- `/installation/repositories` 전체 8개 repo 모두 `permissions: {admin:F, maintain:F, push:F, triage:F, pull:F}` — 동일하게 전부 false. 이 필드는 App permissions 기술에 사용되지 않음.
- branch protection main: `"protected": true`, detail → 403 (admin 권한 없음) — 변동 없음.
- **contents:write 직접 증거**: bot authored PR #33/34/35의 head commits 전부 JonghyukJeon 사람 email. Bot push 흔적 없음.
- **결론 (정정)**: push:false는 collaborator field 오해석. 실제 contents:write 보유 여부는 증거 불충분 — 불확실.

## Step 6. PR creation 가능성: PASS (정정 2026-05-08)
- PR list GET: 200 (GET /repos/Jeon-Jonghyuk/dev_workspace/pulls?state=open → 11개 PR 조회 성공)
- `x-accepted-github-permissions: pull_requests=read` 헤더: GET endpoint 요구 권한(=read)이며, bot 보유 권한이 read뿐이라는 의미가 아님. (정정 사유 #1)
- **결정적 반증 evidence**: PR #33 (2026-05-06T04:57:26Z), PR #34 (2026-05-06T10:09:28Z), PR #35 (2026-05-06T13:26:49Z) — 모두 `user.type=Bot, user.login=jeon-jonghyuk-taskctl-bot[bot]`, 모두 merged=True. 동일 repo (fork 아님). POST /repos/Jeon-Jonghyuk/dev_workspace/pulls 실제 성공 기록.
- **결론 (정정)**: pull_requests:write 실증됨 → PR 생성 가능 PASS.

## Step 7. 권한 상태 (정정 2026-05-08)
| 권한 | 이전 판정 | 정정 판정 | 근거 |
|------|----------|----------|------|
| pull_requests: write | FAIL (read만) | **PASS** | PR #33/34/35 bot authored 실증 |
| contents: write | FAIL (read만) | **INDETERMINATE** | bot commit 흔적 없음, collaborator permissions 오해석 정정 |
| checks: read | FAIL (none) | 변동 없음 (FAIL) | GET /check-suites 404 |

- pull_requests:write는 실증됨 — 별도 App 권한 변경 불필요.
- contents:write는 직접 push 증거가 없어 확실하지 않음. App 설정에서 별도 확인 필요.
- 단, bot authored PR들의 head가 동일 repo (non-fork)이므로 branch가 어떻게 존재했는지 추가 확인 권장.

## 최종 판정 (정정 2026-05-08)
- R+1 발행: **CONDITIONAL GO**
- 사유:
  - pull_requests:write — PR #33/34/35 bot authored 실증 → PASS
  - contents:write (branch push) — 직접 증거 없음, 단 collaborator permissions 필드 오해석 정정으로 이전 FAIL 근거 무효
  - checks — 여전히 확인 불가 (404)
  - 이전 NO-GO의 핵심 근거(헤더 해석 오류 + collaborator permissions 오해석) 두 가지 모두 오판으로 확인됨
  - pull_requests:write는 실증되므로 PR 생성 기능은 GO. contents:write(branch push)는 별도 검증 또는 실제 시도로 확인 필요.

---

## 셀프 체크
- [x] 토큰 원문 노출 0 (sha256 prefix 12자만 기록, ghs_ 이후 원문 미노출)
- [x] 코드 수정 0 (audit-result.md 외 파일 수정 0, audit-evidence.md 추가 1개 허용됨)
- [x] PR 생성 0
- [x] branch push 0
- [x] gh api POST/PATCH/PUT/DELETE 호출 0 (GET 및 graphql read-only query만 사용)
- [x] `scripts/refresh_bot_token.py` 실행 0 (read만 수행)

---

## 정정 이력

### 정정 1 (2026-05-08)
- 사유: `x-accepted-github-permissions` 헤더 오해석 및 `/installation/repositories` 의 `permissions` 필드(collaborator permissions) 오해석. 실제 권한 검증은 bot authored PR #33/34/35 existence evidence로 수행.
- 변경:
  - Step 3 FAIL → PARTIAL-PASS (pull_requests:write 실증, contents:write 불확실)
  - Step 5 FAIL → INDETERMINATE (collaborator permissions ≠ App permissions)
  - Step 6 FAIL → PASS (PR #33/34/35 bot authored 실증)
  - 최종 판정 NO-GO → CONDITIONAL GO
- 반증 evidence:
  - PR #33 (2026-05-06T04:57:26Z), #34 (2026-05-06T10:09:28Z), #35 (2026-05-06T13:26:49Z): user.type=Bot, user.login=jeon-jonghyuk-taskctl-bot[bot], merged=True, head.repo=동일 repo(non-fork)
  - 이 세 PR의 존재 = POST /repos/.../pulls 성공 = pull_requests:write 실제 보유 증거
  - `x-accepted-github-permissions: pull_requests=read` = GET endpoint 요구 권한 (bot 보유 권한 목록 아님)
  - collaborator permissions (push:false) = App installation token에 항상 false 반환되는 collaborator 관점 필드
- 잔여 불확실: contents:write (branch push) 직접 증거 미확인 — bot authored PR들의 commits 전부 JonghyukJeon(사람) authored
