1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

僕がGodotのコントリビューターになれた話

1
Posted at

僕がGodotのコントリビューターになれた話

結論から、画像で示していくスタイル
ChatGPT Image 2026年8月1日 18_30_49.png

たった6行に、全世界への愛を詰めた

2026年7月、僕の書いたコードがGodot Engineにmergeされた。
正確には、2本のPull Requestがmergeされた。
ひとつは、AndroidでSoC名を取得できるようにする変更。
もうひとつは、iPhone 17eのSoC名と画面密度をGodotの対応表へ追加する変更だった。
Android対応は6行追加、1行削除。
iPhone 17e対応は2行追加、1行削除。
世界的なゲームエンジンへの貢献としては、拍子抜けするほど小さい。
でも、その数行に、僕は全力だった。

なぜなら、僕はGodotを愛していたからだ。

UnityもCocos2d-xも触ってきた

これまで、UnityやCocos2d-xを触ってきた。
どちらも強力なゲーム開発環境だし、それぞれから多くのことを学んだ。

ただ、僕が本当に愛したゲームエンジンはGodotだった。

機能が多いから。
無料だから。
軽いから。

そういう比較表に載る理由だけではない。

Godotには思想がある。
誰かの商売道具を借りているのではなく、世界中の人が同じエンジンを持ち寄り、少しずつ良くしていく。
ソースコードを読める。
内部の仕組みを調べられる。
気に入らないところがあれば、自分で直せる。

そして、その修正を世界へ返せる。

僕は哲学が好きだ。

だから、思想を持ったソフトウェアを愛せる。
そして、愛せるものだからこそ、たった6行のために、全力になれる。

自分が困ったので、Godotの中を掘った

きっかけは、Android端末のSoCをGodotから取得したかったことだった。
端末に搭載されたSoCやNPUによって、実行する処理を切り替えたかった。
Godotには、CPU名を取得するためのAPIがある。

var processor_name = OS.get_processor_name()
print(processor_name)

ところが、Androidで実行すると空文字列が返ってきた。

""

Pixelでも、REDMAGICでも、POCOでも空文字列だった。
自分の使い方が間違っているのかと思い、Godot本体のコードを調べ始めた。
すると、Windows、Linux、macOSなどにはプラットフォーム固有の実装がある一方、Androidには実装がなかった。

Android 12以降なら、システムプロパティのro.soc.modelからSoC名を取得できる。
実機で確認すると、きちんと値が返ってきた。

Pixel 10a    -> Tensor G4
REDMAGIC 9   -> SM8650
POCO         -> MT6899

そこで、Issue #120816を作った。

再現方法、調査したコード、実機の結果、考えられる修正方法を書いた。
ここまでは、普通のバグ報告だった。
でも、僕にとってはIssueを立てて終わりにはできなかった。

もちろん、再現可能なIssueを書くこと自体も立派なOSS貢献だ。
ただ、僕自身が「愛している」と言うなら、問題を見つけて誰かに渡すだけでは足りなかった。
直せそうなら、自分で直したかった。

最初のPRは閉じられた

最初に出したPR #120850では、Android向けの実装を追加した。

ro.soc.modelを取得し、古いAndroidでは/proc/cpuinfoへフォールバックする、少し大きめの実装だった。

このコードとPRの文章を作るために、Claude Codeを使っていた。
AIを使ったことはPRにも開示していた。
自分では、実装内容を確認し、3台の実機でもテストしていた。

だから、問題ないと思っていた。

しかし、Godotのルールでは、AIによるコントリビューションは非推奨であり、AIが全面的に生成した貢献は禁止されていた。

さらに、PRを出すわずか2日前の2026年6月30日、Godot Foundationはコントリビューション方針の変更を発表していた。

Godotには大量のPRが集まり、少数のメンテナーではレビューしきれない状態になっていた。

AIエージェントやAI生成コードによってPRを作るコストだけが下がり、レビューする人間の負担は増えていた。

そのため、

  • 自律型AIエージェントによる貢献
  • AIが生成した大部分のコード
  • 人間同士の会話に使われるAI生成文

を認めない方針が、明確に打ち出された直後だった。

僕は、その記事を知らなかった。

そして、最悪に近いタイミングで飛び込んだ。

さらに、自動化が事故を起こした

その後、PR #120854が作られた。

閉じられたPRとほぼ同じコードで、PRテンプレートも正しく使われておらず、AI利用の開示も欠けていた。

外から見れば、

AI生成だと指摘されて閉じられたコードを、AI利用の説明だけ消して出し直した

ようにしか見えない。

当然、厳しく指摘された。

実際には、僕の環境でClaude CodeがPR作成まで自動化された状態になっており、意図しないPRを作ってしまった。

僕は動作していたClaude Codeのセッションをすべて停止した。

ただし、これはAIのせいではない。

僕のGitHubアカウントから行われた操作は、僕の責任だ。

便利な道具が勝手に走ったからといって、他人の庭へ突っ込んでよい理由にはならない。

メンテナーからは、次に同じことをすれば、今後コントリビューションできなくなる可能性があるとはっきり警告された。

それでも、対話を打ち切らず、僕が責任を持ってやり直すことを信じてくれた。

僕は最初からやり直した。

自分の手で書いたら、6行になった

新しく作ったPR #120896では、コードもPRの説明も、自分で書いた。

最初のPRにあった、古いAndroid向けのフォールバックや複雑なエラー処理をいったん捨てた。

本当に必要な変更だけに絞った。

String OS_Android::get_processor_name() const {
    return get_system_property("ro.soc.model");
}

ヘッダーファイルにoverrideを追加し、ドキュメントを更新した。

最終的な差分は、3ファイルで6行追加、1行削除だった。

3台のAndroid端末でテストした。

Pixel 10a       -> Tensor G4
Nubia NX769J    -> SM8650
Xiaomi端末      -> MT6899

レビューでは、ドキュメントの表現、不要なエラー処理、コミットのまとめ方などを教えてもらった。

指摘を受けて直す。

分からないところは分からないと言う。
自分が書いたコードを、自分の言葉で説明する。
今思えば、これがコントリビューションだった。

コードをGitHubへ置くことではない。
人間同士で、そのコードをGodotの一部にしていくことだった。

2026年7月5日未明、日本時間でPRはmergeされた。

メンテナーから、

Congratulations on your first merged contribution!

という言葉をもらった。

僕はコメントにこう書いた。

皆さんの親切と指導のおかげで、本当に愛しているGodot Engineへ貢献できたことを誇りに思います。

あれは社交辞令ではない。

本当に、そう思っていた。

もうひとつ、1行のバグを見つけた

Android版を検証している途中、iPhone 17eでもOS.get_processor_name()が空文字列になることに、気づいた。

今度はiOS全体の実装がないのではなかった。
Godotには、iPhoneのモデル識別子からSoC名を引く対応表がある。
しかし、iPhone 17eの識別子であるiPhone18,5が、まだ登録されていなかった。

必要だった修正は、SoC対応表への1項目追加だった。

{ { "iPhone18,3", "iPhone18,5" }, "Apple A19" },

レビューで、画面密度の対応表にも追加が必要だと教えてもらい、そちらも修正した。
このPR #120853もmergeされた。

差分は、2行追加、1行削除だった。

本気でOSSを使うと、こういうことが起きる。
巨大な設計を変えなくてもいい。
何千行ものアルゴリズムを書かなくてもいい。

新しい実機で試したら、対応表に1行足りなかった。
毎日使っていたら、ある関数だけ空文字列を返した。

そんな小さな穴が、世界中で使われているソフトウェアにも残っている。

メンテナーに感謝している

PR上では、厳しい言葉も受けた。
ただ、僕はメンテナーを恨んでいない。
むしろ、本当に感謝している。

彼らは僕を追い出すこともできた。
会話を打ち切ることもできた。

それでも、間違いを指摘し、ルールを説明し、僕が自分で書き直したPRをレビューしてくれた。

後日、厳しく指摘したメンテナーの方から、

振り返ると、自分は不公平で厳しすぎたと思う。謝りたい

というコメントをもらった。

僕は、

気にしないでください。
厳しくても、最後まで面倒を見てくれました。
チームがAIに疲れているという記事も読みました。
タイミングが悪かっただけです。

と返した。

僕が知らなかったルールを破ったことと、Godot側がAI生成コントリビューションに疲弊していたこと。
それらが、最悪の角度で衝突した。

でも、最後に残ったのは対立ではなかった。

コードと、対話と、感謝だった。

OSSを本気で使ってみてほしい

「OSSに貢献する」と聞くと、難しく感じるかもしれない。

  • 英語が必要
  • 巨大なコードベースを理解する必要がある
  • 高度なアルゴリズムを書かなければならない

僕も、どこかでそう思っていた。
でも、違った。

OSSを本気で使ってみてほしい。
自分の仕事や作品で、限界まで使ってみてほしい。

すると、1行で直るバグが見つかる。

対応表に名前がひとつ足りない。
あるプラットフォームだけoverrideがない。
戻り値が空になる。

ドキュメントと実装が少しずれている。

コントリビューションは、「貢献できそうなIssue」を探すところから始まるとは限らない。

自分が愛して使い倒した結果、見つけてしまうものでもある。
愛しているから、違和感に気づく。
愛しているから、ソースコードまで掘る。

愛しているから、Issueを書いて終わりにせず、たった1行を直しに行く。

僕にとってOSSへの貢献は、技術力の証明ではなかった。

世界中から受け取ったものへ、少しだけ返す行為だった。

そして今日も、Issueを投げた

2026年8月1日。

僕は今度はHugging FaceのTransformers.jsへ、KV Cacheのメモリリークに関するIssueを投げた。

ChatterboxをWebGPUで繰り返し実行すると、生成のたびにGPUメモリが増え続ける。

調査したところ、呼び出しごとにKV Cacheが破棄されず、最大で約24GBまでGPUメモリが膨らんでいた。
max_new_tokens: 256では、生成1回につき約120MiBずつ増えていた。

Issue #1734として、再現コード、環境、計測結果、原因と思われるコードパスまで書いた。

ただ、僕は自分で書いた。

Issueを起こすだけなら、まだ愛ではない。

これは、愛の入口だ。

次にコードを読んで、直せるのか。
レビューする人の時間を尊重できるのか。
自分の変更を、自分の言葉で説明できるのか。

Godotで教えてもらったことを、次のOSSでも続けられるのか。

それは、これからの僕次第だ。
世界には、まだ誰も直していない1行がある。
そして僕は、多分また、それを見つけに行く。

閑話休題

ちょっと、僕は、メイドインアビスのボンドルドの気持ちがわかった、気がする。

「愛です 愛ですよナナチ」

OSSという、アビスに飛び込みましょう。
そして、君も黎明郷になろう!

参考文献:

End of story.

If u want to knew my story, plz search the issues.
Every-body laughed at me.
But, It was my presure.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?