Skip to main content

Program complex multi-agent workflows with a typed DSL, a CLI-first runtime, and repo-local run state.

Project description

Rally

CI PyPI Python 3.14+ License: MIT OpenSSF Scorecard

Doctrine · Contributing · Support · Security Design · Versioning · Changelog · Support · Security

Run coding-agent workflows from plain repo files.

Rally is a filesystem-first agent harness for multi-agent coding workflows. You author the flow in Doctrine, Rally materializes a run home inside the repo, routes each turn from strict JSON, and leaves the full execution on disk instead of in a hidden control plane.

Flows are code. Runs are files.

Status: early, real, and already useful. Codex and Claude Code support ship today. Repo-local searchable memory and allowlisted MCP surfaces ship today. The checked-in demo flows still default to Codex.

Live demo

Rally running the shipped poem_loop flow from the real CLI.

Rally poem loop live demo

Why Rally is different

  • run history lives under runs/
  • one active run per flow stays easy to reason about
  • turn control comes from strict JSON, not prose guessing
  • the operator can inspect issue.md, artifacts, logs, and sessions on disk
  • resume paths stay honest because the state is visible

Doctrine and Rally

  • Use Doctrine when you want to author and validate the flow.
  • Use Rally when you want to run that flow with repo-local state and strict turn routing.
  • Keep the split crisp: Doctrine is the authoring layer, Rally is the runtime layer.

What Rally is for

Use Rally if you want:

  • repeatable coding-agent workflows
  • clear owners, clear artifacts, and clear stop points
  • repo-local runtime state instead of a hidden control plane
  • workflows you can diff, test, and review like software
  • a harness that is small enough to inspect with normal developer tools

Install Rally

Rally is an ordinary Python package with one CLI:

uv tool install rally-agents
rally --help

Rally requires Python 3.14 or newer and currently supports doctrine>=1.0.1,<2. The published package name is rally-agents. The import path and CLI stay rally.

If you want Rally inside a repo-local environment instead of a tool install:

uv add --dev rally-agents
uv run rally --help

Versioning and upgrade rules live in docs/VERSIONING.md. Release history lives in CHANGELOG.md.

Use Rally In Another Repo

Your host repo is the Rally workspace. Add the fixed top-level folders:

flows/
skills/
mcps/
stdlib/
runs/

Then add the workspace and emit config to pyproject.toml:

[project]
name = "demo-host"
version = "0.1.0"
requires-python = ">=3.14"

[tool.rally.workspace]
version = 1

[tool.doctrine.compile]
additional_prompt_roots = ["stdlib/rally/prompts"]

[tool.doctrine.emit]

[[tool.doctrine.emit.targets]]
name = "demo"
entrypoint = "flows/demo/prompts/AGENTS.prompt"
output_dir = "flows/demo/build/agents"

Author your flow under flows/demo/, then run it:

rally run demo

On the first build or run, Rally syncs its own built-ins into your workspace under stdlib/rally/, skills/rally-kernel/, and skills/rally-memory/. Do not point support files at ../rally/stdlib/.... Rally copies the support files into the host workspace so Doctrine emit stays inside the project root.

If Rally opens home:issue.md, write the issue there and resume:

rally resume DMO-1

Work On Rally Itself

If you are changing Rally, use a normal repo checkout:

git clone https://github.com/aelaguiz/rally.git
cd rally
uv sync --dev

Run the smallest shipped demo:

Build the checked-in flow and skill readback that Rally loads at runtime:

uv run python -m doctrine.emit_docs --pyproject pyproject.toml --target _stdlib_smoke --target poem_loop --target software_engineering_demo
uv run python -m doctrine.emit_skill --pyproject pyproject.toml --target rally-kernel --target rally-memory --target demo-git

Run the smallest shipped demo:

uv run rally run poem_loop

Run the unit tests:

If you do not have an interactive editor configured, Rally will stop and tell you where the issue file lives. On a fresh repo, that path will be:

runs/active/POM-1/home/issue.md

Write the issue there, then resume the run:

uv run rally resume POM-1

Run the unit tests any time with:

uv run pytest tests/unit -q

Cut a public release with the repo-owned flow:

make build-dist
make verify-package
make verify
make release-prepare RELEASE=v0.1.0 CLASS=additive CHANNEL=stable
make release-tag RELEASE=v0.1.0 CHANNEL=stable
make release-draft RELEASE=v0.1.0 CHANNEL=stable PREVIOUS_TAG=auto
make release-publish RELEASE=v0.1.0

The full rules live in docs/VERSIONING.md. The release history lives in CHANGELOG.md. The first TestPyPI and PyPI setup steps also live in docs/VERSIONING.md.

What ships today

Rally already has:

  • Doctrine-authored flows and generated readback under flows/*/build/**
  • live Codex and Claude Code adapter paths
  • repo-local run homes, issue history, logs, and restartable runs
  • strict handoff, done, blocker, and sleep turn results
  • repo-local searchable memory
  • allowlisted skills and MCP materialization into the run home
  • two demo flows:
    • poem_loop
    • software_engineering_demo

Why this angle matters

A lot of agent tooling still hides the important truth in dashboards, opaque state, or giant piles of copied prompt prose.

Rally takes a different bet:

  • keep the runtime small
  • keep the run visible
  • keep ownership changes explicit
  • keep the stop rules typed
  • keep recovery paths boring and honest

If the story only works when the control plane is hidden, the runtime is not trustworthy enough yet.

The key rule does not change: no hidden side doors, no second turn-ending path, and no drift between what the flow says and what the runtime does.

Open Source On Purpose

Rally is MIT licensed. See LICENSE.

Open source matters here because trust is the product. You should be able to inspect:

  • what the agent saw
  • what files were current
  • why ownership changed
  • what ended the turn
  • what the runtime wrote to disk

If that story depends on a hidden DB, a dashboard, or hand-wavy prompt magic, Rally failed its own pitch.

Contributing

See CONTRIBUTING.md. The short version:

  • use uv
  • keep prompt source in .prompt
  • do not hand-edit generated readback
  • prove the smallest real path for the change

Questions and contributions

Read Next

Questions and contributions

If this direction is useful, star the repo and watch releases.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rally_agents-0.1.0.tar.gz (98.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rally_agents-0.1.0-py3-none-any.whl (113.5 kB view details)

Uploaded Python 3

File details

Details for the file rally_agents-0.1.0.tar.gz.

File metadata

  • Download URL: rally_agents-0.1.0.tar.gz
  • Upload date:
  • Size: 98.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for rally_agents-0.1.0.tar.gz
Algorithm Hash digest
SHA256 4bf49e457fcf2e85849eb756aef22c480f2045cd8c5971d86d508066cddfcec5
MD5 cb37ee45c5343e90ee9de672cfada4f6
BLAKE2b-256 cba7bbd82ed440183c02cd1931d533aaecd13774399cecc973d1df5f1a6c35c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rally_agents-0.1.0.tar.gz:

Publisher: publish.yml on aelaguiz/rally

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rally_agents-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: rally_agents-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 113.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for rally_agents-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f889b1a1f5d1516df7cc94feca623c921a9858f6d898a9479a2f7d57c74e85fe
MD5 ffa802ae9a132cd9506e23ddcf946ece
BLAKE2b-256 ad332ddef093d59af832d5646a4930194e18de0ec9462bef91b0707b2ca293d4

See more details on using hashes here.

Provenance

The following attestation bundles were made for rally_agents-0.1.0-py3-none-any.whl:

Publisher: publish.yml on aelaguiz/rally

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page