skills/test-deep/SKILL.md
Context-aware test orchestration. Use when: smart test selection, failure triage, progressive test ladder, test failure analysis. Not for: writing tests (use post-dev-test), reviewing tests (use codex-test-review), generating tests (use codex-test-gen), full manual run (use verify). Output: test results + triage report + fixer actions.
npx skillsauth add sd0xdev/sd0x-dev-flow test-deepInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
When test failures occur, dispatch background triage:
Agent({
description: "Analyze test failure root cause and suggest fixes",
subagent_type: "verify-app",
prompt: Analyze the following test failure: <failure output> Identify root cause and suggest minimal fix.
})
| Scenario | Alternative |
|----------|------------|
| Writing new tests | /post-dev-test |
| Reviewing test coverage | /codex-test-review |
| Generating unit tests | /codex-test-gen |
| Full manual test run | /verify |
| Code review | /codex-review-fast |
❌ git add | git commit | git push — per @rules/git-workflow.md
This skill runs tests and may apply safe fixers, but does not commit. To commit, the user must invoke /smart-commit --execute separately.
flowchart TD
U[User: /test-deep] --> S[Phase 0: Test Selection]
S --> |git diff mapping| T[Test Targets]
S --> |no mapping| F1[Framework --changedSince]
S --> |low confidence| F2[Full Suite]
T --> L[Phase 1: Progressive Ladder]
F1 --> L
F2 --> L
L --> |unit| R1[Run Unit Tests]
R1 --> |pass| R2[Run Integration Tests]
R1 --> |fail| TR[Phase 2: Triage Pipeline]
R2 --> |pass| R3[Run E2E Tests]
R2 --> |fail| TR
R3 --> |pass| DONE[All Pass]
R3 --> |fail| TR
TR --> P[Parser: Structured Tags]
P --> LLM[LLM: Root Cause + Action]
LLM --> FC[Phase 3: Fixer Catalog Lookup]
FC --> SG{Safety Gate}
SG --> |safe| AUTO[Auto-run Fix]
SG --> |side-effect| ASK[AskUserQuestion]
SG --> |destructive| BLOCK[Manual Only]
AUTO --> L
ASK --> |approved| L
Map code changes to test targets. See references/test-selection.md for full strategy.
Strategy priority:
| Priority | Method | When |
|----------|--------|------|
| 1 | Git diff filename mapping | Default — map changed files to test files via Glob |
| 2 | Framework native | Jest --changedSince, Vitest --changed |
| 3 | Full suite fallback | Config change, no mapping, --all flag |
Steps:
--branch uses merge-base)Full suite escalation triggers: config file changed, CI/CD file changed, package dependency changed, no test files mapped, --all flag.
Execute tests layer-by-layer with fail-fast.
| Layer | Directory Pattern | Timeout | Fail Behavior |
|-------|------------------|---------|---------------|
| Unit | test/unit/**, test/scripts/lib/**, unclassified | 60s | Fail-fast → triage |
| Integration | test/integration/** | 300s | Fail-fast → triage |
| E2E | test/e2e/** | 600s | Enter triage |
Fail-fast rule: Unit fail → skip integration + e2e. Integration fail → skip e2e.
Override: --no-fail-fast disables this behavior (run all layers regardless).
Layer detection: Classify test files by directory prefix. Files not matching any integration/e2e pattern → treat as unit.
Execution: Run tests using project's configured test command (from package.json scripts or CLAUDE.md). Capture stdout/stderr and exit code.
When failures occur, analyze and classify. See references/triage-pipeline.md for full spec.
Extract structured tags from test output (no classification — just structure):
| Tag | Description |
|-----|-------------|
| exit_code | Process exit code |
| error_signatures[] | Regex-matched error patterns |
| failing_tests[] | Failed test names |
| failing_files[] | Failed test file paths |
| env_hints[] | Environment clues (testnet, localhost, etc.) |
| stack_depth | Stack trace line count |
Feed parser tags + compressed output to LLM for classification:
| Classification | Definition | Typical Action |
|---------------|------------|----------------|
| code_bug | Logic error in code | Fix code |
| infra | Infrastructure issue (port, dependency) | Restart / reinstall |
| environment | External precondition unmet | Fixer catalog action |
| flaky | Non-deterministic failure | Retry + quarantine tag |
Mandatory secret redaction before LLM analysis — per @rules/logging.md:
references/triage-pipeline.md for redaction patternsRoute suggested_fixer through safety gate:
| Tier | Auto-run? | Confirmation | Examples |
|------|-----------|-------------|---------|
| safe | Yes | None | retry, clear_cache |
| side-effect | No | AskUserQuestion | reinstall_deps, restart_server |
| destructive | Blocked | Manual only | Reset state, drop tables |
Default-deny: Unknown fixer → side-effect tier (require confirmation).
Lookup fixer from catalog, check tier, execute or prompt. See references/fixer-catalog.md for full catalog.
Core fixers (plugin-shipped):
| Fixer | Tier | Description |
|-------|------|-------------|
| retry | safe | Re-run failing tests |
| clear_cache | safe | Clear build/test cache |
| reinstall_deps | side-effect | Remove node_modules + reinstall |
| restart_server | side-effect | Kill + restart dev server |
| port_cleanup | side-effect | Kill process on conflicting port |
Host extensions: Project-specific fixers in .claude/test-deep/fixers.md. Schema validation at load — missing required fields or invalid tier → rejected with warning.
Fixer loop: After safe/approved fixer runs, re-enter progressive ladder for failed tests only. Max 1 fixer retry per failure to prevent infinite loops.
Write per-run artifacts for comparison and debugging.
Location: .claude/cache/test-deep/<runId>/
Run ID format: <timestamp>-<shortSHA>-<pid>
| File | Content |
|------|---------|
| metadata.json | Run config: selected tests, ladder config, changed files |
| results.json | Per-layer results: pass/fail, duration, exit codes |
| triage.json | Parser tags, LLM classification, fixer chosen, outcome |
| output.log | Compressed test output (secret-redacted) |
TTL: Keep last 5 runs. Prune older on new run start.
latest symlink: Points to most recent run directory.
| Flag | Default | Description |
|------|---------|-------------|
| --all | false | Force full test suite |
| --layer <unit\|integration\|e2e> | all | Run only specified layer |
| --no-fail-fast | false | Run all layers regardless of failures |
| --no-fix | false | Triage only, skip fixer execution |
| --focus <path> | — | Limit test selection to path |
| --branch | false | Use merge-base diff instead of working tree |
## Test Deep Report
### Test Selection
- Changed files: N
- Mapped test files: N (N unit, N integration, N e2e)
- Selection method: git diff mapping | framework native | full suite
### Results
| Layer | Tests | Passed | Failed | Skipped | Duration |
|-------|-------|--------|--------|---------|----------|
### Failure Triage
| # | Test | Classification | Root Cause | Fixer | Tier |
|---|------|---------------|------------|-------|------|
### Actions Taken
- [N] fixer_id: outcome
### Gate
✅ All Pass | ⛔ N failures pending resolution
git add / git commit / git push executedreferences/test-selection.md — Git diff mapping strategy + full suite escalationreferences/triage-pipeline.md — Parser tags + LLM prompt + safety gatereferences/fixer-catalog.md — Core fixers + host extensions + safety tiers@rules/logging.md — Secret redaction policy@rules/docs-writing.md — Output format conventionsdocumentation
Rewrite the previous reply in Traditional Chinese
development
Monitor GitHub Actions CI runs until completion. Use when: watching CI after push, checking build status, monitoring PR checks, waiting for CI completion, user says 'watch CI', 'check CI', 'CI status', 'monitor build', or /watch-ci. Not for: pushing code (use push-ci), creating PRs (use create-pr). Output: per-run verdict (pass/fail/timeout).
development
Verification loop — lint -> typecheck -> unit -> integration -> e2e
development
Research current code state then update corresponding docs, ensuring docs stay in sync with code.