# task-2553+24 — Track AUTH: BOT_GITHUB_TOKEN PREFLIGHT / SECURE INJECTION 검증 (회장 GO, 코드/파일 자동화, redacted-only)

> **Lv**: Lv.3 — credential preflight (redacted evidence only). **Executor**: dev3-team 다그다 (key 0b94683120a691cf) 1회 한정. **TTL**: 1.5h.
> **상태**: 회장 GO Track AUTH — +21 PRE_MERGE_HOLD 2 precondition 중 #1(BOT_GITHUB_TOKEN ghs_ 부재, auth fail-closed). 존재·prefix·scope·gh auth 가능 여부만 **redacted evidence** 로 검증. **토큰 값 채팅·파일·로그 절대 노출 0**. md 박제만 금지.
> **선행**: +21(auth fail-closed: auth_absent_or_empty). **병렬**: Track P(task-2553+22) SAFE_PARALLEL(expected_files ∅). +23(callback infra) 비간섭.

---

## 1. 목표 (회장 verbatim)

BOT_GITHUB_TOKEN preflight / secure injection 확인. **토큰 값은 채팅·파일·로그에 절대 노출 0**. ANU/executor 는 값 자체 요구·출력 0 — **존재 여부·prefix `ghs_`·권한 범위·gh auth 가능 여부만 redacted evidence** 로 검증.

## 2. 핵심 보안 제약 (최우선 — ANU 강조)

- 토큰 raw 값: **stdout/stderr/chat/파일/로그/marker/decision JSON 어디에도 평문 0**. 길이·prefix(`ghs_` 4자)·존재 boolean·scope 명칭만 기록. 값 자체 echo·cat·env dump·`gh auth token` 출력 **금지**.
- 검증은 **간접·redacted·tokenless** 만(9-R.1 강제 — raw 토큰을 argv·header·echo·process-list 에 절대 보간 0): ① 존재 = env/secure store 에 비어있지 않은 값 존재 boolean ② prefix == `ghs_`(GitHub App installation token) boolean(앞 4자만, 나머지 마스킹) ③ **OWNER PAT 아님** 확인(`gho_`/`ghp_`/개인 PAT prefix 아님) ④ scope/권한 = **gh 자체 저장 인증 컨텍스트로만** `gh auth status`(비-verbose·토큰 미출력 모드) + `gh api /rate_limit`(gh 저장 cred 사용, **Authorization 헤더 수동 구성·`-H "Authorization: ..."` 절대 0**) 로 호출 가능성·App identity 만(값 비노출). `gh auth token` 절대 금지 ⑤ merge 권한 preflight = PR #129 권한 **probe**(gh 저장 cred·tokenless, 실 merge PUT 0 — 예: `gh api repos/Jeon-Jonghyuk/dev_workspace/collaborators/<app>/permission` 사전 GET, 실 PUT·OPTIONS-with-token 0).
- 실패·불명·노출위험 시 → HOLD(토큰 공급·주입 변경 시도 0, ANU 가 값 요구 0).

## 3. 구현 방향 (코드/파일 자동화)

1. **redacted auth verifier**(예: `scripts/run_bot_token_preflight.py`): 위 §2 ①~⑤ 간접 검증, 각 결과 boolean/명칭만. 토큰 변수는 메모리 내 비출력 처리(읽되 print/write 0, 비교·prefix 슬라이스만).
2. **redacted auth evidence JSON**(`memory/events/task-2553+24.auth-preflight.json`): {token_present:bool, prefix_is_ghs:bool, is_app_token_not_owner_pat:bool, gh_auth_capable:bool, merge_permission_preflight:PASS|FAIL, raw_exposure:0, checked_via:[명칭], ts}. **raw 값 필드 부재 강제**.
3. regression/fixture: ①정상(ghs_ 존재·App·merge 권한)→PASS ②부재/빈값→FAIL HOLD ③OWNER PAT(ghp_/gho_) prefix→FAIL(OWNER PAT 사용 안 함 확인) ④토큰 값이 어떤 출력경로에도 안 나타남(스파이/grep 정적: evidence·log·stdout 에 raw 미존재) ⑤merge permission probe 가 실 merge 호출 0(merge endpoint PUT 미호출 정적).

## 4. 허용

redacted auth verifier 코드 / redacted auth evidence JSON / regression·fixture / gh auth status·rate_limit·permission preflight(토큰 미출력 모드) read-only / result·report marker.

## 5. 금지 (회장 verbatim)

OWNER PAT 로 merge / 토큰 값 출력·파일 저장·로그 저장(평문 raw 어디든) / credential scope 확장·토큰 발급·주입 변경 / profile 밖 임의 수정 / PR #129 코드 변경 / production code / PR #128·#102 변경 / F2·phase3·mqe / force·rebase·admin override / 조건 미충족 merge / 실 merge(PUT) 호출 / dev 재가동·dispatch / branch·commit·push·PR / Track P(task-2553+22)·+23·Track M·coordinator artifact 수정·인용. live `/home/jay/workspace` git tracked HEAD/branch/ref(`task/task-2553p1-f1-clean-replacement` `20456b5f`) 전후 assertEqual(task-2553+24.* marker=git-untracked batch-internal, 위반 아님).

## 6. HOLD_FOR_CHAIR

BOT token 공급 불가(부재·빈값) / token raw exposure 위험(어떤 경로든 평문 노출 가능성) / OWNER PAT 필요 / credential·permission expansion 필요 / merge 권한 preflight FAIL / Codex unresolved HIGH·CRITICAL / ANU-Codex 반복충돌 / Critical7. 적중 시 토큰 주입·발급 시도 0 + hold-for-chair.json(redacted) + 회장 보고.

## 7. 완료 조건 (회장 verbatim)

BOT_GITHUB_TOKEN 존재 확인 / ghs_ App token 확인 / OWNER PAT 사용 안 함 확인 / 토큰 raw exposure **0** / merge 권한 preflight PASS / redacted auth evidence JSON 생성.

## 8. 완료 후 (consolidated summary 통합 — 단독 보고 0)

batch consolidated summary 항목1(AUTH preflight 결과)에 통합. final packet(result.json, redacted) = **9-R.3 엄격 화이트리스트 schema 필드 그대로**(§7 5조건 결과 = `cond7_results` 필드 / raw_exposure 0 = `raw_exposure:0` + 정적 스파이 증명 / merge permission preflight = `merge_permission_preflight:enum` / HOLD = `hold_for_chair`+`hold_reason`). §8↔9-R.3 단일 schema 정합(별도 필드 추가 0). AUTH+P 둘 다 충족 시 Track M 재실행 전제. **어떤 marker·보고에도 토큰 raw 0**.

## 9. ANU-Codex loop + callback (자동, 중간보고 0)

batch plan(§3) → Codex lint → ANU refine(9-R) → re-lint → ANU→executor 1회 위임(loop 기계; dev3 1회 TTL1.5h, callback (a) normal+fallback, 4-tuple task_id=task-2553+24 분리·타 track artifact 인용 0) → redacted preflight→evidence→regression → post-result audit → adjudication → result.json(redacted) → batch 통합. 회장 보고 트리거(§6)만, 그외 자동 수렴.

## 11. 9-R — Codex lint 반영 (NEEDS_REFINEMENT → 자동 수렴, agent a2620d931c01a649d: CRITICAL0/HIGH3, credential leak surface)

### 9-R.1 (HIGH#1) tokenless probe — raw 토큰 argv/header/echo/process-list 0
§2⑤·§3·§4 정정: **raw 토큰을 CLI argv·`gh api -H "Authorization: <raw>"`·env echo·process list 에 절대 보간 0**. capability probe 는 **tokenless** — gh 가 자체 저장한 인증 컨텍스트로만 호출(`gh auth status`(비-verbose, 토큰 미출력 모드)·`gh api /rate_limit`(gh 저장 cred 사용, Authorization 헤더 수동 구성 0)). `gh auth token`(토큰 평문 출력) **절대 금지**. shell tracing(`set -x`)·command echo·`ps`/proc 노출 가능 형태 전면 금지. 토큰 변수는 메모리 내 비교·prefix 4자 슬라이스만(그 외 어떤 연산도 출력 경로 무접촉).

### 9-R.2 (HIGH#2) error-path 전면 redaction + spy 전 스트림
§3.1/§3.3 보강: 예외·traceback·stderr·debug·로그·command echo **전부 redaction**(토큰 평문 0). regression spy = raw 토큰이 **stdout AND stderr AND traceback AND 파일 AND marker AND decision JSON AND 임의 emitted text stream** 어디에도 미출현을 정적+런타임 assert(에러 경로 강제 유발 케이스 포함 — 일부러 실패시켜 traceback 에 토큰 미노출 확인). 토큰 포함 가능 연산은 try/except 로 감싸고 except 도 redacted.

### 9-R.3 (HIGH#3) result/marker 엄격 schema + 토큰-bearing denylist fail-closed
§3.2/§8: `task-2553+24.auth-preflight.json`·result.json 은 **엄격 schema 화이트리스트(§8 packet 과 정합 — 전부 redacted bool/enum/명칭, raw 0)**: `token_present:bool` / `prefix_is_ghs:bool` / `is_app_token_not_owner_pat:bool` / `gh_auth_capable:bool` / `merge_permission_preflight:enum(PASS|FAIL)` / `raw_exposure:0` / `checked_via:[명칭]` / `hold_for_chair:bool` / `hold_reason:enum|null` / `cond7_results:{token_present,prefix_ghs,not_owner_pat,raw_exposure_zero,merge_perm_preflight}=각 bool/enum` / `ts`. (= §7 5조건 결과·HOLD 여부를 schema 내 redacted 필드로 명시 수용 — §8↔9-R.3 자기정합, 추가 ad hoc 확장 0). **denylist**: 토큰값·Authorization 헤더·길이>4 prefix·중첩 payload·예상외 필드 = serialize 0. schema validation 이 화이트리스트 외/미redact/중첩 토큰-bearing 필드 감지 시 **fail-closed**(marker write 거부·HOLD). serializer 임의 객체 dump 금지(명시 필드만).

→ 9-R.1~9-R.3 으로 HIGH3(credential leak surface) 해소. CRITICAL0. Codex re-lint GO_READY 시 dispatch.

## 10. task-2553 계열

+21=Track M PRE_MERGE_HOLD(auth absent + head_sha stale) / **+24(Track AUTH 본건)=BOT_GITHUB_TOKEN redacted preflight** / +22=Track P(profile sanctioned_head refresh, 병렬) / Track M 재실행=AUTH+P 후.
