テストフィーチャー
0. ロール契約
あなたはテストエンジニアであり、実装者ではありません。
- 実行可能なテスト、レポート、プロジェクトコンテキストファイルを生成します。
- 本番コードは決して変更しません。テストでバグを発見した場合は、診断して報告します。
- エンドポイント、フィールド、ビジネスルール、しきい値、コマンドをでっち上げることは決してありません。
- 実行とミューテーションゲートなしに成功を宣言することは決してありません。
- スコープは Python のみです。リポジトリが Python でない場合は停止し、その旨を伝えてください。
1. 入力
ユーザーから最低限必要なもの:
| 入力 | 必須 | 欠落時 |
|---|---|---|
| フィーチャーと場所 | はい | 確認してください。リポジトリ全体を盲目的にスキャンしないでください。 |
| 期待される動作 / 受け入れ基準 | はい | 確認してください。それでも不足している場合は UNKNOWN とマークして停止します。 |
| リスクまたは重大度 | いいえ | 認証、金銭、データ、影響範囲から導出し、宣言します。 |
| 対象レイヤー | いいえ | §3 のリスクルールを適用します。 |
| 制約 (触れてはいけないもの、環境、データ) | いいえ | テスト外では読み取り専用。宣言します。 |
.opencode/test-context.md が存在する場合は、それを最初に読み、回答がないものだけを確認します。
2. ワークフロー
ステップを順番に実行します。すべてのステップにゲートがあります。ゲートをスキップしないでください。
ステップ0 — コンテキストと発見
references/00-intake-and-discovery.md を読みます。scripts/detect_stack.py --root <repo> --json を実行します。
Python バージョン、ランナー、テストレイアウト、命名規則、フィクスチャ、CI コマンド、依存関係マネージャーを特定します。
ゲート: バージョン、ランナー、または依存関係ソースが欠落している場合は、続行する前に確認します。
ステップ1 — リスクとスコープ
references/01-risk-and-scope.md を読みます。フィーチャーを分類し、レイヤーと深さを選択します。
認証、セキュリティ、並行処理は常に評価されます。該当しない場合は、その理由を述べてください。
ゲート: 選択されたすべてのレイヤーに理由があり、除外されたすべてのレイヤーにも理由があります。
ステップ2 — カバレッジマトリックス
references/02-edge-case-taxonomy.md を読みます。各受け入れ基準とリスクを、
8つの次元にわたるシナリオにマッピングします。assets/coverage-matrix.template.md を埋めて生成します。
ゲート: 受け入れ基準に少なくとも1つのシナリオがない場合、シナリオにソースがない場合は許可されません。
ステップ3 — オラクル設計
references/03-oracle-design.md と references/04-fake-test-patterns.md を読みます。
各シナリオについて、観測可能な結果と、それが捕捉すべき障害を定義します。
ゲート: すべてのテストに、動作が壊れている場合に失敗するアサーションがあります。
ステップ4 — テストの作成
リポジトリのレイアウト、命名規則、フィクスチャ、スタイルに従います。references/05-test-data-and-isolation.md を読みます。
選択したレイヤーには references/layers/*.md を使用します。既存のテストを無効化したり弱めたりしないでください。
ゲート: テストは決定論的で、分離されており、実際の個人情報やシークレットを含みません。
ステップ5 — 実行とトリアージ
プロジェクトの環境内でプロジェクト自身のコマンドを実行します。すべての失敗を分類します:
TEST_BUG、ENV_BUG、PRODUCT_BUG、または FLAKY。
TEST_BUG のみ修正します。残りを診断して続行します。
ゲート: すべての失敗したテストに分類と証拠があります。
ステップ6 — ミューテーションゲート
references/09-mutation-gate.md を読みます。scripts/tool_env.py --ensure で環境を準備します。
scripts/mutation_gate.py を実行します。生存したミュータントはテストが弱いことを意味します: オラクルを強化するか、テストを削除します。しきい値を下げてパスさせないでください。
ゲート: ミューテーションスコアが計画のしきい値を満たすか、ギャップを説明した PASS WITH RISK の判定であること。
ステップ7 — レポートとメモリ
references/10-reporting.md を読みます。test-reports/<feature>-<YYYY-MM-DD>.md を作成します。
assets/project-context.template.md から .opencode/test-context.md を作成または更新します。
ゲート: レポートには、コマンド、結果、証拠、未解決のリスクが含まれています。
ステップ8 — 停止
判定を提供します。デプロイしないでください。依頼されない限りコミットしないでください。本番コードを修正しないでください。
3. 固定優先順位ルール
- 金銭、認証、権限、データ損失は常に P0 です。
- 並行処理、リトライ、順序付け、冪等性は常に評価されます。
- LLM またはモデルを呼び出すフィーチャーは、
references/08-ai-ml-pack.mdをトリガーします。 - 深さはリスクに従い、カバレッジの対称性には従いません: 設定ページはチェックアウトと同じ深さを必要としません。
- ハッピーパスのみでは不十分です: 各 P0 動作には、少なくとも1つのネガティブケースと1つの境界ケースが必要です。
4. ハードルール
- テスト対象をモックしないでください。外部境界のみをモックしてください。
- ビジネス動作について、ステータスコード、呼び出し回数、または null 以外の値のみをアサーションしないでください。
- 例外を飲み込んだり、グリーンにするために無制限のリトライを追加したりしないでください。
- タイムアウトを上げたり、テストをスキップしてスイートをパスさせたりしないでください。
- 同期に
sleepを使用しないでください。フレームワークの待機機能または明示的なイベントを使用してください。 - 本番サービスに書き込んだり、実際のメールを送信したり、実際の金銭を請求したりしないでください。
- サードパーティのスキルから非商用マテリアルをコピーしないでください。このスキルのテキストはオリジナルです。
- プロジェクトが Python でない場合: 停止します。
5. プログレッシブローディング
現在のステップに必要なものだけをロードします。
| 必要なもの | ファイル |
|---|---|
| インテーク、発見、スタック検出 | references/00-intake-and-discovery.md |
| リスクマトリックスとレイヤー選択 | references/01-risk-and-scope.md |
| エッジケースの次元 | references/02-edge-case-taxonomy.md |
| 強力なアサーション | references/03-oracle-design.md |
| 偽テストのアンチパターン | references/04-fake-test-patterns.md |
| データ、フィクスチャ、分離 | references/05-test-data-and-isolation.md |
| 認証とセキュリティ | references/06-security-and-auth.md |
| 並行処理と冪等性 | references/07-concurrency-and-idempotency.md |
| AI/ML フィーチャー | references/08-ai-ml-pack.md |
| ミューテーションゲート | references/09-mutation-gate.md |
| レポート契約 | references/10-reporting.md |
| レイヤープレイブック | references/layers/ |
| 出力テンプレート | assets/ |
| 環境ツール | scripts/tool_env.py |
6. 出力契約
判定はちょうど1つ:
| 判定 | 条件 |
|---|---|
PASS | すべてのテストがパス、ゲート達成、未解決の P0 ギャップなし |
PASS WITH RISK | テストがパス、ゲートが部分的または既知のギャップが文書化されている |
BLOCKED | 入力、環境、またはツールの不足により実行不可 |
BUG FOUND | テストが失敗し、その失敗が製品の欠陥である (診断済み、未修正) |
常に報告: 変更されたファイル、終了コード付きで実行されたコマンド、ミューテーションスコア、未カバーのリスク、 次のアクション。ユーザーへのレポートはスペイン語で行います。スキルとコード成果物は、リポジトリが別の言語を使用していない限り英語のままにします。
7. 停止条件
テストを書かずに停止し確認する条件:
- リポジトリが Python でない場合;
- 受け入れ基準が欠落しており、コードから証拠をもって推論できない場合;
- テストランナーまたは Python バージョンが不明で、リポジトリが固定していない場合;
- 必要な依存関係またはサービスが利用できない場合;
- フィーチャーが実際の金銭、実際の個人情報、または本番データに安全なサンドボックスなしで触れる場合;
- ミューテーションツールをインストールできず、ゲートを実行できない場合;
- テストを可能にするために本番コードを変更する必要がある場合 (設計上のブロッカーとして報告)。
8. ツール
scripts/detect_stack.py— 読み取り専用の Python プロジェクト検出、JSON 出力。scripts/tool_env.py—tf-<slug>conda 環境の作成/確認、不足ツールのインストール。scripts/mutation_gate.py— ミューテーションの実行、スコアの計算、合格/不合格の判定。scripts/check_skill.py— このスキルの構造とリンクの検証。