Verify Tests Catch the Bug
dotnet/maui
Confirms that newly added tests actually fail without the fix, auto-detecting UI, device, unit or XAML tests and running the matching runner.
7-phase .NET verification pipeline with structured PASS/FAIL reporting.
$ npx skills add Resgrid/Core --skill verification-loop -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Resgrid/Core verification-loop --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Resgrid/Core.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.forge/skills/verification-loop .claude/skills/verification-loop && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "verification-loop" agent skill from https://github.com/Resgrid/Core/tree/master/.forge/skills/verification-loop into .claude/skills/verification-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verification-loop", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Resgrid/Core/tree/master/.forge/skills/verification-loopType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Resgrid/Core --skill verification-loop -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Resgrid/Core verification-loop --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Resgrid/Core.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.forge/skills/verification-loop .agents/skills/verification-loop && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "verification-loop" agent skill from https://github.com/Resgrid/Core/tree/master/.forge/skills/verification-loop into .agents/skills/verification-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verification-loop", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Resgrid/Core --skill verification-loop -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Resgrid/Core verification-loop --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Resgrid/Core.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.forge/skills/verification-loop .cursor/skills/verification-loop && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "verification-loop" agent skill from https://github.com/Resgrid/Core/tree/master/.forge/skills/verification-loop into .cursor/skills/verification-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verification-loop", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Resgrid/Core.git --path .forge/skills/verification-loop--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Resgrid/Core --skill verification-loop -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Resgrid/Core verification-loop --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Resgrid/Core.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.forge/skills/verification-loop .gemini/skills/verification-loop && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "verification-loop" agent skill from https://github.com/Resgrid/Core/tree/master/.forge/skills/verification-loop into .gemini/skills/verification-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verification-loop", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Resgrid/Core verification-loopInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Resgrid/Core --skill verification-loop -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Resgrid/Core.git skills-src && mkdir -p .github/skills && cp -r skills-src/.forge/skills/verification-loop .github/skills/verification-loop && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "verification-loop" agent skill from https://github.com/Resgrid/Core/tree/master/.forge/skills/verification-loop into .github/skills/verification-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verification-loop", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Resgrid/Core --skill verification-loop -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Resgrid/Core verification-loop --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Resgrid/Core.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.forge/skills/verification-loop .opencode/skills/verification-loop && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "verification-loop" agent skill from https://github.com/Resgrid/Core/tree/master/.forge/skills/verification-loop into .opencode/skills/verification-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "verification-loop", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
verification-loop7-phase .NET verification pipeline with structured PASS/FAIL reporting.
Verification Loop is an agent skill from Resgrid/Core. 7-phase .NET verification pipeline with structured PASS/FAIL reporting. Ensures every change is build-verified, diagnostics-clean, anti-pattern-free, test-passing, security-scanned, format-compliant, and diff-reviewed before marking work as complete. Load this skill when: "verify", "check everything", "run verification", "pre-PR check", "is this ready", "validate changes", "build and test", "quality gate", "pipeline check", "ready to merge".
Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Quality gates. It works with .NET. The repository describes itself as: The Open Source Computer Aided Dispatch (CAD), Personnel, Shift Management, Automatic Vehicle Location (AVL) and Emergency Management Platform that powers Resgrid.com. The licence is Apache-2.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit a31015f. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dotnetgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Verification Loop loads about 2.4k tokens when it runs. Until then it costs about 116 tokens; SKILL.md has 604 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
cidental files (`.vs/`, `bin/`, `obj/`, `.env`, secrets)Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Resgrid/Core at commit a31015f, republished under its Apache-2.0 licence (© Resgrid). 604 words, ~2,431 tokens.
.claude/skills/verification-loop/SKILL.md (or your agent's skills folder).Build is the minimum bar — Never mark a task complete without a green dotnet build. If it doesn't compile, nothing else matters. A broken build wastes every subsequent phase's time.
Automated checks before manual review — Tools catch what humans miss. get_diagnostics finds nullability issues, detect_antipatterns catches DateTime.Now usage, and dotnet test proves behavior. Run all of these before eyeballing code.
Short-circuit on critical failures — If the build fails, don't run tests. If tests fail, don't run formatting checks. Failing fast saves time and keeps the feedback loop tight. Fix the most fundamental issue first.
Structured reporting — Every phase gets an explicit PASS, FAIL, or WARN status with details. No ambiguity. "It looks fine" is not a verification result. A table with statuses is.
Verification is iterative — A single pass rarely produces all-green. Fix the first failure, re-run from that phase, repeat until clean. The loop is the point.
Execute phases in order. Short-circuit on CRITICAL failures (Phase 1 and Phase 4).
Phase 1: Build (CRITICAL)
dotnet build --no-restoreStatus: PASS (0 errors) / FAIL (N errors) Short-circuit: If FAIL, stop all subsequent phases. Fix build errors first. Note: Capture warning count even on PASS — new warnings are tracked in Phase 2.
Phase 2: Diagnostics
MCP: get_diagnostics(scope: "file", path: each changed file)
MCP: get_diagnostics(scope: "project", path: changed project)Status: PASS (0 new warnings) / WARN (N new warnings) / FAIL (new errors) Check: Compare against baseline — only flag NEW warnings introduced by the current changes. Common findings: CS8600 (null reference), CS8602 (dereference of nullable), CS0219 (unused variable).
Phase 3: Anti-pattern Scan
MCP: detect_antipatterns(file: each changed file)Status: PASS (0 anti-patterns) / WARN (N anti-patterns found)
Catches: async void, sync-over-async, new HttpClient(), DateTime.Now, broad catch,
logging string interpolation, missing CancellationToken, EF queries without AsNoTracking.
Phase 4: Tests (CRITICAL)
dotnet test --no-buildStatus: PASS (all green) / FAIL (N failures) Short-circuit: If FAIL, stop remaining phases. Fix failing tests before proceeding. Note: If no test project exists, status is SKIP with a recommendation to add tests.
Phase 5: Security Scan
dotnet list package --vulnerable --include-transitiveScan changed files for: hardcoded secrets, connection strings, API keys. Check: OWASP patterns in new code (SQL injection, XSS, missing auth attributes). Status: PASS / WARN (medium/low findings) / FAIL (critical/high vulnerabilities)
Phase 6: Format Compliance
dotnet format --verify-no-changesStatus: PASS (no changes needed) / FAIL (formatting violations found)
Fix: Run dotnet format and include formatting changes in the commit.
Phase 7: Diff Review
git diff --stat
git diffStatus: PASS (changes match intent) / WARN (unexpected files changed) Check:
.vs/, bin/, obj/, .env, secrets)Console.WriteLine, #if DEBUG blocks in production paths)After running all phases, produce a verification report:
## Verification Report
| Phase | Status | Details |
|-------|--------|---------|
| 1. Build | PASS | 0 errors, 2 warnings (pre-existing) |
| 2. Diagnostics | WARN | CS8600 in OrderService.cs:47 — possible null reference |
| 3. Anti-patterns | PASS | 0 anti-patterns in changed files |
| 4. Tests | PASS | 42 passed, 0 failed, 0 skipped |
| 5. Security | PASS | No vulnerable packages, no secrets detected |
| 6. Format | PASS | No formatting violations |
| 7. Diff Review | PASS | 3 files changed, all match task scope |
**Overall: PASS (with warnings)**
### Action Items
- [ ] Fix CS8600 in OrderService.cs:47 — add null check or use null-forgiving operator with justificationWhen a phase fails, follow this exact sequence:
1. IDENTIFY — Which phase failed? What's the specific error?
2. FIX — Make the minimal change to resolve the issue
3. RE-RUN — Start from the failed phase (not from Phase 1, unless the fix changed code)
Exception: If the fix involved code changes, re-run from Phase 1 (build)
4. REPEAT — Until all phases pass or you've identified an issue that needs user input
EXAMPLE:
Phase 4 fails: OrderServiceTests.CreateOrder_ReturnsCreated fails with 404
→ Fix: Route was "/orders" but test expected "/api/orders"
→ Re-run from Phase 1 (code changed) → Build PASS → Phase 4 PASS
→ Continue Phase 5, 6, 7Before creating any pull request, run the full 7-phase pipeline. This is non-negotiable.
PRE-PR CHECKLIST:
1. All 7 phases PASS (warnings acceptable only if pre-existing)
2. No new warnings introduced
3. All new code has corresponding tests
4. Diff review confirms changes match the PR description
5. No TODO comments left unresolved (or tracked in issues)
Only after all 7 phases pass:
→ Create the PR with the verification report as part of the PR descriptionFor minor changes (typo fix, config change, documentation), run a subset:
QUICK VERIFICATION (3 phases):
Phase 1: dotnet build
Phase 4: dotnet test
Phase 6: dotnet format --verify-no-changes
Use when:
- Single-line bug fix with existing test coverage
- Configuration change
- Documentation-only change
- Dependency version bump (also add Phase 5 for security)After structural refactoring, focus on correctness:
POST-REFACTOR VERIFICATION (4 phases):
Phase 1: dotnet build — refactors often break compilation
Phase 2: get_diagnostics — refactors often introduce new warnings
Phase 3: detect_antipatterns — refactors can accidentally introduce anti-patterns
Phase 4: dotnet test — the ultimate refactor validation
Skip Phase 5-7 unless the refactor touches security-sensitive code or public APIs.# BAD — "it compiles in my head"
"I've made the changes. The code looks correct. Let me create the PR."
# No build run, no tests, no diagnostics — hope-driven development
# GOOD — verify before declaring done
"Let me run the verification pipeline before we create the PR."
→ Phase 1: Build PASS → Phase 2: Diagnostics PASS → ... → Phase 7: PASS
"All 7 phases passed. Creating the PR now."# BAD — wasting time on downstream checks
Phase 1: Build FAIL (3 errors)
Phase 2: Running diagnostics anyway...
Phase 3: Running anti-pattern scan...
Phase 4: Running tests... (they'll fail because build failed)
# GOOD — short-circuit and fix
Phase 1: Build FAIL (3 errors)
→ STOP. Fix the 3 build errors first.
→ Re-run from Phase 1.# BAD — "warnings are just suggestions"
Phase 2: 12 new CS8600 warnings introduced
"These are just warnings, not errors. Moving on."
# Three weeks later: NullReferenceException in production
# GOOD — treat new warnings as failures
Phase 2: 12 new CS8600 warnings introduced
"12 new nullability warnings detected. Fixing before proceeding."
→ Add null checks or non-nullable assertions with justification
→ Re-run Phase 2: 0 new warnings. PASS.# BAD — reading code instead of running tools
"Let me read through OrderService.cs... looks good to me."
# Missed: DateTime.Now on line 23, async void on line 67, CS8600 on line 91
# GOOD — tools first, then human judgment
→ detect_antipatterns: Found DateTime.Now (line 23), async void (line 67)
→ get_diagnostics: CS8600 on line 91
"Found 3 issues via automated analysis. Fixing all three before manual review."# BAD — only running the phases you think are relevant
"It's just a service change, I'll skip the security scan."
# The service change added a raw SQL query with string concatenation
# GOOD — full pipeline for non-trivial changes
When in doubt, run all 7 phases. The cost of running extra phases is minutes.
The cost of missing a security issue is days of incident response.| Scenario | Phases | Notes |
|---|---|---|
| Feature complete | All 7 | Full pipeline, no shortcuts |
| Bug fix (with test) | 1, 2, 4 | Build, diagnostics, tests |
| Bug fix (no test) | 1, 2, 3, 4 | Add a test, then verify |
| Formatting only | 6 | Format check is sufficient |
| Dependency update | 1, 4, 5 | Build, tests, security |
| Pre-PR | All 7 | Non-negotiable full pipeline |
| After refactor | 1, 2, 3, 4 | Focus on correctness |
| Config change | 1, 4 | Build and test |
| New endpoint added | All 7 | Full pipeline including security |
| Test-only changes | 1, 4 | Build and run the new tests |
| Performance optimization | 1, 2, 3, 4 | Correctness first, benchmark separately |
| CI failure investigation | Run the failing phase locally | Reproduce, fix, verify |
© Resgrid, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .forge/skills/verification-loop of Resgrid/Core.
Open the folder on GitHubat commit a31015f
Verification Loop next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Verification Loop this skillResgrid/Core | 229 | — | ~2.4k | Automated safety check: Notes | Apache-2.0 | |
| Verify Tests Catch the Bugdotnet/maui | 23k | — | ~2.7k | Automated safety check: Pass | MIT | |
| Code Completionfacioquo/stock-indicators-dotnet | 1.2k | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| Verifycodewithmukesh/dotnet-claude-kit | 751 | — | ~2k | Automated safety check: Notes | MIT | |
| Mcaf Dotnet Resharper Cltmanagedcode/Storage | 138 | — | ~1.5k | Automated safety check: Pass | MIT | |
| Quality CImanagedcode/dotnet-skills | 486 | — | ~2.1k | Automated safety check: Pass | MIT |
dotnet/maui
Confirms that newly added tests actually fail without the fix, auto-detecting UI, device, unit or XAML tests and running the matching runner.
facioquo/stock-indicators-dotnet
Quality gates for finishing work in this repository — dead-code cleanup, Roslynator and dotnet format fixes, markdownlint, build, unit tests, documentation, and Obsolete migration shims — with the…
codewithmukesh/dotnet-claude-kit
Run a comprehensive 7-phase verification pipeline for .NET projects: build, analyzers, antipattern detection, tests, security, formatting, and diff review.
managedcode/Storage
Use the free official JetBrains ReSharper Command Line Tools for .NET repositories.
managedcode/dotnet-skills
Set up or refine open-source .NET code-quality gates for CI: formatting, .editorconfig, SDK analyzers, third-party analyzers, coverage, mutation testing, architecture tests, and security scanning.
ScottPlot/ScottPlot
Build the full ScottPlot 5 solution only for solution-wide validation or changes affecting controls, demos, sandboxes, workloads, or platform projects. For…
Resgrid/Core
Focus code review effort on the 20% of code that causes 80% of issues.
Resgrid/Core
Autonomous iteration loops for .NET development: build-fix, test-fix, refactor, and scaffold loops.
Resgrid/Core
Auto-document insights and discoveries during development sessions.
Resgrid/Core
Observability for .NET 10 applications. An agent skill from Resgrid/Core.
Resgrid/Core
Strategic Codex model selection for .NET development workflows.
Resgrid/Core
Strategic Claude model selection for .NET development workflows.
Works with
Categories
7-phase .NET verification pipeline with structured PASS/FAIL reporting. Verification Loop is an agent skill from Resgrid/Core.NET verification pipeline with structured PASS/FAIL reporting.
Verification Loop fits situations like: tasks that involve Quality gates.
Run `npx skills add Resgrid/Core --skill verification-loop -a claude-code`. Or copy the skill folder (.forge/skills/verification-loop in Resgrid/Core) into .claude/skills/verification-loop in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Resgrid/Core --skill verification-loop -a codex`. Or copy the skill folder (.forge/skills/verification-loop in Resgrid/Core) into .agents/skills/verification-loop in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Resgrid/Core --skill verification-loop -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/verification-loop, .gemini/skills/verification-loop, .github/skills/verification-loop and .opencode/skills/verification-loop in your project.
Going by SKILL.md and its folder, Verification Loop needs the command-line tools its instructions call (dotnet and git).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Verification Loop is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Verification Loop: Verify Tests Catch the Bug (dotnet/maui, 23k stars), Code Completion (facioquo/stock-indicators-dotnet, 1.2k stars), Verify (codewithmukesh/dotnet-claude-kit, 751 stars) and Mcaf Dotnet Resharper Clt (managedcode/Storage, 138 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Resgrid (a GitHub organization) maintains it in Resgrid/Core, which has 229 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 7, 2026.
Source: Resgrid/Core on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.