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.
npx skills add uqeu/estelle-cli --skill estelle-loopgit clone --depth 1 https://github.com/uqeu/estelle-cliWrote 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/uqeu/estelle-cli/estelle-loop)<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.
<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>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.00000 | $0.01692 |
| Opus 5.5 | $0.00000 | $0.00677 |
| Sonnet 5.5 | $0.00000 | $0.00338 |
| Haiku 4.5 | $0.00000 | $0.00169 |
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.
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
- 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_autonomyoverAutonomyLevelREAD_ONLY→PROPOSE→BRANCH→EXECUTE — the loop may only take actions the ceiling permits) and a budget guard read from real metering (model_pricing.usage_breakdownon 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." - 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 withmodel_router.route(repair/agentic→ FRONTIER, small bulk → CHEAP) so flagship tokens go to the hard step, not the coverage. - Propose the change, grounded from attempt #1. Generate via the work prompt (
_work_promptinhandle_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. - Gate it — no ungrounded change survives. Run
_gate_verdicton the change (wrapped as a diff by_as_added_diff): it returns{merge, verdict, blockers, warnings}, whereblockersare 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. - Repair against the gate, then against the real suite — and know WHICH limit stopped you. While
gate["blockers"]and undermax_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 throughrun_and_repair_suite/parse_suite_output: the change counts green ONLY when the pytest summary line truly sayspassedwith nofailed/errorand 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 reportsabandonment()—rounds(used every round allowed) vsbudget(our clock stopped it) vsstarved(an earlier round ate this one's declared slice). The suite half reportsSuiteVerdict.outcome—passed_clean·passed_repaired·rounds·not_attempted— bounded byDEFAULT_SUITE_ROUNDS. The ORCHESTRA code worker feeds BOTH its evaluators back (gate blockers, then repro failures) on one sharedmax_repairsbudget, and marks a terminal admission refusalgate-refusedrather than letting it read as a failed test run. 🔴roundsandnot_attemptedare 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. - Bank the lesson — this is why the loop improves. On a caught hallucination,
learn_from_groundingwrites anExperienceStorelesson naming the invented symbols (deduped, and expirable once those symbols become real) so the next iteration recalls it. Feed the outcome toSkillLearning.recordsoblendedselection biases toward what worked here, and to theInstinctEngine(observe) — a reflex that keeps being confirmed graduates atGRADUATE_CONFIDENCEoverGRADUATE_MIN_OBSERVATIONSinto a first-class skill the loop can then select. Lessons compound per-namespace with no weights touched. - Audit the iteration into team-shared history. Fold each iteration's
AgentRunintoRunHistory.record(rendered byruns_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 withrun_swarm— each in its OWN isolated gated worktree — instead of serializing. - 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.
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.
- 1mo ago First seen · 82 lines · 0 tokens per session scan A 2db5f81f63c1
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.
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.
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.
include-test-files-that-assert-on-behavior-being-changed-in-decl
When delegating a task affected by this skill, include.
check
Auto-fix lint and formatting, then report types and tests. Run before every commit.
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…
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…