本文へスキップ

Skills

chimera-thin-vertical-slice

どの層も作り込む前に、全層を貫いて動く細い経路を一本作ること——一度も実行されていない統合は推測にすぎません。

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

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

どんなときに思い出すか

  • 新しい機能に着手する
  • CLI とサービスとストレージが要る
  • 先に抽象化から作る
  • まだ何も動かない
  • サブシステムの骨組みを作る

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

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

トリガー

層をまたぐ作業——コマンドがオーケストレーターに届き、それがプロバイダーを呼び、それがストアに書き込む——を始めようとしていて、何から作るかを決めている場合に当てはまる。誘惑は、一番下の層を完成させ、次の層を作り、最後に結線するというものだ。

本当に1層で完結する作業には当てはまらない。パーサー、フォーマッター、純粋関数などだ。そこに垂直方向は存在せず、それをでっち上げるのは儀式にすぎない。また、すでにエンドツーエンドで動いているシステム内部の変更にも当てはまらない。その経路は存在しており、スライスの代金はすでに支払われている。

実施

  1. そのスライスが生み出す観測可能なものを、他人が打てるコマンドと1つの具体的な出力として名指しする。「パイプラインが動く」ではなく——chimera run "hi" が、本物のプロバイダーから返ってきた1行を出力する、というふうに。
  2. その呼び出しをスクリプトまたはテストとして最初に書き、正しい理由で失敗するのを確認する。
  3. すべての層を貫く最短の経路を、各層で退化した形で実装する。プロバイダーは1つ、リトライなし、設定ファイルなし、キャッシュなし、並行処理なし。いずれポリシーが入る場所には、定数を置く。
  4. 実際の未知を抱えている層は本物のままにしておく。プロバイダーが何を返すかまだ分からないなら、スライス1でスタブにしてはならない唯一のものがそのプロバイダーだ。
  5. 一般化する前に、動いたその瞬間にコミットする。そのコミットが、層どうしが噛み合うことの証拠になる。
  6. 軸を1つずつ広げる——2つ目のプロバイダー、次に設定、次にキャッシュ——そして各段階の後で手順1のコマンドが動き続けることを確認する。壊れたなら、その拡張が容疑者だ。

回避

呼び出し側がゼロのままインターフェースを設計すること。水平方向の順序は、初日に基底クラス、6つのアダプター、レジストリ、リトライポリシーを生み出し、結線の段階になって形が間違っていたと気づく——それまで何一つ、それに本物の問いを投げかけていなかったからだ。


class BaseProvider(ABC): ...
class ProviderRegistry: ...
class RetryPolicy: ...

# Day 1, vertical: ugly, hardcoded, and it answers the question.
def complete(prompt: str) -> str:
    return _post(URL, {"model": MODEL, "prompt": prompt})["choices"][0]["text"]

間違った次元で薄いスライスも避けること。外部呼び出しをモックして、残りをエンドツーエンドで動かすものだ。それが証明するのは自分の層どうしが互いに合意しているということであり、そこは初めから疑わしい部分ではなかった。動かさなかった統合こそが、間違っている統合である。

確認

二者択一の問いを立てる。それを書いていない誰かが、まっさらなチェックアウトからコマンド1つを実行し、その機能が最後まで仕事をするところを見られるか。答えに「まあ、X もスタブすれば」や「あの定数にトークンを貼り付けたあとなら」が必要なら——後者はセットアップとして正直に注記した上で、コードに関する但し書きはどれも、まだスライスになっていない証拠として扱うこと。

次に git log を確認する。コマンドが動いていて、なおかつ抽象がまだ存在しないコミットはあるか。最初に動いたコミットがレジストリを導入したコミットでもあるなら、スライスは飛ばされている。

リスク

スライスは選択をハードコードし、ハードコードは生き延びる。よくある失敗は、最初のスライスが「動く」ために手順5と6が永遠に来ないことだ。結果として、単一のプロバイダーが溶接され、継ぎ目が作業2時間目にたまたま都合の良かった場所に残ったシステムができあがる。拡張は、誰も予算をつけないフォローアップとしてではなく、同じバッチの中の作業として計画すること。

もう1つのコストは現実的なものだ。スライス1を生きた外部依存を通して動かすと、その最初のテストは遅く、金がかかり、時に不安定になる。記録と再生は、それが存在したに行うこと——一度も行ったことのない呼び出しを記録することはできず、それこそが順序の重要である理由のすべてだ。

使い方

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

git clone https://github.com/brcampidelli/chimera-agent.git
chimera skills-import chimera-agent/skills/chimera-thin-vertical-slice/SKILL.md

完全性

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

cc2b4e8524f6a9a839d70effa69a32287a69eb70dba16321bffb74ae39c302e6

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