Skip to main content

let it loop (LIL)

let it loop (LIL)

Make any Python function or AI agent workflow crash-proof in 3 lines. Zero tokens wasted on SIGKILL.

Official Website PyPI version CI Matrix GitHub Action v2 Benchmark Python 3.11+ License: MIT

Official Website • DCP-2.0 Benchmark • GitHub Action v2 • PyPI Package


Temporal is great if you have a DevOps team to manage a cluster. LetItLoop is for developers who want crash-proof Python functions and AI agent pipelines in 3 lines of code without running a single daemon.


LetItLoop Process Crash & WAL Recovery Demo

⚡ Quickstart

from letitloop import durable, step, atomic_marker


@durable(goal_id="customer_sync")
def sync_workflow():
    # If this process crashes or gets SIGKILLed midway,
    # completed steps are skipped on resume in <15ms. Zero duplicate tokens wasted.
    user = step("fetch_user", fetch_crm_record, user_id=123)
    summary = step("summarize", call_claude, user)

    # Protect external API mutations against duplicate execution
    with atomic_marker("slack_notification") as should_execute:
        if should_execute:
            step("notify", send_slack, summary)

    return summary


if __name__ == "__main__":
    sync_workflow()
pip install letitloop

⚡ Async Support: For asynchronous pipelines, use @durable_async and await async_step(...) with full asyncio.gather() isolation.


🔄 Process Liveness: Auto-Supervision & CLI Watcher

LetItLoop bridges the gap between State Durability (saving steps to disk) and Process Liveness (auto-restarting on SIGKILL 137 / OOM) with zero external daemons:

1. Terminal Watcher (lil watch)

Run any existing Python script under supervisor control with rapid-failure circuit breaking and clean Ctrl+C handling:

# Auto-respawns on SIGKILL (137), resuming from last WAL checkpoint in ~14ms
lil watch agent_pipeline.py --max-restarts 10 --backoff 1.0

2. In-Code Programmatic Supervisor (@supervise)

from letitloop import durable, step, supervise


@supervise(max_restarts=5, backoff=1.0)
@durable(goal_id="equity_analyst")
def run_pipeline():
    user = step("fetch_data", fetch_financials)
    report = step("generate_report", analyze, user)
    return report


if __name__ == "__main__":
    run_pipeline()


🔌 Multi-Framework Durability Adapter Suite

Make any major AI multi-agent framework crash-resilient in 2 lines of code with zero daemon overhead:

# 1. CrewAI
from letitloop.adapters.crewai import CrewAIDurabilityHandler
handler = CrewAIDurabilityHandler(session_id="research_crew")
handler.wrap_crew(my_crew)

# 2. Hugging Face Smolagents
from letitloop.adapters.smolagents import SmolagentsWALCallback
agent = CodeAgent(tools=[...], model=model, step_callbacks=[SmolagentsWALCallback()])

# 3. Microsoft AutoGen 0.4
from letitloop.adapters.autogen import AutoGenStateSerializer
serializer = AutoGenStateSerializer(session_id="autogen_chat")
serializer.wrap_agent(assistant_agent)

# 4. LangGraph
from letitloop.adapters.langgraph import LetItLoopCheckpointSaver
app = workflow.compile(checkpointer=LetItLoopCheckpointSaver())

See docs/adapters.md for complete framework recipes, lifecycle callbacks, and benchmark details.

💎 The 3 Architectural Moats

1. Zero-Daemon Local Durability (Zero Infrastructure)

No background Go servers, no Redis queues, and no PostgreSQL cluster configuration. LetItLoop embeds a single-file Write-Ahead Log (LILWAL02) that logs step outputs atomically. If your script dies from SIGKILL (137), OOM, or spot eviction, running the script again instantly fast-forwards to the exact interrupted step in ~14ms.

2. Source-Span AST Node Splicer (0% Comment Loss)

Temporal and existing orchestrators only manage task state. LetItLoop includes a surgical Python concrete syntax tree (CST) engine built specifically for self-coding AI agents:

  • Replaces targeted functions and classes with surgical precision.
  • 0% Comment Loss: Guarantees module docstrings, inline comments, licensing headers, and class indentation are never stripped or hallucinated away by LLM whole-file rewrites.

3. Proof-Carrying CI Gate (letitloop-action)

LetItLoop generates signed HMAC-SHA256 receipts recording execution invariants and test outputs. Drop letitloop-action@v2 into GitHub Actions to block AI pull requests from hallucinating passing test outputs or altering protected function signatures.


📊 DCP-2.0 Agent Durability Conformance Benchmark

How does LetItLoop compare against heavyweight workflow engines and existing agent frameworks under physical host OS SIGKILL (137) fault injection?

Empirical results from the open DCP-2.0 Durability Benchmark:

Architecture & Runtime Durability Mechanism Crash Recovery ($R_{crash}$) Resumption Latency ($T_{resume}$) Duplicate Token Waste ($W_{token}$) Per-Step Write Overhead Proof / Audit Trail
LetItLoop (@durable WAL) Single-File Atomic WAL (LILWAL02) 98.6% PASS 14.2 ms 2.8% (interrupted step) +3.8 ms (fsync journal) HMAC-SHA256 Sealed
Temporal (Durable Workflows) Distributed Event Sourcing (Cluster) 99.2% PASS 74.0 ms 1.9% +18.5 ms (gRPC cluster) Cluster Event History
LangGraph (SQLite Saver) Superstep Graph Checkpointing 84.5% PARTIAL 38.4 ms 16.8% (node re-run) +1.2 ms (SQLite row) Database Row Logs
CrewAI (In-Memory Loop) In-memory process queue 0.0% LOSS N/A (Full restart) 100.0% (Total wipe) 0.0 ms (Zero disk writes) None
Microsoft AutoGen In-memory ConversableAgent state 0.0% LOSS N/A (Full restart) 100.0% (Total wipe) 0.0 ms (Zero disk writes) None
Raw Python (Unmanaged CLI) Standard runtime globals 0.0% LOSS N/A (Full restart) 100.0% (Total wipe) 0.0 ms (Zero disk writes) None

🔄 Durability vs. Liveness (Auto-Supervision)

  • Durability (LetItLoop Kernel): Guarantees that completed state is never lost when a process terminates.
  • Liveness (Supervisor Runner): When a process gets killed by the OS (SIGKILL), it requires a supervisor to automatically respawn it. LetItLoop provides built-in supervision:
# Supervise execution and auto-respawn process on unhandled SIGKILL/crash until completion
lil run --task auth-refactor --supervise --strict

🍳 Framework Recipes & Community Cookbooks

Explore runnable self-contained examples in examples/:

Framework Recipe / Cookbook Status Description
CrewAI Durable Tools Example ✅ Ready Multi-agent tool execution with step-level resumption and zero duplicate side-effects
LlamaIndex Durable Workflows Example ✅ Ready Event-driven @step pipeline with crash durability and sub-millisecond fast-forward
OpenAI Swarm Durable Handoff Example ✅ Ready Multi-agent context handoff with WAL v2 serialization
LangGraph Financial Analyst Agent ✅ Ready 4-step yfinance + DeepSeek StateGraph with independently audited SIGKILL recovery
DSPy Issue #83: Prompt Optimizer Pipeline 🤝 Contributor Async BootstrapFewShot / Teleprompter tuning with zero lost progress
Playwright Issue #88: Web Scraping Agent 🤝 Contributor Multi-page browser scraper that checkpoints DOM items to skip scraped pages
Pydantic AI Issue #89: Pydantic AI Integration 🤝 Contributor Type-safe agent with tool-calling checkpointing and zero token waste

Install and run the financial analyst without paid API calls:

python -m pip install -e ".[financial-agent]"
python examples/cookbooks/langgraph_financial_analyst.py --ticker AAPL --offline
python examples/cookbooks/langgraph_financial_analyst.py --ticker AAPL --offline --demo

For a live investment memo, configure DeepSeek only through the environment:

export DEEPSEEK_API_KEY="your-key"
python examples/cookbooks/langgraph_financial_analyst.py --ticker AAPL --model deepseek:deepseek-v4-flash --live

If a local Python installation has no default CA bundle, set SSL_CERT_FILE="$(python -m certifi)". On POSIX, the demo sends SIGKILL only after the market data, indicators, and LLM memo have each been committed to WAL (Windows uses exit 137). It records yfinance/LLM calls and token usage in a separate fsynced log, then proves those counters do not increase on recovery. Reported <1ms measurements cover only in-memory async_step cache lookups—not Python startup, imports, WAL initialization, or the unfinished report node.


🛡️ GitHub Action CI Gate (v2)

Drop letitloop-action@v2 into your CI pipeline to block non-deterministic AI agent regressions:

name: LetItLoop Proof-Carrying CI Gate
on: [pull_request]

jobs:
  verify:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: sdageltc/letitloop-action@v2
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          strict-ast: 'true'

📜 Architecture Decision Records (ADRs)

Core design invariants are documented under docs/adr/:

  • ADR-0001: Write-Ahead Logging (WAL) & Zero-State Recovery
  • ADR-0002: Deterministic AST & Exit-Code Verification Gates
  • ADR-0003: Zero-API-Key Headless Agent CLI Failovers
  • ADR-0004: Format-Aware Acceptance Checks & Markdown Invariants

👥 Contributors

sdageltc
sdageltc

💻 📖 🚧
Yash Paudel
Yash Paudel

💻 📖
wangshen-tech
wangshen-tech

💻 📖 💡

License

Distributed under the MIT License. Copyright (c) 2026 sdageltc. See LICENSE for details.

Metadata

Release files for letitloop 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for letitloop 0.6.0
File Size Uploaded
letitloop-0.6.0.tar.gz 566.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for letitloop 0.6.0
File Interpreter ABI Platform
letitloop-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 1.0 MB

Release files / letitloop-0.6.0.tar.gz

Download URL letitloop-0.6.0.tar.gz
Size 566.8 kB
Tags Source
SHA-256 checksum
How to use checksums
ed11f79e6740dd059ddf2b46b2733afea017decb7dac88513ddc12c7f4a6563c
BLAKE2b-256 checksum
How to use checksums
7c5316aabb16111405a922be5e6cef3bf71304a8011e4144a305271d32f7b227
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 4, 2026.

Transparency log

Release files / letitloop-0.6.0-py3-none-any.whl

Download URL letitloop-0.6.0-py3-none-any.whl
Size 459.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
098d44879d95f7dccd554d22fd9030283cd780b0ac370faed410dcf83f9def3e
BLAKE2b-256 checksum
How to use checksums
e966fd3124778ea5d9e5a7af0bdbd17bb8bc9ba79b9d47be3cc4039e4b57eb32
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 4, 2026.

Transparency log

Release history Release notifications | RSS feed

0.7.0

2 release files

This release

0.6.0 This release

2 release files

0.4.0

2 release files

0.3.3

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release 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