no-mistakes is a local Git proxy that validates changes in an isolated worktree before forwarding a push to the real remote and opening a pull request. It is for developers and coding agents that want automated checks, safe fixes, CI repair, and human review before changes are published.
Borrowing it
Nothing to install: this file belongs to kunchenguid/no-mistakes. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/kunchenguid/no-mistakes/main/.agents/skills/testing-conventions/SKILL.mdgit clone --depth 1 https://github.com/kunchenguid/no-mistakesWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/kunchenguid/no-mistakes/testing-conventions)<a href="https://agentmods.dev/skills/kunchenguid/no-mistakes/testing-conventions"><img src="https://agentmods.dev/badge/skills/kunchenguid/no-mistakes/testing-conventions/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/kunchenguid/no-mistakes/testing-conventions"><img src="https://agentmods.dev/badge/skills/kunchenguid/no-mistakes/testing-conventions.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00035 | $0.01753 |
| Opus 5.5 | $0.00014 | $0.00701 |
| Sonnet 5.5 | $0.00007 | $0.00351 |
| Haiku 4.5 | $0.00003 | $0.00175 |
Grade A, and why
testing-conventions scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 17d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 28 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Testing Conventions
- Prefer e2e tests for behavior that crosses a process or I/O boundary (CLI flags, config loading, git operations, agent spawning, daemon coordination, stdout/stderr, recorded fixtures); unit-test pure helpers where speed and failure localization matter. Prefer creating real git repos in temp dirs over heavy mocking.
- The e2e suite is behind the
e2ebuild tag;make e2erunsscripts/e2e.sh, which sweeps./internal/e2e/...and./internal/pipeline/steps/..., so keep new step-local e2e tests behind the tag too. - Temporary e2e daemons (
NM_TEST_START_DAEMON=1/ harness) are owned byinternal/e2edaemon: exact inventory, concurrency cap (NM_E2E_DAEMON_MAX, default 2), bounded argv checks, and reapers in harness Cleanup, packageTestMain, andscripts/e2e.shEXIT/INT/TERM. A SIGKILL of the wrapper shell does not run its trap; next-run inventory recovery covers that. External sleep-loop keepalives are out of scope. Never point inventory reaping at the shared~/.no-mistakesservice. Regressions:internal/e2edaemon/*_test.go. - Packages whose tests shell out to git unset
GIT_CONFIG_COUNTinTestMainso ambientGIT_CONFIG_*injection from agent harnesses cannot leak in; a test exercising injected config re-sets it witht.Setenv(seeinternal/git,internal/gate,internal/daemon,internal/pipeline/steps,internal/pipeline/steps/citest). - Those
TestMains (plusinternal/evidence,internal/branchsync,internal/gatecontext) also setGIT_CONFIG_NOSYSTEM=1: some distributions shipsafe.bareRepository=explicitin the system git config, which refuses running git inside the bare fixture repositories. Production code passes--git-dirfor bare repositories and must keep working without this. - Every package whose tests run git also points
GIT_CONFIG_GLOBALat a nonexistent path in a temp directory (write no file), so fixture commits never follow the developer'scommit.gpgsign. AHOMEoverride alone does not isolate it, because git also reads$XDG_CONFIG_HOME/git/config. A test that needs a global config writes its own file and re-setsGIT_CONFIG_GLOBALwitht.Setenv(seeTestCIStep_CommitAndPush_GitCommandsUseStandardCredentialEnv). - Packages whose tests can start a daemon or touch ambient state (
cmd/no-mistakes,internal/cli,internal/update) use a package-wideTestMainthat pointsNM_HOMEandHOMEat fresh temp dirs and disables telemetry/update-check env vars, so a full test run never touches a real~/.no-mistakes. Follow the same pattern in new such packages. paths.New()refuses the default~/.no-mistakesroot undergo test; tests that touch app state must setNM_HOMEto a temp dir, and only the production-default path test may opt in withNO_MISTAKES_ALLOW_DEFAULT_ROOT_IN_TESTS=1.- Isolate filesystem and environment state with
t.TempDir()andt.Setenv(). - The Windows CI leg is process-spawn bound, not compute bound: git-backed packages cost roughly 10x their Linux time (
internal/git5.7s -> 53s,internal/branchsync31s -> 415s). The Windows matrix is three shards so each job's wall stays insidetimeout-minutes: 40and a hang still surfaces asgo test -timeout(15m) rather than an evidence-free job cancel:windows-stepsruns./internal/pipeline/steps/...alone (includingsteps/citest),windows-gitruns the remaining git-heavy packages (internal/git,internal/branchsync,internal/gate,internal/evidence,internal/daemon,internal/eval), andwindows-coreis thego listremainder filtered byNM_CI_WINDOWS_GIT_EXCLUDE(the union of the other two shards). Combining steps with the other git-heavy packages madewindows-gita ~21 min floor; the split is the lockstep pin inTestCIWorkflow_WindowsHangSurfacesAsGoTimeoutNotJobCancellation. Keep long git-heavy packages off the serial critical path (internal/branchsyncrunst.Parallel()for exactly that reason) and keep the Defender scan-exclusion step inci.yml, whose comment owns the rationale. GitHub-hosted Windows runners are 4-core; do not assume larger machines. Regressions:TestCIWorkflow_WindowsTestsRunWithScanExclusions,TestCIWorkflow_WindowsHangSurfacesAsGoTimeoutNotJobCancellation. - Go applies an implicit GOOS constraint from a filename suffix, so a test file named
*_windows_test.go(or_linux,_darwin) silently compiles only on that platform. Name platform-agnostic tests about Windows something else. - On macOS with Go 1.26.0-1.26.4, a git-heavy package under
-raceintermittently loses a git child before it runs git: darwinsyscall.rawSyscallwas race-instrumented, andforkAndExecInChildcalls it in the forked child beforeexecve(golang/go#79804, fixed in Go 1.26.5). It surfaces asgit <cmd>: signal: segmentation fault;exit status 66with empty stderr beside a bareThreadSanitizer: CHECK failed: tsan_rtl.cpp:94 "((part)) == ((part1))"line;exec: WaitDelay expired before I/O completefrom a git that exited 0 (a wedged sibling child still holds its inherited pipe); or goroutines parked insyscall.forkExec->readlenuntil the package timeout. Code that folds a git error into a verdict then fails a test (branchsync'sblocked_assumptions_changedwith relationunknown). None of it is a repo bug: checkgo versionand upgrade the toolchain rather than adding retries, waits, or longer timeouts.~/Library/Logs/DiagnosticReports/*.ipsrecords the crash asprocName: <pkg>.test, parentProc: <pkg>.test, asi: "crashed on child side of fork pre-exec"; the CI legs are Linux and Windows. The same bug explains a stray<pkg>.test -test.timeout=...process at high CPU that ignores its own deadline: it is a pre-exec child spinning in__tsan::TraceSwitchPartImplthat inherited the parent's name, argv, and cwd, so no test-side timeout applies to it.internal/procreapreaps those by cwd.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 17d ago Changed · +1 lines e0b48af8aacc
- 20d ago Changed · +1 lines eee89dbbc835
- 29d ago Changed · +4 lines · +8 tokens per session bceb1284eb55
- 1mo ago Changed 78cc2ee6cbeb
- 1mo ago Changed 03559bb3b0c8
- 1mo ago First seen · 22 lines · 27 tokens per session scan A 9586210e3074
testing-conventions is a skill published in the GitHub repository kunchenguid/no-mistakes (8,945 stars, last pushed today), licensed MIT. It adds 35 tokens to every session and 1,753 once invoked, about $0.0001 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
e2e-testing
Use when reviewing CI coverage, automated checks, or test strategy related to Implement end-to-end testing. Focus on whether the rule is continuously verified, not just documented.
azure-microsoft-playwright-testing-ts
Run Playwright tests at scale using Azure Playwright Workspaces (formerly Microsoft Playwright Testing). Use when scaling browser tests across cloud-hosted browsers, integrating with CI/CD pipelines, or publishing test results to the Azure portal.
mirrord-chaos
Help users chaos test their app with mirrord: inject artificial latency or connection errors into a mirrord session's outgoing traffic via per-session chaos rules managed with the mirrord chaos CLI. Use when a user wants to add latency or delay to outgoing connections or a dependency (e.g. a slow database), simulate…
playwright-ci
Production-ready CI/CD configurations for Playwright — GitHub Actions, GitLab CI, CircleCI, Azure DevOps, Jenkins, Docker, parallel sharding, reporting, code coverage, and global setup/teardown.
playwright-testing
E2E testing with Playwright - Page Objects, cross-browser, CI/CD.
azure-microsoft-playwright-testing-ts
Run Playwright tests at scale using Azure Playwright Workspaces (formerly Microsoft Playwright Testing). Use when scaling browser tests across cloud-hosted browsers, integrating with CI/CD pipeline...