Local-first executor for the Specfuse Plan + Work Unit gate-cycle methodology.
Project description
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/scripts/loop.py) 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 from the Claude Code marketplace:
pip install specfuse-loop # the driver: `specfuse-loop` on PATH
# in Claude Code: skills under the /specfuse: namespace
# /plugin marketplace add specfuse/specfuse
# /plugin install specfuse@specfuse
# scaffold a target repo's .specfuse/ state (templates, rules, verification.yml)
./init.sh /path/to/your-project # legacy installer (v1.0; removed in v1.1)
cd /path/to/your-project
$EDITOR .specfuse/verification.yml # match the `code` gates to your stack
# author your first feature folder under .specfuse/features/ from .specfuse/templates/
specfuse-loop --dry-run # or: python .specfuse/scripts/loop.py --dry-run
specfuse-loop
Distribution (FEAT-2026-0019). Code ships via pip (
specfuse-loop), thespecfuseumbrella CLI bridges pip ↔ plugin (specfuse upgrade), and Claude assets ship via thespecfuse/specfusemarketplace.init.shremains the scaffold bootstrap (laying down.specfuse/state) until pip-native scaffolding lands; it prints a deprecation banner.
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 scaffold .specfuse/ into a target repo
├── 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)
init.sh 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.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file specfuse_loop-0.3.0.tar.gz.
File metadata
- Download URL: specfuse_loop-0.3.0.tar.gz
- Upload date:
- Size: 296.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f110107990ed674f24f3a6500d8331cfffa4a8ecd3bf4bd93b88d1c8f4004831
|
|
| MD5 |
3c13ef25dd18ec9143cab4d3ffab430f
|
|
| BLAKE2b-256 |
fc3b6b3bf64b6fa2b814829f8d3cfcaacc609e8dc3b03eed8cac1bf8bfea2404
|
Provenance
The following attestation bundles were made for specfuse_loop-0.3.0.tar.gz:
Publisher:
release.yml on specfuse/loop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
specfuse_loop-0.3.0.tar.gz -
Subject digest:
f110107990ed674f24f3a6500d8331cfffa4a8ecd3bf4bd93b88d1c8f4004831 - Sigstore transparency entry: 1911676747
- Sigstore integration time:
-
Permalink:
specfuse/loop@c88f41c55e5542b6e2718a52e3fe75fe9f416cb6 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/specfuse
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c88f41c55e5542b6e2718a52e3fe75fe9f416cb6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file specfuse_loop-0.3.0-py3-none-any.whl.
File metadata
- Download URL: specfuse_loop-0.3.0-py3-none-any.whl
- Upload date:
- Size: 137.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a222af5198d05f523b471a7b7b768acb02b22e05007541ddfc67afb8dcee15fa
|
|
| MD5 |
4e2491cc6b95fd4722ec4334eb7dac94
|
|
| BLAKE2b-256 |
c3c142fe43fe754404b2e8cfb771f42cf80b798103c69400d87dad868e38aab7
|
Provenance
The following attestation bundles were made for specfuse_loop-0.3.0-py3-none-any.whl:
Publisher:
release.yml on specfuse/loop
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
specfuse_loop-0.3.0-py3-none-any.whl -
Subject digest:
a222af5198d05f523b471a7b7b768acb02b22e05007541ddfc67afb8dcee15fa - Sigstore transparency entry: 1911676890
- Sigstore integration time:
-
Permalink:
specfuse/loop@c88f41c55e5542b6e2718a52e3fe75fe9f416cb6 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/specfuse
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@c88f41c55e5542b6e2718a52e3fe75fe9f416cb6 -
Trigger Event:
push
-
Statement type: