RagLeap
ragleap-agents · release notes

ragleap-agents v0.4.0

Fourth release of ragleap-agents. Install: pip install ragleap-agents==0.4.0.

Behaviour change from 0.3.0

A run with no tools, or with an empty task, now returns status="stopped" with stop_reason="no_task_or_tools". 0.3.0 and earlier returned status="done" for it, although nothing had happened. Code that checked only status == "done" now sees stopped in this case.

What is new

  • SQLiteStateStore(path): a durable StateStore in one SQLite file, standard library only. JSON text only (nothing is unpickled), a new file is created with mode 0600, run ids are limited to A-Za-z0-9_- (1-64), and a stored row that is corrupt, names another run or has an unknown status is refused with ValueError. The file is not encrypted: it holds tool arguments and observations, so protect it like that data.
  • save_if_status(run_id, state, expected_status) -> bool on both shipped stores (an atomic compare-and-set; SQLite uses BEGIN IMMEDIATE) and the AtomicStateStore protocol that describes it.

Fixed

  • resume() claimed a paused run with load, check, save, which two workers could both pass, so an approved call could run twice. With a store that has save_if_status the claim is now atomic. A store with only save() and load() keeps the old, non-atomic behaviour.
  • A stored run state that a store refuses as corrupt now makes resume() raise ResumeError, and nothing runs.

Verified

  • 151 tests (123 in 0.3.0). CI on the release PR (run 39036065260): the ragleap-agents tests passed on Python 3.10, 3.11 and 3.12. CI on the merge commit completed successfully.
  • The agents code at the tag is identical to the PR head that CI tested (no difference under packages/ragleap-agents between the merge commit's second parent and the merge commit).
  • The published wheel and sdist digests match the publish log and PyPI (below).
  • The published wheel installed into a fresh virtual environment, run from outside the repository, on Python 3.10.12 (the VPS) and 3.12.3 (a separate environment): pip check clean, the version string, an empty run returns stopped without calling the model, a SQLite round trip with file mode 0600, a claim succeeds exactly once, a paused run resumes from a second agent on a new store object with the call executed once and a second resume refused, and of four separate processes racing to claim one run exactly one wins. These were checked with a throwaway script that is not part of the repository.
  • Written tests first: the new resume test failed before the change (the second resume did not raise) and the tampered-row test failed with a ValueError instead of ResumeError; both pass after it. The SQLite store has 24 tests; mutation-checked: removing the status check, skipping run-id and state validation, a 0644 file mode, skipping the corrupt-row checks, and a deferred BEGIN instead of BEGIN IMMEDIATE are each caught by at least one test.

Not verified

  • The published wheel on Python 3.11 (CI runs the tests on 3.11; the fresh-install check was not run there).
  • SQLite on a network filesystem (file locking there is unreliable; use a local disk), throughput, and long-running use. The file is not encrypted.
  • Stores other than the two shipped ones: a custom store with only save() and load() cannot make the claim atomic.
  • Unchanged since 0.3.0: the prompt wording was not touched, so the real-model results of 0.3.0 stand and were not re-run for this release. JSON mode on the model tested is still intermittent, and the taint rule has still never been triggered by a real model.

Correction

  • The 0.3.0 CHANGELOG section is headed 2026-10-13, but the 0.3.0 tag was pushed on 2026-10-15 (tag run 38791601216). The date is corrected in this release's CHANGELOG; the published 0.3.0 files still carry the old date and cannot change.

Provenance

  • Code: release PR #811, merge commit 16bad91 (the changes are in #778 and #793).
  • Publish: tag run 39036326610, trusted publishing with attestations; the log shows both files uploaded, with no "skipping" line, so this was the first upload.
  • Digests (sha256), identical on PyPI and in the run log:
    • ragleap_agents-0.4.0-py3-none-any.whl: 4631899060b0098327f72440e5581c4374b22155fe10745a47042e101bd421ed
    • ragleap_agents-0.4.0.tar.gz: b9653c4fef968bff9dcbcab8930611742a6fd15ad33fc143bad9cee0aa632bcb
View on GitHub Package page All releases
← v0.3.0

Release notes mirrored from GitHub Releases.