Use when implementing high-assurance code with evidence-first development — executable spec + gauntlet of constraints (tests, types, coverage, mutation) so line-by-line review becomes optional. Triggers on "prove it works", "I won't read the code", or high-stakes domains (money, auth, data loss, concurrency, public API).
An old coder's strategy for the agent era: don't read the code — make it run the gauntlet. This skill makes coding agents prove their work through executable specifications and evidence reports rather than relying on human code review.
When to Use
User explicitly asks for high-assurance or evidence-first work ("reliable", "TDD", "prove it works", "I won't read the code")
Changes touching high-stakes domains: money, auth, data loss, concurrency, public API
When you need to produce an executable spec (SPEC) and evidence report (EVIDENCE) instead of relying on code review
For routine changes where the user just wants normal tests, write good tests directly instead of invoking this loop
Anti-Rationalization Table
Excuse
Reality
Rule
"The tests pass, isn't that enough?"
Passing tests can be vacuous, mocked, or testing the wrong thing
Mutation testing is mandatory — tests must catch planted bugs
"I'll add tests after the implementation"
Post-hoc tests rarely exercise the actual logic paths
RED phase is non-negotiable — watch every test fail first
"Coverage is 100%, we're good"
Global coverage % is vanity; changed-line coverage is the constraint
Gate on changed-line coverage with --cov-fail-under
"This is a trivial change, skip the gauntlet"
Trivial changes in high-stakes domains cause the worst bugs
Scale to blast radius (Tier 1/2/3), never skip silently
"The mutation tool is slow/unavailable"
No tool? Manual mutation with a persisted runner script is required
Document every skipped layer and why in EVIDENCE
"The spec is good enough, let's code"
An unapproved spec breaks the author-correlation breaker
Human must explicitly approve SPEC before any implementation
"I fixed it, the gauntlet passes now"
If you weakened a test or check to make it pass, you destroyed trust
Never weaken tests, never report unrun layers, failing gauntlet blocks done
Workflow: The Evidence-First Loop
SPEC → (human approves spec, not code) → RED → GREEN → REFACTOR → GAUNTLET → EVIDENCE
↑_____________________|
repeat per behavior
Phase 1: SPEC — The Only Thing the Human Reads Before Code
Goal: Turn the request into executable acceptance criteria before touching implementation.
Steps:
Write behaviors as Gherkin-style scenarios or a named test list — concrete inputs, concrete expected outputs, edge cases, and error cases.
Include what the change must NOT do (invariants: existing tests, public API signatures, performance budgets).
Include the setup plan: tools to install, git usage, files the gauntlet will add, and every new dependency with a one-line justification.
Write the spec to a file at an absolute path (so it's clickable in terminal).
Show the spec to the human in plain language and get explicit approval before writing implementation.
In autonomous mode: state the spec and proceed, but EVIDENCE must record spec approval: not obtained (autonomous run) with lower confidence.
Anti-gaming: An answer to a question is not an approval. Questions and approval are two exchanges — fold answers in, show revised spec, ask again.
Phase 2: RED — Prove Each Test Can Fail
Goal: Write the test for one behavior, run it, and watch it fail before writing implementation.
Steps:
If module doesn't exist, create a stub that raises (e.g., NotImplementedError) so test fails on behavior, not import.
Run the new test individually and observe failure.
If a new test passes immediately: it's either vacuous or behavior already exists. Prove it — break implementation with a throwaway mutant, watch test fail, restore.
Record pre-existing behavior kept as regression armor.
Phase 3: GREEN — Minimal Implementation
Goal: Write the least code that makes the failing test pass.
Steps:
Implement minimal code for the current behavior.
Run the full suite, not just the new test.
All tests must pass.
Phase 4: REFACTOR — Clean Up Under Green
Goal: Improve names, extract duplication, simplify structure while suite is green.
Rules:
Implementation refactors touch no test files.
Test-structure refactors (helpers, fixtures) allowed as separate step: assertions unchanged, suite green before and after, then rerun mutation to confirm tests still kill.
Anything requiring editing an assertion is a behavior change — goes back to SPEC.
Run suite after each refactor.
Phase 5: GAUNTLET — The Constraint Stack
Goal: Run every applicable layer after all spec behaviors are green. Scale to task (Tier 1/2/3), never skip silently.
Tier 1 (trivial): Full suite + lint. No new tests required, state why.
Tier 2 (normal): Full loop. Bug fixes MUST start with RED test reproducing the bug.
Tier 3 (high stakes — money, auth, data loss, concurrency, public API): Full loop + property-based tests + mutation testing (tool-based) + adversarial pass — explicitly try to break your own implementation with hostile inputs before declaring done. Write a short failure model listing ways this change can hurt, and for each mode add a layer that catches it.
Phase 6: EVIDENCE — The Only Thing the Human Reads After Code
Goal: End with a report the human can trust without opening a single source file.
Required Sections:
Spec approval status: Obtained from user / not obtained (autonomous) with confidence downgrade
Source state: Commit SHA or sha256 tree hash (persist computation as script)
#!/usr/bin/env python3
"""
Manual mutation runner for ecosystems without a mature mutation tool.
Persisted in repo so EVIDENCE is reproducible.
Proves it executed each mutant via mtime pinning + cache check.
"""
import subprocess
import sys
import os
import hashlib
from pathlib import Path
MUTANTS = [
# (file, original_snippet, mutated_snippet, description)
("src/rate_limiter.py", "if current >= limit:", "if current > limit:", "off-by-one: >= -> >"),
("src/rate_limiter.py", "return tokens >= cost", "return tokens > cost", "off-by-one: >= -> >"),
("src/rate_limiter.py", "self.tokens = min(self.tokens + rate, capacity)", "self.tokens = min(self.tokens + rate, capacity - 1)", "capacity off-by-one"),
("src/rate_limiter.py", "async def acquire", "async def acquire_not_called", "delete method"),
("src/rate_limiter.py", "return True", "return False", "flip boolean return"),
]
def file_hash(path: Path) -> str:
return hashlib.md5(path.read_bytes()).hexdigest()
def run_tests() -> bool:
result = subprocess.run([sys.executable, "-m", "pytest", "-q"], capture_output=True)
return result.returncode == 0
def main():
src_files = [Path(m[0]) for m in MUTANTS]
original_hashes = {f: file_hash(f) for f in src_files}
killed = 0
total = len(MUTANTS)
for file_path, original, mutated, desc in MUTANTS:
path = Path(file_path)
content = path.read_text()
if original not in content:
print(f"FAIL: mutant pattern not found: {desc}")
sys.exit(1)
# Apply mutant
mutated_content = content.replace(original, mutated, 1)
path.write_text(mutated_content)
# Prove execution: mtime must change, no bytecode cache reuse
new_hash = file_hash(path)
if new_hash == original_hashes[path]:
print(f"FAIL: mutant did not change file hash: {desc}")
sys.exit(1)
print(f"Testing mutant: {desc}")
if not run_tests():
print(f" KILLED")
killed += 1
else:
print(f" SURVIVED - missing test!")
# Restore and fail
path.write_text(content)
print(f"Manual mutation: {killed}/{total} killed")
sys.exit(1)
# Restore
path.write_text(content)
restored_hash = file_hash(path)
if restored_hash != original_hashes[path]:
print(f"FAIL: restore mismatch for {desc}")
sys.exit(1)
print(f"Manual mutation: {killed}/{total} killed")
# Final verification
if not run_tests():
print("FAIL: suite not green after restore")
sys.exit(1)
if __name__ == "__main__":
main()
Verification Checklist
Run this checklist before claiming the task is complete:
SPEC written to absolute path and contains: behaviors (Gherkin/named tests), negative constraints, setup plan with justified dependencies, failure model (Tier 3)
Human explicitly approved SPEC before any implementation (or autonomous mode noted in EVIDENCE)
RED phase: Every new test observed failing individually before implementation
GREEN phase: Minimal implementation, full suite passes
REFACTOR phase: Only under green, assertions frozen, mutation rerun after test-structure changes
GAUNTLET: Every applicable layer run, all exit non-zero on failure, no silent skips
Changed-line coverage: Gates at 100% with --cov-fail-under (not just reports %)
Mutation testing: Tool-based preferred; manual with persisted runner that proves execution
EVIDENCE report: Single final fresh run, reproducible entry point, spec→test mapping, all layers with commands+results, skipped layers with reasons, honest notes
Anti-gaming: No weakened tests, no simultaneous test+impl edits, no mocking unit under test, no coverage chasing, no unrun layers reported
1---2name: old-coder3description: Use when implementing high-assurance code with evidence-first development — executable spec + gauntlet of constraints (tests, types, coverage, mutation) so line-by-line review becomes optional. Triggers on "prove it works", "I won't read the code", or high-stakes domains (money, auth, data loss, concurrency, public API).4---567# Old Coder: Evidence-First Development89An old coder's strategy for the agent era: don't read the code — make it run the gauntlet. This skill makes coding agents prove their work through executable specifications and evidence reports rather than relying on human code review.1011## When to Use1213- User explicitly asks for high-assurance or evidence-first work ("reliable", "TDD", "prove it works", "I won't read the code")14- Changes touching high-stakes domains: money, auth, data loss, concurrency, public API15- When you need to produce an executable spec (SPEC) and evidence report (EVIDENCE) instead of relying on code review16- For routine changes where the user just wants normal tests, write good tests directly instead of invoking this loop1718---1920## Anti-Rationalization Table2122| Excuse | Reality | Rule |23|--------|---------|------|24| "The tests pass, isn't that enough?" | Passing tests can be vacuous, mocked, or testing the wrong thing | Mutation testing is mandatory — tests must catch planted bugs |25| "I'll add tests after the implementation" | Post-hoc tests rarely exercise the actual logic paths | RED phase is non-negotiable — watch every test fail first |26| "Coverage is 100%, we're good" | Global coverage % is vanity; changed-line coverage is the constraint | Gate on changed-line coverage with `--cov-fail-under` |27| "This is a trivial change, skip the gauntlet" | Trivial changes in high-stakes domains cause the worst bugs | Scale to blast radius (Tier 1/2/3), never skip silently |28| "The mutation tool is slow/unavailable" | No tool? Manual mutation with a persisted runner script is required | Document every skipped layer and why in EVIDENCE |29| "The spec is good enough, let's code" | An unapproved spec breaks the author-correlation breaker | Human must explicitly approve SPEC before any implementation |30| "I fixed it, the gauntlet passes now" | If you weakened a test or check to make it pass, you destroyed trust | Never weaken tests, never report unrun layers, failing gauntlet blocks done |3132---3334## Workflow: The Evidence-First Loop3536```37SPEC → (human approves spec, not code) → RED → GREEN → REFACTOR → GAUNTLET → EVIDENCE38 ↑_____________________|39 repeat per behavior40```4142### Phase 1: SPEC — The Only Thing the Human Reads Before Code4344**Goal**: Turn the request into executable acceptance criteria before touching implementation.4546**Steps**:471. Write behaviors as Gherkin-style scenarios or a named test list — concrete inputs, concrete expected outputs, edge cases, and error cases.482. Include what the change must NOT do (invariants: existing tests, public API signatures, performance budgets).493. Include the **setup plan**: tools to install, git usage, files the gauntlet will add, and **every new dependency with a one-line justification**.504. Write the spec to a file at an **absolute path** (so it's clickable in terminal).515. Show the spec to the human in plain language and get explicit approval **before writing implementation**.526. In autonomous mode: state the spec and proceed, but EVIDENCE must record `spec approval: not obtained (autonomous run)` with lower confidence.5354**Anti-gaming**: An answer to a question is not an approval. Questions and approval are two exchanges — fold answers in, show revised spec, ask again.5556### Phase 2: RED — Prove Each Test Can Fail5758**Goal**: Write the test for one behavior, run it, and **watch it fail** before writing implementation.5960**Steps**:611. If module doesn't exist, create a stub that raises (e.g., `NotImplementedError`) so test fails on behavior, not import.622. Run the new test individually and observe failure.633. If a new test passes immediately: it's either vacuous or behavior already exists. Prove it — break implementation with a throwaway mutant, watch test fail, restore.644. Record pre-existing behavior kept as regression armor.6566### Phase 3: GREEN — Minimal Implementation6768**Goal**: Write the least code that makes the failing test pass.6970**Steps**:711. Implement minimal code for the current behavior.722. Run the **full suite**, not just the new test.733. All tests must pass.7475### Phase 4: REFACTOR — Clean Up Under Green7677**Goal**: Improve names, extract duplication, simplify structure while suite is green.7879**Rules**:80- Implementation refactors touch no test files.81- Test-structure refactors (helpers, fixtures) allowed as separate step: assertions unchanged, suite green before and after, then rerun mutation to confirm tests still kill.82- Anything requiring editing an assertion is a behavior change — goes back to SPEC.83- Run suite after each refactor.8485### Phase 5: GAUNTLET — The Constraint Stack8687**Goal**: Run every applicable layer after all spec behaviors are green. Scale to task (Tier 1/2/3), never skip silently.8889| Layer | What It Catches | Tool (Python) | Must Exit Non-Zero |90|-------|----------------|---------------|-------------------|91| Full test suite | Regressions | `pytest -q` | Yes |92| Static types | Whole classes of bugs | `mypy <pkg>` / `pyright` | Yes |93| Lint + format | Latent bugs, drift | `ruff check . && ruff format --check .` | Yes |94| Changed-line coverage | Untested code paths | `pytest --cov=<pkg> --cov-branch --cov-fail-under=100` | **Yes** (critical) |95| Mutation testing | Tests that assert nothing | `mutmut run` (configure in pyproject.toml) | Yes |96| Property-based tests | Edge cases you didn't imagine | `hypothesis` strategies | Yes |97| Complexity budget | Unmaintainable output | Manual review / tools | No (subjective) |98| Real execution | "Passes tests, doesn't run" | Run app/CLI/endpoint on realistic input | Yes |99| Supply chain & secrets | Vulnerable deps, leaked creds | `pip-audit`, `gitleaks` | Yes |100| Suite health | Flaky/order-dependent tests | `pytest-randomly`, repeat suspected flakes | Yes |101102**Calibration**:103- **Tier 1 (trivial)**: Full suite + lint. No new tests required, state why.104- **Tier 2 (normal)**: Full loop. Bug fixes MUST start with RED test reproducing the bug.105- **Tier 3 (high stakes — money, auth, data loss, concurrency, public API)**: Full loop + property-based tests + mutation testing (tool-based) + **adversarial pass** — explicitly try to break your own implementation with hostile inputs before declaring done. Write a short **failure model** listing ways this change can hurt, and for each mode add a layer that catches it.106107### Phase 6: EVIDENCE — The Only Thing the Human Reads After Code108109**Goal**: End with a report the human can trust without opening a single source file.110111**Required Sections**:1121. **Spec approval status**: Obtained from user / not obtained (autonomous) with confidence downgrade1132. **Source state**: Commit SHA or sha256 tree hash (persist computation as script)1143. **Toolchain**: Pinned versions file (e.g., `requirements-dev.txt`)1154. **Entry point**: Single command that reruns every layer (e.g., `tools/gauntlet.sh`)1165. **Independent verification**: not performed / passed / failed / blocked (Tier 3 protocol in `verifier.md`)117118**Spec → Test Mapping Table**:119| Scenario | Test | Status |120|---|---|---|121| Scenario name | `test_file::test_name` | pass / fail / unverified / n-a |122123**Gauntlet Results Table** (all from ONE final fresh run):124| Layer | Command | Result |125|---|---|---|126| Tests | `<cmd>` | N passed, 0 failed |127| Types | `<cmd>` | 0 errors |128| Lint | `<cmd>` | 0 warnings |129| Changed-line coverage | `<cmd>` | covered/total changed lines |130| Mutation | `<tool or manual>` | killed/total killed |131| Property-based | `<cmd>` | N properties, examples each |132| Real execution | `<cmd>` | Observed output |133| Supply chain | `<cmd>` | 0 known vulns; new deps listed with SPEC justification |134| Suite health | `<cmd>` | Randomized order (seed N), all passed |135136**Skipped layers**: List each with reason (or "none").137138**Honest notes**: Failures hit during task and how resolved, spec revisions, anything reducing confidence.139140---141142## Code Examples143144### Python Project Setup (pyproject.toml)145146```toml147[project]148name = "my-project"149version = "0.1.0"150dependencies = []151152[project.optional-dependencies]153dev = [154 "pytest>=8.0",155 "pytest-cov>=5.0",156 "pytest-randomly>=3.15",157 "hypothesis>=6.100",158 "mutmut>=3.0",159 "mypy>=1.10",160 "ruff>=0.6",161 "pip-audit>=2.7",162 "gitleaks>=8.0",163]164165[tool.pytest.ini_options]166addopts = "-q --randomly-seed=last"167testpaths = ["tests"]168python_files = ["test_*.py"]169python_functions = ["test_*"]170171[tool.mutmut]172source_paths = ["src/"]173tests_dir = "tests/"174runner = "python -m pytest"175176[tool.coverage.run]177source = ["src"]178branch = true179180[tool.coverage.report]181fail_under = 100182show_missing = true183184[tool.mypy]185python_version = "3.11"186warn_return_any = true187warn_unused_configs = true188disallow_untyped_defs = true189190[tool.ruff]191target-version = "py311"192line-length = 100193select = ["E", "F", "I", "UP", "B", "C4", "PTH", "T20", "ARG", "SIM", "RUF", "PERF"]194ignore = []195```196197### Gauntlet Entry Point Script (tools/gauntlet.sh)198199```bash200#!/usr/bin/env bash201set -euo pipefail202203# Freshness by mechanism: delete stale artifacts from previous runs204rm -rf .coverage coverage.xml .mutmut-cache htmlcov .pytest_cache205206echo "=== GAUNTLET START ==="207echo "Source state: $(git rev-parse HEAD 2>/dev/null || sha256sum $(find . -type f -name '*.py' | sort) | sha256sum | cut -d' ' -f1)"208209# 1. Full test suite210echo "--- Tests ---"211python -m pytest -q212213# 2. Static types214echo "--- Types ---"215python -m mypy src/216217# 3. Lint + format218echo "--- Lint ---"219python -m ruff check .220python -m ruff format --check .221222# 4. Changed-line coverage (requires baseline)223echo "--- Changed-line Coverage ---"224python -m pytest --cov=src --cov-branch --cov-report=term-missing --cov-fail-under=100225226# 5. Mutation testing227echo "--- Mutation ---"228python -m mutmut run --paths-to-mutate=src/229230# 6. Property-based tests (included in pytest run above)231echo "--- Properties ---"232python -m pytest -q -k "property"233234# 7. Real execution235echo "--- Real Execution ---"236python -m src.cli --help # or run actual CLI/app on realistic input237238# 8. Supply chain & secrets239echo "--- Supply Chain ---"240python -m pip_audit241gitleaks detect --source . --verbose --redact242243# 9. Suite health244echo "--- Suite Health ---"245python -m pytest -q --randomly-seed=last --randomly-dont-reorganize246247echo "=== GAUNTLET COMPLETE ==="248```249250### SPEC Template (spec.md)251252```markdown253# SPEC: <Task Name>254255**Tier**: 1 | 2 | 3256**Approval**: [ ] Obtained from user / [ ] Not obtained (autonomous)257258## Behaviors (Gherkin-style)259260### Feature: <Capability in user language>261262#### Scenario: <One concrete behavior>263**Given** <concrete starting state>264**When** <concrete action with concrete input>265**Then** <concrete observable outcome, exact values>266267#### Scenario: <Error case>268**Given** <starting state>269**When** <invalid/hostile input>270**Then** <exact error type/message/status, and what state must NOT change>271272## Negative Constraints (Must NOT)273274| Invariant | Verification Method |275|-----------|---------------------|276| Existing tests still pass | Full suite baseline |277| Public API signatures unchanged | API compatibility check (griffe) |278| No new network/filesystem/env usage | Capability diff |279280## Setup Plan281282- Tools to install: (from `requirements-dev.txt`)283- Git: init / checkpoint commit cadence284- Files gauntlet will add: `tests/`, `tools/gauntlet.sh`, `tools/mutants.py`285- New dependencies: (each with one-line justification)286287## Failure Model (Tier 3 only)288289| Failure Mode | Layer That Catches It |290|--------------|----------------------|291| Race condition | `go test -race` / threading stress + rerun |292| Parser edge case | Property-based tests (hypothesis) |293| Silent production failure | Observability assertions in tests |294| Rollback failure | Migration rehearsal test |295```296297### EVIDENCE Template (evidence.md)298299```markdown300## Evidence Report — <Task Name> (Tier <1|2|3>)301302- Spec approval: <obtained | not obtained (autonomous)>303- Source state: <commit SHA | tree hash>304- Toolchain: <requirements-dev.txt>305- Entry point: `./tools/gauntlet.sh`306- Independent verification: <not performed | passed | failed | blocked>307308### Spec → Test Mapping309310| Scenario | Test | Status |311|---|---|---|312| Happy path: divide(10, 2) = 5 | `test_math.py::test_divide_happy` | pass |313| Error: divide(1, 0) raises ZeroDivisionError | `test_math.py::test_divide_by_zero` | pass |314| Must NOT: change existing API | `griffe` diff | pass |315316### Gauntlet (Final Fresh Run)317318| Layer | Command | Result |319|---|---|---|320| Tests | `pytest -q` | 47 passed, 0 failed |321| Types | `mypy src` | 0 errors |322| Lint | `ruff check . && ruff format --check .` | 0 warnings |323| Changed-line coverage | `pytest --cov=src --cov-fail-under=100` | 31/31 lines, 20/20 branches |324| Mutation | `mutmut run` | 22/22 killed |325| Property-based | `pytest -k property` | 5 properties, 200 examples each |326| Real execution | `python -m src.cli 10 2` | `5.0` |327| Supply chain | `pip-audit && gitleaks detect` | 0 vulns; 0 new deps |328| Suite health | `pytest --randomly-seed=last` | seed 42, all passed |329330### Skipped Layers331- none332333### Honest Notes334- Mutation runner initially had cache bug (fixed in tools/mutants.py with mtime pinning)335- Spec revised once: added negative constraint for env var access336```337338### Manual Mutation Runner (tools/mutants.py)339340```python341#!/usr/bin/env python3342"""343Manual mutation runner for ecosystems without a mature mutation tool.344Persisted in repo so EVIDENCE is reproducible.345Proves it executed each mutant via mtime pinning + cache check.346"""347import subprocess348import sys349import os350import hashlib351from pathlib import Path352353MUTANTS = [354 # (file, original_snippet, mutated_snippet, description)355 ("src/rate_limiter.py", "if current >= limit:", "if current > limit:", "off-by-one: >= -> >"),356 ("src/rate_limiter.py", "return tokens >= cost", "return tokens > cost", "off-by-one: >= -> >"),357 ("src/rate_limiter.py", "self.tokens = min(self.tokens + rate, capacity)", "self.tokens = min(self.tokens + rate, capacity - 1)", "capacity off-by-one"),358 ("src/rate_limiter.py", "async def acquire", "async def acquire_not_called", "delete method"),359 ("src/rate_limiter.py", "return True", "return False", "flip boolean return"),360]361362def file_hash(path: Path) -> str:363 return hashlib.md5(path.read_bytes()).hexdigest()364365def run_tests() -> bool:366 result = subprocess.run([sys.executable, "-m", "pytest", "-q"], capture_output=True)367 return result.returncode == 0368369def main():370 src_files = [Path(m[0]) for m in MUTANTS]371 original_hashes = {f: file_hash(f) for f in src_files}372373 killed = 0374 total = len(MUTANTS)375376 for file_path, original, mutated, desc in MUTANTS:377 path = Path(file_path)378 content = path.read_text()379380 if original not in content:381 print(f"FAIL: mutant pattern not found: {desc}")382 sys.exit(1)383384 # Apply mutant385 mutated_content = content.replace(original, mutated, 1)386 path.write_text(mutated_content)387388 # Prove execution: mtime must change, no bytecode cache reuse389 new_hash = file_hash(path)390 if new_hash == original_hashes[path]:391 print(f"FAIL: mutant did not change file hash: {desc}")392 sys.exit(1)393394 print(f"Testing mutant: {desc}")395 if not run_tests():396 print(f" KILLED")397 killed += 1398 else:399 print(f" SURVIVED - missing test!")400 # Restore and fail401 path.write_text(content)402 print(f"Manual mutation: {killed}/{total} killed")403 sys.exit(1)404405 # Restore406 path.write_text(content)407 restored_hash = file_hash(path)408 if restored_hash != original_hashes[path]:409 print(f"FAIL: restore mismatch for {desc}")410 sys.exit(1)411412 print(f"Manual mutation: {killed}/{total} killed")413 # Final verification414 if not run_tests():415 print("FAIL: suite not green after restore")416 sys.exit(1)417418if __name__ == "__main__":419 main()420```421422---423424## Verification Checklist425426Run this checklist before claiming the task is complete:427428- [ ] **SPEC written to absolute path** and contains: behaviors (Gherkin/named tests), negative constraints, setup plan with justified dependencies, failure model (Tier 3)429- [ ] **Human explicitly approved SPEC** before any implementation (or autonomous mode noted in EVIDENCE)430- [ ] **RED phase**: Every new test observed failing individually before implementation431- [ ] **GREEN phase**: Minimal implementation, full suite passes432- [ ] **REFACTOR phase**: Only under green, assertions frozen, mutation rerun after test-structure changes433- [ ] **GAUNTLET**: Every applicable layer run, all exit non-zero on failure, no silent skips434- [ ] **Changed-line coverage**: Gates at 100% with `--cov-fail-under` (not just reports %)435- [ ] **Mutation testing**: Tool-based preferred; manual with persisted runner that proves execution436- [ ] **EVIDENCE report**: Single final fresh run, reproducible entry point, spec→test mapping, all layers with commands+results, skipped layers with reasons, honest notes437- [ ] **Anti-gaming**: No weakened tests, no simultaneous test+impl edits, no mocking unit under test, no coverage chasing, no unrun layers reported438- [ ] **Tier 3**: Failure model written, adversarial pass performed, independent verification protocol acknowledged439- [ ] **Independent verification** (Tier 3): `verifier.md` protocol executed or explicitly marked not performed with confidence downgrade440441---442443## References444445- Original repo: https://github.com/AmazingAng/old-coder446- Gauntlet tooling by ecosystem: `references/gauntlet.md`447- Verifier protocol (Tier 3): `references/verifier.md`448- Verifier case study: `references/verifier-case-study.md`449- Demo project: `demo-rate-limiter/` (shows 41 tests, 100% coverage, 22/22 mutants killed)
Run npx skillmds add oyi77/old-coder in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Use when implementing high-assurance code with evidence-first development — executable spec + gauntlet of constraints (tests, types, coverage, mutation) so line-by-line review becomes optional. Triggers on "prove it works", "I won't read the code", or high-stakes domains (money, auth, data loss, concurrency, public API). It is listed under Integrations & APIs on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: makes network calls. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
oyi77 (@oyi77) published this skill. Their other Agent Skills are listed on their SkillMD profile.