loopsmith v0.1.0
First release. The design in one line: goal_satisfied is written by a
deterministic Rust gate and by nothing else, and the gate can revoke.
The runtime
- A–J config model in YAML or Markdown, with
validaterefusing to run until
everypre_executionstep is marked done. That refusal is the feature: a
process you cannot describe in checkable terms should not be automated. - Deterministic verification gate. Detectors are
file_exists,regex,
script, and composites. The gate promotes and revokes — delete a required
artifact and a satisfied goal flips back. - DAG scheduling with critical path and Amdahl-derived concurrency, and
phases that open one at a time. - Four layered stop gates — iterations, per-node revisions, wall clock, and
no-progress — all evaluated every iteration. Their accounting lives in the
checkpoint, so a resume cannot refund a spent revision budget. - Shared memory on
sled: episodes, goal state, an append-only ledger,
checkpoints, per-goal scratchpads, and skill trials. - Provider routing for Claude Code, Ollama, Grok, OpenAI, Gemini, Hermes,
MCP, and any BYOK command, with a per-tier cascade and enforced judge
independence.requires_envnames the variables a provider needs; loopsmith
checks only that they exist and never reads their values, so a key cannot
reach a prompt, a log, or the ledger. - Git worktree isolation per builder, degrading to the shared directory —
and saying so — outside a repository or without git. - A local stdio MCP server exposing memory, gate, and graph to any MCP
client. - Sub-agent acquisition ordered installed → marketplace → generate, with a
star floor, credential-shaped-name refusal, and quarantine until a human
promotes.
Cross-platform
- Linux, macOS, and Windows, verified by a CI matrix rather than asserted.
- Nothing is decided at build time. The userland is probed by asking
sed
for a version, because Homebrew's coreutils puts GNU tools ahead of BSD ones
on a Mac and the operating system therefore does not imply the answer. The
scheduler is whichever candidate is onPATH:launchctlthencrontabon
macOS,crontabthensystemctlon Linux and BSD,schtasksthencrontab
on Windows. - Every new loop gets both launcher flavours —
run.sh/resume.shand
run.cmd/resume.cmd— on every host, because a loop directory outlives the
machine that produced it. Every.shis POSIX, since macOS ships bash 3.2. scripts/compat.shtravels with each loop:sed_i,stat_size,
stat_mtime,readlink_f,sha256,require,need_bash.requireand
need_bashexit 2, not 1 — a detector's exit code is its verdict, and
"cannot run the check" is not "the check failed".loopsmith doctorreports the host and what it stops you doing.- Home directory resolution honours
USERPROFILEandHOMEDRIVE+HOMEPATH,
not justHOME. - Universal installers:
install.shfor Linux/macOS/BSD,install.bat+
installers/deps.ps1for Windows.
Packaging
- crates.io:
loopsmithplus the eight libraries behind it. - npm:
@bitphill/loopsmith. PyPI:loopsmith-cli. Both names differ from the
command becauseloopsmithwas already registered on those registries by
unrelated projects; the installed binary isloopsmitheither way. - Homebrew: the
bitphill/loopsmithtap.
Decisions worth knowing about
Two things look unfinished and are not:
--installwrites a scheduler definition and stops. It does not run
launchctl load -worschtasks /Create. Registering a scheduled job is a
persistent, user-visible change to someone's machine, so it stays their call.- Cron expressions are evaluated in UTC. Deriving a correct local offset in
a multithreaded process is unsound on Unix without care, and a scheduler that
is quietly an hour off twice a year is worse than one that is honestly in UTC.
schedulesays so in its output. For a cadence that does not care, use an
intervaltrigger.
And one default that is deliberately impatient: the starter ollama provider
times out at 120 seconds. ollama run pulls a missing model, a pull is
indistinguishable from slow generation from outside the process, and the point of
a cheap tier is to be abandoned quickly. Run ollama pull <model> first.