header background image

GitHub Actionsで仕様書の更新漏れを“仕組みで止める”——gh-awで自動PR/NoopするPoC

2026年2月11日☕️☕️ 10 min read

gh-awで仕様書の更新漏れを“仕組みで止める”PoC(送料計算の事故から)

tl;dr

  • 仕様書の更新漏れは注意力では止まらない
  • gh-awで「docs更新が必要ならPR / 不要ならnoop」を自動化すると、人間のレビューが“楽”になる
  • 詰まったのは2つだけ:Safe OutputsActions の PR 作成権限
  • ついでにPR文面を日本語&Draft解除まで整えると、運用のストレスが消える

背景:ドキュメントは「気をつける」だけだと必ずズレる

昔も今も、避けて通れない課題が 仕様書の管理
コードだけ更新されて 仕様書や手順書が古いまま――これは日常的に起こります。

しかも AI時代はこれが悪化しやすい
AIが素早くソースコードを生成・変更できるほど、更新の回数と速度が上がり、結果として ドキュメントが置いていかれる確率 も上がります。

ここで「気をつける」で勝つのは無理ゲー。
なので、差分を自動検知して、更新漏れが起きにくい導線を先に作る方が現実的です。


事故はいつも「コードは正しい」顔をしてやってくる(送料計算のやつ)

送料計算のロジックを変えた。

  • コードは動く
  • テストも通る
  • PRもマージされた

……のに、仕様書だけが古いまま残った。

別に珍しくない。むしろ“よくある”。
だから「ちゃんと書こう」ではなく、ズレると勝手に止まる方向に寄せたくなった。

今回はその緩和策として、GitHub Agentic Workflows(gh-aw) を使い、

  • src/ などの変更をトリガーにする
  • 影響する docs を見直す
  • 更新が必要なら PR を自動作成する
  • 何も不要なら noop で「何もしなかった」を明示する

という流れをPoCとして組みます。

ここでやりたいのは「ドキュメントを完璧に自動生成」ではなく、
更新漏れを“見逃しにくくする仕組み” を作ることです。


gh-awでやりたかったこと(人間のレビュー観点をそのまま機械に渡す)

狙いはシンプル。

  1. src/ の変更をトリガーにする
  2. 影響する docs を見直す
  3. 直す必要があれば PR を出す
  4. 直す必要がなければ noop で明示する

ここでポイントは、「AIが賢いから全部見つけてくれるはず」ではなく、

人間がレビューでやっている判断を、毎回同じ手順で再現させたい

という思想。


1回目:検知したのに成果物ゼロ(No Safe Outputs)

最初の実験、面白いことが起きた。

AIは「仕様書更新が必要」と判断した。
ログにもそれっぽい“完了サマリ”が出る。

……のに、ワークフローは失敗する。

理由はこう:

Safe Outputs が生成されていない
(No Safe Outputs Generated)

ここで一瞬「え、AIが作業したのに何がダメなの?」ってなるんだけど、gh-awの設計を理解すると納得する。

  • エージェント本体は基本 read-only
  • 書き込み(PR作成など)は safe outputs 経由で“明示”しないと反映されない

つまり、AIがローカルで「コミットした気分」になっても、それは成果物としては無効

そこで指示をこう変えた。

  • 変更があるなら create-pull-request を必ず呼ぶ
  • 変更がないなら noop を必ず呼ぶ
  • コミットは禁止(成果物は safe outputs で出す)

2回目:PRを作ろうとして権限で死ぬ

次は create-pull-request を呼ぶようになった。

今度こそ勝った……と思ったら、別の地雷。

GitHub Actions is not permitted to create or approve pull requests.

これ、コードじゃなくて GitHub 側の設定

Actions の「Workflow permissions」が読み取りのみだと、PR作成が通らない。
つまり、

仕組みは合ってるのに、権限が足りなくて死ぬ

という、CIあるあるに着地する。

ここは UI で2つONにしたら終わりだった(後述)。


最終形:PR/Noopを強制し、日本語で、DraftじゃないPRを出す

ここまで来ると、「動く」だけじゃなくて「運用が気持ちいい」状態に寄せたくなる。

  • PRが Draft だと、地味にダルい
  • PRの説明が英語だと、地味に読み飛ばす
  • 変更がないのに黙って終わると、「動いたのか?」が分からない

なので、最終形はこう。

  • docsを直したら PR(Ready for review) を出す
  • 直すものがなければ noop を出す
  • PRタイトル&本文は 日本語
  • 変更対象は /docs と README のみ(ソースは絶対いじらない)

あなたの最新 docs-auto-fix.md はこの形になっていて、かなり“運用できる”と思う:

---
on:
  push:
    branches:
      - main
    paths:
      - "src/**"
      - "test/**"
      - "package.json"
      - "tsconfig*.json"
      - "nest-cli.json"
permissions:
  contents: read
  issues: read
  pull-requests: read
safe-outputs:
  create-pull-request:
    draft: false
  noop:
    max: 1
tools:
  edit:
---
# Docs Auto-Fix

## Goal
Keep documentation in `/docs` and `README.md` consistent with recent source code changes.

## Instructions
1. Identify what changed in this push (check the git diff or review the modified files under `src/`, `test/`, and config files).
2. Determine which docs are impacted and update them for accuracy.
3. Only modify documentation files under `/docs` and `README.md`. Do not change source code.
4. Do NOT commit directly. If documentation updates are made, use the safe output tool `create-pull-request` to propose changes.
5. If no documentation updates are needed, use the safe output tool `noop` to explicitly report no action.
6. When creating a pull request, write the PR title and body in Japanese. Include a short summary and test status.
7. Keep updates minimal, precise, and aligned with existing formatting.

## Repo Notes
- If shipping fee rules or API behavior change, update `/docs/shipping-fee-spec.md`.

導入手順(コピペ用チェックリスト)

「設定も記事に入れた方がいい?」→ 入れた方がいいです。ここで離脱する人が多いので、チェックリスト化が強い。

1) ファイルを追加する

  • .github/workflows/docs-auto-fix.md を作る(上の内容)

2) lock を生成する

gh aw compile

生成される .github/workflows/docs-auto-fix.lock.yml も 必ずコミット

3) GitHub Actions 側の設定(ここで死にがち)

Repo → Settings → Actions → General で:

  • Workflow permissions: Read and write permissions
  • Allow GitHub Actions to create and approve pull requests: ON

これがないと create-pull-request が権限エラーで落ちる。

4) Secret(Copilot を使う場合)

Repo → Settings → Secrets and variables → Actions → New repository secret

  • COPILOT_GITHUB_TOKEN を追加

(Fine-grained PAT で “Copilot Requests” を付ける。最小権限でOK、という設計に寄せるのが気持ちいい)

5) 動作確認

  • src/ 配下を触って main に push
  • docs更新が必要なら PR が出る
  • 必要ないなら noop が出る(「動いたけど何もしなかった」が可視化される)

教訓:「気をつける」より「通らない仕組み」

今回いちばん面白かったのはここ。

  • AIは“判断”できる
  • でも、成果物として反映するには儀式が必要(safe outputs)
  • そして、権限は現実(Actions の PR 許可)

つまり、AIに全部任せるというより、

“AIが動けるレーン”を人間が設計してあげる

のが勝ち筋だった。

そしてそのレーンが一度できると、仕様書の更新漏れは「注意力」じゃなくて「仕組み」で減らせる。

速度が上がる時代ほど、ズレも増える。 だから「ちゃんと書こう」ではなく、書かないと通らないを先に作る方が、多分うまくいく。

サンプルリポジトリ:

https://github.com/thundermiracle/ai-auto-docs

ThunderMiracle

Blog part of ThunderMiracle.com

コメントは表示領域に入ると読み込みます