Agent skill

Build Until Pass Loop

by LichAmnesia in LichAmnesia/lich-skills

Drives a failing build, typecheck, lint or test command to a passing exit code through small, one-fix-at-a-time rounds, stopping at a hard attempt cap instead of looping forever.

MITAuto-check passedDevelopment

Install Build Until Pass Loop

skills CLI
$ npx skills add LichAmnesia/lich-skills --skill build-until-pass -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install LichAmnesia/lich-skills build-until-pass --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/LichAmnesia/lich-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/build-until-pass .claude/skills/build-until-pass && rm -rf skills-src

Use ~/.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/

Facts

Skill name
build-until-pass
GitHub stars
234
Token cost
~2.8k tokens
SKILL.md length
1,562 words
Files
1
Skills in repo
11
Repo updated
First seen
Licence
MIT

At a glance

Drives a failing build, typecheck, lint or test command to a passing exit code through small, one-fix-at-a-time rounds, stopping at a hard attempt cap instead of looping forever.

  • Works in 4 steps: LOCK THE CHECK COMMAND → RUN CHECK → FIX SMALLEST → …
  • Driving a red build or typecheck to green through small fixes
  • SKILL.md covers When to Use, When NOT to Use, The Loop and Phase 0: LOCK THE CHECK COMMAND, plus 6 more sections
  • Calls npm, cargo and go

What it does

The skill treats the project's own check command as the sole judge of success: green means exit code 0, and nothing else counts, not a fix that looks right or an error that seems to have disappeared. Each round runs the check, applies the smallest diff that addresses the first failure, and re-runs, rather than batching several unrelated fixes before testing again, so it is always clear which change helped.

It applies to mechanical failures such as type errors, missing imports, signature mismatches or bundler configuration problems, and explicitly does not apply when the check command is unknown, when the failure is a genuine logic bug needing investigation rather than a mechanical fix, when only a human can make the needed product decision, or when the only way to go green would be deleting tests or suppressing real errors instead of fixing them. A hard attempt cap, ten by default, stops the loop and hands the remaining failures back to a person rather than letting the agent thrash indefinitely.

When your agent uses it

  • Driving a red build or typecheck to green through small fixes
  • Clearing a batch of mechanical compiler or linter errors one at a time
  • Reproducing and fixing a CI failure locally before pushing again

Example prompts

  • “Run tsc until it passes, fixing one error at a time.”
  • “Get this cargo build green without touching anything but the failing lines.”
  • “Drive the lint check to pass, and stop if you hit ten attempts without success.”

Requirements

  • A project with a runnable build, typecheck, lint or test command

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. LOCK THE CHECK COMMAND
  2. RUN CHECK
  3. FIX SMALLEST
  4. RE-RUN & GATE

What it can do on your machine

Read from SKILL.md and the folder at commit ebbc355. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • npm
    • cargo
    • go
    • tsc

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Build Until Pass Loop loads about 2.8k tokens when it runs. Until then it costs about 98 tokens; SKILL.md has 1,562 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~98
When it runs · the whole SKILL.md, loaded when a task matches
~2.8k

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.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

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.

SKILL.md

The full file from LichAmnesia/lich-skills at commit ebbc355, republished under its MIT licence (© LichAmnesia). 1,562 words, ~2,768 tokens.

Download SKILL.mdSave it as .claude/skills/build-until-pass/SKILL.md (or your agent's skills folder).
name
build-until-pass
description
Use when a build, typecheck, lint, or test command is failing and you want the agent to drive it to green on its own — run the check, read the errors, apply the smallest fix, re-run, repeat until exit code 0. Stops the human from being the while-loop (run → read error → fix one line → run again) and stops the agent from bulldozing huge speculative rewrites between checks.

Build Until Pass

A bounded self-correcting loop: run the project's check command, capture its errors, apply the smallest diff that addresses the first failure, re-run, and repeat until it exits 0 — or until a hard attempt cap is hit.

The core principle: the check command is the judge, not you. You do not declare the build "basically fixed." Green is exit code 0. Anything else is red, and red means another round.

This is the engineering-discipline counterpart to "run it and hope." The cap exists so the agent backs off instead of burning tokens thrashing on an error it cannot fix without human input.

When to Use

  • A build / compile / bundle command fails and the cause is mechanical (type errors, missing imports, signature mismatches, bundler config)
  • tsc, cargo build, go build, npm run build, vite build exits non-zero
  • A typecheck or lint gate is red and you want it green before committing
  • A focused test suite is failing and each failure points at a clear fix
  • CI went red on a build/typecheck step and you're reproducing locally
  • You catch yourself copy-pasting errors back to the agent one at a time

When NOT to Use

  • You don't know the check command yet — find it first (see Phase 0)
  • The failure is a genuine logic bug needing investigation, not a mechanical fix → use debug-hypothesis instead, then come back here to confirm green
  • The fix requires a product/design decision only a human can make
  • The "fix" would mean deleting tests, // @ts-ignore-ing real errors, or loosening types to silence the compiler → that's cheating the judge, not passing it (see Anti-rationalizations)
  • The build passes already — there's nothing to loop on

The Loop

            ┌─────────────────────────────────────────────┐
            │  attempt > MAX_ATTEMPTS (default 10)?        │
            │  → STOP, report what's left, ask the human   │
            └──────────────────────┬──────────────────────┘
                                   │ no
   RUN CHECK ──▶ green? ──yes──▶  DONE (exit 0, report rounds used)
       ▲             │
       │             │ no (red)
       │             ▼
       │      READ ERRORS  ──▶  FIX SMALLEST  ──▶  re-RUN
       │      first failure     minimal diff,        │
       │      only, verbatim    no refactor          │
       └──────────────────────────────────────────────┘
                    one round = one fix + one re-run

Hard rules:

  1. Green is exit code 0 from the check command. Not "looks fixed," not "the error I saw is gone." Run it and read the exit status.
  2. One round = one targeted fix + one re-run. Do not fix five unrelated things, then run once. You won't know which fix helped or broke something.
  3. Minimal diff per round. Touch only the lines the current error points at. No drive-by refactors, no reformatting, no renaming.
  4. Hard attempt cap (default 10). When hit, STOP and hand back to the human. Do not raise your own cap to "just try a few more."
  5. Report each round. One line: round N/MAX — <errors remaining> — <what I changed>.
  6. Never silence the judge. Suppressing an error (@ts-ignore, any, deleting a test, || true) is not a pass. See Anti-rationalizations.

Phase 0: LOCK THE CHECK COMMAND

Goal. Know exactly what command defines "green" before you touch any code.

Steps.

  1. Identify the check command. Look at, in order: the user's instruction, the project's CI config (.github/workflows/*), package.json scripts, Makefile, justfile, the build tool's convention.
  2. If multiple are plausible (build vs typecheck vs test), pick the one the user named; if unstated, pick the narrowest one that reproduces the reported failure, and state your choice.
  3. Run it once, unmodified, to capture the baseline failure and confirm it actually fails. A check that already passes means there's nothing to do.
  4. Set MAX_ATTEMPTS (default 10 unless the user gave a number).

Exit criteria.

  • Exact check command written down (copy-pasteable)
  • Baseline run captured — confirmed non-zero exit
  • MAX_ATTEMPTS set

Common Rationalizations

ExcuseReality
"I'll just run npm run build, it's always that"It's tsc -b in half of repos and a custom script in the other half. Read package.json — 5 seconds saves a loop spent fixing the wrong thing.
"I don't need the baseline, I know it fails"Then capturing it costs one run and proves the failure mode you're about to fix is the one that's actually there.
"I'll set the cap later"No cap means no stop condition. Set it now or the loop has no floor.

Phase 1: RUN CHECK

Goal. Get the current ground truth: exit code + full error output.

Steps.

  1. Run the locked check command. Do not modify flags between rounds — same command every round, or the judge moved.
  2. Read the exit code. 0 → jump to Done. Non-zero → continue.
  3. Capture the error output. If it's long, focus on the first error block — later errors are often downstream of the first and vanish once it's fixed.

Exit criteria.

  • Check command run unmodified
  • Exit code read explicitly (not inferred from log text)
  • First failure identified verbatim (file:line + message)

Phase 2: FIX SMALLEST

Goal. Apply the minimum change that resolves the first failure.

Steps.

  1. Locate the first error's file:line. Read the surrounding code.
  2. Apply the smallest correct fix: add the missing import, fix the type, match the signature, correct the path. Real fixes only — see the cheating list.
  3. Change one logical thing. If the same root cause produces N identical errors across files (e.g. a renamed export), fixing the root and the N call sites is one logical change — that's allowed. Five unrelated fixes is not.
  4. Do not touch anything the error didn't point at. Resist refactoring.

Exit criteria.

  • Fix targets the first failure's root cause
  • Diff is minimal — no unrelated edits, no reformatting
  • No error was suppressed to fake a pass

Common Rationalizations

ExcuseReality
"@ts-ignore / # type: ignore / any makes the error go away"The error going away isn't the goal — the code being correct is. Suppressing it ships the bug with a green check on top. That's worse than red.
"I'll delete the failing test, then it passes"The test is the judge for behavior. Deleting it doesn't fix the build, it blinds it. If the test is genuinely wrong, say so to the human — don't silently remove it.
"Let me refactor this whole file while I'm in here"Now your diff has the fix tangled with 80 lines of churn. When the next round goes red, you can't tell which change caused it. Fix the one line.
"I'll fix all five errors at once to save rounds"If the build then breaks differently, you've lost the mapping from change to effect. One fix, one run — the loop is cheap, untangling regressions is not.
"Loosening the type silences it"Loosening the type to pass a typecheck defeats the entire reason the typecheck exists. The judge is now rubber-stamping.
Show full SKILL.md (532 more words)Show less

Phase 3: RE-RUN & GATE

Goal. Decide: done, another round, or stop and escalate.

Steps.

  1. Re-run the check (back to Phase 1's command).
  2. Green (exit 0)? → Done. Report total rounds used.
  3. Red, and attempt < MAX_ATTEMPTS? → Report this round, loop to Phase 1.
  4. Red, and attempt == MAX_ATTEMPTS? → STOP. Do not raise the cap.
  5. Error unchanged after your fix, or oscillating (error A → fix → error B → fix → error A)? → STOP early. The loop is stuck; a human or debug-hypothesis is needed. Don't spend the remaining rounds thrashing.
  6. Progress check: if the count of errors isn't trending down across rounds, treat it like step 5 — you're not converging.

Report format (one line per round):

round 3/10 — 4 errors left (was 7) — fixed missing `await` in db.ts:42

Exit criteria.

  • Re-run executed with the unmodified command
  • Exit code checked, not assumed
  • Either green-and-done, or looped, or stopped-and-escalated — never silently continuing past the cap

Common Rationalizations

ExcuseReality
"9 rounds in, just let me do a couple more"The cap is the stop condition. Hitting it means this isn't a mechanical fix — it needs a human decision or real investigation. More blind rounds burn tokens, not bugs.
"The error count went up but I'm close"Going up is the opposite of converging. Stop and look at why your fixes create new errors — your model of the failure is wrong.
"It's the same error as round 2 but I'll try a different fix"You're oscillating. Two different fixes for one persistent error means you don't understand the error. Switch to debug-hypothesis.
"I'll just `

When the Loop Stops Red

Hitting the cap (or stopping early) is a legitimate, expected outcome — not a failure of the skill. Report:

  1. The exact command and its final exit code.
  2. The remaining errors (verbatim first block).
  3. What you tried each round and why it didn't converge.
  4. Your best hypothesis for why it's stuck (missing dep, env mismatch, a real logic bug, an API change that needs a design call).

Then hand back. A human unblocking one root cause is faster than the agent blindly trying fix #11.

Verification

The skill was applied correctly when:

  • The check command was locked and run unmodified every round
  • Each round was one targeted fix + one re-run, with a one-line report
  • No error was suppressed, no test deleted, no type loosened to fake green
  • The loop ended in exactly one of: green (exit 0), cap reached, or stopped early for non-convergence — with a final report either way
  • If green: a final clean run of the command shows exit code 0
  • If red: remaining errors + a hand-back hypothesis were reported

The Anti-Thrash Rule

The two failure modes this skill guards against:

  • Human-as-while-loop — you copy an error to the agent, it fixes one line, you copy the next error, forever. Automate the loop, cap it, walk away.
  • Agent-as-bulldozer — the agent writes a 200-line speculative "fix" between runs, it doesn't work, so it writes another 200 lines. Minimal diff per round + the cap kill this.

Run the judge. Read the first error. Fix the one thing. Run again. Stop at the cap.

© LichAmnesia, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/build-until-pass of LichAmnesia/lich-skills.

Open the folder on GitHubat commit ebbc355

Compare with similar skills

Build Until Pass 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.

Build Until Pass Loop compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Build Until Pass Loop this skillLichAmnesia/lich-skills234—~2.8kAutomated safety check: PassMIT
Vibe Coding PartnershareAI-lab/Kode-CLI5.2k—~5.6kAutomated safety check: PassApache-2.0
Odoo Workflowunclecatvn/agent-skills143—~4.7kAutomated safety check: PassMIT
Code Review21pounder/terminalAgent1201 repos~650Automated safety check: PassApache-2.0
Code WriterWildGums/Orc.LicenseManager108—~2.3kAutomated safety check: PassCustom licence
Surgical PatchJuliusBrussee/caveman110k1 repos~166Automated safety check: PassApache-2.0

Similar skills

  • Vibe Coding Partner

    shareAI-lab/Kode-CLI

    Gives an agent a set of working rules for any development task: understand first, surface decisions, verify results, and load deeper reference files per scenario.

    5.2k GitHub stars~5.6k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • Odoo Workflow

    unclecatvn/agent-skills

    Mandatory pre-code gate and definition-of-done for ANY Odoo change (add field, override method, inherit view/xpath, OWL/JS patch, wizard, cron, controller, report, security, migration, bug fix…

    143 GitHub stars~4.7k tokensUpdated 14 days ago
    DevelopmentAuto-check passed
  • Code Review

    21pounder/terminalAgent

    A skill your agent uses when user asks to "review code", "check for issues", "analyze code quality", "find bugs", or wants feedback on code implementation.

    120 GitHub starsUsed in 1 repo~650 tokens
    DevelopmentAuto-check passed
  • Code Writer

    WildGums/Orc.LicenseManager

    Write production C code following repository coding standards and architecture.

    108 GitHub stars~2.3k tokensUpdated today
    DevelopmentAuto-check passed
  • Surgical Patch

    JuliusBrussee/caveman

    Fix bugs and small behavior changes at the narrowest responsible layer. Use when regression proof, preserved surrounding behavior, and task-relevant tests…

    110k GitHub starsUsed in 1 repo~166 tokens
    DevelopmentAuto-check passed
  • Find Bugs

    getsentry/skills

    Official

    Find bugs, security vulnerabilities, and code quality issues in local branch changes.

    1k GitHub starsUsed in 9 repos~708 tokens
    DevelopmentAuto-check passed

More from LichAmnesia/lich-skills

All 11 skills in this repo
  • Google Analytics 4 Analysis

    LichAmnesia/lich-skills

    Pulls Google Analytics 4 data through the Data API with TypeScript scripts and turns it into a daily SEO report or prioritized traffic and bounce-rate recommendations.

    234 GitHub stars~2k tokensUpdated 4 mo ago
    Auto-check: notes
  • Nano Banana Image Generator

    LichAmnesia/lich-skills

    Generates or edits PNG images with Google's Nano Banana 2 model through a small script, with a choice of 512, 1K, 2K or 4K output.

    234 GitHub stars~1.1k tokensUpdated 4 mo ago
    Auto-check: notes
  • Spec-Driven Development v2

    LichAmnesia/lich-skills

    Organizes long-running agent work into a Project, Sprint and Task hierarchy with per-task state files, isolated worktrees, review loops and script-checked rules.

    234 GitHub stars~3.1k tokensUpdated 4 mo ago
    Auto-check passed
  • Tavily Web Search

    LichAmnesia/lich-skills

    Runs headless web searches and single-page extraction through the Tavily API from a Python script, returning cited, summarized results without a browser.

    234 GitHub stars~1k tokensUpdated 4 mo ago
    Auto-check: notes
  • Hypothesis-Driven Debugging

    LichAmnesia/lich-skills

    Replaces trial-and-error fixing with an observe, hypothesize, experiment and conclude loop kept in DEBUG.md, where no fix is allowed before evidence supports a cause.

    234 GitHub stars~2.5k tokensUpdated 4 mo ago
    Auto-check passed
  • Spec-Driven Development

    LichAmnesia/lich-skills

    Runs a gated Spec, Plan, Build, Test, Review, Ship workflow so non-trivial changes are specified, verified and reviewed before they ship, with a named artifact per phase.

    234 GitHub stars~3.5k tokensUpdated 4 mo ago
    Auto-check passed

Categories

Questions about Build Until Pass Loop

What does Build Until Pass Loop do?

Drives a failing build, typecheck, lint or test command to a passing exit code through small, one-fix-at-a-time rounds, stopping at a hard attempt cap instead of looping forever. The skill treats the project's own check command as the sole judge of success: green means exit code 0, and nothing else counts, not a fix that looks right or an error that seems to have disappeared. Each round runs the check, applies the smallest diff that addresses the first failure, and re-runs, rather than batching several unrelated fixes before testing again, so it is always clear which change helped.

When should I use Build Until Pass Loop?

Build Until Pass Loop fits situations like: driving a red build or typecheck to green through small fixes; clearing a batch of mechanical compiler or linter errors one at a time; reproducing and fixing a CI failure locally before pushing again.

How do I install Build Until Pass Loop in Claude Code?

Run `npx skills add LichAmnesia/lich-skills --skill build-until-pass -a claude-code`. Or copy the skill folder (skills/build-until-pass in LichAmnesia/lich-skills) into .claude/skills/build-until-pass in your project. Claude Code loads it when a task matches its description.

How do I install Build Until Pass Loop in Codex?

Run `npx skills add LichAmnesia/lich-skills --skill build-until-pass -a codex`. Or copy the skill folder (skills/build-until-pass in LichAmnesia/lich-skills) into .agents/skills/build-until-pass in your project. Codex loads it when a task matches its description.

Can I use Build Until Pass Loop in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add LichAmnesia/lich-skills --skill build-until-pass -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/build-until-pass, .gemini/skills/build-until-pass, .github/skills/build-until-pass and .opencode/skills/build-until-pass in your project.

What does Build Until Pass Loop need to run?

Going by SKILL.md and its folder, Build Until Pass Loop needs the command-line tools its instructions call (npm, cargo, go and tsc). Our summary lists: A project with a runnable build, typecheck, lint or test command.

Does Build Until Pass Loop access the network?

SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Build Until Pass Loop safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Build Until Pass Loop use?

Build Until Pass Loop is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Build Until Pass Loop use?

About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Build Until Pass Loop?

Skills that share tags, products or a category with Build Until Pass Loop: Vibe Coding Partner (shareAI-lab/Kode-CLI, 5.2k stars), Odoo Workflow (unclecatvn/agent-skills, 143 stars), Code Review (21pounder/terminalAgent, 120 stars) and Code Writer (WildGums/Orc.LicenseManager, 108 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Build Until Pass Loop?

LichAmnesia (a GitHub user) maintains it in LichAmnesia/lich-skills, which has 234 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on June 9, 2026.

Source: LichAmnesia/lich-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.