Verification Loop

SkillDev tools

Verification loop — lint -> typecheck -> unit -> integration -> e2e

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Verification Loop skill

What this skill tells your AI

The instructions your AI receives, as published by sd0xdev/sd0x-harness in skills/verify/SKILL.md and read by ahel’s review.

Trigger

  • Keywords: verify, run tests, check, lint, typecheck, verification

When NOT to Use

  • Pre-commit gate (use /precommit or /precommit-fast)
  • Test coverage review (use /codex-test-review)
  • Running a single specific test (run directly)

Workflow Steps

StepGoalSafetySkip if Missing
lintCheck code style (read-only)read-onlyyes
typecheckStatic type checking (full only)read-onlyyes
test-unitRun unit test suiteread-onlyyes
test-integrationRun integration tests (full only)read-onlyyes
test-e2eRun end-to-end tests (full only)read-onlyyes

Failure behavior: continue-all (run all steps, report all results)

Task

Step 1: Check for runner script

Use Glob to check if .claude/scripts/verify-runner.js exists in the project root.

  • Found → run: node .claude/scripts/verify-runner.js $ARGUMENTS
    • If runner succeeds, use its output and skip to the Output section.
    • If runner fails, treat as a real verification failure (do not silently fallback).
  • NOT found → skip to Step 2 (do NOT attempt to run the runner).

Step 2: Fallback (no runner script)

If the runner was not found in Step 1, detect the project ecosystem to run steps manually.

Ecosystem detection (check project root for manifest files):

ManifestEcosystemLintTypecheckTest
package.jsonNode.js{pm} lint{pm} typecheck{pm} test:unit
pyproject.tomlPythonruff check .mypy .pytest
Cargo.tomlRustcargo clippy(implicit)cargo test
go.modGogolangci-lint rungo vet ./...go test ./...
build.gradleJava./gradlew spotlessCheck(implicit)./gradlew test

For Node.js projects, auto-detect package manager from lockfile.

$ARGUMENTS == "fast": lint + unit only

Otherwise (full): lint -> typecheck -> unit -> integration -> e2e

Steppackage.json scriptIf missing
lintlintSkip with note
typechecktypecheckSkip with note
unittest:unit, fallback to testSkip with note
integrationtest:integrationSkip (requires explicit path)
e2etest:e2eSkip (requires explicit path)

Graceful Skip Rules

ScenarioBehavior
No lint scriptSkip, log "no lint script — skipped"
No typecheck scriptSkip, log "no typecheck script — skipped"
No test:unit or test scriptSkip, log "no test script — skipped"
No package.jsonReport error, cannot run checks

Output

For fast mode:

## Verify (fast)

| Step | Status | Notes |
|------|--------|-------|
| lint | ✅/❌/⏭️ | |
| unit | ✅/❌/⏭️ | |

## Overall: ✅ PASS / ❌ FAIL

For full mode:

## Verify (full)

| Step | Status | Notes |
|------|--------|-------|
| lint | ✅/❌/⏭️ | |
| typecheck | ✅/❌/⏭️ | |
| unit | ✅/❌/⏭️ | |
| integration | ✅/❌/⏭️ | skipped unless path specified |
| e2e | ✅/❌/⏭️ | skipped unless path specified |

## Failures (if any)

- Root cause: <first error>
- Fix: <suggestion>

## Overall: ✅ PASS / ❌ FAIL

Signals

GitHub stars
188
Forks
24
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
verify-sd0xdev
Source
github.com/sd0xdev/sd0x-harness