本文へスキップ

Skills

chimera-run-the-projects-own-gate-command

プロジェクトの検証コマンドは、そのまま実行すること——同じ範囲、同じフラグで。その場で組み立てたほぼ同じ変種は、両方向に嘘をつきます。

パターン来歴: cleanステータス: activev0.1.0 · Apache-2.0

カードを読んだレビュアーが与えるものであり、ファイルが自分について主張するものではありません。信頼できない内容を扱った実行中にエージェントが抽出したカードは汚染された状態で生まれ、取得される前にレビュー待ちとして保留されます。

どんなときに思い出すか

  • lint や型チェックを走らせる
  • コミットや PR の前の確認
  • ローカルは通ったのに CI が落ちた
  • 範囲の指定や厳格化フラグを足す
  • ゲートが緑だと報告する

価値はたいてい「回避」と「確認」にあります。「実施」は誰でも書ける節です。

上のカード本文は翻訳です。CLI が取り込み、エージェントが実行時に読み、下のハッシュが証明するのは英語の原文です。

トリガー

プロジェクトの品質ゲート——lint、型チェック、テスト——をこれから実行し、その結果を、ある変更が安全であることの証拠として報告しようとしている場合に当てはまる。誘惑は、それを絞り込むこと(「触ったのは chimera/ だけだ」)か、厳しくすること(「--strict の方がきっと良いはずだ」)である。

探索には当てはまらない。1つのファイルを反復している最中に pytest tests/test_governed_surfaces.py -x を実行するのは正しいことだ。このルールが対象とするのは、その後それをゲートと呼んでよいかである。絞り込んだ実行はデバッグの補助であって、検証では決してない。

実施

  1. そのコマンドがどこに書き留められているかを見つけ、正典とする情報源を1つだけ指名する。Chimera ではそれは Makefilecheck ターゲット——make check——である。ターゲットは実行可能であり、文章中の1行はそのコピーにすぎないからだ。それが実行する3つのチェックは ruff check .mypy chimerapytest -q である。
  2. 正典の形をバイト単位でそのまま実行する。パス引数を足さない、フラグを足さない、ランナーを置き換えない。文章によるコピーは、見た目は些細でも実際にはそうでない差異を含みうることに注意すること。Makefile:21 はそれを uv run --no-sync で包み、CONTRIBUTING.md:105uv run --extra dev --extra desktop で包んでいる。同じツール、異なる環境——だからこそ、どちらか一方を情報源に定める必要がある。
  3. 2つの情報源が食い違う場合は、CI のワークフローを権威として扱い、それを実行し、古くなったドキュメントを同じ PR で直すこと——CONTRIBUTING.md はしばらく誤った mypy --strict の行を抱えていた。そして古い指示は、それを読むすべての人に伝播する。
  4. 正典のコマンドが自分の環境で実行できないなら、ゲートは実行されなかったと述べる。Windows ではローカルの .venv が壊れている(litellm が Rust/MSVC を要求する)ため、ゲートは WSL で実行する。シェルを移すことは許されるが、コマンドを編集することは許されない。
  5. コマンドとその出力を、どうだったかの要約ではなく、そのまま報告する。

回避

惜しい間違いが2つ。どちらも実話で、どちらも同じセッション中に起きた。そして両者が方向に嘘をつくことに注意してほしい:

mypy --strict chimera      # WRONG — lies toward failure
mypy chimera               # right

明示的なフラグは、pyproject.toml にあるプロジェクト自身の warn_unused_ignores = false を上書きし、誰も触っていないファイルについておよそ15件の unused-ignore エラーを報告する。それはあやうく、きれいなコードに対して起票されるバグレポートになるところだった。

ruff check chimera tests   # WRONG — lies toward success
ruff check .               # right

絞り込まれた範囲は、ruff check . なら報告する B023(ループ変数を捕捉するクロージャ)を報告しない。範囲が変わればどのファイルが対象になるか——したがってどのディレクトリ別のルール設定が効くか——が変わるからだ。ローカルの「ゲート」が緑だった PR が、CI で落ちた。

共通する仕組みはこうだ。フラグはどの設定が勝つかを決め、範囲はどのルールが発火するかを決める。 どちらも見た目だけの違いではなく、そしてどちらの変種も本物のコマンドに十分近く見えるため、その出力は権威あるものとして読まれてしまう。

確認

自分のコマンドが書かれているファイルと行を指し示すこと。Makefile:21CONTRIBUTING.md:105 のように。指し示せないなら、その場で作ったということだ。

二者択一の問い: 自分が打った文字列を、一切編集せずに check のレシピに貼り付けられるか。自分のコマンドがレシピにない引数やフラグを持っているなら、答えはノーであり、実行したのは名前が同じだけの別のチェックである。

リスク

正典のコマンドはたいてい最も遅いものであり、速い変種を禁じるルールは、結局何も実行しない方へ人を押しやる。それは、絞り込んだ実行を正直にそう表示することより悪い結果だ。

ルールが安上がりだと決める前にコストを測り、スイートが育つにつれて測り直すこと。このカードの最初の草稿は、Chimera のフルスイートを「およそ15秒」と書いていた——かつては真実だった数字であり、このカードが書かれた時点では、測定した4回の実行を通じておよそ100秒まで漂流していた。コマンドをその場で作るなというカードは、コマンドを実行すれば生き残らない数字を載せるには不向きな場所である。

そしてレシピ自体が間違っていることもある。それを忠実に守ることは、その盲点も引き継ぐということだ。make check は、あるテストが、新規クローンには存在しない gitignore 済みの bench/local_lift/results/paired.json を読んでいることを教えてはくれない。悪いゲートに対する修正は、PR でレシピを変えることであって、より良いものを自分だけこっそり実行することではない——個人的な改善はたった1人を守るだけで、CI と他のみんなを古いコマンドに残す。

使い方

カードはデータです。リポジトリをクローンし、パスで取り込んでください。ネットワーク経由で届いたものは汚染扱いとなり、承認されるまで保留されます。それが望ましい挙動であり、ここにワンライナーのインストーラーがない理由です。

git clone https://github.com/brcampidelli/chimera-agent.git
chimera skills-import chimera-agent/skills/chimera-run-the-projects-own-gate-command/SKILL.md

完全性

公開された状態のファイルの SHA-256。取り込む側は、受け取ったものがこのページに表示されたものと同じか確認できます。

12e60e2bbe0fa29b4a242ec429a1897741266f43812148c3a55356f77de227b9

リポジトリでカードを読む