bot 名義のコミットと PR のための GitHub App

デフォルトでは、Takuto Core はあなたの個人 gh 認証情報(または 範囲を絞った personal access token)を使ってブランチを push し、 pull request を開きます。これでも動きますが、すべてのコミットと PR が あなた に紐づきます。

代わりに GitHub App を設定すると、Takuto Core を専用の bot アイデンティティとして 動かせます: コミットと pull request は App のアカウントに紐づき、認証には、環境に置きっぱなしの 長命な個人トークンではなく、Takuto Core が自動で発行・ローテーションする 短命のインストールトークン が使われます。

暗号的な署名ではなく、紐づけ(attribution)です。 これにより App の bot アカウントが 作業の作者・コミッターになります。コミットを GPG/SSH 署名するわけ ではない ので、 GitHub の緑色の Verified バッジは付きません — それにはコミット署名が必要で、これは別の 話です。Verified コミットが必要なら、workflow 側で署名を別途設定してください。

なぜ bot アイデンティティを使うのか?

紐づけがすっきりするだけでなく、エージェントの作業を bot アカウント経由にすると、安全性の うえで重要な 2 つのものが手に入ります:

  • トレーサビリティ。 エージェントが生み出すすべてのブランチ、コミット、PR が、あなた自身の 作業に混ざるのではなく、bot に明確に紐づきます — エージェントが何をしたか の記録が 曖昧さなく残ります。
  • ひとりで作業していても、本物のレビューゲートを。 PR の作者があなたではなく bot になる ため、少なくとも 1 件の承認レビューを必須にする branch protection ルールを有効にしつつ、 エージェントの PR を自分でレビューして承認できます。GitHub は通常、自分自身 の PR を 承認することをブロックするので、bot の作者がいなければ、ひとりの開発者はレビューゲートを まったく強制できません。bot がいれば、すべての変更はマージ前に必ずもう一度目を通される ことになります — 大きなセキュリティ上の利点です。

ブランチは必ず保護する。 自律エージェントは、そのトークンが許す範囲なら何でもできます。 だからこそ、リポジトリ自身の保護が本当のセーフティネットになります。main(およびエージェント が対象とするあらゆるブランチ)では branch protection を有効にしてください: マージ前に pull request を必須にし、承認レビューを必須にし、直接の push を禁止します。Takuto Core は 常に feature ブランチを push して PR を開くだけです — 保護されたブランチに直接コミットできて しまうことは決してあってはなりません。エージェントが行儀よくふるまうことに頼らず、ブランチ ルールに頼ってください。

しくみ

[github] の App 認証情報が設定されていると、Takuto Core は次のことを行います:

  1. App の秘密鍵で署名した JWT を組み立てます。
  2. それを GitHub API 経由で インストールアクセストークン と交換します。
  3. 各 worktree 内の gitgh を、その実行中はそのトークンを使うように設定します。

トークンは App のインストールに範囲が限定され、バックグラウンドで更新されるので、push や PR 作成のために個人 PAT は不要です。

1. App を作成する

GitHub → Settings → Developer settings → GitHub Apps → New GitHub App(org のリポジトリ なら org の設定の下)へ進みます。名前とホームページ URL を入力します。webhook は 無効 のままで構いません(Takuto Core はポーリングし、webhook は受け取りません)。作成したら、 App のページに表示される App ID を控えておきます。

2. リポジトリ権限を付与する

App の Permissions → Repository permissions で、実行に必要なものだけを設定します — 範囲を絞ったトークン と同じ範囲です:

権限アクセス用途
ContentsRead & writeブランチとコミットの push
Pull requestsRead & writePR を開く、マージのポーリング
MetadataRead必須の基本権限
IssuesRead & writeticketing_system = "github" の場合のみ

エージェントが触れるべき特定のリポジトリに範囲を絞ったまま — それ以上は付与しないでください。

3. 秘密鍵を生成する

App のページの Private keys で、Generate a private key をクリックします。GitHub が .pem ファイルをダウンロードします。これは認証情報として扱ってください: container に マウントされる場所に保存するか、takuto.env に貼り付けます — 決してリポジトリにコミットしないでください。

4. App をインストールする

Install App をクリックし、リポジトリを所有するアカウント / org にインストールします。 このとき Takuto Core が作業すべき リポジトリだけ を選びます。インストール後、インストールの 設定ページを開きます — URL は /installations/<number> で終わります。この番号が インストール ID です。

5. Takuto Core を設定する

[github] セクションに 3 つすべてを設定します。3 つのフィールドはまとめて指定する必要があり、 秘密鍵の 2 つのフィールドは排他です — パス または インラインの鍵のどちらかを使います:

[github]
app_id = 123456
app_installation_id = 7654321
# マウントした PEM ファイルを指すか…
app_private_key_path = "/run/secrets/takuto-app.pem"
# …または鍵をインラインで保持します(これには config.toml より takuto.env を推奨):
# app_private_key = "-----BEGIN RSA PRIVATE KEY-----\n…\n-----END RSA PRIVATE KEY-----"

鍵は config.toml の外に置くことを推奨します: app_private_keytakuto.env に入れるか、 .pem をマウントして app_private_key_path を使います。正確なフィールドの意味については [github] 設定リファレンス を参照してください。

6. 再起動して確認する

Takuto Core を再起動します(takuto restart、エンジンを直接動かす場合は docker compose up)。 PR を開く workflow を実行し、コミットと PR が個人ユーザーではなく App の bot アカウントに 紐づいていることを確認します。認証に失敗した場合、Takuto Core は対処可能な GitHub API エラー(例えばインストールが見つからない、権限の不一致など)をログに出します — 上記の App ID、 インストール ID、付与した権限を見直してください。