Until
Goal-pursuit engine — attempt, verify, adjust until a pinned objective is verifiably done. Negative-control verification, a hypothesis ledger that forbids re-testing refuted ideas, git checkpoints, and a forced escalation ladder (switch layers → fresh-context subagent → attack the goal itself). Survives session death via a state file. (For time-based recurrence, use the built-in /loop instead.)From its SKILL.md
npx -y skills add yiyaw-lab/agent-armor --skill untilAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
4.8 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it
You are in goal-pursuit mode. You do not end your turn until the objective is VERIFIED accomplished or a stop condition fires. "Should work now" is not a stopping state.
Step 0 — Pin the goal, then prove the check can fail
- Restate the objective as a binary, observable check: a command's exit code, a file's state, a passing test, a visible behavior. If
$ARGUMENTScontains-- <verify>, that IS the check.max=Ncaps iterations (default 10). - Negative control: run the check BEFORE doing any work. If it already passes, the goal is mis-pinned — stop and re-pin. A check that can't fail can't verify anything.
- NEVER weaken the check mid-run. The check pinned here is the check you finish on.
- Create the state file
.claude/until/<goal-slug>.mdin the project: the pinned check, the brief (what's known, what's ruled out), and the ledger below. Update it EVERY iteration — this is what makes the pursuit survive compaction, crashes, and session ends./until resume= read the newest state file and continue from its ledger, not from scratch.
The hypothesis ledger
Maintain in the state file:
| iter | hypothesis | layer | action | check result | status: REFUTED / CONFIRMED / UNTESTED |
- One hypothesis per iteration, falsifiable, named BEFORE acting.
- A REFUTED hypothesis is dead. Re-testing it is forbidden — variants count as re-tests unless you can say what evidence distinguishes them.
- Tag each hypothesis with its layer:
code | config | environment | dependency | data | assumption. You'll need this for escalation.
Each iteration
- Checkpoint — before any risky change: a WIP commit, or
git stash pushONLY in a tree where every piece of dirt is your own — never in a tree carrying a peer's/foreign dirt (a stash there silently swallows their in-progress work; the S38 parallel-build near-miss). A failed fix must be rolled back, not layered under the next fix. Compounding half-fixes is how loops corrupt the workspace. - Act — smallest change that tests the hypothesis.
- Verify — run the pinned check for real; capture output. A pass must be reproduced once (re-run, clean state if cheap) before you trust it — flaky passes are how loops end in false victory.
- Record — update the ledger + state file. Failed experiment? Roll back to checkpoint before iterating.
The escalation ladder — strategy shifts are forced, not optional
- 3 consecutive REFUTED in the same layer → that layer is probably innocent. Next hypothesis MUST come from a different layer.
- 5 consecutive REFUTED → your context is now part of the problem: you're anchored on dead hypotheses. Write a clean brief (symptom, check, ledger summary, what's ruled out — NOT your theories) and spawn a fresh-context subagent on it. Its naivety is the asset; do not contaminate the brief with your favorite suspect.
- 7 consecutive REFUTED → attack the goal itself: spawn an adversarial subagent to argue the check is testing the wrong thing, the bug is upstream of where you're looking, or the objective hides a false assumption. If it lands, re-pin WITH THE USER (this is the one allowed check change — explicit, never silent).
- Cap reached → write the handoff: state file finalized, brief sharpened, "what I'd try next" listed. A future
/until resume— yours or another agent's — starts from iteration N, not zero.
Stop conditions — never declare false success
- ✅ Check passes, reproduced → report what worked + verifying output.
- 🛑 Thrashing: no new falsifiable hypothesis exists in any layer.
- 🛑 Cap (default 10).
- 🛑 User-blocked: needs credentials, a decision, money, or hardware only the user has — name it precisely.
- 🛑 Diminishing returns on a subjective/scored check — when the verifier is a graded judge/panel, not a binary pass, its score is ASYMPTOTIC: it plateaus and the all-high bar may never cleanly fire. Track the score delta per iteration; when it flattens (~2 iterations of marginal gain), STOP and surface the plateau + best result + any anchor-conflict as a fork for the user. Cap the expensive judge cadence to every 2-3 iterations, not every one. (Banked from a /until loop that ran ~10 panels / ~3.7M tokens against an asymptotic bar.)
Final report
✅ or 🛑 · the verified evidence (real output, not paraphrase) · iterations used · the ledger · state-file path. On 🛑: the exact resume command.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.