Skip to main content
loopsmith

loopsmith

Self-evolving agent loops. The gate is code, so "done" cannot be argued.

PyPI license platforms python

pip install loopsmith-cli
loopsmith doctor

This distribution is a Rust binary, not a Python library. There is nothing to import. It installs a loopsmith command. To drive loops from Python, use subprocess — its exit codes are its API.

TL;DR:

You have a job you redo every week and are fussy about — a competitor roundup, a lead list, a landing page, a research brief. Write down what you want and how anyone would tell it's good, in one plain text file. loopsmith puts an AI to work on it, checks the result, sends it back when it falls short, and stops when it passes. It can run on a schedule for weeks without you.

The rule that makes it safe to walk away: the AI never gets to say "done". A deterministic checker reads the actual files and decides — and it can revoke, so a goal that stops being true stops being satisfied.

Not a developer? Marketing, sales, research, ops — if you can edit a text file, you can run a loop. And if you would rather not open a text file at all, loopsmith --web builds one for you in a browser.

START-HERE — README-FOR-DUMMIES.md

A plain-English guide: one install line, thirteen ready-made loops to copy, the six settings you actually edit, and how to leave it running on a schedule.

There is also a generated code wiki mapping the crates, the execution engine, the gate, and the provider layer.

What it is

You describe a purpose in a config — goals, how each is checked, what counts as success, when to stop, what the loop may never do. loopsmith handles scheduling, provider routing, memory, verification, and termination, and can run for weeks without you.

One rule holds the whole design up:

A model must not be the thing that certifies its own completion.

goal_satisfied is written by a deterministic Rust gate and by nothing else, and the gate can revoke: delete a required artifact and a satisfied goal flips back. A system that can only promote is a burndown chart with extra steps.

The browser UI

loopsmith --web        # or: loopsmith web

Serves http://127.0.0.1:3000 and opens a tab. Everything the CLI does, done by clicking — with every field explained in place, for people who would rather not learn a schema before they learn whether the tool is useful.

Six steps rather than one long form — Place, Power, Intent, Proof, Work, Ship — carrying only the actions that make sense on each, and ⌘K to reach any step, section, action, or example directly.

It probes the machine first, so nothing has to be typed from memory: agent CLIs on PATH, the Ollama models actually pulled, MCP servers already configured by your editor, which API keys are set, and which sub-agents are installed. Found CLIs become one-click provider cards prefilling a working argv, and a Test button puts one real prompt through a provider so a wrong flag surfaces now rather than in iteration four of an unattended run. The folder button opens your operating system's own folder chooser, so no path has to be typed at all.

The right-hand panel re-checks the draft on every keystroke — the same validator, planner, and permission derivation the CLI uses, in-process: every problem with the field it belongs to, what a run could cost at the ceilings currently set (or unbounded if none is), the wave schedule and the speedup ceiling no worker count beats, and parallel builders that would overwrite each other.

All thirteen examples are compiled into the binary and load with one click. The buttons spawn the real loopsmith binary and stream its output live, so the browser can never drift from the CLI and can never do anything loopsmith --help does not list. A run belongs to the server, not the page: close the tab and it keeps going, reopen and the log picks up from the start.

Binds loopback only, and refuses any request not addressed to it. API keys go to your shell profile or your OS secret store — only the variable name is ever written into a config.

Five minutes

pip install loopsmith-cli

# --path must be outside any repo you care about: a loop edits files and writes
# state, so it does not get pointed at the tool that runs it.
loopsmith new --path ~/loops/nightly-refactor --purpose "keep the module simple"

cd ~/loops/nightly-refactor
$EDITOR loop.yaml           # your goals, and how each one is checked
loopsmith validate loop.yaml
loopsmith plan     loop.yaml
./run.sh                    # run.cmd on Windows

validate fails on purpose

error  pre_execution: 2 step(s) not marked done: Run this task manually end to
       end at least once; Write down what 'done' means in checkable terms.
       Automating before understanding produces fast, confident garbage

That refusal is the most valuable thing the tool does. Do the task by hand once — the manual run is the spec. Mark each pre_execution step done: true once you actually have.

What a config looks like

Ten sections, A to J: information, the manual work list, goals, validations, success criteria, stop gates, schedules, constraints, execution guidelines, default skills. YAML or Markdown — the same model either way.

name: nightly-refactor
description: keep the payments module simple without breaking it

pre_execution:
  - step: Ran the refactor by hand on one file and kept the diff
    done: true

goals:
  - name: simpler
    description: Cyclomatic complexity down, behaviour unchanged.

validations:
  - target: simpler
    name: tests-still-pass
    mode: objective
    statement: The suite exits clean.
    detector:
      type: script
      command: ./scripts/check-tests.sh
      expect_exit: 0
    blocking: true

success:
  - target: overall
    name: all-blocking-pass
    mode: percentage
    statement: Every blocking validation passes.
    threshold: 1.0

stop_gates:
  max_iterations: 8
  max_revisions_per_node: 3
  max_cost_usd: 5.0
  no_progress_iterations: 3

graph:
  nodes:
    - id: refactor
      role: builder
      instruction: Simplify one function. State any assumption you had to make.
      goals: [simpler]
      isolated: true          # its own git worktree
    - id: review
      role: judge
      instruction: Check the diff against the brief. Pass or fail per check, with evidence.
      depends_on: [refactor]
      goals: [simpler]
      tier: strong

Detectors are file_exists, regex, script, and composites. Only a detector can satisfy a goal — a model's opinion of its own work never does.

While it runs

Question Command
What does the gate say? loopsmith status <config> <run-id>
What happened? loopsmith ledger <config> <run-id>
Why did it stop? the last line of logs/<run-id>.log
What does it want changed about itself? loopsmith proposals <config> <run-id>
Which providers can it reach? loopsmith providers <config>
Will this machine get in the way? loopsmith doctor <config>

The loop never edits its own config. Changes to goals, validations, success criteria, and sub-agent adoption are written as proposals for a human to apply.

Providers and BYOK

Every provider is a command template, which is what makes bring-your-own-key free: Claude Code, Ollama, a Grok CLI, an OpenAI-compatible endpoint driven by curl, an MCP server over stdio — all of them are "a program you run with a prompt". Adding one is a config edit, never a rebuild.

requires_env names variables that must exist. loopsmith never reads their values, so a key cannot reach a prompt, a log, or the ledger.

⚠ Never paste an API key into a chat window, a config file, or an issue. If one ends up somewhere it should not be, rotate it — deleting the message is not enough.

How this distribution installs the binary

The binary is fetched on first run, not during pip install, and cached under ~/.loopsmith/bin/<version>/ (override with LOOPSMITH_HOME).

That is deliberate. A wheel that downloads at install time breaks in every environment that installs without a network and runs with one — CI images, Docker build stages, locked-down build hosts — and the failure surfaces as an install error for a package the user has not tried to use yet.

Every download is verified against the release's published SHA256SUMS before it is executed. Fetching a binary and running it unverified is a supply-chain hole with a progress bar.

Prebuilt for:

Platform Target
Linux x86_64 (glibc) x86_64-unknown-linux-gnu
Linux x86_64 (musl, auto-detected) x86_64-unknown-linux-musl
Linux arm64 aarch64-unknown-linux-gnu
macOS Intel x86_64-apple-darwin
macOS Apple silicon aarch64-apple-darwin
Windows x86_64 x86_64-pc-windows-msvc

Anywhere else, build from source — it is the same program:

cargo install loopsmith

The distribution name

loopsmith on PyPI was already registered by an unrelated project, so this distribution is loopsmith-cli. The installed command is loopsmith either way. Elsewhere: loopsmith on crates.io, @bitphill/loopsmith on npm, and the bitphill/loopsmith Homebrew tap.

Documentation

MIT licensed. © bitphill

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

loopsmith_cli-0.2.1.tar.gz (14.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

loopsmith_cli-0.2.1-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

Details for the file loopsmith_cli-0.2.1.tar.gz.

File metadata

  • Download URL: loopsmith_cli-0.2.1.tar.gz
  • Upload date:
  • Size: 14.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.15

File hashes

Hashes for loopsmith_cli-0.2.1.tar.gz
Algorithm Hash digest
SHA256 0619223e867364d38e722240c8e0f1bf2c036ebd23250d2bd1490dd1c72fa451
MD5 0f3deb864ebe55d899cf24ab074d2940
BLAKE2b-256 11cc9f2ca615ba91a3438bfb5bdd73e2c8e306f9e0f7f6b0f38b57b422623241

See more details on using hashes here.

File details

Details for the file loopsmith_cli-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: loopsmith_cli-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 10.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.11.15

File hashes

Hashes for loopsmith_cli-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c23430073dae73801b2b7e626b67c7b04119b6b8e5a57b94ca9e22fe25d47d12
MD5 67c645da74143912f8b72d8db5d1f2c1
BLAKE2b-256 b145274960e52e9a300e25d85100ac6191c15392b992d3d5d4332727d5217bc2

See more details on using hashes here.

Release history Release notifications | RSS feed

0.3.1

2 files

0.3.0

2 files

0.2.2

2 files

This release

0.2.1 This release

2 files

0.2.0

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page