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 durableStateStorein one SQLite file, standard library only. JSON text only (nothing is unpickled), a new file is created with mode 0600, run ids are limited toA-Za-z0-9_-(1-64), and a stored row that is corrupt, names another run or has an unknown status is refused withValueError. 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) -> boolon both shipped stores (an atomic compare-and-set; SQLite usesBEGIN IMMEDIATE) and theAtomicStateStoreprotocol 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 hassave_if_statusthe claim is now atomic. A store with onlysave()andload()keeps the old, non-atomic behaviour.- A stored run state that a store refuses as corrupt now makes
resume()raiseResumeError, 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-agentsbetween 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 checkclean, the version string, an empty run returnsstoppedwithout 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()andload()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