Specfuse Loop
For engineers using AI coding agents — a local-first driver that structures features as verified, work-unit sequences so each agent session runs focused on one task instead of accumulating context drift.
A small, local-first executor for the Plan + Work Unit pattern in a single repository. You plan a feature as a sequence of gates, each a batch of self-contained work units with explicit acceptance criteria and verification. The loop dispatches each work unit to a fresh agent session, verifies the result itself, commits one squashed commit per unit, and stops at each gate so you can reflect — with the next gate already drafted and waiting for your review.
Specfuse Loop is one of three independently-adoptable projects under the Specfuse methodology suite:
specfuse/codegen— deterministic source code from OpenAPI / AsyncAPI / Arazzo specifications.specfuse/loop— this project. Single-repo, spec-optional, lightweight. You author the task graph directly; no specification and no agent-coordination overhead are required.specfuse/orchestrator— multi-repo, spec-first, agent coordination across many component repositories.
Use any one without the others. The loop and the orchestrator share the same
gate-cycle methodology (see docs/methodology.md); the
loop is the lightweight surface for work that lives in one repo and may have no
formal specification.
Why it exists
AI coding agents do well on narrow, well-scoped work and poorly on large, vague work. The loop's bet is that the leverage is in the planning: if you remove ambiguity up front — crisp work units with hard boundaries and machine-checkable verification — then execution can run with a fresh agent per unit, re-grounding from durable files each time rather than accumulating context drift. It is the Ralph loop idea applied at work-unit granularity, with the planning rigor Ralph's bare task list lacks.
How it works (in one minute)
- A feature lives in
.specfuse/features/FEAT-YYYY-NNNN-slug/, with aPLAN.md(the task graph: gate order, work-unit membership, dependencies), oneGATE-NN.mdper gate, and oneWU-*.mdper work unit (frontmatter + the prompt body a fresh session receives). The loop also handles orchestrated features dispatched by the Specfuse Orchestrator, identified byINIT-YYYY-NNNN/FNNIDs — the loop treats both namespaces identically; only the ID root differs. Use.specfuse/scripts/gh_features.pyto discover a target repo's openspecfuse:featureissues as feature candidates; use.specfuse/scripts/adopt_feature.py <repo> <issue-number>(or the interactive/adopt-featureskill) to scaffold a dispatchable feature folder from a picked issue. - The driver (
specfuse run, from thespecfuse-looppip package) walks the current gate's ready work units, dispatches each as a freshclaude -psession, runs the unit's verification itself as the exit oracle, and commits one squashed, trailer-carrying commit per unit. A failed gate is retried with a fresh session carrying the failure evidence, up to three attempts, then escalated. - Each gate ends with a closing sequence so reflection, a durable
cross-feature
LEARNINGS.md, documentation, and drafting the next gate all happen systematically. Non-terminal gates use a two-WU form (close-intermediate+plan-next); the terminal gate uses a singlecloseWU. A legacy four-WU form (retrospective → lessons → docs → plan-next) is accepted but emits a lint warning. - The gate is the human boundary. The driver runs unattended within a gate and stops at it; you review the next gate's draft and arm it. (Under automatic mode, safe gates can self-arm; the dangerous edges always pull you back in — see the methodology doc.)
Quickstart
In a target single-repo project:
Contributing to this repo? Run ./scripts/install-hooks.sh once after
cloning to enable the pre-push hook (runs scripts/smoke-test.sh — same
checks CI runs — before each git push). Bypass with git push --no-verify.
The driver installs from PyPI and the skills ship as a Claude Code plugin:
pipx install specfuse # or: uv tool install specfuse
# one command for the whole suite: specfuse run / lint / monitor / stats / …
# (or: python3 -m pip install specfuse, in a venv)
# in Claude Code, enable the skills plugin (one-time):
# /plugin marketplace add specfuse/specfuse
# /plugin install specfuse@specfuse
specfuse init /path/to/your-project # scaffold .specfuse/ + wire .claude/ (--dry-run previews)
cd /path/to/your-project
$EDITOR .specfuse/verification.yml # match the `code` gates to your stack
# author your first feature (in Claude Code: /draft-feature)
specfuse run --dry-run # show the gate walk, no dispatch
specfuse run # the real run
Distribution. Code ships via pip — the
specfuseumbrella hard-depends onspecfuse-loop(the driver) and every other component, sopipx upgrade specfuse/uv tool upgrade specfusere-resolves the whole suite. Claude assets ship via thespecfuse/specfuseplugin marketplace.specfuse initlays down.specfuse/and wires.claude/;specfuse upgradeis the same idempotent operation over an existing scaffold. Everyspecfuse runself-provisions (version-syncs.specfuse/from the installed package), so an upgrade reaches existing projects on their next run. (./init.shis a deprecated v1.0 shim that delegates tospecfuse init/upgrade; slated for removal.)Flat commands are deprecated.
specfuse-loop,specfuse-lint,specfuse-monitor,specfuse-monitor-lintandspecfuse-statsstill work as aliases until 1.0.0, with identical arguments and behaviour. Use the subcommands.specfuse doctorreports which flat names are still on your PATH;SPECFUSE_NO_DEPRECATION_WARNING=1silences the notice in noisy hooks or CI.pip install specfuse-loopon its own remains supported for library use.
One driver per working tree. The driver holds an exclusive advisory lock on
.specfuse/.loop.lockfor the duration of a run; a second driver targeting the same checkout exits immediately with a clear error message. To run two features in parallel, use separategit worktreecheckouts — each gets its own lock.--dry-runis exempt and may run alongside a live driver.
This repository is also a self-demonstrating reference installation: its own
.specfuse/ contains a worked example feature
(features/FEAT-2026-0001-health-endpoint/). From the repo root you can run:
python .specfuse/scripts/lint_plan.py .specfuse/features/FEAT-2026-0001-health-endpoint
python .specfuse/scripts/loop.py --dry-run
Layout
specfuse-loop/
├── LICENSE NOTICE CONTRIBUTING.md README.md .gitignore
├── init.sh deprecated v1.0 shim → delegates to `specfuse init`/`upgrade`
├── docs/
│ ├── getting-started.md narrated first-feature + operator walkthrough
│ ├── methodology.md the gate-cycle contract (shared with the orchestrator)
│ ├── skills.md the skills catalog, ordered by lifecycle phase
│ ├── concepts/ why it exists; orchestrator mapping
│ │ ├── ralph-lineage.md the Ralph / Gas Town lineage
│ │ └── architecture-addendum-gates-and-iterative-planning.md
│ └── dev/ internal working notes (not user-facing)
└── .specfuse/ canonical scaffold + worked example
├── README.md
├── roadmap.template.md verification.yml.example LEARNINGS.md
├── rules/result-contract.md
├── skills/verification/SKILL.md
├── scripts/{loop.py, lint_plan.py, gh_features.py, adopt_feature.py, gh_backend.py}
├── templates/{PLAN,GATE,WU}.template.md
└── features/FEAT-2026-0001-health-endpoint/ (the worked example)
specfuse init also ships the durable docs — methodology.md, skills.md, and
concepts/ — into a target's .specfuse/docs/, so an initialized repo is
self-documenting without this checkout.
Status
Early but exercised. The driver, linter, parsing, dependency ordering, draft/arm
gating, the deterministic auto-close predicate, and verification wiring are all
tested, and the loop dogfoods itself — its own .specfuse/features/ holds 20+
features taken through the full gate cycle, including multi-gate features whose
forward-design model (each gate's plan-next drafts the next) has held across
four consecutive gates.
What works today: single-feature and orchestrator-dispatched features; adopting a
GitHub specfuse:feature issue into a dispatchable folder; GitHub issue-label
state transitions for adopted features; per-gate auto-close on clean runs with a
full-ceremony fallback when a gate goes off-plan; and a single-driver working-tree
lock so two drivers can't corrupt one checkout.
Expect rough edges. The interfaces (WU contract, RESULT block, correlation-ID
scheme, verification.yml shape) are stable; tooling around them is still
hardening.
License
Apache License 2.0. See LICENSE.
Release files for specfuse-loop 0.19.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| specfuse_loop-0.19.0.tar.gz | 1.3 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| specfuse_loop-0.19.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.0 MB
Release files / specfuse_loop-0.19.0.tar.gz
| Download URL | specfuse_loop-0.19.0.tar.gz |
|---|---|
| Size | 1.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
60c6ba8936496e6e717e933264cde7a6390d105105e6cafe7f61fca64701b1ad
|
|
BLAKE2b-256 checksum How to use checksums |
30a77e962332da0d1332335bc8820e9efcf43461ced341716ad5514d8fa13eb3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.
Transparency logRelease files / specfuse_loop-0.19.0-py3-none-any.whl
| Download URL | specfuse_loop-0.19.0-py3-none-any.whl |
|---|---|
| Size | 637.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b941f594dba2517bed168ac1c142c96929ac3218eb3dbe63068bd2d0e1c0939a
|
|
BLAKE2b-256 checksum How to use checksums |
5b09e679cb14f9977e0669003f8463cc342c1e0ff45bae63f4cb90836a6ff8ef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 10, 2026.
Transparency log