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: 17 additions & 3 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,25 @@
{
"name": "loop-engineer",
"version": "0.8.0",
"version": "0.9.0",
"description": "Design, launch, verify, repair, and improve agent loops. A Claude-Code-native architect+operator for long-running, verifiable, self-improving agentic-coding systems.",
"author": { "name": "Sollan Systems", "url": "https://github.com/SollanSystems" },
"author": {
"name": "Sollan Systems",
"url": "https://github.com/SollanSystems"
},
"homepage": "https://github.com/SollanSystems/loop-engineer",
"repository": "https://github.com/SollanSystems/loop-engineer",
"keywords": ["agent", "loop", "agentic", "verification", "harness", "orchestration", "self-improvement", "claude-code", "eval", "repair"],
"keywords": [
"agent",
"loop",
"agentic",
"verification",
"harness",
"orchestration",
"self-improvement",
"claude-code",
"eval",
"repair"
],
"license": "MIT",
"hooks": {
"Stop": [
Expand Down
62 changes: 62 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,68 @@ All notable changes to `loop-engineer` are documented here.
`WORKFLOW.md` and `README.md` are reworded to describe the mechanism; the 0.3.4
history is left intact.

## 0.9.0 — 2026-07-17

**The event-sourced kernel.** The contract gains a durable runtime substrate:
`loop-engineer/event@1` events in an append-only SQLite store
(`.loop/events.db` — WAL, `synchronous=FULL`, no-update/no-delete triggers,
`expected_sequence` compare-and-swap) folded by a deterministic reducer that
enforces FSM legality, the all-required completion gate, and terminal
immutability through the same `loop.fsm`/`loop.completion` modules the
writers use (#62). Around it: a canonical intermediate-state FSM with
unknown-state validation and writer timestamps (#59); `loop-engineer/plan@1`
— a Loop Plan IR with a `plan-lint` verb and a typed capability vocabulary
(#61); `loop-engineer/evidence@1` — hashed evidence objects with provenance,
re-verifiable byte-for-byte (#63); administrative `terminal_superseded`
events — the only event a terminated run admits, so a wrong terminal is
corrected on the record instead of edited in place (#64); a run-control event
vocabulary for approval, pause, and resume (#73); and explicit validation
modes `--mode basic|strict|release` across the CLI (#60).

**Runtime verbs.** `loop run` — event-sourced single-step dispatch with
crash-safe resume (#71); read-only `loop status` and `loop replay` (#70);
`loop simulate` — strictly read-only dry-run dispatch prediction (#75);
`approve` / `pause` / `resume` / `cancel` (#74); a subprocess-isolated
verifier runner — shlex argv, no shell, wall-clock cap, bounded output tail,
typed failure classes — plus typed fail-loud stubs for the not-yet-shipped
run modes (#72); `loop architect` as a typed fail-loud deferral (#76). And
`loop doctor` now composes an event-store consistency gate over
`status`/`replay` whenever `.loop/events.db` exists — one hard gate across
the file layer and the event log (#77).

**Completion-semantics hardening (Phase 0).** `Succeeded` now requires
**all** required criteria satisfied plus evidence — the prior any-true
reading was a correctness bug, fixed in one shared `loop/completion.py`
wired into the writer API, the integrations projection, and the contract
validator's G1 check. `terminal_state.json` is create-once (atomic;
`force` always raises); iteration ids are canonical ints (legacy decimal
strings stay read-compatible); `terminal@1` gains an additive
`completion_policy` (#48).

**Adversarial hardening.** A property-based kernel suite over FSM legality,
G1 completion, supersession, and replay determinism (#65), and a
process/security suite — real crash injection at code-controlled barriers,
verifier tampering, workspace-escape TOCTOU (#66). The `verify_evidence()`
symlink-swap TOCTOU that suite discovered (#67) is closed by fd-pinned
open-then-verify (#69), retiring the strict xfail marker.

**Scoreboard, funnel, housekeeping.** The ST5 harness scoreboard — 9 public
harnesses read through a foreign-layout registry with 8 vendored fixtures
(#41); contributor-funnel fixes — trigger-phrase disambiguation (#42),
documentation-completeness labels on the self-eval (#43),
`approval_requested`/`replanned` recognized as honest-red metrics tokens
(#44), metrics-clean RUNLOG seeding (#45); Dependabot version updates and
least-privilege workflow permissions (#46, #47).

**Known limitation.** Read verbs over the event store leave SQLite
`-wal`/`-shm` sidecars next to `.loop/events.db` (read-only connections
recreate them and cannot checkpoint on close). Store content is never
mutated, but tree-byte-identity checks over a store-backed workspace will
notice them.

Test baseline: 933 passed / 16 skipped with the `yaml`+`schemas` extras;
864 / 85 in structural-fallback mode (PyYAML only).

## 0.8.0 — 2026-07-09

**ST3 — integration adapters.** `loop/integrations.py`: an engine-neutral,
Expand Down
20 changes: 15 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
[![CI](https://github.com/SollanSystems/loop-engineer/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/SollanSystems/loop-engineer/actions/workflows/ci.yml)
[![Python 3.10–3.12](https://img.shields.io/badge/python-3.10%E2%80%933.12-blue)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
[![Release](https://img.shields.io/badge/release-0.8.0-blue)](https://github.com/SollanSystems/loop-engineer/tags)
[![Release](https://img.shields.io/badge/release-0.9.0-blue)](https://github.com/SollanSystems/loop-engineer/tags)

Long-running agents commit **false completion**. After context compaction they
forget what "done" meant, optimize to the visible test, patch in circles, and
Expand All @@ -20,7 +20,11 @@ ships, on disk and runnable today:
- a **held-out gate** and an **anti-cheat scan** built to catch a loop gaming its
own verifier;
- a runnable example whose `false_completion: false` is backed by a committed,
real gate verdict — `.loop/artifacts/holdout-verdict.json`, not a hand-set flag.
real gate verdict — `.loop/artifacts/holdout-verdict.json`, not a hand-set flag;
- an **event-sourced runtime** — `run`, `status`, `replay`, `simulate`, and
approve/pause/resume/cancel over an append-only SQLite event log
(`.loop/events.db`), folded by a deterministic reducer that enforces the same
completion gate as the writers, with crash-safe single-step resume.

![The inspector scores a self-asserted DIY loop 0/weak, then the gate-backed example 90/strong — both runs live](docs/demo.gif)

Expand Down Expand Up @@ -280,6 +284,12 @@ The portable core lives in `loop/` and validates schema-bearing artifacts in
- `loop-engineer/state@1`
- `loop-engineer/tasks@1`
- `loop-engineer/terminal@1`
- `loop-engineer/receipt@1`
- `loop-engineer/repair@1`
- `loop-engineer/rollout@1`
- `loop-engineer/plan@1`
- `loop-engineer/event@1`
- `loop-engineer/evidence@1`

### Claude Code plugin

Expand Down Expand Up @@ -318,7 +328,7 @@ present. Recipe:
**CI** — one workflow step validates the contract and publishes a scorecard:

```yaml
- uses: SollanSystems/loop-engineer@v0.8.0
- uses: SollanSystems/loop-engineer@v0.9.0
with:
path: "."
```
Expand Down Expand Up @@ -411,8 +421,8 @@ doctor` and the contract's own `verify-*` scripts).

## Status

- Version: `0.8.0`
- Release tag: `v0.8.0` (PyPI publish trigger; plugin tags through 0.6.0 used `loop-engineer--v<version>`)
- Version: `0.9.0`
- Release tag: `v0.9.0` (PyPI publish trigger; plugin tags through 0.6.0 used `loop-engineer--v<version>`)
- License: MIT
- Primary interface: Claude Code plugin
- Portable core: Python CLI + JSON schemas
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "loop-engineer"
version = "0.8.0"
version = "0.9.0"
description = "Portable Loop Contract Core: validate and inspect repo-native operating contracts for agent loops."
readme = "README.md"
requires-python = ">=3.10"
Expand Down
5 changes: 3 additions & 2 deletions scripts/test_docs_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ def test_readme_has_no_stale_seven_skills():
assert "all 9 skills" in readme


def test_plugin_version_is_0_8_0():
def test_plugin_version_is_0_9_0():
plugin = json.loads(_read(".claude-plugin/plugin.json"))
assert plugin["version"] == "0.8.0"
assert plugin["version"] == "0.9.0"


def test_pyproject_version_matches_plugin():
Expand All @@ -30,6 +30,7 @@ def test_pyproject_version_matches_plugin():

def test_changelog_has_current_and_historical_entries():
changelog = _read("CHANGELOG.md")
assert "## 0.9.0" in changelog
assert "## 0.8.0" in changelog
assert "## 0.7.0" in changelog
assert "## 0.6.1" in changelog
Expand Down