From a3cf83db5c47309a223e9c697823ba61867d3f70 Mon Sep 17 00:00:00 2001 From: Sollan Systems Date: Fri, 17 Jul 2026 12:38:30 -0400 Subject: [PATCH] =?UTF-8?q?chore(release):=20cut=20v0.9.0=20=E2=80=94=20ev?= =?UTF-8?q?ent-sourced=20kernel=20+=20runtime=20verbs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Version 0.8.0 -> 0.9.0 across pyproject.toml, plugin.json, README (badge, action example, schema list 4 -> 10, event-sourced runtime bullet, Status), CHANGELOG 0.9.0 entry covering #41-#48 and #59-#77, and the version-pin test. --- .claude-plugin/plugin.json | 20 ++++++++++-- CHANGELOG.md | 62 ++++++++++++++++++++++++++++++++++++ README.md | 20 +++++++++--- pyproject.toml | 2 +- scripts/test_docs_version.py | 5 +-- 5 files changed, 98 insertions(+), 11 deletions(-) diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index d67e29a..02a7f5b 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -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": [ diff --git a/CHANGELOG.md b/CHANGELOG.md index 546cbc6..258e6ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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, diff --git a/README.md b/README.md index fe04475..a08b424 100644 --- a/README.md +++ b/README.md @@ -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 @@ -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) @@ -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 @@ -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: "." ``` @@ -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: `0.9.0` +- Release tag: `v0.9.0` (PyPI publish trigger; plugin tags through 0.6.0 used `loop-engineer--v`) - License: MIT - Primary interface: Claude Code plugin - Portable core: Python CLI + JSON schemas diff --git a/pyproject.toml b/pyproject.toml index 06e7967..2c3c875 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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" diff --git a/scripts/test_docs_version.py b/scripts/test_docs_version.py index 8a70eae..101271c 100644 --- a/scripts/test_docs_version.py +++ b/scripts/test_docs_version.py @@ -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(): @@ -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