Temporal replays code. LangGraph orchestrates graphs.
SemanticRun freezes what your agent already committed — and resumes with proof of what drifted.
Artifact-aware durable agent environment for Python.
Survive crashes, human waits, model swaps, and tool drift — without redoing completed work or silently replaying side effects.
from semanticrun import SemanticRun, PolicyMapping
env = SemanticRun.open("./runs.db")
run = env.start(
intent="Onboard lead_42",
plan=["research", "draft", "approve", "send"],
policies=PolicyMapping(
tool_result_hash_mismatch="revalidate",
model_id_changed="fail_fast",
outbound_payload_divergence="fail_fast",
),
)
for step in run.steps(): # completed steps skipped on resume
if step.name == "research":
lead = step.tool("crm_lookup", lambda: crm.lookup("lead_42"),
hash_exclude=["created_at"])
elif step.name == "draft":
draft = step.llm(lambda: llm.draft(lead), model="gpt-4.1")
step.remember("draft_email", draft)
elif step.name == "approve":
step.require_approval("send_email", {"draft": draft})
elif step.name == "send":
step.tool("send_email", lambda: mail.send(draft),
side_effect="external",
outbound={"to": lead["email"], "body": draft})
run = env.resume(run_id, artifacts=...) # matrix + policies; cursor continues
Day-one proof: drift recovery
Pause an agent mid-run, inject drift, resume three ways.
Suite: benchmarks/drift_recovery/ (OpenRouter free models when OPENROUTER_API_KEY is set; deterministic stub otherwise).
| Drift injected | Naive restart | Blind resume | SemanticRun |
|---|---|---|---|
| Model ID swap | continues blind | continues blind | abort (model_id_changed) |
| File edit while waiting | continues blind | continues blind | abort (file_tree_hash_mismatch) |
| Tool schema change | continues blind | continues blind | revalidate |
| Tool result drift | continues blind | continues blind | revalidate |
| Re-synthesized outbound | re-sends | re-sends | abort (outbound_payload_divergence) |
Score (5/5 scenarios): naive restart safe 0/5 · blind resume safe 0/5 · SemanticRun safe 5/5
That is the visceral loop Temporal had for distributed systems: feel the failure, then watch the environment refuse it. Papers describing the failure mode are not the product proof — this suite is.
python benchmarks/drift_recovery/run_suite.py
Why SemanticRun
| Temporal | LangGraph | SemanticRun | |
|---|---|---|---|
| Core idea | Replay workflow code | Orchestrate agent graphs | Diff committed artifacts on resume |
| Durability | Event history | Checkpointers | Sync checkpoints + plan cursor |
| Drift (tools / models / files) | App-level | App-level | Divergence matrix + enforced policies |
| Side effects | Activity semantics | App-managed | Outbound payload hash gate |
Not a Temporal or LangGraph plugin — the environment your agent runs in when the question is “what already happened, and is it still true?”
Install
pip install SemanticRun
# from source:
pip install -e ".[dev]"
pytest
python examples/survive_the_swap.py
What you get
- Durable plan cursor —
run.steps()skips finished work after resume - Sync checkpoints — written before the step returns (SQLite)
- Divergence matrix — mechanical diffs; no LLM guessing
- Enforced policies —
fail_fast/revalidate/strict_reset - Outbound replay gate — refuse divergent external side effects
License
MIT
Metadata
Release files for SemanticRun 0.4.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| semanticrun-0.4.2.tar.gz | 212.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| semanticrun-0.4.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 248.0 kB
Release files / semanticrun-0.4.2.tar.gz
| Download URL | semanticrun-0.4.2.tar.gz |
|---|---|
| Size | 212.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
51a5cafd8f8f6c0e64705cef56debeebfd47df1230f83b65be4f57da49dcd637
|
|
BLAKE2b-256 checksum How to use checksums |
74bd9e66da10cbfc60b0c99834baa9b4f4c1635e91f903798a352d27ea49e48a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 4, 2026.
Transparency logRelease files / semanticrun-0.4.2-py3-none-any.whl
| Download URL | semanticrun-0.4.2-py3-none-any.whl |
|---|---|
| Size | 35.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f0e501fc4e7950e031fa1084baa8c939f78a6a0e31caec7ac1c009a9fe923424
|
|
BLAKE2b-256 checksum How to use checksums |
907e66ac2b19c096ed4c1cddfbf05b700381a0fa75d1c09986b73d3c9e6f0e05
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 4, 2026.
Transparency log