estelle-loop

estelle-loop is a skill for Claude Code from uqeu/estelle-cli. It costs 0 tokens per session (1,692 once invoked), scanned A, original, Apache-2.0.

A goal-driven coding loop that repeatedly makes a change, checks it with repository tests and safety gates, and repairs failures.

In plain words
What is it for?
It helps harden code, improve test coverage, and work through a backlog until the checks pass or the run reaches its limits.
Why use it?
It provides a structured way to continue larger tasks without accepting unverified changes or repeating known mistakes.

Skill for Claude Code

Written for Claude Code: shipped in a Claude Code plugin.

Part of the estelle plugin — 26 skills, 4 agents, 9 hooks shipped together

Good fit It helps harden code, improve test coverage, and work through a backlog until the checks pass or the run reaches its limits.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/uqeu/estelle-cli/estelle-loop
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Any agent
npx skills add uqeu/estelle-cli --skill estelle-loop
Clone the repo
git clone --depth 1 https://github.com/uqeu/estelle-cli

Made for: Claude Code.

Or install estelle, the plugin that ships this one along with the rest of its 26 skills, 4 agents, 9 hooks.

Wrote 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.

agentmods badge for estelle-loop

README.md
[![agentmods](https://agentmods.dev/badge/skills/uqeu/estelle-cli/estelle-loop/github.svg)](https://agentmods.dev/skills/uqeu/estelle-cli/estelle-loop)
Your own site
<a href="https://agentmods.dev/skills/uqeu/estelle-cli/estelle-loop"><img src="https://agentmods.dev/badge/skills/uqeu/estelle-cli/estelle-loop/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.

agentmods 80×15 button for estelle-loop

Your own site · 80×15
<a href="https://agentmods.dev/skills/uqeu/estelle-cli/estelle-loop"><img src="https://agentmods.dev/badge/skills/uqeu/estelle-cli/estelle-loop.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 0 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 1,692 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce invoked
Fable 5.1 $0.00000 $0.01692
Opus 5.5 $0.00000 $0.00677
Sonnet 5.5 $0.00000 $0.00338
Haiku 4.5 $0.00000 $0.00169

Measured 1mo ago against content hash 2db5f81f63c1, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

estelle-loop 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 1mo 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.

estelle-plugin/skills/estelle-loop/SKILL.md · 82 lines

How it starts

The opening of the file, as written. The whole thing — 82 lines — stays where its author put it; the contents beside it link to each section on GitHub.

estelle-loop

Estelle's self-driving build loop — its variation of an agent loop. A plain agent loop calls the model, applies the change, and hopes; two failure modes follow — an ungrounded change slips through, and the loop repeats the same mistake because it never learned. Estelle's loop closes both with primitives it already owns: every iteration runs the deterministic merge gate (_gate_verdict — grounding against the real symbol graph + security scan, every error-severity finding blocks) and the repo's REAL pytest (run_and_repair_suite / parse_suite_output), and every iteration banks what it learned (learn_from_grounding → ExperienceStore, the InstinctEngine, SkillLearning). So the loop is the handle_work unit-of-work — generate → gate → repair — lifted into a goal-driven cycle that picks the next target, audits each run into RunHistory, and stops on an autonomy ceiling (run_autonomy) or a metering budget (model_pricing.usage_breakdown over real provider counts received through usage_sink).

When to run

When a goal is bigger than one change and you want Estelle to grind it out autonomously — harden a module, raise coverage, work down a backlog, resolve a batch of findings — rather than hand-holding each edit. Use it when the work is open-ended enough that "pick the next best thing" is itself part of the job. Do not use it for a single scoped edit (self-eval grades one output) or a fan-out audit by concern (agent-orchestration); this is the sequential, self-improving driver that keeps going.

Procedure

  1. State the goal and the stopping condition first. Turn the ask into an explicit goal plus the two bounds that stop the loop: an autonomy ceiling (run_autonomy over AutonomyLevel READ_ONLY→PROPOSE→BRANCH→EXECUTE — the loop may only take actions the ceiling permits) and a budget guard read from real metering (model_pricing.usage_breakdown on actual served-model token counts, never an estimate). The loop ends when the goal is met OR a bound trips — never "when the model feels done."
  2. Pick the next highest-value target. One target per iteration. Use recall + the code graph (memory.locate / recall) to choose the single change with the most leverage remaining toward the goal, and route its difficulty with model_router.route (repair/agentic → FRONTIER, small bulk → CHEAP) so flagship tokens go to the hard step, not the coverage.
  3. Propose the change, grounded from attempt #1. Generate via the work prompt (_work_prompt in handle_work) with the RECALL side of the learning loop injected up front — prior lessons (recall_lessons / ExperienceStore.as_prompt_block), the grounded repo context, and the team's learned house style (memory.conventions) — and output only code. In-convention, in-context generation means the gate then only has to catch what slips.
  4. Gate it — no ungrounded change survives. Run _gate_verdict on the change (wrapped as a diff by _as_added_diff): it returns {merge, verdict, blockers, warnings}, where blockers are error-severity facts from the real symbol graph (invented symbol, wrong arity) plus the security scan. This deterministic gate on EVERY iteration is exactly what makes this loop different from a generic agent loop.
  5. Repair against the gate, then against the real suite — and know WHICH limit stopped you. While gate["blockers"] and under max_rounds, feed the gate's exact rejections back (_repair_prompt) and regenerate — repairing against ground truth, not a vague "don't hallucinate." Then run the repo's OWN tests through run_and_repair_suite / parse_suite_output: the change counts green ONLY when the pytest summary line truly says passed with no failed/error and it isn't "no tests ran" (the exact trap that once hid a regression for 8 commits). Both halves feed refusals back and both NAME THEIR EXIT. /work's gate half reports abandonment() — rounds (used every round allowed) vs budget (our clock stopped it) vs starved (an earlier round ate this one's declared slice). The suite half reports SuiteVerdict.outcome — passed_clean · passed_repaired · rounds · not_attempted — bounded by DEFAULT_SUITE_ROUNDS. The ORCHESTRA code worker feeds BOTH its evaluators back (gate blockers, then repro failures) on one shared max_repairs budget, and marks a terminal admission refusal gate-refused rather than letting it read as a failed test run. 🔴 rounds and not_attempted are deliberately different values: gave up after N attempts and was never given an attempt are different facts about a red result, and they used to be the same bytes. Never report a loop as having failed when it was never allowed to run.
  6. Bank the lesson — this is why the loop improves. On a caught hallucination, learn_from_grounding writes an ExperienceStore lesson naming the invented symbols (deduped, and expirable once those symbols become real) so the next iteration recalls it. Feed the outcome to SkillLearning.record so blended selection biases toward what worked here, and to the InstinctEngine (observe) — a reflex that keeps being confirmed graduates at GRADUATE_CONFIDENCE over GRADUATE_MIN_OBSERVATIONS into a first-class skill the loop can then select. Lessons compound per-namespace with no weights touched.
  7. Audit the iteration into team-shared history. Fold each iteration's AgentRun into RunHistory.record (rendered by runs_to_markdown, capped, snapshot-persisted) so every member's console sees what ran, what the ceiling refused, and the artifacts. When several targets are independent and the ceiling allows writes, fan them out with run_swarm — each in its OWN isolated gated worktree — instead of serializing.
  8. Loop until the goal or a ceiling stops it, and say WHICH. Re-evaluate the goal against the banked state; if it's unmet and neither the autonomy ceiling nor the budget has tripped, return to step 2 on what's left. Because each pass is gated (no bad change survives) and smarter (lessons + instincts + skill scores carry forward), the loop converges on the goal instead of drifting — and halts honestly when a bound says stop.

Read the full file on GitHub · 82 lines

Changes

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.

  1. 1mo ago First seen · 82 lines · 0 tokens per session scan A 2db5f81f63c1

Subscribe to this mod's changes

estelle-loop is a skill published in the GitHub repository uqeu/estelle-cli (0 stars, last pushed 14d ago), licensed Apache-2.0. It costs nothing until one of its globs matches a file; then it loads 1,692 tokens. 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-09-12.

Related

Other skills, from other repositories

remove-ai-slops

Removes AI-generated code smells from branch changes or an explicit file list behind regression tests. Use when the user asks to clean up, deslop, or remove AI-slop patterns from recent changes.

code-yeongyu/lazycodex · 45 tokens

review-work

Post-implementation gate review: run manual QA on the real surface yourself, then launch ONE gate reviewer (never a panel) to audit goal, constraints, code quality, security, missed context, and QA evidence. Use before a PR handoff or when the user explicitly asks to review completed work.

code-yeongyu/lazycodex · 63 tokens

include-test-files-that-assert-on-behavior-being-changed-in-decl

When delegating a task affected by this skill, include.

ZaxbyHub/opencode-swarm · 29 tokens

check

Auto-fix lint and formatting, then report types and tests. Run before every commit.

ffroliva/gflow-cli · 20 tokens

code-guidelines-go

Go 1.24–1.27 coding guidelines for the dimetron/pi-go AI agent runtime. Use this skill whenever writing, reviewing, or refactoring ANY Go code in pi-go. This covers idiomatic style, error handling, concurrency, project layout, testing (table-driven, fuzz, benchmarks, synctest), new stdlib usage, golangci-lint v2…

dimetron/pi-go · 124 tokens

vhs-e2e-gif

Record a test run, a TUI session, or any terminal command as a GIF with VHS and attach it to a GitHub PR as a release-hosted asset, never a repo commit. Use when asked to record an e2e run, demo a fix on a PR, attach a GIF or screen recording to a pull request, show a test passing visually, or produce a terminal…

dimetron/pi-go · 106 tokens