これも積んだままだったので NHK の配信と並行しながら読んだ。この手の物語的な小説はあまりテンションを上げて読んだりしないのだけど、大いなる遺産はなぜか面白くてどんどん読んでしまった。
時代背景として、アサシンクリードシンジケートくらいの社会と、階級社会と成り上がりみたいなあたりが面白かったのかもしれない。
claude の codex plugin が free プランだと動かなくなってしまったので、GitHub の copilot コマンドを使って、Gemini と Codex それぞれに HEAD と master との差分をレビューさせる claude command を作った。以下のテキストを .claude/commands/diff-review.md などとして保存すると /diff-review で呼び出せる。
---
description: master との差分を copilot 経由で最新の gemini pro と gpt codex にレビューさせる
---
`$ARGUMENTS` が空なら比較対象を `master...HEAD`、指定があればその範囲/ref を diff 対象とする。
まず対象ブランチ・差分の有無を確認する。現在のブランチが比較対象そのもの、または差分が無い場合はその旨を報告して終了する(copilot は実行しない)。
差分がある場合、**毎回 copilot で使えるモデル一覧を取得し、その時点で最新の gemini pro と gpt codex を動的に選ぶ**。モデル名はハードコードしない。以下を実行して 2 つのモデル ID を得る:
```bash
copilot --model gpt-5-mini --effort low -s --allow-all-tools \
-p "Output ONLY the available model IDs, one per line, no bullets, no extra text." \
| ruby -e '
ids = STDIN.read.split("\n").map(&:strip).reject(&:empty?)
ver = ->(s){ s[/(\d+(?:\.\d+)?)/, 1].to_f }
gemini = ids.select { |i| i =~ /gemini/i && i =~ /pro/i }.max_by { |i| ver.(i) }
codex = ids.select { |i| i =~ /gpt/i && i =~ /codex/i }.max_by { |i| ver.(i) }
abort "gemini pro model not found" unless gemini
abort "gpt codex model not found" unless codex
puts gemini
puts codex
'
``
1 行目が gemini pro、2 行目が gpt codex の最新モデル ID。取得に失敗したらフォールバックせず報告して止める。
得られた 2 つのモデル ID をそれぞれ `--model` に与え、以下 2 つのレビューコマンドを **1 つのメッセージ内で並列に** 実行する(`<MODEL>` は選定結果、`<diff範囲>` は上で決めた範囲に置換):
```bash
copilot --model <MODEL> --allow-all-tools \
-p "<diff範囲> の差分 (git diff <diff範囲>) を日本語でコードレビューして。バグ・設計・可読性の観点で、重要度順に簡潔に指摘して"
``
`--allow-all-tools` は非対話モードで必須なので省略しない。各レビューは長時間かかることがあるため timeout は 300000ms 程度に設定する。
両モデルの出力が揃ったら、実際に使ったモデル ID を見出しにして(例「## gemini-3.1-pro-preview」)結果を分けて提示し、最後に両者の指摘が一致した重要な項目を 2-3 行でまとめる。
(`` のところはレンダリングの都合でダブルにしてるので実際に使う時はトリプルにしてください)
日本語で書いてるけど、内容自体は全部 claude に作らせた。ちょっと遅いのはしょうがないとして、ブランチで作業して最後の仕上げって時になかなか有用な気がする。特に両方のモデルが指摘してきた項目は大体の場合、本当にバグってことが多い気がしている。使うためには copilot コマンドを allow list に入れる必要がある。
しかし、この手の Agenting coding 向けの何か、スクリプトの時だとバンバン公開するのに、日本語になると「別にいいかな...」って気持ちになるのはなんだか面白い。
CI をひたすら整備していたら Ruby 3.3 と 3.4 が Windows で libgmp を正しくリンクできないことに気がついたので関連するコミットを拾ってバックポートしておいた。
https://bugs.ruby-lang.org/issues/22078
この辺のやつ、プラットフォームかつコンパイルオプションの組み合わせの沼の一部っぽいけど、意図的に整備していかないと気が付かないものだなあ。最近 CI が微妙に不安定なので頑張ろう。
引き続き積んである雑誌消化、金沢ということで東博で開催中の前田百万石の展示に合わせたものだった。こういうのを、ちゃんと内覧会に行く前に読めって話だよなあ。
claude 使ってあれこれしてると、朝仕事を始めて気がついたら夜、ということばかりで生産性高いのやら何やらよくわからない感じになってる。
定期リリース予定の日だったので RubGems/Bundler 4.0.13 のリリース
https://blog.rubygems.org/2026/06/03/4.0.13-released.html
ここ数回はコンフリクトがあってもまあまあリリースできるようになってきたので、事前に素振りをして発生するコンフリクトと直し方の目処をつけて claude に解決させる、って感じでナレッジを積めば失敗することは無くなってきた、気がする。
しかし、それでも man の生成でバージョン違いで差分が出てやり直し、みたいなこともあり本当にだるいので徹底的に潰していかないとなあ。
4.0.13 には1-2ヶ月開発をしていた cooldown オプションを新規機能として追加した。
https://blog.rubygems.org/2026/06/03/cooldown-let-new-gems-be-vetted.html
最初は全く新しい機能なので 4.0.x ではなく 4.1.0 にするかなあなど考えていたけど、じゃあ出した後に 4.0.x のメンテはどうするの、とか 4.1.0 にしたら 4.0.x からのバージョンアップの心理障壁上がらないか?などを考えた結果「気軽に使ってもらいたいので 4.0.13 でいいや」となった。
細かい使い方などはリリースエントリの方を見て貰えば良くて、書いてないこととしてはエッジケースがめちゃくちゃあって、その都度 claude と壁打ちしながら、「じゃあ仕様としてこうするから」「それは債務を超えているので無視」などひたすら決めることをしていてなかなかに疲れた。日によっては1日8時間、ずっと日本語を書いてリサーチして仕様を決めてた日もあると思う。
例えば以下のようなケースで決めが必要となる。
自分の中では上記のようなケースで「こっちにします」という判断軸はあるので、聞きたいという人がいればどっかで話す、かもしれない。しかし、今回は自分で書いたコードはほぼ0で、claude にずーっと日本語だけを話しかけて作った。AI coding 最高である。
cooldown が最高の解決策、とは全く思わないけど cooldown 3 くらいで設定しておけば、ほとんどのケースで平和になると思うので、気になる人は設定しておくといいと思います。ご活用ください。