本文へ移動
cccskills
無料GitHub で公開日本語紹介

red-green-proof

不具合を再現するテストを先に失敗させ、修正後の成功と、修正を外した際の再失敗まで確認します。テストが問題を実際に検出していることを実行結果で確かめます。

原文原文の説明を見る

Turns a suspected bug into a proven one. Verify the cause against reality before claiming it, write a test that FAILS on the current code, apply the fix, watch it pass — then revert the fix and confirm the test goes red again, because a test that passes both ways proves nothing. Invoked bare after a debugging conversation, it takes the target from context rather than asking. Use when fixing a bug, investigating an incident, hardening a flaky area, or when asked to "add tests that reveal the bug". Triggers on "/red-green-proof", "prove the bug", "red-green", "make the test fail first", "is that test load-bearing", "reveal the bug with a test".

実行スコア 未検証

インストール方法を見る

こんなときに便利

  • 修正前に不具合を再現したいとき
  • 再発防止テストの有効性を確かめたいとき
  • 実行証拠を残して障害を調査したいとき
  • 不安定なテストの失敗条件を保存したいとき

日本語での紹介

できること

不具合の原因を実際のコードやログなどで確認し、修正前に失敗するテストを作ります。最小限の修正で成功させた後、修正を一時的に外して再び失敗することまで検証します。同じテストと判定条件を使い、問題そのものを検出しているかを実行結果で確かめます。

こんなときに便利

バグ修正や障害調査に加え、修正後に追加した再発防止テストの有効性を確認したい場面に向いています。不安定なテストでは、失敗時の乱数の種や実行順序などを残してから調査します。原因は確認済み・推測・不明を区別して報告します。

使い方の例

  • 「この不具合を再現するテストを先に失敗させてから修正して」
  • 「追加したテストが、修正を外すと本当に失敗するか確認して」

注意点

対象コードとテストを実行できる環境が必要です。修正を一時的に取り除く工程があり、検証後に復元して全体テストと型チェックを実行します。直接再現できない場合は、構造の検査やモデルによるテストなどの種別と限界を明記します。MIT Licenseで提供されています。

この紹介文は、公開されている SKILL.md をもとに AI(OpenAI Codex)が作成しました。正確な仕様は下の原文を確認してください。

含まれるファイル(4)

  • SKILL.md9.4 KB
  • README.md620 B
  • scripts/README.md205 B
  • scripts/red_green_evidence.py1.5 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Red-Green-Proof

A bug is not fixed because the tests pass. A bug is fixed when a test fails without your fix and passes with it, and you have watched it do both.

Overview

Use this skill when a bug, incident, flaky test, or unproven regression test is under investigation. It applies a strict red-green-red loop: establish the cause, observe a focused test fail, make the smallest fix, then remove the fix and observe the test fail again. The final revert is the proof that the test is actually coupled to the defect.

Workflow

Keep evidence for each phase separate. A test command that exits zero is not evidence that it exercised the defect; record the assertion and the observed failure or success. Do not proceed when the current phase is unobserved.

Before changing code, identify the exact test command and expected red signal. After the fix, run that same command without changing its assertions. During the revert, use the same command again and preserve the failure output. Restore the fix before running the broader suite.

Proactive Triggers

  • A pull request adds a regression test but no pre-fix failure is recorded → ask for the red run before calling it coverage.
  • A bug fix changes production code and tests in one step → verify the test fails against the parent revision or label the evidence as missing.
  • A test uses only mocks or call-count assertions → ask for the observable user-facing consequence.
  • A test is described as flaky → preserve the failing seed, timing, or interleaving before attempting a stabilization fix.

Output Format

Report each investigation with: (1) target and cause, labeled Proven, Inferred, or Unknown; (2) the red command and actual failure before the fix; (3) green and revert-red results with actual output; and (4) final suite status and remaining uncertainty.

Most "regression tests" written after a fix never had the chance to fail. They are decoration. This skill is the discipline that separates a real test from a decorative one.

Picking the target

With an argument, that is the target: /red-green-proof the status endpoint reports finished runs as running.

With no argument, take the target from the conversation. The usual case is that you have just spent a long stretch investigating something — the bug is already on screen. Do not ask what to work on. Scan back through the session and pick, in this order:

  1. A defect just identified but not yet fixed.
  2. A fix applied without a failing test to back it — the most valuable target, because the test still has to be proven load-bearing.
  3. A test written but never verified red.
  4. Something described as "still open", "not fixed yet", or "characterization only".

State your pick in one line and start:

Target: the buffer discards events when the flush write fails (checkpointBuffer.ts:271). Verifying before writing the test.

Only ask the user if two or more candidates are genuinely equal in priority — then list them as a short numbered choice and stop. If several related defects came up, handle them one at a time through the full loop rather than batching; each needs its own red.

If nothing in the conversation qualifies, say so and ask for a target rather than inventing one.

The loop

Run these in order. Do not skip 1, and never skip 4.

1. Verify the cause. Do not infer it.

Before you write a line of test code, establish what actually happened using evidence you can point at: the real record from the database or API, the real log line, the actual source of the function you are blaming.

Say which of these you have:

  • Proven — I read the value / ran the code / pulled the record.
  • Inferred — consistent with the evidence, but I have not confirmed it.
  • Unknown — I cannot determine this from what is available.

State the label out loud. If the honest answer is Unknown, say so and name the one artifact that would settle it. A confident wrong cause costs more than an admitted gap, because it sends the fix to the wrong place.

Two traps worth naming:

  • A plausible mechanism is not the mechanism. Rank candidates, then go rule them out one at a time by reading code, not by reasoning about it.
  • Check whether the "bug" was deliberate. git log -S '<the exact line>' and read the commit. If a test already asserts the current behaviour, someone may have wanted it. Understand why before you invert it.

2. Write the test. Watch it fail.

The test must fail against the code as it is right now, before any fix exists.

Name it after the defect, not the function: reveals bug: stale status shadows a terminal event, not test inferStatus.

Assert the observable consequence a user or caller would see — the wrong status, the lost record, the 500 — not an internal call count. Call counts pass for the wrong reasons.

If it does not fail, you have not reproduced the bug. Go back to step 1.

3. Fix it.

Smallest change that makes the failing test pass. If the fix needs to be large, the test was probably too broad — narrow it and split.

4. Revert the fix. Confirm red. ← the whole point

Put the buggy code back, run the test, and watch it fail. Then restore the fix.

cp path/to/fixed.ts /tmp/fix.bak
# revert the fix (edit, patch, or git stash the single file)
<run the specific test>          # MUST fail here
cp /tmp/fix.bak path/to/fixed.ts
<run the specific test>          # green again

If it stayed green, the test is fake. Not "probably fine" — fake. Rewrite it and repeat.

This is not paranoia. It catches a specific, common failure: a test that exercises a path adjacent to the bug rather than the bug. Two real examples:

  • A concurrency test modelled two writers but had no await between each writer's read and its write. Both ran to completion atomically, never interleaved, and the test passed with the lock removed. Fix: add latency between read and write, mirroring the real network gap.
  • A fault-isolation test asserted "no 500 when the store fails", but the injected failure was a missing record, which the loader turns into null rather than throwing. The error path never ran. Fix: inject a real 500.

Both looked correct on the page. Only the revert exposed them.

5. Run everything.

The full suite, plus type checks. A fix that corrects one behaviour often contradicts a test that pinned the old one — which is a finding, not an annoyance. Go read that test and decide deliberately (see step 1).

When you cannot get a true red

Sometimes the buggy code cannot be invoked: it is a closure inside a 3,000-line factory, a route handler, a private method. Do not fake a behavioural test. Pick one of these and label it in the file header:

TypeUse whenHonesty requirement
Extract, then testThe logic can be moved to a module with injected dependenciesPreferred. Do this if the extraction is small.
Structural testThe call site cannot be reached, but the invariant is visible in the sourceScan the source and assert the property (e.g. "every write cycle sits inside the lock"). It will name offenders itself. Say in the header that it is structural and should be replaced when the code becomes reachable.
Model testTesting an interaction between components you cannot both instantiateMirror the real code field-for-field, cite the file:line it models, and note in the header that it is a model. Extra important to run step 4 — models are where fake tests hide.
Characterization testDocumenting current behaviour you are not fixing yetName it as such. Do not call it a regression test. Flag that it will invert when the bug is fixed.

Reporting

When you present the work, include:

  • What you proved vs inferred vs still do not know.
  • The revert output — the actual failure line, not a claim that it failed.
  • Which tests are behavioural, structural, model, or characterization.
  • Anything you got wrong earlier in the investigation, corrected explicitly.

Do not describe a test as "revealing the bug" unless you have seen it red.

Anti-patterns

  • Writing the test after the fix and never reverting → decoration.
  • Asserting a mock was called instead of the user-visible outcome → passes for the wrong reason.
  • Widening a test until it passes → deleting the signal.
  • Inverting a pre-existing test because it blocks you → check the history first; it may encode a decision.
  • Reporting "all green" as success when nothing was ever red.

One-line version

Red first, green second, red again on purpose, then green — and say which parts you actually proved.

Attribution and License

Originally created and maintained by RooAGI as the rooagi-red-green-proof skill. Copyright © 2026 RooAGI. Contributed under the MIT License.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

コメント

ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。

まだコメントはありません。最初のコメントを書いてみませんか。

送信するとすぐに公開されます。メールアドレスや電話番号などの個人情報は書かないでください。URL は 2 つまでです。

0 / 1000 文字

このフォームは reCAPTCHA で保護されており、Google のプライバシーポリシーと利用規約が適用されます。

同じリポジトリのスキル

a11y-audit

無料概要あり

Webアプリのアクセシビリティを点検し、WCAG 2.2のA・AA違反の検出から、フレームワーク別の修正案、再検証、監査報告書の作成まで支援するスキル。

  • 公開前にアクセシビリティを点検したいとき
  • 配色やキーボード操作を修正したいとき
  • 関係者向けの監査報告書作成
alirezarezvani/claude-skills2.9万2026年10月23日 更新

ab-test-setup

無料概要あり

Webページの見出しやボタン、料金表示などの変更を検証するために、仮説・評価指標・必要人数・実施期間を整理し、A/Bテストの設計から結果分析まで支援します。

  • LPの見出しを比較したいとき
  • 申込ボタンの変更を検証したいとき
  • 料金ページのテスト計画
alirezarezvani/claude-skills2.9万2026年10月23日 更新

ad-creative

無料概要あり

有料広告の見出しや本文を媒体ごとの文字数に合わせて作成し、配信実績を基にした改善案や比較テスト用の文案展開、文字数・表現の検証まで進めるスキル。

  • Google RSAの見出しを作りたいとき
  • MetaやLinkedInの広告文制作
  • 成果の出た広告の別案を作りたいとき
alirezarezvani/claude-skills2.9万2026年10月23日 更新

adversarial-reviewer

無料概要あり

コード変更を本番障害、保守性、セキュリティの三つの視点で厳しくレビューし、見落としや弱い前提を洗い出して、重要度とマージ判断をまとめるスキル。

  • プルリクエストをマージ前に確認
  • AIが書いたコードの再レビュー
  • 認証やデータアクセス処理の点検
alirezarezvani/claude-skills2.9万2026年10月23日 更新

aeo

無料概要あり

AIの回答で引用されることを目指し、記事の根拠や著者情報、構造を点検・改善します。監査レポートの作成に加え、見つけた引用を記録し、ページ別の状況を集計します。

  • 既存記事の根拠や信頼性の点検
  • AI回答向けの記事構造と引用の整理
  • 各AIサービスで見つけた引用の記録
alirezarezvani/claude-skills2.9万2026年10月23日 更新

agent-decision-receipts

無料概要あり

デプロイや削除、支払いなど重要なエージェント操作に、改ざんを検知できる署名付き記録を作成します。記録の要否を判断し、発行から証明書だけでのオフライン検証まで扱います。

  • 本番デプロイの署名付き記録作成
  • 削除や支払いの証跡保存
  • アクセス権付与の確認用記録
alirezarezvani/claude-skills2.9万2026年10月23日 更新

alirezarezvani のスキルをすべて見る

このスキルの問題を報告する