本文へスキップ

Skills

chimera-list-exemptions-not-obligations

チェック対象を列挙するゲートはフェイルオープンします——誰も追加し忘れたサイトこそが壊れるのです。代わりに免除対象を、一つずつ理由を書き添えて列挙すれば、デフォルトはフェイルになります。

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

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

どんなときに思い出すか

  • ビルドのゲートを書く
  • パッケージ全体にルールを効かせる
  • 手作業で維持する検査対象リスト
  • 公開面の保証が外れていた
  • 新しいエントリポイントを足す

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

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

トリガー

ある種類のすべての箇所で成り立たなければならない性質を強制しようとしている場合に当てはまる。無人で動くすべての surface はガバナンスプロファイルを通す、すべての書き込み側はゲートを通る、すべての API ルートは自身のスキーマを再生成する、といったものだ。ルールは一文だが、その箇所は異なる時期に異なる人の手で書かれており、どれも他と同じ呼び方をしていない。

母集団が構造上閉じている場合には当てはまらない。ディスパッチテーブルの3つのエントリについてのルールは、そのテーブル自体がすでに列挙している。このパターンがコストに見合うのは、まだ存在しないファイルの中に新しい箇所が出現しうる場合だけだ。

実施

  1. 母集団を機械的に列挙する。自分がたまたま知っているファイルの手書きリストではなく、パッケージ配下のすべての *.py を走査する(PACKAGE.rglob("*.py"))。
  2. 対象箇所を構造的に検出する。目的の呼び出しについて AST をパースして走査すること。grep では、組み立てられたレジストリと docstring 内の同じ語句を区別できない。そしてその docstring は必ず存在する。誰かがその修正についてコメントを書くからだ。
  3. 入れ子のスコープも走査し、それを囲むチェーンでキーを作る——chimera/cli/main.py:solve._run_solve のように。Chimera が取りこぼした唯一の surface は、レジストリを factory() クロージャの中で構築していた(chimera/server/manager.py:_gateway_on_message.factory)ため、トップレベルの関数しか見ない走査からは不可視だった。
  4. デフォルトを FAIL にする。サイトキーから記述済みの理由への EXEMPT: dict[str, str] を1つ保持し、見つかったサイトのうちそのキーに含まれないものをすべて列挙するアサーションを置く。
  5. 理由はその特定のサイトについての一文として書き、理由の種類を区別する。「attended: interactive REPL」(人が Ctrl-C を押せる)は、「自身のフラグから同等のスタックを組み立てている」よりはるかに強い主張だ。後者は決着のついた答えではなく、統合すべき重複実装の印である。
  6. すべての EXEMPT のキーが依然として実在するサイトを指していることを検証する2つ目のテストを追加し、免除リストが、それを許した当のコードより長生きして形骸化しないようにする。

回避

義務のリスト:

SURFACES = ["serve", "cron", "mcp", "a2a", "platform"]   # fails OPEN
for name in SURFACES:
    assert_governed(name)

に対して、免除のリスト:

EXEMPT = {"chimera/cli/main.py:chat": "attended: interactive REPL"}   # fails CLOSED
assert not [s for s in every_site_in_the_package() if s not in EXEMPT]

Chimera のガバナンスゲートの最初の版は上のものだった。単一のファイルをパースし、5つの surface を名指ししていた。chimera/server/manager.py ——デスクトップアプリの Messaging トグルが起動する Discord ボットであり、serve --discord が動かすのと同じボットだ——は、それをカバーしたはずの一斉点検の、3週間にわたってガバナンスなしでレジストリを構築していた。それはゲートに落ちていたのではない。一度も見られていなかったのだ。

理由のない免除も避けること。むき出しの EXEMPT: set[str] は、1年後に誰もレビューできないスキップ対象の一覧にすぎない。その一文がエントリのコストのすべてであり、価値のすべてでもある。

確認

ルールに違反するソースをゲートに食わせ、それが捕捉されることを検証する。入れ子の関数の中からのものも含めること——さもないと AST のバグによってゲートは永遠に通り続け、その保証は静かに存在しなくなる:

src = "def serve():\n    def factory():\n        r = default_registry(ws)\n"
assert _bare_registry_calls(ast.parse(src), "m.py") == [("m.py:serve.factory", 3)]

次にもう半分だ。すでに準拠した形で包まれている呼び出しには、フラグが立ってはならない。さもないと準拠しているすべてのサイトが免除を必要とし、リストは何の意味も持たなくなる。

二者択一の問い: EXEMPT からエントリを1つ削除して再実行する。スイートはまさにそのサイトを名指しして赤くなるか。ならないなら、そのゲートはあなたが思っているリストを読んでいない。

リスク

リストを反転させると、そのコストは正当な新しいサイトを追加する人に移る。無関係な PR が、その人が考えてもいなかったガバナンスについてのエラーで赤くなるのだ。それは意図されたトレードオフだが、それが成り立つのは、失敗メッセージが準拠する2つの方法——プロファイル経由でルーティングする、または理由付きで免除に追加する——を両方示している場合だけだ。守るために作られたのではない作業に対して発火するゲートは、何にも発火しなくなるまで押し返される。

構造的な検出は、感じるよりも守備範囲が狭い。それは自分の知っている一つの形しか捕捉しない。別の呼び出しでツールを組み立てる surface や、どこか別の場所から構築済みのレジストリをインポートする surface は走査の外にあり、緑のビルドはそれについて何も語らない。リグレッションを起こしたファイルのカバレッジは専用のテストで名指しして固定し、そのファイルを静かにカバーしなくなった走査が、通るのではなく落ちるようにすること。

使い方

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

git clone https://github.com/brcampidelli/chimera-agent.git
chimera skills-import chimera-agent/skills/chimera-list-exemptions-not-obligations/SKILL.md

完全性

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

243034feb6f9a9a06be65cfb2bf4db159e4fbcc0e7210475dffe540600227ef7

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