This release is a pre-release and may not be stable for production use.
agentic-dev-loop
Turn an LLM into a gated, sandboxed, resumable construction loop over your codebase.
Describe your pipeline in one YAML file — agent steps, mechanical test gates, and
trusted actions — and agentic-dev-loop runs it end to end: agent and command steps get
kernel-level sandboxing via Docker, verdicts route the graph, every boundary is
checkpointed, and nothing gets committed until every gate passes.
flowchart LR
dev["agent: dev"] --> test{{"test gate"}} --> review["agent: review"] --> qa["agent: qa"] --> commit["action: commit"]
test -- fail --> dev
review -- fail --> dev
qa -- fail --> dev
- A tool, not a wiring project. One CLI entry point, opinionated defaults, fixed safety policies. You write the pipeline and the agent definitions — nothing else.
- Deterministic. Same pipeline + same state → same routing. Verdicts are parsed from files, retries are bounded, nothing is best-effort.
- Sandboxed by default. The agent's shell and every command step run inside an always-on Docker sandbox. There is no opt-out.
Core features
| Feature | What it gives you |
|---|---|
| Stage-gated agent loop | Agents do the work, test stages verify it, and the pipeline only advances when each stage passes its gates — looping back with full context when one fails. |
| Kernel-level sandboxing | Agent work and command stages run isolated from your machine: no network access, no writes outside your workspace. No sandbox available → the run stops instead of degrading. |
| Crash-safe resume | Interrupt a run at any time and pick it up later — finished stages stay finished, and you resume from exactly where it stopped. |
| Live graph visualisation | Follow every run in the browser: stage status, pass/fail verdicts, retry cycles, and live console output as it happens. |
| Extensible | Plug in your own actions, tools, and document loaders to adapt the loop to your projects. |
The fixed policies are the product: fail fast on missing config/secrets, no silent fallbacks, verdicts only from artifacts, bounded retries, per-attempt artifact hygiene, a single clean-worktree-gated commit point, and no default LLM timeout (agent runs are long).
Installation
Prerequisites
| Requirement | Detail |
|---|---|
| Python | ≥ 3.12 |
| Docker engine | Engine API ≥ 1.43 (Engine 24). Any compliant engine works — Docker Desktop, OrbStack, Colima, Rancher Desktop, podman docker-compat. On Windows, Linux-containers mode is required. |
| LLM API key | The env var named by your pipeline's api_key_env (e.g. OPENAI_API_KEY) must be set — a missing key fails fast, naming it. |
pip install agentic-dev-loop==1.0.0a1 # current release (alpha — pin it explicitly)
# or: pip install --pre agentic-dev-loop
agentic-dev-loop --version
On the first run the engine pulls the digest-pinned dev image
(ghcr.io/lukedawilson/agentic-dev-loop/dev) and verifies its digest — the
supply-chain check refuses to continue on a mismatch. If you're running
pre-publish tooling, point AGENTIC_DEV_LOOP_DEV_IMAGE at your locally built
image. Engine setup, first-run details, the full pipeline.yaml contract, and
troubleshooting for every fail-fast code live in
docs/setup.md.
Usage
export OPENAI_API_KEY=... # whatever api_key_env names
agentic-dev-loop pipeline.yaml # run it
agentic-dev-loop pipeline.yaml --dry-run # validate first — no LLM, no Docker
agentic-dev-loop pipeline.yaml --resume <thread-id> --max-attempts 5
| Flag | Effect |
|---|---|
--dry-run |
Full load-and-validate pass, then print the resolved plan. No LLM, no Docker, no state writes, no API key. Exit 0 on a clean load. |
--resume <thread-id> |
Continue the latest checkpoint of a previous run (crash, Ctrl-C, exhaustion) with all accumulated notes intact. |
--max-attempts <n> |
Override the pipeline's max_attempts. |
--refresh |
Force re-provision of every setup: hook (bypasses the stamp cache). |
--clean-stamps |
Delete cached provision stamps and exit. |
--no-viz / --viz-port <port> |
Suppress the live graph view / set a preferred port (default 8321; falls back to a free port when busy). |
| extension flags | Document-loader flags (e.g. --plan, --aidlc-unit) appear once the pipeline's extensions are loaded — agentic-dev-loop PIPELINE --help shows them. |
Exit code is 0 on pipeline success, 1 otherwise.
What a run looks like (the shipped self-loop example):
- dev — the dev agent works with full context (loaded docs + shared files).
Its edits are untracked; only declared
produces:files are hygiene-tracked. - test — a mechanical command step runs the suite inside the sandbox.
Exit 0 moves on; anything else rewinds to
devwith the failing output. - review / qa — verdict agents write artifacts whose
VERDICT:lines route the graph.failrewinds todevand consumes an attempt. - commit — the single commit point fires only when all gates passed and the worktree was clean at start.
- success — committed; or failure when attempts are exhausted.
pipeline.yaml reference
name: my-construction-loop
extensions:
- agentic_dev_loop.extensions.aidlc:AidlcExtension # bundled AI-DLC doc loader
additional_files:
- ../README.md # shared context for every agent step
llm:
model: openai/deepseek-v4-pro
base_url: https://api.deepseek.com
api_key_env: OPENAI_API_KEY
max_attempts: 10 # CLI --max-attempts overrides
agents_dir: sdk_agents # your <name>.agent.md files
steps:
- name: dev
agent: dev
produces: implementation-summary.md
on_pass: test
- name: test
command: .venv-sandbox/bin/python -m pytest tests/ -q -m "not docker"
setup: python -m venv .venv-sandbox && .venv-sandbox/bin/pip install -e ".[dev]"
timeout: 600
on_pass: review
on_fail: { goto: dev, retry: true }
- name: review
agent: review
artifact: review-findings.md
verdicts: { pass: APPROVED, fail: NEEDS CHANGES }
on_pass: qa
on_fail: { goto: dev, retry: true }
- name: qa
agent: qa
artifact: qa-report.md
verdicts: { pass: PASS, fail: FAIL }
on_pass: commit
on_fail: { goto: dev, retry: true }
- name: commit
action: commit
params: { message: "feat: construct {subject} (agent dev loop)" }
| Key | Notes |
|---|---|
agent: / command: / action: |
Exactly one per step. Agents live in agents_dir as <name>.agent.md; commands run sandboxed (mechanical, never an LLM call); actions are registered host-side functions. |
produces: / artifact: + verdicts: |
Hygiene-tracked outputs vs verdict-parsed routing. The last VERDICT: line wins; stale artifacts are deleted at each attempt start. |
on_pass: / on_fail: |
A step name, terminal success/failure, or {goto: X, retry: true}. No loops happen unless you write them. |
env: / setup: (command steps) |
Declared env inside the sandbox (fixed safe base + declared vars only); setup: provisions the sandbox (network ON, stamp-cached, --refresh forces). |
isolation: (optional) |
Configures the sandbox — image override, resource caps, allow_git_mutations. It can never disable it. |
state_dir |
Defaults to ~/.agentic-dev-loop/runs/<pipeline-hash>/ — artifacts and checkpoints live outside the sandbox mount. |
Development environment
git clone git@github.com:lukedawilson/agentic-dev-loop.git
cd agentic-dev-loop
./setup-venv.sh # idempotent .venv setup (never touches bare pip)
# create .env with your LLM key (loaded by trigger-agentic-dev-loop.sh, never committed):
# echo 'OPENAI_API_KEY=...' > .env
python -m pytest tests/ -q # fast suite
python -m pytest tests/ -q -m "not docker" # skip engine-dependent tests
./trigger-agentic-dev-loop.sh --dry-run # run the shipped pipeline against this repo
./run-demo.sh # viz demo — scripted run replay, no pipeline needed
setup-venv.shis safe to re-run and picks the right interpreter even on machines with exotic Python installations.- Docker-marked integration tests need a local daemon; CI runs them on Linux.
- The shipped pipeline (
agentic-dev-loop/pipeline.yaml) dogfoods the tool on its own repo — dev → test → review → qa → commit, with the engine's own three agent definitions insdk_agents/. - CI:
ci.yml(unit + integration suite, ubuntu + windows),publish-image.yml(multi-arch dev image, amd64 + arm64),release.yml(PyPI publishing).
Contributing
- Read AGENTS.md first — it is the instruction set for both human and agent contributors (default mode: the user drives, ask before coding, TDD, no silent fallbacks).
- Development is structured by AI-DLC — the lifecycle workflow in
.aidlc/aidlc-rules/aws-aidlc-rules/with working docs (plans, units, state) inaidlc-docs/. The bundled document loader autodetects the current unit fromaidlc-state.mdvia--aidlc-unit, or load any plan with--plan. - OpenCode commands over the workflow:
/unit-status,/epic-status,/ticket-details,/update-subtask,/apply-aidlc-patches, and more. - Working extension samples (actions, tools, document loaders) ship as
tests/sample_ext.py.
Built on OpenHands SDK and LangGraph.
Metadata
Release files for agentic-dev-loop 1.0.0a2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| agentic_dev_loop-1.0.0a2.tar.gz | 126.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agentic_dev_loop-1.0.0a2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 194.8 kB
Release files / agentic_dev_loop-1.0.0a2.tar.gz
| Download URL | agentic_dev_loop-1.0.0a2.tar.gz |
|---|---|
| Size | 126.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1a5693cd95a71516b13a9f4b368c88c6af99870450a0deb089988533773e97bc
|
|
BLAKE2b-256 checksum How to use checksums |
eb3ed47835c5aebbf4d1dd635855266d076c09f40e18eeb1ea4dc46f1e40f32b
|
| 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 Oct 20, 2026.
Transparency logRelease files / agentic_dev_loop-1.0.0a2-py3-none-any.whl
| Download URL | agentic_dev_loop-1.0.0a2-py3-none-any.whl |
|---|---|
| Size | 68.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
43a80123d17ea828909aa3d14476ca7b3f4017431a0f68589f59af7b5c1a5c75
|
|
BLAKE2b-256 checksum How to use checksums |
41b12c5ab1604bd2aca1841b38789015c47185719a0e662881be94ee097b9b5a
|
| 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 Oct 20, 2026.
Transparency logSecurity for agentic-dev-loop 1.0.0a2
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for agentic_dev_loop-1.0.0a2.tar.gz
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 Oct 20, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.