verification
Skill16 starsChanged 57 days agoMITView on GitHub
Verification command resolution and evidence rule for skills that run a project's tests or build before calling work done. Resolves the test and build command from project instructions, then from the stack, then to none; defines what a pass, fail, or skipped claim must quote.
- Reads credentials
48 other projects use a version of this.
Adopted by
Most recently taken up by
- neuraforge-cl-es/adaptive-engineeringtheir own version, first seen Nov 8, 2026
- facebook/docusaurustheir own version, first seen Nov 8, 2026
- maideps/ai-harness-frameworktheir own version, first seen Nov 8, 2026
- Lanqiao-Luca/ai-java-workflowtheir own version, first seen Nov 8, 2026
- Beskars-Code/Skillstheir own version, first seen Nov 6, 2026
- Gabriel-Lafrance/Skillstheir own version, first seen Nov 6, 2026
Used with
Projects with it also use evidence-driven-writing, experiment-results-planning and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
Norman-burySkillevidence-driven-writing
Use when writing or revising Introduction, Related Work, background, literature synthesis, or any section where references must drive claims
Also in 3 projects that use this
Norman-burySkillexperiment-results-planning
Use when designing experiments, result tables, mock planning data, evaluation protocols, or results sections before real data are final
Also in 3 projects that use this
- +10 more from Norman-bury
Other versions48 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 48
- facebook/docusaurus★ 67ksame name
- open-metadata/OpenMetadata★ 16ksame name
- openai/plugins★ 7.8ksame name
- hi-godot/godot-ai★ 3.4ksame name
- Norman-bury/research-writing-skill★ 3.4ksame name
- Norman-bury/articlewriting-skill★ 3.4ksame name
- forcedotcom/salesforcedx-vscode★ 1ksame name
- vercel/vercel-plugin★ 328same name
- s3s-project/s3s★ 315same name
- project-numina/numina-lean-agent★ 279same name
38 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository23 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- adviseSkill
- brainstormSkill
- code-navigationSkill
- commitSkill
- create-agents-mdSkill
- create-prSkill
- design-buildSkill
- design-fixSkill
- designSkill
- handoverSkill
- hypothesis-debuggingSkill
- load-handoverSkill
- local-filesSkill
- planSkill
- report-checkSkill
- reviewSkill
- senior-reviewSkill
- shipSkill
- tddSkill
- visual-companionSkill
- workSkill
The file
We split this skill into the rules it gives an agent
3 rules. 0 are common, 2 are distinctive, and 1 is very specific to this project.
0
Common
Most of the 40 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 42
Never let a runner wait. CI=true on every Node script, vitest run in place of a bare vitest script, and the consumer's own wait rules for …
- Distinctive: line 64
Read this file at the verification step, not at skill start.
- Distinctive: line 67
Do not restate the resolution table.
“Common” is measured: kept by at least 6 in 10 of the 40 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Verification
Reference skill read by /work, /ship, /design-build, /hypothesis-debugging, and /quiver:review at their verification step. It is never invoked and never runs a command itself: the consumer resolves the command by the rules here, runs it, and quotes the evidence.
Command Resolution
test: <command> | none (<reason>)
build: <command> | none (<reason>)
source: docs | stack | noneThe consumer resolves once, before the first task runs, records these three lines, and passes the resolved command to every subagent as a literal. none is a value, not a gap to fill: it carries its reason in the parentheses and is never promoted to a guess. Test and build resolve independently under the same rules; source names the rule that produced the test command.
Apply the rules in order. The first rule that yields a command decides source.
- Project instructions. A command named in the project's
CLAUDE.md,AGENTS.md, or equivalent agent-instruction file, in a Testing or Build section. When present it wins andsourceisdocs. - Stack detection. The table below, matched on files at the project root.
sourceisstack. - None.
sourceisnone. Write the reason in the parentheses; never substitute a guess.
A command from rule 1 or 2 is confirmed before it runs: the script or task is declared in the manifest, and the tool is on PATH (command -v). A command that fails confirmation resolves to none with the reason, not to the next rule.
| Stack | Signal | Test command | Build command | Confirm | Summary line | Exit caveat |
| Node | package.json; package manager from the lockfile (package-lock.json npm, pnpm-lock.yaml pnpm, yarn.lock yarn, bun.lock or bun.lockb bun); a packageManager field overrides | CI=true <pm> run test | <pm> run build | scripts.test in package.json is a string that is not the placeholder echo "Error: no test specified" && exit 1, and command -v <pm> finds the resolved manager; same for scripts.build; a missing script is none | jest Tests: N passed, N total; vitest Tests N passed (N); mocha N passing; node:test pass N (spec reporter, the default since Node 23) or # pass N (tap, Node <=22 on a pipe) | mocha exits the failure count; jest and vitest exit 1 on zero test files; node:test exits 0 and prints pass 0, so only the summary line separates skipped from pass; bun test is not the script, use bun run test |
| Python | pyproject.toml, setup.py, or requirements*.txt; runner from uv.lock (uv run pytest), poetry.lock (poetry run pytest), else python -m pytest; python -m unittest discover only when pytest is not declared and tests/ or test_*.py exists | as resolved | uv build / poetry build / python -m build only when pyproject.toml has [build-system] or setup.py exists, else none (application, no build step) | pytest declared in pyproject.toml, requirements*.txt, tox.ini, or a pytest.ini exists, and import pytest succeeds under the resolved runner (uv run python -c "import pytest", poetry run python -c "import pytest", else python -c "import pytest"); python -m build needs import build under the same runner | pytest N passed in Xs; unittest Ran N tests then OK | exit 5 from pytest, or from unittest on 3.12+, means no tests ran: skipped, not fail |
| Go | go.mod | go test ./... | go build ./... | command -v go | ok <pkg> Xs per package; build prints nothing on success, quote no output, exit 0 | exit 0 with only [no test files] lines is skipped, not pass |
| Rust | Cargo.toml; add --workspace when a [workspace] table exists | cargo test | cargo build | command -v cargo | test result: ok. N passed; ... once per target, quote the last line and the target count; build Finished ... target(s) in Xs | exit 101 on failure; 0 passed on every target is skipped |
| Ruby | Gemfile and Gemfile.lock; rspec-core in the lock -> bundle exec rspec; minitest in the lock with test/ -> bundle exec rake test; bin/rails present -> bin/rails test | as resolved | bundle exec rake build only when a *.gemspec exists and the Rakefile requires bundler/gem_tasks, else none (application, no build task) | bundle exec rake -T test lists the task for rake-based runners; command -v bundle | rspec N examples, N failures; minitest N runs, N assertions, N failures, N errors | 0 examples or 0 runs exits 0 and is skipped |
| Flutter/Dart | pubspec.yaml; Flutter when sdk: flutter appears under dependencies, else Dart | flutter test (Dart: dart test) | flutter analyze (Dart: dart analyze); flutter build <target> only when the matching platform directory (android/, ios/, web/, macos/, linux/, windows/) exists and the consumer asked for an artifact; never flutter build apk on a project with no android/ | command -v flutter (or dart) and test/ contains at least one *_test.dart | "All tests passed!", "Some tests failed.", "No tests ran."; analyze "No issues found!" | "No tests ran." exits 79: read the line, not the code; skipped, not fail |
Cross-cutting rules
- Exit 0 is not evidence. The summary line must show at least one test executed; otherwise the outcome is
skipped. - Compare exit codes as zero versus nonzero, never
== 1. pytest and unittest exit 5 when nothing ran, the Dart test runner exits 79, cargo exits 101, and mocha exits the failure count. - Never let a runner wait.
CI=trueon every Node script,vitest runin place of a barevitestscript, and the consumer's own wait rules for cold builds. - A command is runnable only when the tool is on
PATHand the script or task is declared. Otherwise it isnone. - A failure whose first error line names a service, port, or environment variable (a
docker-compose.yml,.env.example, orDATABASE_URLin test config is the usual signal) is reported verbatim and flagged as environmental. It is not counted as a code failure and not retried.
Evidence Rule
- Pass is this run's exit code plus the runner's summary line, from a run made after the last edit. When the runner prints no summary, the last output line stands in.
- Fail is the first failing test name plus the first error line. More output belongs in a report file, not in the evidence line.
- Skipped carries its reason:
nonefrom resolution, a failed confirmation, or a zero-test run. It never counts as a pass; a consumer that requires a pass treats skipped as not passed. - No evidence means not run. "Should pass", "ran earlier", and "the change is safe" are not outcomes.
- A command that has not returned is not a pass. Waiting for it is the consumer's business.
Consumers quote the outcome in one of these line formats:
pass: <command> -> exit 0: <summary line>
fail: <command> -> exit <code>: <first failing test> -- <first error line>
skipped: <reason>For Skill Authors
- Read this file at the verification step, not at skill start.
- Resolve once per run in the controller and pass the resolved command into any subagent prompt as a literal (
Test command: npm test), never as "detect the test command". - Require the evidence line format back from a subagent, and paste the
### Subagent restatementbelow into its prompt verbatim. It is the only text from this file that is copied anywhere, andtests/skills/test-verification-contract.shcompares the copies to it. - Do not restate the resolution table. When a stack is missing, add a row here.
Subagent restatement
Run the test command you were given exactly as written, and report a pass only by quoting this run's exit code and the runner's summary line -- a run that executed zero tests, a command that has not returned, or a result remembered from an earlier run is not a pass. On failure, quote the first failing test name and the first error line.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

