# task-3033 — GitHub Actions 소비 절감 (3,000분 소진 재발 방지)

**레벨**: Lv.2 · **팀**: dev5-team · **회장 승인 완료** (2026-08-27)
**저장소**: `Jeon-Jonghyuk/InsuRo` (`/home/jay/projects/InsuRo`, 기본 브랜치 **main**)

## ★ 배경 — 실제로 CI 가 멈췄다
```
Actions minutes   3,000 / 3,000 min  소진 (100%)
Billable usage    $10.00  ($28.01 사용 − $18.01 할인)
Usage by repo     InsuRo $27.72  ·  InsuWiki $0.29     ← InsuRo 가 사실상 전부
리셋              6일 후
```
잡이 **시작조차 못 하고 2초 만에 실패**했다:
> "The job was not started because recent account payments have failed
>  or your spending limit needs to be increased."

회장이 budget 을 인상해 당장은 풀렸으나 **구조를 안 고치면 다음 달에 똑같이 터진다.**

## 원인 — main push 마다 워크플로우 3개가 전부 돈다
```
ci.yml                4~7분     push:main + pull_request
e2e.yml               3분       push:main + pull_request
diagnostic-pytest.yml 4분       push:main + pull_request
extension-release.yml            (paths 필터 있음 — 유일)
```
★ **`paths` 필터가 `extension-release.yml` 에만 있다.**
→ `memory/reports/task-XXXX.md` 한 줄만 바뀌어도 **3개 워크플로우 전량 실행**된다.
2026-08-26 하루에만 태스크 5건이 머지되며 그때마다 3개씩 돌았다.

---

## 고칠 것 (회장 승인 3안)

### ① 경로 필터 추가
문서·보고서만 바뀐 커밋에서는 CI 를 돌리지 않는다.
- 대상: `ci.yml` · `e2e.yml` · `diagnostic-pytest.yml`
- ★ **`paths-ignore` 를 쓸지 `paths` 를 쓸지 신중히 판단하라.**
  `paths-ignore` 로 문서만 제외하는 편이 안전하다. `paths` 화이트리스트는
  **새 디렉터리가 생기면 조용히 검사에서 빠진다**(더 위험).
- 제외 후보: `**/*.md` · `memory/**` · `docs/**` · `.gitignore` · `LICENSE`
- ★ **워크플로우 파일 자신(`.github/workflows/**`)은 제외하지 마라.** CI 설정 변경은 검증돼야 한다

### ② E2E 는 PR 에서만
`e2e.yml` 의 `push: branches: [main]` 트리거를 제거한다.
- 근거: PR 에서 이미 검증한 것을 머지 후 또 돌린다. squash 머지라 내용이 동일하다
- ★ 단 **PR 없이 main 에 직접 push 되는 경로가 있는지 먼저 확인하라.**
  있다면 그 경로는 검증 공백이 된다 — 발견 시 진행하지 말고 보고하라

### ③ diagnostic 은 하루 1회
`diagnostic-pytest.yml` 을 매 push 대신 `schedule`(cron) 로 바꾼다.
- 하루 1회. 시각은 **KST 기준으로 명시**하고 주석에 UTC 환산을 남겨라
  (`cron` 은 UTC 다. 06:00 KST = `0 21 * * *` UTC)
- ★ `workflow_dispatch` 를 함께 넣어 **수동 실행이 가능하게** 하라. 필요할 때 못 돌리면 안 된다
- PR 트리거는 **유지할지 판단하고 근거를 남겨라**

---

## ★ 절대 하지 말 것
- **CI 를 무력화하지 마라.** 목표는 "덜 돌리기"이지 "검증 안 하기"가 아니다.
  PR 에서의 검증은 **그대로 유지**되어야 한다
- `ci.yml` 의 **테스트 내용·스텝 자체를 줄이지 마라**. 트리거 조건만 조정한다
- `extension-release.yml` 은 이미 `paths` 필터가 있다. 건드리지 마라
- 시크릿·`permissions` 블록 변경 금지
- 소스 코드(`src/**` · `server/**` · `extension/**`) 변경 금지

## allowed_resources
```yaml
allowed_resources:
  paths:
    - ".github/workflows/ci.yml"
    - ".github/workflows/e2e.yml"
    - ".github/workflows/diagnostic-pytest.yml"
    - "memory/reports/task-3033.md"
  forbidden_paths:
    - ".github/workflows/extension-release.yml"
    - ".github/workflows/taskctl-ci.yml"
    - "src/**"
    - "server/**"
    - "extension/**"
  commands: ["bash", "python3", "gh", "npx"]
  merge_policy: "tiered"
  ttl_hours: 24
```

## 검증 (실측 강제)
1. **문법 검증** — 수정한 YAML 이 유효한지 확인하라(`actionlint` 또는 파서).
   문법이 깨지면 CI 가 **영구히 안 돈다**. 이게 이 태스크의 최대 위험이다
2. **트리거 매트릭스** — 아래 4가지 경우에 어떤 워크플로우가 도는지 **표로** 제시하라
   ```
   (a) src/ 코드 변경 PR
   (b) memory/reports/*.md 만 변경 (문서 커밋)
   (c) main 에 squash 머지
   (d) .github/workflows/ 변경
   ```
3. **절감 추정** — 2026-08 실제 사용 이력을 근거로 이번 변경이 **몇 분을 아끼는지** 추산하라.
   ★ 추측 금지. 최근 머지 이력(태스크 5건/일)과 워크플로우별 소요시간(ci 4~7분·e2e 3분·
   diagnostic 4분)을 곱해 계산하고 산식을 보여라
4. **검증 공백 없음** — ②③ 후에도 **PR 단계에서 모든 검증이 유지**되는지 명시하라.
   어떤 검사가 언제 사라지는지 표로 정리하라
5. **실증** — 이 PR 자체가 `.github/workflows/**` 변경이므로 **CI 가 정상 실행되어야 한다**(①의 제외 대상 아님).
   실제로 돌았는지 확인하고 결과를 보고하라

## ★ 이 태스크의 위험
워크플로우 문법 오류는 **조용히 실패**한다 — CI 가 안 도는데 아무도 모른다.
반드시 ①(문법 검증)을 먼저 하고, PR 에서 실제 실행을 확인한 뒤 완료 선언하라.

## 완료 조건 (DoD)
**문서만 바뀐 커밋에서 CI 3종이 실행되지 않고, PR 단계 검증은 그대로 유지되며,
절감량이 실제 이력 기반 산식으로 제시된다. 그리고 이 PR 자체에서 CI 가 정상 실행된다.**

## ★ 세션 조기 종료 대책
시작 즉시 브랜치 + 드래프트 PR 을 먼저 열어라. 단계마다 커밋하라.
(2026-08-26 OOM 으로 봇 4팀이 죽었고 그중 2팀은 커밋 0이라 진척이 전부 사라졌다)
★ ANU 명세 전제가 틀렸다고 판단되면 구현하지 말고 **반증을 먼저 기록한 뒤 보고하라.**

## 운영 계약
- `origin/main` 기준 `git pull --ff-only` 후 시작
- ★ **worktree 를 써라.** 메인 저장소 `/home/jay/projects/InsuRo` 는 **cron 이 매일 06:00·08:00 에
  직접 실행**한다. 2026-08-26 에 다른 팀이 점유해 ANU 가 수동 복구했다
- ★ `gh` 호출 시 `GH_TOKEN="$BOT_GITHUB_TOKEN"` 주입 필수 (회장 개인 PAT 금지 — 감사기록 오염)
- 워크플로우 `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md` · QC `/home/jay/workspace/teams/shared/QC-RULES.md`
- `WORKSPACE_ROOT=/home/jay/workspace` · `CHAT_ID=6937032012` · 수집자 key `ANU_KEY=c119085addb0f8b7`
- 완료 경로는 `finish-task.sh` 실행이 유일하다. 수동 `.done` 금지.

## 보고
**PR 생성까지가 범위다. 머지는 ANU 가 한다. 자동 머지 금지.**
`memory/reports/task-3033.md` 작성 후 표준 완료 콜백 등록. 콜백 프롬프트 **UTF-8 3900 bytes 이하**.
★ 봉투 첫 줄에 **"트리거 매트릭스 확인 여부 + 추정 절감 분수"** 를 담아라.