<What this skill does>
日本語の概要は準備中です。原文の説明を表示しています。
テストは存在するがアサーションが実質何も検証しておらず、実装が壊れても落ちない(常に PASS する)構造を diff-time で検出する。Check 1 missing assertion(テスト本体にアサーションが無い)、Check 2 tautological assertion(定数同士・入力自身・mock の戻り値自身を assert し SUT に依存しない)、Check 3 nonexistent expected literal(assertDontSee / assertNotContains 等の期待文字列が対象ファイルに実在しない)、Check 4 stale expected value(同一 diff で対象の出力が変わったのに期待値が据え置き)、Check 5 unscoped expectation(汎用的な属性・クラスを応答全体に対して assert し対象要素にスコープされていない)、Check 6 swallowed failure(例外の握り潰しや到達しない位置のアサーションで判定が成立しない)、の 6 Check を対象とする report-only。テストの有無は test-existence、未テスト経路の量は coverage-gap、非決定性は flaky-test、命名は test-naming、JS/TS の un-awaited resolves / rejects は vitest-mock-isolation、tdd-ledger artifact ベースの RED/GREEN 検証は plangate-tdd-evidence、.only / .skip / xit / @ts-ignore と空の catch は heuristic-review.mjs の決定論検出器へ委譲する
インストール方法を見るインストールする前に、エージェントに与えられる指示の中身を確認できます。
skills/README.md の Naming Q0–Q5 に従って決定した。Q0 では外部プロジェクトの成果物を取り込んでいないため「概念の再実装」に分類され、リネーム(新規命名)が既定となる。Q1 は衝突なし(assertion を含む skill id は既存に無い)、Q2・Q3 は参照元の原語が存在しないため適用外、Q4 で既存の test-* 命名ファミリ(test-existence / test-naming / test-plan-review)に整合することを確認し、Q5 で「価値(アサーションが有効であること)を名指す」名として test-assertion-effectiveness を採用した。機構名(tautology 検出・grep 照合)ではなく価値を名指す点が Q5 の要件である。
Primary pattern: Reviewer Secondary patterns: Inversion Why: アサーションの形はパターンとして拾えるが、「そのアサーションが SUT の挙動に依存しているか」の判定は意味的であり、期待値の照合先(テンプレート・コンポーネント)が discover できない差分では実行を止めるゲートが必要である。
テストの「有無」や「粒度」は既存 skill が見るが、書かれたアサーションが実際に失敗しうるかは誰も見ていない。アサーションが無効なテストは行を通過するためカバレッジ指標にも現れず、CI が緑であることも有効性の証明にならない(レビュー時点の CI が古い sha で緑だった実例が #1684 に記録されている)。この盲点を diff-time の静的観点として埋める。
次の 6 Check のいずれかに該当し、そのテストが実装の退行を検知できないと読み取れる場合に指摘する。report-only(ADR-005)であり、finding / question のみを出力して自動修正はしない。
| 隣接領域 | 委譲先 | 分界 |
|---|---|---|
| テストが存在しない | test-existence | 委譲先は「変更コードに対応するテストが差分に無い」。本 skill は逆にテストがある差分にだけ働く(委譲先はテスト差分があると黙る前提のため) |
| 未テスト経路・分岐・境界の量 | coverage-gap | 委譲先は「その経路のテストが存在しない」。本 skill は「テストは存在するがアサーションが落ちない」 |
| 実行ごとに結果が変わる不安定さ | flaky-test | 委譲先は非決定性。本 skill は決定論的に必ず PASS する構造 |
describe / it の命名・構造 | test-naming | 命名の明瞭さは対象外。名前が適切でもアサーションが無効なら本 skill が扱う |
JS / TS の un-awaited expect(...).resolves / .rejects | vitest-mock-isolation | 委譲先が「常に pass する空 assertion」として既に所有する。async-correctness も本番コード側からここへ委譲済みであり、三重管理にしない |
tdd-ledger artifact による RED / GREEN 証跡の検証 | plangate-tdd-evidence | 委譲先は artifact 駆動(artifact 非供給の adopter では常に NO_REVIEW)。本 skill はartifact に依存しない diff-time 観点 |
| 影響・失敗系・外部依存を調査した証拠の有無 | impact-evidence-coverage | 委譲先は同一 diff のテストを「証拠あり」として充足扱いにする。本 skill はそのテスト自体が有効かを見る(矛盾ではなく補完関係) |
| 本番経路の例外握り潰し・配線切れ | e2e-wiring / logging-observability | 委譲先は src/** 等の本番経路。本 skill が見る握り潰しはテスト本体の中で判定を無効化するものに限る |
.only / .skip / xit / @ts-ignore / 空の catch {} | src/lib/heuristic-review.mjs の決定論検出器 | 決定論で判定済みのため重複指摘しない(.claude/rules/review-core.md §「カスタム静的解析の False-positive 責務分界(#1070)」) |
さらに次はスコープ外とする。
toBe と toEqual の使い分け等)。.claude/rules/review-core.md の責務分界に従い、本 skill が扱う範囲を次の 3 層に分ける。
.only / .skip / xit / xdescribe / @ts-ignore / @ts-nocheck / 空の catch (...) {} / コード変更に対するテストファイルの不在。これらは src/lib/heuristic-review.mjs の検出器が構文的に判定済みであり、重複指摘は禁止する。fixtures/ の canary が誤検出の回帰防止を引き継ぐ。このスキルは以下の条件がすべて満たされない限り NO_REVIEW を返す。
diff が含まれている。fullFile・code_search のいずれかで到達できる。到達できない場合、その Check は finding を出さず question に留める。ゲート不成立時の出力: NO_REVIEW: test-assertion-effectiveness — アサーションの追加・変更を含むテスト差分が無い
正当なテストを FP にしないため、次を厳守する。
expect.extend・trait / base class に切り出されている場合、テスト本体に assert トークンが無くても Check 1 に該当しない。呼び出し先を確認できないときは question に留める。it.each / test.each / @dataProvider / pytest.mark.parametrize の入力テーブルは「入力自身を assert している」ように見えるが、実行はケースごとに SUT を通る。表側の定数を Check 2 として扱わない。.only / .skip / @ts-ignore / 空の catch {} / JS・TS の un-awaited .resolves / .rejects は本 skill から出力しない。抑制時の出力: 該当する指摘を出力しない(黙る)。
テスト本体が SUT を呼び出すのみで、アサーションが 1 つも存在しない。例外が投げられた場合しか落ちないため、戻り値・副作用の退行を検知できない。ヘルパー経由の assert と意図的な smoke test は抑制条件で除外する。
アサーションの結果が SUT の挙動に依存しない。次を含む。
expect(true).toBe(true) / assertTrue(true) / assertSame(1, 1))。否定系アサーション(assertDontSee / assertNotContains / not.toContain 等)の期待文字列が、照合先のテンプレート・コンポーネントに元から存在しない。存在しないものが「無いこと」を検証しているため常に PASS する。肯定系(assertSee 等)で期待文字列が照合先に一度も存在しない場合も同じ根拠で扱う。
同一 diff で照合先の出力(マークアップ・レンダリング結果・シリアライズ形式)が変更されているのに、その出力を検証するアサーションの期待値が据え置かれている。連結された文字列が複数要素へ分割された場合など、変更後は一致しなくなる形が典型である。
汎用的すぎる属性・クラス・トークン(rel= / target= / 汎用ユーティリティクラス / 共通ヘッダーの文言等)を応答全体に対して単独で assert しており、検証対象の要素から当該属性を除去しても他の箇所が供給するため PASS してしまう。
テスト本体の構造が失敗判定を無効化している。次を含む。
catch 節が再 throw も明示的な失敗(fail() / expect.unreachable() / $this->fail())も行わず、例外発生時に PASS してしまう。expect.assertions(n) / expectException / assertThrows)が無いまま、アサーションを try 節にのみ置いている。return や到達しない分岐の後ろにアサーションが置かれている。なお空の catch (...) {} は決定論検出器(silent-catch)が既に検出するため、本 Check からは重複指摘しない。本 Check が扱うのは、catch 節に何らかのコード(コメント・ログ出力等)があるため決定論検出器が黙るが、失敗判定は成立していないケースである。
code_search または fullFile で特定する。特定できなければ question に落とす。expect.assertions / expectException で失敗経路を固定する」のいずれかを明示する。blocker。warning。nit。info 相当)。file:line は差分内のアサーション行にアンカーする。差分外の推測に基づく指摘は question として返す。.claude/rules/review-core.md)。すべて日本語。標準の finding フォーマットに従い、各指摘に check(1〜6)と resolution を含める。
(test-assertion-effectiveness):1: [要約] 最も影響の大きい無効アサーションは〈1文〉
<file>:<line>: [Ineffective assertion] <タイトル>
check: 1 | 2 | 3 | 4 | 5 | 6
Finding: どのアサーションがなぜ失敗しえないか
Evidence: 照合先 `<file>` と検索語 `<query>`、または差分内の該当行
Impact: どの退行を見逃すか(1文)
Fix: <最小修正案>
Confidence: high | medium | low
Severity: blocker | warning | nit(較正基準に従う)
resolution: <解消手順>
tests/Feature/ComparisonPageTest.php:48: [Ineffective assertion] 期待文字列がテンプレートに存在せず assertDontSee が常に PASS する
check: 3
Finding: `assertDontSee('要件整理シート付き比較表をダウンロード')` の期待文字列が、照合先テンプレートに 1 件も存在しない
Evidence: 照合先 resources/views/comparison/show.blade.php、検索語 `要件整理シート付き比較表をダウンロード`(0 件)。分割後の文言は同ファイル 31-32 行に 2 要素で存在する
Impact: 対象文言が再び出力されるようになっても、このテストは落ちない
Fix: 分割後のマークアップに合わせ、対象要素へスコープした正規表現で検証する
Confidence: high
Severity: warning
resolution: 期待値を変更後の出力に合わせるか、検証意図が「削除の回帰固定」であればテスト名とコメントにその旨を明記する
このテストは意味がありません
(Check の特定なし、照合先と検索語のアンカーなし、落ちない根拠の提示なし、resolution なし、作者の意図の断定)
vitest-mock-isolation の領分を重複指摘している、resolution が無い。skills/downstream/test-existence/SKILL.md — テストの有無(委譲先)skills/downstream/coverage-gap/SKILL.md — 未テスト経路の量(委譲先)skills/downstream/flaky-test/SKILL.md — 非決定性(委譲先)skills/downstream/test-naming/SKILL.md — 命名・構造(委譲先)skills/midstream/vitest-mock-isolation/SKILL.md — JS / TS の un-awaited .resolves / .rejects(委譲先)skills/upstream/plangate-tdd-evidence/SKILL.md — tdd-ledger artifact ベースの証跡検証(委譲先)skills/midstream/impact-evidence-coverage/SKILL.md — 証拠の充足性(補完関係)src/lib/heuristic-review.mjs — .only / .skip / @ts-ignore / 空 catch の決定論検出器(重複指摘しない境界).claude/rules/review-core.md §「カスタム静的解析の False-positive 責務分界(#1070)」 — 決定論と意味的判断の分界docs/review/output-format.md — 重要度ラベルと出力形式(SSoT)まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
<What this skill does>
日本語の概要は準備中です。原文の説明を表示しています。
画像・ボタン・フォーム要素に適切なアクセシブルネームがあるか確認する。
Ensure ADRs capture context, decision, alternatives, tradeoffs, and follow-ups in a way that prevents future drift.
日本語の概要は準備中です。原文の説明を表示しています。
敵対的分析手法を統合したレビューの entry skill。認知バイアス対策の3手法 (Pre-mortem / War Game / Logic Torturing)と、宣言・主張と実態の乖離を突く claim-vs-actual 検出3パターン(Self-Contradiction / Refactor-Claim Audit / Cross-File Leakage)へルーティングし、通常のレビューでは見えない設計の盲点・ 防御の穴・論理の弱点・宣言と実装のズレを可視化する。
Review changes to the Agent Skills import/export bridge for path safety, round-trip fidelity, and validation correctness.
日本語の概要は準備中です。原文の説明を表示しています。
Checks whether AI-assisted work defines review criteria, accessible context, explicit review loop, human judgment boundary, and feedback capture before delegating to an agent.
日本語の概要は準備中です。原文の説明を表示しています。