Release management¶
How a reactifact version is cut, built, verified, and published.
Versioning¶
- SemVer; pre-releases carry an
rcmark (e.g.0.5.0rc1), dropped for the stable cut (0.5.0). - The version lives in two places and must stay in sync:
pyproject.toml→[project] version;reactifact/__init__.py→__version__.
Changelog rule¶
Every user-visible change lands in CHANGELOG.md (Keep a Changelog). Cut the
entry when the version is bumped:
- move unreleased items under a new
## [X.Y.Z] — <date>heading; - group them as
Added/Changed/Removed(deprecations too); - mark breaking changes explicitly, even in
rcs.
Upgrading¶
There's no separate migration doc — CHANGELOG.md is the source of truth for
what changed between versions, and breaking entries are marked per the rule
above. A few changes worth knowing if you're crossing them (see also
migrating.md for porting from other frameworks):
- 0.10.0 — behavior-visible (non-breaking) changes to know about:
PromptTemplate.rendernow substitutes only identifier-shaped{field}placeholders and leaves other braces verbatim, so a literal JSON example in a prompt needs no{{/}}escaping. Templates that relied onstr.formattreating a stray{...}as an error/format-spec now pass it through.reactifact.chat.ChatEvent.kindis a closedLiteral["session","status","message"]; constructing one with an arbitrarykindnow fails validation.- Provider/
WebSource/OTLP/Langfuse HTTP clients are created lazily per event loop (no moreRuntimeError: Event loop is closedacross loops); an injectedclient=is still used as-is. Runtime.arun/astreamgained a keyword-onlyrequest=;Runtime.run/run_oncelikewise. Existing positional calls are unaffected.- 0.7.0 —
Context.merge_fromnow preserves theidof an artifact that exists inotherbut not intarget(it previously minted a fresh one). If you relied on the old id-regenerating behavior — unlikely, since it silently detached the merged artifact from any relation pointing at its original id — pass the artifact throughcreate(data, id=new_id())yourself before merging to keep the old effect. - 0.5.0 —
reactifact/__init__.pyre-exports only the core surface (~40 names, down from ~150); eval, tracing, checkpoint/branch backends, the chat/web layer, the adaptive scheduler, replay, structured-LLM helpers, viz, and prompt templates moved to their own submodule imports. Nothing renamed — see the### Breakingentry inCHANGELOG.mdfor the full before/after import list. - 0.4.0-rc1 —
LLMRequest.temperaturechanged from a hard-coded0.7tofloat | None;Nonenow means "omit → provider default" instead of "use0.7". Same call shape, different generation behavior, no error raised — passtemperature=0.7explicitly (per-call or on the provider) if your code relied on the old implicit default. - 0.1.0-rc1 —
Produceno longer returns aPatch; it writesself.effects.create/update/link/ask/resumeand returnsNone(see effects).InterruptPatch,Patch.merge_existing_patchandPatch.to_dictwere removed.
The release loop¶
# 1) sanity
.venv/bin/python -m pytest
.venv/bin/python -m mypy
.venv/bin/python -m ruff check
.venv/bin/python -m ruff format --check
# 2) version + changelog (see above)
# 3) build artifacts
uv build # dist/reactifact-0.5.0-py3-none-any.whl + sdist
# 4) verify the wheel in a scratch venv (not the workspace, so no PYTHONPATH)
uv venv /tmp/reactifact-rc
/tmp/reactifact-rc/bin/python -m pip install --quiet dist/reactifact-0.5.0-py3-none-any.whl
/tmp/reactifact-rc/bin/python -c "import reactifact; print(reactifact.__version__)"
/tmp/reactifact-rc/bin/python -m reactifact graph examples.knowledge.agents 2>/dev/null \
|| /tmp/reactifact-rc/bin/reactifact --help >/dev/null # console script present
# confirm the wheel contains reactifact + tracing templates and NOT examples/tests:
unzip -l dist/reactifact-0.5.0-py3-none-any.whl | grep -E "examples/|tests/|tracing/templates"
# 5) tag
git tag v0.5.0
git push origin v0.5.0
# 6) publish (PyPI token in env)
uv publish --publish-url https://upload.pypi.org/legacy/
What ships¶
uv build packages only the reactifact package (setuptools packages.find
excludes examples/tests) plus the trace dashboard templates
(reactifact/tracing/templates/*.html). Examples, tests and docs stay in the
repository and are the documentation-by-example.
Rollback¶
A broken rc is fixed in the next rc/release — never rewrite history of a
tagged version. Keep patch releases strictly backwards-compatible (§61: the
framework is stable at the stated surface).