Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Comprehensive testing workflow - unit tests ∥ integration tests → E2E tests
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 15% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 29% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-19 | ✗→✓ | ▲ Improved | -1% | 0% |
Run comprehensive test suite with parallel execution.
┌─────────────┐ ┌───────────┐
│ diagnostics │ ──▶ │ arbiter │ ─┐
│ (type check)│ │ (unit) │ │
└─────────────┘ └───────────┘ │
├──▶ ┌─────────┐
┌───────────┐ │ │ atlas │
│ arbiter │ ─┘ │ (e2e) │
│ (integ) │ └─────────┘
└───────────┘
Pre-flight Parallel Sequential
(~1 second) fast tests slow tests| # | Agent | Role | Execution | |---|-------|------|-----------| | 1 | arbiter | Unit tests, type checks, linting | Parallel | | 1 | arbiter | Integration tests | Parallel | | 2 | atlas | E2E/acceptance tests | After 1 passes |
Before running tests, check for type errors - they often cause test failures:
bashtldr diagnostics . --project --format text 2>/dev/null | grep "^E " | head -10
Why diagnostics first?
If errors found: Fix them BEFORE running tests. Type errors usually mean tests will fail anyway.
If clean: Proceed to Phase 1.
For large test suites, find only affected tests:
bashtldr change-impact --session # or for explicit files: tldr change-impact src/changed_file.py
This returns which tests to run based on what changed. Skip this for small projects or when you want full coverage.
# Run both in parallel
Task(
subagent_type="arbiter",
prompt="""
Run unit tests for: [SCOPE]
Include:
- Unit tests
- Type checking
- Linting
Report: Pass/fail count, failures detail
""",
run_in_background=true
)
Task(
subagent_type="arbiter",
prompt="""
Run integration tests for: [SCOPE]
Include:
- Integration tests
- API tests
- Database tests
Report: Pass/fail count, failures detail
""",
run_in_background=true
)
# Wait for both
[Check TaskOutput for both]Task(
subagent_type="atlas",
prompt="""
Run E2E tests for: [SCOPE]
Include:
- End-to-end flows
- Acceptance tests
- UI tests if applicable
Report: Pass/fail count, screenshots on failure
"""
)User: /test
→ All unit + integration + E2E testsUser: /test authentication
→ Only auth-related testsUser: /test --quick
→ Only unit tests (skip integration and E2E)User: /test the new payment feature
Claude: Starting /test workflow for payment feature...
Phase 0: Pre-flight diagnostics...
$ tldr diagnostics . --project --format text | grep "^E "
(no type errors found)
Phase 1: Running parallel tests...
┌─────────────────────────────────────────┐
│ arbiter: Running unit tests... │
│ arbiter: Running integration tests... │
└─────────────────────────────────────────┘
arbiter: ✅ 45/45 unit tests passing
arbiter: ✅ 12/12 integration tests passing
Phase 2: Running E2E tests...
atlas: ✅ 8/8 E2E tests passing
Test Summary:
┌─────────────┬─────────┬────────┐
│ Type │ Passed │ Failed │
├─────────────┼─────────┼────────┤
│ Unit │ 45 │ 0 │
│ Integration │ 12 │ 0 │
│ E2E │ 8 │ 0 │
├─────────────┼─────────┼────────┤
│ TOTAL │ 65 │ 0 │
└─────────────┴─────────┴────────┘
All tests passing! ✅User: /test
Claude: Starting /test workflow...
Phase 0: Pre-flight diagnostics...
$ tldr diagnostics . --project --format text | grep "^E "
E src/payment.py:45:12: Argument of type 'str' not assignable to 'int'
E src/refund.py:23:8: Return type 'None' not assignable to 'float'
Found 2 type errors. Fixing before running tests...
[Claude fixes the type errors]
Re-running diagnostics... clean.
Phase 1: Running parallel tests...If Phase 1 fails:
arbiter: ❌ 43/45 tests passing
2 failures:
- test_payment_validation: expected 'invalid' got 'valid'
- test_refund_calculation: off by $0.01
Stopping workflow. Fix failures before running E2E tests.--quick: Unit tests only--no-e2e: Skip E2E tests--coverage: Include coverage report--watch: Re-run on file changes| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 7,796 | 5,975 | -23% | 1 | 1 | 0% | 1,325 | 1,714 | +29% | 0 | 0 | — |
case-02 | fail→fail | 12,576 | 3,526 | -72% | 1 | 1 | 0% | 2,418 | 2,062 | -15% | 0 | 0 | — |
case-17 | pass→fail | 5,607 | 5,735 | +2% | 1 | 1 | 0% | 898 | 1,748 | +95% | 0 | 0 | — |
case-03 | fail→fail | 5,821 | 5,548 | -5% | 1 | 1 | 0% | 1,002 | 1,734 | +73% | 0 | 0 | — |
case-04 | pass→fail | 12,948 | 3,642 | -72% | 1 | 1 | 0% | 2,664 | 1,845 | -31% | 0 | 0 | — |
case-05 | pass→fail | 8,828 | 3,719 | -58% | 1 | 1 | 0% | 1,663 | 2,015 | +21% | 0 | 0 | — |
case-06 | pass→fail | 5,174 | 4,790 | -7% | 1 | 1 | 0% | 1,057 | 1,647 | +56% | 0 | 0 | — |
case-07 | fail→fail | 9,151 | 3,414 | -63% | 1 | 1 | 0% | 839 | 1,907 | +127% | 0 | 0 | — |
case-08 | fail→pass | 9,876 | 4,044 | -59% | 1 | 1 | 0% | 1,838 | 2,120 | +15% | 0 | 0 | — |
case-09 | fail→pass | 9,520 | 3,071 | -68% | 1 | 1 | 0% | 1,727 | 1,872 | +8% | 0 | 0 | — |
case-10 | fail→fail | 11,688 | 3,241 | -72% | 1 | 1 | 0% | 2,297 | 1,825 | -21% | 0 | 0 | — |
case-11 | fail→pass | 8,538 | 2,177 | -75% | 1 | 1 | 0% | 1,397 | 1,803 | +29% | 0 | 0 | — |
case-12 | fail→pass | 7,626 | 2,254 | -70% | 1 | 1 | 0% | 1,234 | 1,830 | +48% | 0 | 0 | — |
case-13 | pass→pass | 7,317 | 3,060 | -58% | 1 | 1 | 0% | 1,101 | 2,042 | +85% | 0 | 0 | — |
case-14 | fail→fail | 7,055 | 3,617 | -49% | 1 | 1 | 0% | 1,179 | 1,897 | +61% | 0 | 0 | — |
case-15 | pass→fail | 7,154 | 3,381 | -53% | 1 | 1 | 0% | 1,309 | 1,836 | +40% | 0 | 0 | — |
case-16 | fail→fail | 6,001 | 3,551 | -41% | 1 | 1 | 0% | 1,075 | 1,824 | +70% | 0 | 0 | — |
case-18 | pass→pass | 4,420 | 6,576 | +49% | 1 | 1 | 0% | 732 | 1,793 | +145% | 0 | 0 | — |
case-19 | fail→pass | 14,678 | 2,887 | -80% | 1 | 1 | 0% | 1,975 | 1,957 | -1% | 0 | 0 | — |
case-20 | pass→pass | 13,544 | 2,640 | -81% | 1 | 1 | 0% | 2,291 | 1,768 | -23% | 0 | 0 | — |
case-21 | fail→pass | 12,786 | 1,977 | -85% | 1 | 1 | 0% | 2,003 | 1,748 | -13% | 0 | 0 | — |
case-22 | fail→fail | 12,189 | 2,183 | -82% | 1 | 1 | 0% | 2,001 | 1,795 | -10% | 0 | 0 | — |
case-23 | pass→pass | 11,651 | 9,205 | -21% | 1 | 1 | 0% | 1,779 | 2,995 | +68% | 0 | 0 | — |
case-24 | pass→pass | 12,238 | 8,789 | -28% | 1 | 1 | 0% | 1,999 | 2,693 | +35% | 0 | 0 | — |
case-25 | fail→fail | 6,619 | 3,346 | -49% | 1 | 1 | 0% | 1,316 | 1,803 | +37% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted, and 20 counted toward the lift figure. The other 5 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +4 percentage points is the difference between those two pass rates over the 20 comparable cases. 5 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 7/29/2026 | +52% |
Other measured skills in the registry, with their headline benchmark lift.