GitHub Actions 無料枠 枯渇 の 原因と対策
2026-09-19、 rei-aios repo 私 用 CI 枠 2,000 min/月 が 月中 に 枯渇した 事案 の root cause audit と 修正 arc (STEP 2127〜2130、 rei-aios-09 tab)
Ⅰ原因
私 の rei-aios repo (private) の GitHub Actions 無料枠 (2,000 min/月) が 2026-09-19 昼過ぎに 枯渇。 直接 causal chain:
- push で 動く workflow が 複数 (Mirror to GitLab + Codeberg、 dist-renderer/data mirror check 等)
- 私 用 自動 commit が 高頻度 (site rebuild + stats refresh + OUKC static pages refresh 等、 実測 ~39 回/日)
この 2 つの 掛け算 (~39 push/day × 複数 workflow × 各 1-2 min billable) で 全体 の 8 割 弱 が 消費されていた。 push で 動く 設定 (on: push) と 自動 commit の 高頻度 の 組合せ が 本質的 root cause で、 定期実行 (schedule cron) の 本数 が 多いこと は 副次的。
更に 悪化要因 が 2 つ:
- self-firing signal monitor workflow が 書式エラー — STEP 2004 (2026-09-13) 設置 の
continuous-self-firing-signal-monitor-weekly.ymlが YAML block scalar (run: |) 内 の heredoc content の indent 不整合 で GitHub Actions parser に invalid file と 判定されていた。 push 毎に 「0 job の failure run」 が 記録され (実 runner 時間 は 消費されず 0 min)、 週次 cron も 一度も 発火せず monitor は dormant のまま だった。 - MCP Tests workflow (STEP 2119、 2026-09-18 設置) の paths filter 欠如 — 上記 push 発火の pattern を 新設 CI で 再作り込み していた。 quota 枯渇 状態 で 気付かず、 chat-Claude が catch。
Ⅱworkflow ごとの 消費内訳
2026-09-01 〜 2026-09-19 (18 日) の 実測 run 数 × 1 job あたり平均 wall-clock × 「job 単位 1 min 切り上げ」 の 総和。 30 日換算は 一律 × 5/3 で 外挿。
| workflow | trigger | 30 日 見込み (min) | 備考 |
|---|---|---|---|
| Mirror to GitLab + Codeberg | push + schedule | ~1,973 | 全体 の 32% |
| dist-renderer/data mirror check | push + pull_request | ~967 | 全体 の 16% (537/537 全 failure) |
| Lean 4 Verify | push (paths filter) | ~453 | paths filter で 既に 抑制 |
| Rei Learning Cycle | schedule 2/日 | ~223 | 健全 |
| Comparator Gauge Daily | schedule 1/日 | ~133 | 健全 |
| MCP Tests (STEP 1987+1988) | push (filter 無し = 想定) | ~2,340 | quota 枯渇時 は 21 runs × 1 min の billing 失敗 短周期 のみ、 正常時 は 39 push/日 × 2 min の想定 |
| continuous-self-firing weekly | schedule (書式エラーで 未 発火) | 0 | 本 arc で invalid 判明 |
| その他 (7 workflow) | schedule 主体 | ~185 | Daily / Weekly 系 |
| rei-aios-v2 Auto Evolve | push | ~145 | 本 arc 未変更 |
| 合計 (13 workflow、 修正前 想定) | ~6,100 | 無料枠 2,000 の 3 倍超 |
Ⅲ対策
STEP 2127 (commit 7c8afa398) — 2 workflow の push 発火 削除
mirror-sync.yml:on.push削除、schedule: '0 12 * * *'(毎日 12:00 UTC) とworkflow_dispatchのみ残す。 GitLab / Codeberg mirror は 最大 1 日遅れで 更新。 目的 (GitHub 障害 / account ban risk 分散 の 予備複製) は 1 日遅れで 十分成立。dist-renderer-mirror-check.yml:on.pushとon.pull_request削除、workflow_dispatchのみ残す (file 削除しない)。 537/537 全 failure だった ため 検査 が 機能していなかった。 失敗原因の 調査と 修正 は 未決 (下記)。
STEP 2128 (commit 9eff44712) — MCP Tests に paths filter 追加
STEP 1987 は readFileSync('src/mcp/rei-mcp-server.ts') で 解析、 STEP 1988 は tsx src/mcp/rei-mcp-server.ts を 実 subprocess spawn。 実 import を grep で 特定し、 src/mcp/** + src/agent-connector/** + src/aios/dialogue-terminal/** + src/aios/stopping-condition/** + src/axiom-os/bilattice-eight-engine.ts + src/axiom-os/seven-logic.ts + test/step1987-*.ts + test/step1988-*.ts + package.json + package-lock.json + tsconfig.json + 本 workflow file 自身、 の 12 paths を filter に。 push + pull_request 両方に 適用。
STEP 2129 (commit 57bb45245) — self-firing workflow の 書式エラー 修正
2 箇所 の YAML block scalar (run: |) content indent bug を発見・修正:
- Alert step: heredoc
cat > file << EOFの Markdown content が column 1 で block scalar 基準 indent より 浅く、 YAML parser が block scalar を 途中 で 終了と 解釈 → line 118 の**Verdict**の*を YAML alias reference として scan して失敗。{ echo '...'; echo ''; ... } > filepattern に置換で解消。 - Commit step: multi-line
git commit -m "..."の 2 行目以降 が column 1 で 同型 bug。 複数-mflag に 分割 で 解消。
本 修正 で GitHub Actions parser が workflow file を 受理、 API .name field が raw path から 「Continuous Self-Firing Signal Monitor Weekly」 に 復活。 STEP 2004 (2026-09-13) 設置以降 6 日間 一度も 動いていなかった monitor が 初 実行 (詳細 は 下記 § Ⅵ)。
Ⅳ対策 前後 の 月間見込み
「全体 (13 workflow 合計)」 と 「MCP Tests 単独 (STEP 1987+1988 のみ)」 は 別の scale。 混同予防で 分けて 提示:
| scope | 修正前 (30 日換算) | 修正後 (30 日換算) | 削減 |
|---|---|---|---|
| 全体 (13 workflow 合計) | ~6,100 min/月 | ~1,250 min/月 | ~4,850 (80%) |
| MCP Tests 単独 (paths filter で hit した push のみ 発火 に 変化) | ~2,340 min/月 | ~112 min/月 | ~2,228 (95%) |
無料枠 2,000 min/月 に 対して 全体 ~1,250 で 750 min の 余裕。 MCP Tests は 実測 wall-clock 55s (1 run) を 実 CI で 観測、 過去 18 日 の commit 971 件中 67 件 (6.9%) が paths filter に該当 = 30 日換算 ~112 件/月 × 1 min billable = ~112 min/月 の 見込み。
Ⅴself-firing 監視 の dormant 期間 と 初 実行 結果
continuous-self-firing-signal-monitor-weekly.yml は 書式エラー で GitHub Actions parser に invalid file と 判定されていたため、 週次 cron (Sunday 22:40 UTC = Monday 07:40 JST) が 一度も 発火せず。 設置以降 6 日間、 monitor は 完全に dormant だった。 push 毎に 「0 job の failure run」 が 211 件 記録されていたが、 実 runner 時間 は 消費されず (0 min billable)、 monitor script も 走っていなかった。
STEP 2129 修正後、 workflow_dispatch で 初 実行 (run ID 35406858861、 2026-09-18T23:44 UTC):
- Conclusion: success
- Wall clock: 1m15s (billable 2 min)
- Signal 1 (session close review 累積): 0 hits
- Signal 2 (baseline triggered miss): 0 hits
- Signal 3 (藤本さん explicit): 0 hits
- Verdict: NOT_EMERGED — signal accumulate 継続、 defer indefinite 維持
Honest scope: CI runner に $HOME/.claude/.../memory/ hooks は 存在しない ため、 CI 上 の 走査は notepad-only の partial scan (script 内 comment で 明示)。 ローカル memory hooks を含む full scan は 別環境。 「monitor が 動いていなかった 6 日間 の signal を backfill 収集する」 forward-only の recovery は 困難 (run 記録側 の backfill は 不能)、 今後 の weekly cron で 継続 観測。
Ⅵcommit メッセージ の skip 命令 の 規則
本 arc で 私 (rei-aios-09 tab) が STEP 2128 で 副次事故: commit メッセージ本文 内 で 「自動 commit への skip-ci 案 は 未来 STEP 候補 として 記録のみ」 と 説明 する 際、 GitHub が commit メッセージ 内 を 検出する 角括弧付き 5 文字列 の うちの 1 つ を そのまま literal で 書いてしまい、 GitHub が 該当 push の 全 workflow を silent-skip。 私 は 「billing transition 由来 の event drop」 と 誤 診断、 chat-Claude が 真因 を catch。
公式 規則 (要旨)
- 検出対象 = 角括弧付き 5 文字列 (具体 literal は 公式文書 参照、 本 page 本文 では 意図的 に 転記しない)
- 適用 event =
on: pushとon: pull_requestの 2 つのみ - 非適用:
on: pull_request_targetは 公式で 明示除外、on: schedule/on: workflow_dispatch/on: workflow_run等 は list 外 (対象外) - 括弧 の ない 単語列 (例: 「skip ci」 の 空白区切り word だけ) は list に なく、 検出されない
出典: docs.github.com — Skipping workflow runs (公式文書、 2026-09-19 curl 取得、 md5 fixed で sidecar 永久保存 = STEP 2130 一次資料)。 詳細 の 5 文字列 と verbatim 原文は 出典 link を 参照 (本 page では 転記しない、 未来 誰かが 本 page を 別 commit body に 引用 した 際 の 再 感染 予防)。
私 の feedback memory では 「commit body で skip-ci 案 を 記述 する 際 は hyphen 化 (skip-ci 案) or word 化 (skip flag) or 括弧除去 で 回避」 を rule として embed。 意図的 marker としての 使用 (auto-commit script の 自己再帰 prevent 用) は 従来通り正しい (rule 対象外)。
Ⅶarc 全体 (STEP 2127〜2130)
| STEP | 内容 | run ID / 主 evidence | commit |
|---|---|---|---|
| 2127 | GHA quota audit + mirror-sync / dist-renderer push 発火 削除 | gh audit 1,673 runs 内訳 | 7c8afa398 |
| 2128 | ci-mcp-tests.yml paths filter 追加 | run 35406077167 PASS 11/11 + 23/23、 55 秒 | 9eff44712 |
| 2129 | continuous-self-firing yaml 修正 + skip-ci 規則 embed | run 35406858861 NOT_EMERGED、 1m15s | 57bb45245 |
| 2130 | 公式文書 一次資料 curl 取得 + feedback memory 出所訂正 | docs.github.com md5 5d26d57e | e6e1efb84 |
| 2140 | source-attribution + 数字混同 訂正 (記録のみ) | — | b595509b0 |
本 page は STEP 2141 で land、 未 review。 rei-aios repo は private のため run URL は link に せず、 run ID のみ 記載。
Ⅷ未決 (未来 STEP candidate、 本 arc では 実施なし)
- dist-renderer/data mirror check の 537/537 failure 原因 の 調査と 修正 (現状 は
workflow_dispatchのみで 保持、 file 削除は していない) - 自動 commit ~39 回/日 への
[skip-ci-marker](角括弧付き literal) 付与 による 一括削減 の 検討 — 藤本さん + auto commit script owner 判断待ち。 paths filter で 既に 大部分 の 発火 は 抑止済 の ため、 二段目 の 保険 位置付け - registry (m)
continuous-self-firing-needの verdict label 訂正 (「監視中 NOT_EMERGED」 → 「dormant 未観測 → 修正後 measured NOT_EMERGED (partial)」) は owner tab rei-aios-62 復帰待ち、 rei-aios-09 sidecarhandoff-to-rei-aios-62-2026-09-19.mdに 申し送り deposit 済