AIによるコーディング量の増加が目覚ましいですが、いっぽうでAI生成による低品質コード・低品質ユーザによるOSSへの攻撃も深刻なものとなっています。
Curlはブチ切れて報奨金制度から撤退し、また様々な組織が歯止めのない仕組みに苦言を呈しています。
一部のWebサイトでは、2025年の流行語大賞がslopになったくらいです。
この問題の原因のひとつが、GitHubにアクセス制御の仕組みがないことです。
もちろんGitHub以外にもそのようなシステムはありますが、人口的に最も影響が大きいのはGitHubでしょう。
GitHubは、Publicなリポジトリであれば誰でも、文字どおり誰でもプルリクやIssueを出すことができ、条件付き許可やBANといった仕組みがありません。
これまでは、Issueはともかくプルリクは参入障壁が高かったのでおかしな連中もそこまで多くなかったわけですが、AIの登場によって参入障壁が限りなく低くなり、低品質ユーザも入り込みやすくなってしまいました。
しかしGitHubは昔ながらの信頼モデルを引き継いでおり、低品質ユーザが多数乱入してくることを想定していないシステムであるため、ここで今まさに制度の軋みが発生しているというわけです。
ということで、信頼リストによってIssueやプルリクへのアクセス制御をおこなうツールVouchが誕生しました。
以下はGitHubリポジトリからリードミーの紹介です。
Vouch
コミュニティの信頼による管理システム。
プロジェクトの一部領域にアクセスする際、ユーザは認証を受ける必要があります。
具体的にどのようにするかは、プロジェクトごとに設定可能です。
また、明示的にdenounceすることでアクセスを拒否することも可能です。
実装は汎用的であり、どのプロジェクトのどの領域にも使用可能です。
我々は、GitHub ActionsとCLIで使えるGitHub統合機能を提供しています。
信頼リストは1ファイルでできていて、標準のPOSIXツールやプログラミング言語で簡単に解析できるフォーマットです。
信頼リストは、信頼の輪を形成することができます。
設定によって、他プロジェクトの信頼リスト・拒否リストを取り込むことができるのです。
これによって、共通の価値観を持つプロジェクトは、相互に信頼を共有し、エコシステム全体で大規模かつ包括的な信頼の輪を築くことができます。
あるプロジェクトで信頼されているユーザは、別のプロジェクトでも自動的に信頼されるようになるといった活用が可能です。
これはGhosttyで使用している実験的なシステムです。
実績とフィードバックに基いて、引き続き改良していきます。
Why?
オープンソースは信頼と検証に基いて機能してきました。
コードを理解し、変更を実装し、プルリクエストを提出するまでの労力は非常に大きかったため、そのレベルにない人による低品質のcontributeは自然と排除されていました。
これまで20年以上、これは私のプロジェクトだけではなく、他の全てのプロジェクトにおいても同様でした。
残念ながら、AIツールの登場がその状況を一変させました。
AIツールを使えば、コードをほとんど理解せず、あるいは全く理解せずに、一見もっともらしく見えるだけの極めて低品質なcontributeを送りつけることが簡単にできるようになってしまいました。
プルリクを送ることができるという参入障壁で相手を信頼することが、もはやできなくなってしまったのです。
しかしながら、オープンソースは今もなお信頼の上で成り立っています。
全てのプロジェクトは、メンテナーという信頼できる個人の明確なグループと、コミュニティによく参加しておりおそらく信頼できるであろう個人のグループが存在します。
そこで、信頼できる個人が他者を信頼し、信頼された個人がcontributeできるという、はっきりした信頼モデルを作ることにしました。
Who is Vouched?
誰が、どうやって信頼リストに載せるか、拒否リストに載せるかは、プロジェクトごとに決めることができます。
ある人を信頼した、拒否したことがどのような結果をもたらすかも、プロジェクト次第です。
プロジェクトとコミュニティに適したポリシーを選びましょう。
Usage
GitHub
GitHub Actionsを使えば、プロジェクトに簡単にVouchを統合できます。
ユーザに信頼を付与する方法や、実行できる動作、実行できない操作を完全に制御することができます。
例としてはVouch自身を見てください。
VouchにはVouchが完全に統合されています!
以下にアクションの一覧と概要を示します。
さらなる詳細はリンク先を見てください。
| Action | Trigger | 概要 |
|---|---|---|
| check-issue | issues | Issue作成時に信頼チェックする。信頼リストにいなければ自動クローズ。 |
| check-pr | pull_request_target | プルリク作成時に信頼チェックする。信頼リストにいなければ自動クローズ。 |
| check-user | Any | 信頼されているGitHubユーザかチェックする。信頼リストにいなければ失敗させる。 |
| manage-by-discussion | discussion_comment | ディスカッションのコメントから信頼/拒否できるようにする。 |
| manage-by-issue | issue_comment | Issueのコメントから信頼/拒否できるようにする。 |
| sync-codeowners | Any | CODEOWNERSを自動で信頼する。 |
| setup-vouch | Any | Vouch CLIをインストールする。 |
CLI
CLIはNushellで実装されています。
Nushell以外に依存はありません。
Integrated Help
ヘルプコマンドはNushellのものです。
use vouch *
help add
help check
help denounce
help gh-check-issue
help gh-check-pr
help gh-manage-by-issue
Local Commands
ステータスチェック。
0は信頼リスト入り、1は拒否リスト入り、2はどちらでもない。
vouch check <username>
信頼リストに追加する。
# プレビュー。デフォルト
vouch add someuser
# 実際に追加する。
vouch add someuser --write
拒否リストに追加する。
# プレビュー。デフォルト
vouch denounce badactor
# コメントも書ける。
vouch denounce badactor --reason "Submitted AI slop"
# 実際に追加する。
vouch denounce badactor --write
GitHub Integration
GitHub統合には環境変数GITHUB_TOKENが必要。
Issue作成者の確認。
# ステータス確認のdryrun。
vouch gh-check-issue 123 --repo owner/repo
# 自動クローズのdryrun。
vouch gh-check-issue 123 --repo owner/repo --auto-close
# 自動クローズ実行。
vouch gh-check-issue 123 --repo owner/repo --auto-close --dry-run=false
# リストに載ってないユーザも許可し、拒否リストユーザのみ拒否。
vouch gh-check-issue 123 --repo owner/repo --require-vouch=false --auto-close
プルリク作成者の確認。
# ステータス確認のdryrun。
vouch gh-check-pr 123 --repo owner/repo
# 自動クローズのdryrun。
vouch gh-check-pr 123 --repo owner/repo --auto-close
# 自動クローズ実行。
vouch gh-check-pr 123 --repo owner/repo --auto-close --dry-run=false
# リストに載ってないユーザも許可し、拒否リストユーザのみ拒否。
vouch gh-check-pr 123 --repo owner/repo --require-vouch=false --auto-close
信頼リストのフォーマット
Vouch自身の信頼リストはこちらで、単純にユーザ名だけが並んだものとなっています。
ここに並んだユーザだけがプルリク可能で、それ以外のユーザがプルリクを出すと自動でCloseされます。
サンプルではもう少し複雑なこともできるようです。
username1
platform:username2
-platform:denounced-user1
-platform:denounced-user2 reason for denouncement
この書式の意味は以下のようになります。
・アカウントusername1はプラットフォームによらず全面的に信頼する。
・プラットフォームplatformではアカウントusername2を信頼する。
・プラットフォームplatformではアカウントdenounced-user1・denounced-user2を拒否する。
-で始まれば拒否リスト、なければ信頼リストです。
:があればその前がプラットフォーム、後ろがユーザ名になります。
半角スペースの後には、任意のテキストを記述することができます。
非常に簡単なフォーマットですね。
しかしユーザ名に:や を入れられるシステムがあったとしたらどうするんだろう?
感想
要するに、リストに入ってない人によるIssue・プルリクを自動で却下するというだけの代物でした。
なんかContribute履歴とかに基いて信頼度を算出するみたいなのを想像していたのですが、そういう機能は一切なく、単にリスト管理するだけでした。
ちょっと残念。
またCLIが普通のbashとかではなく、何故かわざわざNushellを要求するので導入が面倒ですね。
これはVouchの作者がGhosttyの作者であり、Ghosttyには様々なシェルとの統合機能があるので、そこから使いやすいのを選んだとかそんなかんじでしょうか。
そもそもがGhosttyへアクセス制限したいから作ったみたいなところがあるみたいですしね。
まあなんにせよ何もしないよりはずっとマシなので、AIによるゴミPRに悩まされている人などは導入を検討してみてはいかがでしょうか。