Deterministic, file-based execution system for autonomous agents
Project description
Runnrr
Git for agent workspaces.
Runnrr is a filesystem-native, markdown-based workspace protocol that gives coding agents (and humans) durable structured state, explicit task boundaries, and lightweight context retrieval.
It is not an autonomous loop runtime, a checkpoint engine, a multi-agent orchestrator, or a sprawling platform. It is simply the structured workspace that tools like Gemini CLI and Claude Code work inside to understand what to do next.
The Five Commands That Matter
runnrr next # what should I work on?
runnrr context # what do I need to know?
runnrr log # what did I just do?
runnrr done # I finished this
runnrr adr # I made an architectural decision
Everything else is in service of these five.
The Stack
.runnrr/ Filesystem. Source of truth. Always.
├── tickets/ Markdown files. Folder = state.
├── epics/ Markdown files.
├── adrs/ Markdown files.
└── context/ conventions.md, glossary.md. Static. Human-maintained.
.runnrr/.db SQLite. Derived only. Gitignored.
Rebuilt anytime with: runnrr index rebuild
Used for: search, next-ticket ranking, context scoring
Rule: If .db is deleted, everything still works. It just gets slow. The markdown files are always the absolute source of truth.
Core Entities
Tickets
The atomic unit of work. Status is determined by which folder the markdown file lives in (backlog, todo, in-progress, blocked, done).
runnrr create "My first ticket"
Epics
Strategic groupings of tickets. Status is strictly computed from child ticket states. Never stored manually.
runnrr epic create "Auth System"
ADRs (Architecture Decision Records)
Append-only, immutable records of technical decisions. Once accepted, they are frozen.
runnrr adr create "Use JWT" --context "..." --decision "..."
The Agent Workflow
Runnrr shines when used alongside an LLM CLI.
1. Initialization and Context
The agent runs runnrr exec at the start of a session. This command automatically:
- Calls
runnrr nextto find the highest priority unblocked ticket. - Calls
runnrr contextto dynamically assemble a token-budgeted, relevance-ranked context payload (including the ticket, blockers, Epics, related ADRs, and project conventions). - Calculates the valid state machine actions the agent is allowed to take.
2. Execution
The agent starts the work via the CLI:
runnrr start TICKET-001
As the agent writes code, it logs progress directly into the ticket via the CLI to maintain a perfect audit trail:
runnrr log TICKET-001 "Provisioned local Elasticsearch container via Docker Compose."
3. Content Modification (Markdown Direct Editing)
Runnrr relies on direct file edits for human-readable content. To mark a task or an acceptance criterion as complete, the agent opens the .runnrr/tickets/<status>/<TICKET-001>.md file in their editor and changes - [ ] to - [x].
4. Completion
Once all acceptance criteria are checked off in the markdown file, the agent completes the work via the CLI:
runnrr done TICKET-001
(If any criteria are unchecked, the CLI parses the file and rejects the transition).
Python SDK
from runnrr import RunnrrClient
client = RunnrrClient(root=".")
ticket = client.create_ticket("Build auth middleware", tags=["auth"])
client.link(ticket.id, "EPIC-001")
client.transition(ticket.id, "in-progress")
Development
Run tests:
uv run pytest
License
MIT
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file runnrr-0.1.0.tar.gz.
File metadata
- Download URL: runnrr-0.1.0.tar.gz
- Upload date:
- Size: 19.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d483004511815068f15fd235255ad8ca44010f62804820e10e7c2933a416896
|
|
| MD5 |
4bdedfb8c4a66245b809dece6dd033eb
|
|
| BLAKE2b-256 |
1ca2976fa80ef6459a131a6897fd7fddbf0be74c8d7e9d51c739bae2834f3dbd
|
Provenance
The following attestation bundles were made for runnrr-0.1.0.tar.gz:
Publisher:
publish.yml on inf3cti0n95/runnrr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
runnrr-0.1.0.tar.gz -
Subject digest:
9d483004511815068f15fd235255ad8ca44010f62804820e10e7c2933a416896 - Sigstore transparency entry: 1473382771
- Sigstore integration time:
-
Permalink:
inf3cti0n95/runnrr@76ddb19860d1b81130a5638b17574e69fc3f46b9 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/inf3cti0n95
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@76ddb19860d1b81130a5638b17574e69fc3f46b9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file runnrr-0.1.0-py3-none-any.whl.
File metadata
- Download URL: runnrr-0.1.0-py3-none-any.whl
- Upload date:
- Size: 28.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a9ad1186840e1cf6595bd53cd4eff2e3e6e57d92ebb62bcc901c54c2f98ae24a
|
|
| MD5 |
21fdb1b5c7416e037a8383f8211e0146
|
|
| BLAKE2b-256 |
55b0b1cdeb974b5790c99a3d53fbe7185c5c95b5130793766c7365353ad2f8de
|
Provenance
The following attestation bundles were made for runnrr-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on inf3cti0n95/runnrr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
runnrr-0.1.0-py3-none-any.whl -
Subject digest:
a9ad1186840e1cf6595bd53cd4eff2e3e6e57d92ebb62bcc901c54c2f98ae24a - Sigstore transparency entry: 1473382849
- Sigstore integration time:
-
Permalink:
inf3cti0n95/runnrr@76ddb19860d1b81130a5638b17574e69fc3f46b9 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/inf3cti0n95
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@76ddb19860d1b81130a5638b17574e69fc3f46b9 -
Trigger Event:
push
-
Statement type: