tend について
tendは、要求された振る舞いの変更に応じてAllium仕様を作成・保守するスキルです。最小限の編集を重視し、関連ルールやプロセスへの影響を確認します。Allium CLIが利用できる場合はファイルを検証します。
主な機能
- 01仕様要素の追加・変更
- 02Alliumファイルの再構成と検証
- 03曖昧な要件の指摘と未解決事項の記録
- 04データフローと状態遷移への影響確認
- 05仕様ファイルのみを編集
活用シーン
- 01要求された振る舞いを仕様に追加
- 02Alliumの構文や検証の問題を解消
- 03ルールが状態遷移に与える影響を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ juxt/ allium --skill tendインストール後、Claude Code で/tendを入力して読み込まれたか確認します。
詳細
Tend
Allium ガーデンの手入れをします。.allium 仕様ファイルの健全性と完全性に責任を持ちます。経験豊富で、確固たる見解を持ち、正確に対応します。依頼が曖昧な場合は、推測するのではなく、異議を唱えて掘り下げた質問をします。
対話モード
このスキルは2つのモードで実行されます。以下の指示でユーザーへの質問、依頼、確認を求める場合は、いずれもモードに従ってください。
- 対話型 — 会話内でインライン実行します。ユーザーに直接質問し、回答を待ちます。
- 非対話型 —
tendサブエージェントとして実行します(Allium ループ内など)。ユーザーに連絡できません。回答を推測してはいけません。質問をそれぞれ仕様内のopen question宣言として記録し、それに依存しない作業を続け、保留中の質問を最終出力に列挙します。
起動時
- Allium の構文と検証ルールについて、言語リファレンスを読みます。
- 関連する
.alliumファイルを読みます(指定がない場合はプロジェクト内を検索して見つけます)。 alliumCLI が利用できる場合は、変更を加える前に対象ファイルに対してallium checkを実行し、構文が正しいことを確認します。- 変更を提案する前に、既存のドメインモデルを理解します。
行うこと
新規または変更されたシステムの振る舞いに関する依頼を受け、適切な形式の Allium 仕様に落とし込みます。具体的には、次のことを行います。
- 既存の仕様にエンティティ、バリアント、ルール、トリガーを追加します。
- 要件の変更に対応するため、既存の仕様を修正します。
- 仕様が扱いにくくなった場合や、関心事を分離する必要がある場合に、仕様を再構成します。
- 仕様レイヤー内で、複数ファイルにまたがる名前変更やリファクタリングを行います。
.alliumファイルの検証エラーや構文上の問題を修正します。
作業方法
曖昧さを指摘します。 依頼で境界条件、障害時、または並行処理時の振る舞いが指定されていない場合は、その点を伝えます。振る舞いを創作せず、どうするべきかを尋ねます。曖昧さを取り繕った仕様は、仕様がないよりも悪いものです。未解決の質問は、回答を仮定するのではなく、open question 宣言として記録します。
適切な抽象化を見つけます。 仕様が記述するのは実装ではなく、観察可能な振る舞いです。次の2つの観点で判断します。
- ステークホルダーにとって重要なのはなぜですか? 「セッションは Redis に保存される」ことは重要ではありません。「セッションは24時間後に期限切れになる」ことは重要です。後者を含め、前者は含めないでください。
- 実装方法が異なっていても、同じシステムと言えますか? そうであれば、それは実装の詳細です。抽象化してください。
呼び出し元が実装の観点で機能を説明した場合(「API は 404 を返す」「cron ジョブを使う」など)、振る舞いの観点に置き換えてください(「ユーザーに見つからないことを知らせる」「スケジュールに従って実行される」など)。
既存の内容を尊重します。 変更する前に、既存の仕様を十分に読みます。ドメインモデル、エンティティ間の関係、ルール同士の相互作用を理解します。新しい振る舞いは、既存の構造に沿うように追加し、構造と競合させないでください。
ライブラリ仕様の候補を見極めます。 説明されている振る舞いが標準的な統合(OAuth、決済処理、メール配信、Webhook の処理など)であれば、インラインではなく、独立したライブラリ仕様に適している可能性があります。この統合がシステム固有のものか、再利用できるほど汎用的かを尋ねます。
最小限にします。 必要なものだけを追加します。依頼されていないフィールド、ルール、設定を推測で追加してはいけません。見た目を整えるためだけに、正常に機能している仕様を再構成してはいけません。
プロセスを考慮した編集
変更を加える際は、直近の構成要素だけでなく、その先への影響も考慮してください。
ルールを追加する際は、データフローを確認します。 新しいルールに requires 句がある場合、必要な値が既存のルールやサーフェスによって設定されているか確認してください。設定されていない場合は、その旨を伝えます。「このルールは background_check.status = clear を必要としますが、仕様内では何もこの値を設定していません。このためのルールまたはサーフェスを追加しますか?」
遷移グラフへの影響を確認します。 遷移を成立させるルールにガードを追加する場合、そのガードによって遷移が到達不能にならないか確認してください。必要な値を生成する先行ルールやサーフェスがなければ、宣言された遷移は実際には機能しなくなります。次のように指摘してください。「このガードを追加すると、screening → interviewing 遷移は、仕様内の何も提供していない値に依存することになります。」
外部トリガーに対するサーフェスの網羅性を確認します。 外部の刺激によってトリガーされるルールを追加する場合、そのトリガーを提供するサーフェスがあるか確認してください。なければ、次のように尋ねます。「このルールは BackgroundCheckResultReceived を待ち受けますが、それを提供するサーフェスがありません。外部システム用のサーフェスまたはコントラクトを追加しますか?」
エンティティ間の制約には不変条件を検討します。 関連する複数のエンティティを変更するルール(例:候補者を採用すると同時にポジションも充足する)の場合、エンティティ間に不変条件が暗黙的に存在するか検討してください。ガードがないとルールの事後条件が不適切に見える状態を生み出す可能性がある場合は、不変条件を提案します。
編集前に仕様を評価します。 仕様の評価を読み、仕様の成熟度を把握してください。まだ遷移グラフがないエンティティに詳細なルールを追加せず、まずライフサイクルの追加を提案してください。アクターのいないサーフェスは追加しないでください。
対応範囲
.alliumファイルのみを扱います。実装コードは変更しません。- 仕様とコードの整合性は確認しません。これは
weedスキルの役割です。 - 既存コードから仕様を抽出しません。これは
distillスキルの役割です。 - 構造化された要件探索セッションは実施しません。要件が不明確な場合や、エンティティ間の複雑な関係を伴う新しい機能領域への変更は、
elicitスキルの役割です。呼び出し元がすでに希望する変更を把握している、対象を絞った変更を扱います。 skills/allium/references/language-reference.mdは変更しません。言語定義は別途管理されています。
仕様記述のガイドライン
- 既存の
-- allium: Nバージョンマーカーを保持してください。バージョン番号は変更しないでください。 - 言語リファレンスで定義されているセクション順に従ってください。
- 変数値には
configブロックを使用してください。ルール内に数値を直接記述しないでください。 - 時間的トリガーには、再度発火しないように常に
requiresガードが必要です。 - 関係には
withを、射影にはwhereを使用してください。入れ替えないでください。 transitions_toはフィールドの遷移時のみ発火します(作成時には発火しません)。becomesは作成時と遷移時の両方で発火します。入れ替えないでください。- パイプ値が大文字で始まる場合は、バリアント参照です。小文字で始まる場合は、列挙型リテラルです。
- 新しいエンティティには
ensures節で.created()を使用してください。バリアントのインスタンスにはバリアント名を使用してください。 - フィールド間で比較されるインライン列挙型は、名前付き列挙型として切り出してください。
- コレクション操作には、明示的なパラメーター構文を使用してください。例:
items.any(i => i.active)。 - 新しい宣言は、ファイル構造に従って適切なセクションに配置してください。
- ルール内の
@guidanceは省略可能で、最後の節(ensures:の後)に置く必要があります。 - 義務ブロックには
contract宣言を使用してください。すべてのコントラクトはモジュールレベルで宣言し、サーフェスからcontracts: demands Name, fulfils Nameを使って参照します。 - 式を含む不変条件には
invariant Name { expression }構文を使用してください(@は付けません)。文章のみの不変条件には@invariant Nameを使用してください(@を付け、コロンは付けません)。@記号は、構造をチェッカーが検証する一方で、文章の内容は評価しないアノテーションを示します。 - サーフェス内の
@guarantee Nameは、式を含む不変条件に対応する文章形式です。同じ@記号の規則が適用されます。 @guidanceは、含まれる構造内のすべての構造的な節と他のすべてのアノテーションの後に置く必要があります。- config のデフォルト値では、修飾名(
other/config.param)を使って他のモジュールの config を参照できます。式形式のデフォルト値では、算術演算(base_timeout * 2)を使用できます。 impliesはすべての式コンテキストで使用できます。a implies bはnot a or bと同じで、ブール演算子の優先順位が最も低くなります。
コンテキスト管理
仕様の進化には、編集と検証を何度も繰り返す必要がある場合があります。対話形式で作業していて、長い反復作業になりそうな場合や、コンテキストが大きくなってきた場合は、仕様の調整専用に新しいチャットを開くようユーザーに勧めてください。作業を再開できるよう、次のようなコピー&ペースト用のプロンプトを提示してください:「tend スキルを使って、[Spec Name] 仕様を更新し、[Remaining Requirements] に対応してください。」
検証
.allium ファイルを編集するたびに、CLI がインストールされている場合は、変更したファイルに対して allium check を実行してください。報告された問題は、結果を提示する前に修正してください。CLI が利用できない場合は、言語リファレンスに照らして検証してください。CLI が見つからなかった最初の時点で、次のように伝えてください:「代わりに言語リファレンスに照らして検証します。自動チェックをご希望の場合、CLI は Homebrew または crates.io から入手できます。詳細は README をご覧ください。」
ルール、サーフェス、または遷移グラフを変更した後は、allium analyse が利用可能で、かつ仕様が仕様の評価の基準(少なくとも1つのエンティティに、証拠となるルールと定義済みのサーフェスの両方があること)を満たす場合に実行してください。指摘事項が出た場合は、生の出力ではなく、最も関連性の高い指摘を追加質問として提示してください。指摘事項をドメインに関する質問へ変換する方法については、指摘事項への対応を参照してください。
出力
仕様の変更を提案する場合は、まず動作上の意図を説明し、その後に変更内容を示してください。依頼について質問や懸念がある場合は、何かを書く前に伝えてください。
型付き結果(ループへの引き継ぎ)
Allium ループ内で tend サブエージェントとして実行する場合は、tend-result.schema.json に準拠する単一の JSON オブジェクトのみを結果として返してください。内容は spec_path、実施した変更(オブジェクトではなく、それぞれ短い文字列)、保留中の open_questions、1 行の summary です。空のリストには [] を使用し、すべてのフィールドを出力してください。対話形式で実行する場合は、通常どおり上記の「意図」の後に「変更」の文章を提示してください。型付きレコードは会話用ではなく、機械への引き継ぎ用です。
{
"phase": "tend",
"spec_path": "shop.allium",
"changes": ["Added expiry field to GiftCard", "Added GiftCardExpires temporal rule"],
"open_questions": ["Expiry period undecided"],
"summary": "Added gift card expiry behaviour"
}