Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<img src="https://raw.githubusercontent.com/qualixar/bounded-loops/main/assets/bounded-loops-logo.svg" alt="bounded-loops logo" width="170"/>
</p>

<h1 align="center">bounded-loops: Bounded Loops &amp; Graphs</h1>
<h1 align="center">Bounded Loops &amp; Graphs — independent gates for AI agent loops</h1>

<p align="center"><a href="https://arxiv.org/abs/2609.27871"><strong>Read the paper · arXiv:2609.27871</strong></a><br/><small>Research experiments: v0.6.6 · Current software: v0.7.6</small></p>

Expand All @@ -27,16 +27,18 @@ Every run leaves a hash-chained record you can re-verify afterwards.</p>
*Replay of the shipped keyless reference example: the worker is a stub, and the pytest gate is real.*

```bash
pip install bounded-loops
bl loops install bug-fix-red-green
bl run .bounded-loops/loops/bug-fix-red-green --yes # a real planted bug, a real pytest gate, no API key
python -m pip install bounded-loops
bl loops install bug-fix-red-green --dest ./loops
bl run loops/bug-fix-red-green --yes --run-id first-proof # stub worker, real pytest gate
```

The wheel includes 69 loop packages; 65 need no API key. This repository also ships seven
digest-pinned graphs. `bl loops install` copies a package offline into your project, where
`bl run` can write its ledger. Try a [failing test](loops/bug-fix-red-green/),
[retail margin rule](loops/price-margin-floor/), or [invoice match](loops/invoice-3way-match/).
Use a graph for joins, repair routes, or approval before an effect.
The wheel ships 69 loops (65 keyless); the repository adds seven digest-pinned graphs. Install offline;
run locally. Try [tests](loops/bug-fix-red-green/), [margin rules](loops/price-margin-floor/),
or [invoice matching](loops/invoice-3way-match/). Graphs support joins, repairs and approvals.

**[Verify receipts](docs/QUICK_PROOF.md)** · **[Product guide](https://qualixar.com/products/bounded-loops)** · **[Author](https://www.varunpratap.com/products/bounded-loops)**

Useful in your workflow? [Star the repository](https://github.com/qualixar/bounded-loops). Access remains open without starring.

**Research scope.** The [paper](https://arxiv.org/abs/2609.27871) evaluates v0.6.6;
the current software is v0.7.6. Later changes are not paper results.
Expand Down
31 changes: 31 additions & 0 deletions docs/QUICK_PROOF.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# A keyless acceptance-gate proof

Install the published package and copy the demo into an explicit writable directory:

```bash
python -m pip install bounded-loops
bl loops install bug-fix-red-green --dest ./loops
bash loops/bug-fix-red-green/wreck.sh
# Expected exit 1: the ungated stub claims GREEN while its tests fail.
bl run loops/bug-fix-red-green --yes --run-id first-proof
```

The worker is a synthetic stub; the pytest gate is real. The local verification
on 1 October 2026 passed six tests and reached DONE in one lap. No hosted model,
accuracy benchmark, latency comparison or savings estimate is involved.
Use a fresh run-id for each new run. Inspect the gate and runner before using --yes.

Record the printed ledger_head independently of the run directory, then verify:

```bash
bl verify loops/bug-fix-red-green/.bounded-loops/runs/first-proof/ledger.jsonl --expect-head YOUR_RECORDED_HEAD --json
```

The local persisted proof passed chain, separate-head match and completeness.
A plain chain check without a retained head and run metadata is weaker evidence;
it should not be described as all checks verified. The external head is useful
only if the party editing the run directory cannot also replace your retained copy.

The CLI may print its trust notice before JSON output. Consumers must distinguish
that notice from the outcome object rather than assuming all stdout is one JSON value.
The [paper](https://arxiv.org/abs/2609.27871) states the research protocol and assumptions.
Loading