本文へ移動
cccskills
無料GitHub で公開

test-driven-development

Use when implementing deterministic, reusable code where regressions would warrant a CI red light. Enforces RED-GREEN-REFACTOR. Applicability rule and skip conditions inside.

日本語の概要は準備中です。原文の説明を表示しています。

btseytlin/ultrapackスター 46(GitHub 46 + cccskills 0)

実行スコア 未検証

インストール方法を見る

含まれるファイル(1)

  • SKILL.md4.3 KB

SKILL.md(原文)

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

Test-Driven Development

Write the test first. Watch it fail. Write minimal code to pass. Refactor. Repeat.

Core principle: if you didn't watch the test fail, you don't know whether it tests the right thing.

Applicability — invoke only when all three hold

<applies-when> 1. The code produces specific outputs for specific inputs (deterministic I/O contract) 2. It is called from more than one place (library code, API method, utility, validator) 3. A regression here would warrant a CI red light </applies-when>

Skip conditions — do not invoke when any holds

<skip-when> - Training a model, hyperparameter tuning, anything stochastic with no "correct" output - Exploratory data analysis (you're figuring out what's in the data) - One-off scripts or throwaway prototypes - Research / experiment code - UI changes where the real test is "does it look right" </skip-when>

The decision is recorded during up:udesign as TDD: yes or TDD: no (reason).

Iron law when applicable — no production code without a failing test first

Wrote code before the test? Delete it. Start over from the test. Don't "adapt" what you wrote — the test will be shaped by the code instead of shaping it.

Phase 1 — RED: write a failing test

  • One behavior per test
  • Clear name describing the behavior
  • Real code path where possible; mocks only when genuinely unavoidable
def test_retry_succeeds_after_two_failures():
    attempts = 0
    def op():
        nonlocal attempts
        attempts += 1
        if attempts < 3:
            raise RuntimeError("fail")
        return "success"
    assert retry(op, max_attempts=3) == "success"
    assert attempts == 3

Phase 2 — Verify RED: run it, confirm it fails for the right reason

<required> - It fails (not an import/syntax error) - The failure reason is "feature missing", not a typo - The error message matches what you expected </required>

Test passed immediately? You're testing behavior that already exists. Fix the test.

Phase 3 — GREEN: minimal code to pass

def retry(op, max_attempts):
    for i in range(max_attempts):
        try:
            return op()
        except Exception:
            if i == max_attempts - 1:
                raise
    raise RuntimeError("unreachable")

Don't add features, options, or "while I'm here" changes. Just pass the test.

Phase 4 — Verify GREEN: run it, confirm it passes, nothing else broke

Run the new test and the existing suite. If either fails: back to GREEN (not RED — don't change the test).

Phase 5 — REFACTOR: clean up with tests green

Names, duplication, helpers. Keep tests green. Don't add behavior in this step. Then loop back to RED for the next test.

Good tests

<good-test> - Minimal — one behavior per test. If "and" appears in the name, split. - Clear — name describes what it checks. - Real — exercises actual code, not mocks pretending to be code. </good-test>

Red flags — stop and start over

<red-flags> - You wrote code before the test - A test passes immediately on first run - You can't explain why a test failed the way it did - You're keeping old code "as reference" while writing tests — delete it - You're "adapting" existing code while writing tests — that's tests-after, not TDD </red-flags>

Why order matters

Tests-after answer: what does this do? Tests-first answer: what should this do?

Tests-after are biased by the implementation you already wrote. Tests-first force edge-case discovery before you commit to a design.

When stuck

  • Don't know how to test: write the wished-for API in the test first; let it drive the implementation shape
  • Test is too complicated: the interface is too complicated; simplify it
  • Must mock everything: the code is too coupled; use dependency injection
  • Huge setup: extract helpers; if it stays huge, the design is wrong

For bug fixes

Write a failing test that reproduces the bug. Then RED-GREEN-REFACTOR. The test proves the fix and prevents regression.

Final rule

Production code → a test exists and was written first and failed first
Otherwise → not TDD

レビュー

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

コメント

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

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

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

0 / 1000 文字

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

同じリポジトリのスキル

Run a bounded implement-attack-repair loop for a user-specified task. Use when work needs repeated independent criticism: perform the task, dispatch a fresh attacker, verify significant findings, repair them, and stop on a clean attack or the user's round limit.

日本語の概要は準備中です。原文の説明を表示しています。

btseytlin/ultrapack462026年10月15日 更新

e

無料

Explain a file, error, design, diff, or concept like a helpful engineering colleague: grounded in evidence, concise, and with useful follow-up threads. Use when the user asks for a clear explanation of the current work or codebase.

日本語の概要は準備中です。原文の説明を表示しています。

btseytlin/ultrapack462026年10月15日 更新

expand

無料

Turn one user criticism into a principle-level fix: find the violated principle, every similar occurrence, and fix the shared cause. Use only when the user explicitly invokes expand, $expand, /up:expand, or /skill:expand.

日本語の概要は準備中です。原文の説明を表示しています。

btseytlin/ultrapack462026年10月15日 更新

Use when a task needs an isolated checkout. Verify the worktree location, keep mutable environments and build outputs local, and run only authorized setup and checks.

日本語の概要は準備中です。原文の説明を表示しています。

btseytlin/ultrapack462026年10月15日 更新

handsoff

無料

Contract for hands-off mode — the ultrapack workflow variant that minimizes user prompts after Design, takes the safest reversible path, and logs every auto-choice for one end-of-task review. Referenced by the workflow entry point and child skills (udesign, uplan, uexecute, uverify, ureview). Read when the task file's **Mode:** header is `hands-off`.

日本語の概要は準備中です。原文の説明を表示しています。

btseytlin/ultrapack462026年10月15日 更新

Use when the user explicitly asks to launch and supervise a job. Require an authorized launch, monitoring, recovery, and teardown contract. Detect failures without inventing permission to restart or spend money.

日本語の概要は準備中です。原文の説明を表示しています。

btseytlin/ultrapack462026年10月15日 更新

btseytlin のスキルをすべて見る

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