All notable Rally release changes live here.
This file is the portable release history. docs/VERSIONING.md is the
evergreen policy guide.
The format is based on Keep a Changelog.
When you cut a public release:
- Copy the release entry template below.
- Replace the placeholders.
- Move the real change notes into the new release section.
- Leave
## Unreleasedat the top for the next cycle.
Public release entries must replace every placeholder before make release-tag
or make release-draft runs. The helper rejects placeholder release-header
text and breaking releases with no real upgrade steps.
## vX.Y.Z - YYYY-MM-DD
Release kind: Non-breaking
Release channel: stable
Release version: vX.Y.Z
Affected surfaces: ...
Who must act: ...
Who does not need to act: ...
Upgrade steps: ...
Verification: ...
Support-surface version changes: none
### Added
- Describe backward-compatible user-facing additions.
### Changed
- Describe user-visible behavior or workflow changes.
### Deprecated
- Describe soft-deprecated public surfaces and early move guidance.
### Removed
- Describe removed public surfaces.
### Fixed
- Describe important fixes that matter to users or maintainers.
### YANKED
- Use this only when a bad public release was superseded later.Use this section for work that is not public yet.
Release kind: Breaking
Release channel: stable
Release version: v3.0.0
Affected surfaces: Rally package metadata Doctrine floor, supported Doctrine package line, Rally stdlib output-schema authoring inherited from Doctrine Language 5.0, host-repo .prompt files that still use the retired type: string plus enum: form on output schema fields, and downstream consumers of rally-agents whose pyproject.toml still pins rally-agents<3.
Who must act: (1) host authors whose .prompt files still declare output schema fields with the retired type: string plus enum: form or the retired inline type: enum plus values: form (Doctrine v5 emits E320); (2) host authors who consumed Rally's RallyTurnKind or ReviewVerdict enum values through bare string literals — v3 exports both as top-level enum declarations in stdlib/rally/prompts/rally/turn_results/AGENTS.prompt and stdlib/rally/prompts/rally/review_results/AGENTS.prompt and the inherited schemas now reference them with type: EnumName; (3) host repos that still ship a doctrine-agents<5 pin alongside Rally; (4) downstream consumers of rally-agents (e.g. psflows) whose pyproject.toml still pins rally-agents<3.
Who does not need to act: users who resolve doctrine-agents only through Rally's declared range, users whose .prompt files already use the type: <EnumName> form with a declared top-level enum, and users who consume emitted schemas/<output-slug>.schema.json wire shape (the lowered JSON Schema only gains a One of ... description suffix, the type contract is preserved).
Upgrade steps: (1) install rally-agents v3.0.0 so Rally pulls doctrine-agents>=5.0.0,<6; (2) refresh any lockfile or dependency pin that still points at doctrine-agents<5 to doctrine-agents>=5.0.0,<6; (3) in host .prompt files, replace every output schema field that used type: string plus enum: or type: enum plus values: with a top-level enum X: "..." decl plus type: X on the field (Doctrine compile errors cite E320); (4) downstream flow authors who want per-gate review reject ... when ... lines, per-case override gates:, typed schema ... gates:, typed_as: handoff identity, skill mode binding, typed abstract parameters, or declarative rule primitives can now adopt them directly — the shipped poem_loop and software_engineering_demo flows are worked exemplars under flows/*/prompts/; (5) rerun uv run rally build (or make emit in the Rally repo) after the upgrade so emitted build artifacts regenerate against the Doctrine 5.0 language.
Verification: make verify
Support-surface version changes: minimum Doctrine release v4.0.0 -> v5.0.0; supported Doctrine package line doctrine-agents>=4.0.0,<5 -> doctrine-agents>=5.0.0,<6; inherited Doctrine language 4.0 -> 5.0; workspace manifest 1 (unchanged); compiled contract version 1 (unchanged)
- Doctrine v5 exemplar adoption across Rally's stdlib and shipped flows.
Top-level
export enum RallyTurnKindandexport enum ReviewVerdictdeclarations live instdlib/rally/prompts/rally/turn_results/AGENTS.promptandstdlib/rally/prompts/rally/review_results/AGENTS.prompt; every flow-local schema references them withtype: EnumName. Every gate in every shipped review contract carries areject contract.<gate> when ...line closed byaccept "..." when contract.passes. The poem review contract migrated from prose workflow to typedschema ... gates:. A new sharedWorkRoleTurnResultSchemaparent factors the work-role turn-result fields so role schemas only declare their ownnext_routefield. Therally-learnskill refs teach the v5 canonical shapes (typed enums, typed gates, per-gateaccept, anti-patterns forcontract.passesand legacytype: string + enum:). - Installable
rally-learnskill (13 refs +SKILL.md+openai.yaml) teaching flow authoring end-to-end inside Codex and Claude Code.skills/rally-learn/is the authoring source;skills/.curated/rally-learnis the shipped export.make skillsemits the bundle and shells out tonpx skills add .for interactive install.tests/unit/test_emit_skill.pycovers emit-drift and end-to-end npx-skills install into a sandboxed HOME. - Six enduring reference docs:
docs/RALLY_PRINCIPLES.md,docs/RALLY_QUICK_START.md,docs/TURN_RESULT_CONTRACT.md,docs/FLOW_YAML_REFERENCE.md,docs/ERROR_REFERENCE.md, anddocs/SKILL_AUTHORING.md. README grew Learn Rally + Reference sections. - Flow-code CLI aliases. Every command that takes a run-id now also accepts
the bare three-letter flow code, e.g.
rally watch POM -f,rally status POM,rally issue current --run-id POM. Resolver lives insrc/rally/services/run_store.py::resolve_run_id. Mutating commands require an active run and surface a hint at the latest archived id when only archives exist. runs/latest/<CODE>symlinks, atomically maintained bycreate_runandarchive_runvia a newreplace_symlinkhelper. Targets are relative soruns/stays relocatable. Native unix tools work without a Rally wrapper:tail -f runs/latest/POM/logs/rendered.log,bat runs/latest/POM/home/issue.md. Symlink updates are best-effort.rally run <flow> --detachandrally resume <id> --detachstart a Rally run in the background via a double-fork. The parent prints the grandchild pid and returns immediately; the detached worker continues the normal loop with stdio redirected intoruns/active/<id>/logs/stdout.logandstderr.log. run in the background via a double-fork. The parent prints the grandchild pid and returns immediately; the detached worker continues the normal loop with stdio redirected intoruns/active/<id>/logs/stdout.logandstderr.log.rally stop <run-id>asks a run to stop at the next turn boundary by writingcontrol/stop.requested. The runner loop observes the file, finalizes the run asSTOPPED, appends a "Rally Stopped" entry toissue.md, and emits aSTOPPEDevent. Idempotent.rally stop <run-id> --now [--grace <secs>]escalates toSIGTERM, thenSIGKILLafter the grace window, targeting the run's recorded process or process group.rally watch <run-id> [--since N] [--follow]renderslogs/events.jsonlfor one run;--followpolls for new events until the run reaches a terminal status.- Reconciled status (CRASHED / ORPHANED / STALE) surfaces in
rally statusfor runs whose recorded state no longer matches the live process. - Per-run
heartbeat.json(updated every 15s by a background thread) anddone.jsonclean-exit sentinel — their combination lets the reconciler distinguish orderly termination from a crash. - New event codes:
DETACH,STOPPED,STOP_REQUESTED,HEARTBEAT,CRASH_DETECTED. - Always-on run timing. At every terminal turn event (
handoff,done,blocker,sleep), Rally writesruns/<id>/timing.json(cumulative snapshot), appends toruns/<id>/timing_turns.jsonlandruns/<id>/tool_calls.jsonl, and emits aSUMMARYevent that renders an inline receipt showing where the last turn and the whole run spent time. Atdone, a one-line summary is appended to workspace-levelruns/timings.ndjson. Both adapters now projecttool_use_id,input_digest,is_error, andexit_codeon tool-call events. Input digests are secret-scrubbed. Seedocs/RALLY_RUN_TIMING.mdfor schema and rendering details. - Anomaly flags on every receipt. Six rules —
command_always_fails,tool_error_rate,single_call_hot,model_spin,retry_group,high_idle— evaluate against the currentRunTimingat every terminal turn event and render inline under the cumulative block.high_idleis suppressed in--stepmode. rally status <run-id>gains a three-line time footprint derived fromtiming.json(wall/active/idle, top tools, token totals). Silently omitted whentiming.jsonis not yet present.rally watch <run-id>now inlines SUMMARY receipts in the event stream and prints a compact per-turn progress line after every tool-end event.rally runs time [--flow CODE] [--last N]reports longitudinal trends acrossruns/timings.ndjson— recent-run table plus p50 / p90 / mean for wall, active, errors, tools, and tokens.
runs/active/<id>/state.yamlandrun.yamlwrites are now atomic (tempfile + fsync +os.replace+ directory fsync). State gainsschema_version(default 2),pid,process_create_time, andpgidfields.schema_version: 1(pre-detach) state is tolerated and upgraded on the next write.- Per-flow lock migrated from O_EXCL+PID-file to
fcntl.flock. The lock is now held on an open file description, so it automatically releases on process death and survivesforkinto detached children — closing the old PID lock file as a side effect used to orphan the lock. rally statususes a reconciler that computes status from(state.yaml + heartbeat.json + done.json + probe(pid)). Stored terminal states (DONE / BLOCKED / STOPPED) remain sticky; all other computed statuses are presentation-only and never persisted.
psutil>=6,<7for durable(pid, create_time)process identity. Isolated torally.services.process_identity; no other module importspsutil.
Release kind: Breaking
Release channel: stable
Release version: v2.0.0
Affected surfaces: Rally package metadata Doctrine floor, supported Doctrine package line, Rally stdlib prompt layout on disk, packaged data-files glob, host-repo .prompt authoring inherited from Doctrine Language 4.0, and downstream provider-root prompt authoring (e.g. psflows' curriculum_shared/).
Who must act: (1) host authors whose .prompt files still use same-flow import lines between siblings under one AGENTS.prompt or SKILL.prompt root (Doctrine 4.0 emits E315); (2) host authors whose cross-flow imports reach declarations that are not marked export (Doctrine 4.0 emits E314); (3) authors of shared provider roots registered through additional_prompt_roots whose modules are flat .prompt files rather than directory-backed flows (v4 requires every import target to live under a flow root); (4) host repos that still ship a doctrine-agents<4 pin alongside Rally; (5) downstream consumers of rally-agents (e.g. psflows) whose pyproject.toml still pins rally-agents<2.
Who does not need to act: users who resolve doctrine-agents only through Rally's declared range, users whose flows already live under one flow root with cross-flow import lines and no same-flow imports, and users who do not register shared provider roots.
Upgrade steps: (1) install rally-agents v2.0.0 so Rally pulls doctrine-agents>=4.0.0,<5; (2) refresh any lockfile or dependency pin that still points at doctrine-agents<4 to doctrine-agents>=4.0.0,<5; (3) in host .prompt files, delete same-flow import lines — under Doctrine v4 every .prompt under one AGENTS.prompt or SKILL.prompt root shares a flat namespace and siblings resolve by bare name (Doctrine compile errors cite E315); (4) mark every declaration consumed across flow boundaries with the export modifier (Doctrine compile errors cite E314); (5) restructure shared provider-root trees so each shared module is its own flow root with an AGENTS.prompt or SKILL.prompt entrypoint — the Rally stdlib restructure at stdlib/rally/prompts/rally/<module>/AGENTS.prompt is the canonical example; (6) keep each review block in the same .prompt file as its contract workflow declaration (v4 review contract resolution is per-file, not flow-wide); (7) rerun uv run rally build (or the host equivalent) after the upgrade so emitted build artifacts regenerate under the new Doctrine namespace rules; (8) downstream consumers of Rally (e.g. psflows) must bump their rally-agents pin to >=2.0.0,<3 and apply steps (3)–(6) to their own flows and provider roots before they can run.
Verification: make verify
Support-surface version changes: minimum Doctrine release v2.0.0 -> v4.0.0; supported Doctrine package line doctrine-agents>=2.0.0,<3 -> doctrine-agents>=4.0.0,<5; inherited Doctrine language 3.0 -> 4.0; Rally stdlib disk layout retires stdlib/rally/prompts/rally/<module>.prompt in favor of stdlib/rally/prompts/rally/<module>/AGENTS.prompt (one flow root per shared module); package data-files glob updated to ship the new stdlib tree; workspace manifest 1 (unchanged); compiled contract version 1 (unchanged)
- Raised Rally's public Doctrine floor to
doctrine-agents>=4.0.0,<5so Rally installs resolve against the Doctrine 4.0 release line and pick up the new Doctrine language (4.0) flow-namespace rules: directory-backed flow roots, retired same-flowimport, requiredexportfor cross-flow visibility, and retired relative imports. - Restructured Rally's stdlib so each shared module is its own directory-backed
flow root at
stdlib/rally/prompts/rally/<module>/AGENTS.prompt. Downstreamimport rally.<module>keeps resolving; declarations consumed cross-flow carry the newexportmodifier. - Colocated
reviewblocks with their contractworkflowdeclarations inside each shipped flow (Doctrine v4 resolves review contracts per-file). - Updated the
[tool.setuptools.data-files]globs sopip install rally-agentskeeps shipping the new stdlib tree. - Updated
docs/VERSIONING.md,README.md,docs/RALLY_RUNTIME.md,docs/RALLY_MEMORY.md,docs/RALLY_COMMUNICATION_MODEL.md,docs/RALLY_SOFTWARE_ENGINEERING_FLOW_SHOWCASE.md, and the tests-side packaged-install proof to carry the new paths and floor in one place. - Added a "Provider Roots Under Doctrine v4" section to
docs/RALLY_PORTING_GUIDE.mdso downstream repos (psflows and similar) can mirror the same pattern when they port their shared prompt roots.
Release kind: Breaking
Release channel: stable
Release version: v1.0.0
Affected surfaces: Rally package metadata Doctrine floor, supported Doctrine package line, host-repo prompt compatibility inherited from Doctrine 3.0, and host-repo readers of emitted Doctrine contracts and ## Outputs Markdown.
Who must act: (1) host authors whose .prompt files still use retired Doctrine 2.x forms that Doctrine 3.0 rejects, especially required: or optional: inside output schema fields and route fields (Doctrine emits E236 and E237); (2) downstream readers of emitted AGENTS.contract.json, which Doctrine 2.0 retired in favor of final_output.contract.json plus schemas/<output-slug>.schema.json; (3) downstream snapshot, parser, or scraper users of emitted ## Outputs Markdown, the old _ordered list_ or _unordered list_ helper lines, and the old compiler-owned review-semantics and single-child * Binding wrappers; (4) host repos that still ship a doctrine or doctrine-agents<2 pin alongside Rally.
Who does not need to act: users who resolve doctrine-agents only through Rally's declared range, users who consume schemas/<output-slug>.schema.json wire shape, and users who stay on a source checkout with an editable ../doctrine that already tracks Doctrine 3.0 syntax.
Upgrade steps: (1) install rally-agents v1.0.0 so Rally pulls doctrine-agents>=2.0.0,<3; (2) refresh any lockfile or dependency pin that still points at doctrine or doctrine-agents<2 to doctrine-agents>=2.0.0,<3; (3) in host .prompt files, replace authored required: and optional: inside output schema fields and route fields with nullable where the field may be null (Doctrine compile errors cite E236 and E237); (4) stop reading emitted AGENTS.contract.json — read final_output.contract.json for final-output, review-control, and the new top-level route and io metadata, and read schemas/<output-slug>.schema.json for structured-output wire shape; (5) refresh downstream emitted-Markdown snapshots and parsers to the new ## Outputs grouped-contract layout (no _ordered list_ or _unordered list_ helper lines, compacted review-semantics and single-child * Binding wrappers); (6) run uv run rally run <flow> (or the host equivalent) once after the upgrade to regenerate emitted build artifacts under the new Doctrine output shapes.
Verification: make verify
Support-surface version changes: minimum Doctrine release v1.0.2 -> v2.0.0; supported Doctrine package line doctrine-agents>=1.0.2,<2 -> doctrine-agents>=2.0.0,<3; inherited Doctrine language 2.2 -> 3.0; emitted AGENTS.contract.json retired in Rally-managed host builds; emitted schemas/<output-slug>.schema.json is now the sole structured-output wire contract; workspace manifest 1 (unchanged); compiled contract version 1 (unchanged)
- Raised Rally's public Doctrine floor to
doctrine-agents>=2.0.0,<3so Rally installs resolve against the Doctrine 2.0 release line and pick up the new Doctrine language (3.0), retired authoredrequired:andoptional:insideoutput schemafields, the new grouped## OutputsMarkdown layout, and the retiredAGENTS.contract.jsonby default. - Updated
docs/VERSIONING.mdandREADME.mdto carry the new minimum Doctrine release and supported package line so host repos see the new floor in one place.
Release kind: Non-breaking
Release channel: stable
Release version: v0.1.1
Affected surfaces: external host-workspace bootstrap, Rally package metadata, and clean package install proof.
Who must act: users who install Rally from package indexes and maintainers who cut Rally releases.
Who does not need to act: users staying on a source checkout and users who already work from unreleased repo commits.
Upgrade steps: Install rally-agents v0.1.1. Refresh lockfiles or dependency pins that still mention the old doctrine distribution name. The Rally CLI stays rally.
Verification: make verify
Support-surface version changes: workspace manifest 1 (unchanged); compiled contract version 1 (unchanged); minimum Doctrine release v1.0.2 (unchanged)
- Added
rally workspace syncso a host repo can sync Rally-owned built-ins intostdlib/rally/,skills/rally-kernel/, andskills/rally-memory/before the firstrally runor manualdoctrine.emit_docs.
- Updated the external host-repo setup story and Rally design docs to use
rally workspace syncas the front door for host-local built-ins. - Removed Rally's own
[tool.uv.sources]override for Doctrine so Rally resolves the publicdoctrine-agentsrelease by default and sibling repos can choose their own local editable Doctrine source cleanly.
- Switched Rally's public Doctrine dependency to
doctrine-agents>=1.0.2,<2, which matches the first clean renamed-package Doctrine release on PyPI. - Removed the package-proof path that preinstalled Doctrine from git before
installing Rally, so
make verify-package,make verify, and CI now prove clean consumer installs.
Release kind: Non-breaking
Release channel: stable
Release version: v0.1.0
Affected surfaces: packaged runtime assets, explicit package metadata, the public release flow, and external host-repo setup.
Who must act: maintainers cutting Rally releases and users installing Rally as a Python package.
Who does not need to act: users who stay on unreleased commits and users who are not consuming Rally through package installers yet.
Upgrade steps: Install rally-agents v0.1.0. The CLI stays rally. If you were running from a source checkout only, switch to the published package and follow the README host-repo setup flow.
Verification: make verify
Support-surface version changes: workspace manifest 1 (unchanged); compiled contract version 1 (unchanged); minimum Doctrine release v1.0.1
- Shipped Rally's packaged built-ins under
src/rally/_bundled/so installed runtimes no longer depend on a Rally source checkout. - Added a built-artifact external-user proof that installs the wheel, runs
rally --help, runsrally run demo, and verifies hostdoctrine.emit_docsstays inside the host project root. - Added a repo-owned public release flow with
make release-prepare,make release-tag,make release-draft, andmake release-publish. - Added public support and security docs plus GitHub workflow hardening surfaces for release and dependency review.
- Moved Rally release policy and compatibility guidance into the canonical
docs/VERSIONING.mdandCHANGELOG.mdpair. - Switched Rally package metadata to explicit
[project].version. - Published Rally on package indexes under distribution name
rally-agentswhile keeping the import package and CLI namerally. - Replaced the tag-push-only publish path with a GitHub release publish workflow that rebuilds artifacts, reruns the external-user smoke proof, uploads release assets, and can publish to package indexes through Trusted Publishing.
- Stopped Rally-native stdlib support files from escaping host project roots in external Doctrine emit targets.
- Superseded by
v0.1.1becausev0.1.0still depended on the olddoctrinepackage line and failed fresh package installs.