ReasonRDN
Local-first memory and verifiable handoffs for agents.
ReasonRDN lets agents keep useful decisions across sessions, assign stable
reason:// addresses, and explicitly use WARF when competing submissions need
arbitration.
pip install 'reason-rdn[full]'
rdn start
The problem it solves
Agents can call tools through MCP and follow repository instructions through AGENTS.md, but useful work still disappears between runs. The next agent often has to rediscover what was decided, where the evidence came from, and which artifact is current.
ReasonRDN provides the handoff layer:
- Remember context locally by default.
- Give reusable work a stable
reason://authority/category/taskaddress. - Resolve it later from an explicit local or network registry.
- Submit competing candidates to WARF and retain the decision record.
- Keep network participation opt-in.
Quick start
rdn remember "Fixed the deployment race" --tags infra,deploy
rdn recall "deployment race"
Python:
import rdn as reason
reason.remember(
"Pause writes, restore, verify, then switch traffic.",
tags=["ops", "rollback"],
reason_address="reason://ops/deployment/rollback-plan",
)
artifact = reason.resolve("reason://ops/deployment/rollback-plan")
assert artifact.source == "local"
Local data lives under ~/.reason-rdn/.
Managed round trip
The complete network path is explicit and reversible:
from rdn import RDNClient, ReasonArtifact
address = "reason://ops/deployment/rollback-plan"
client = RDNClient()
# 1. Local retention never publishes.
client.remember(
"We need a rollback plan that preserves data integrity.",
project="ops",
reason_address=address,
)
answers = {
"candidate-a": "Pause writes, restore, verify, then switch traffic.",
"candidate-b": "Switch traffic immediately.",
}
evidence = "The runbook requires verification before traffic changes."
# 2. Arbitration compares candidates and retains an event. It does not admit.
decision = client.network_arbitrate(
"Choose the safest rollback plan.",
[
{
"agent_id": candidate_id,
"answer_text": answer,
"corpus": [{"doc_id": "runbook", "text": evidence}],
}
for candidate_id, answer in answers.items()
],
reason_address=address,
)
if decision["status"] == "selected":
selected = answers[decision["winner_submission_id"]]
artifact = ReasonArtifact.from_dict(
{
"address": address,
"media_type": "text/plain; charset=utf-8",
"content": selected,
},
source="local",
)
custody = {
"query_id": decision["query_id"],
"winner_submission_id": decision["winner_submission_id"],
"event_record": decision["event_record"],
"audit_hash": decision["audit_hash"],
}
# 3. Null is create-only. Updates name the exact prior sha256: version.
admitted = client.admit(
artifact,
custody,
expected_current_version=None,
)
# 4. Pinning the returned version resolves the same immutable bytes.
pinned = client.resolve(
address,
source="registry",
version=admitted.version,
)
assert pinned.to_dict() == admitted.to_dict()
Only three operations use the managed network: arbitrate, admit, and
resolve(..., source="registry"). Remember, recall, and default resolution stay
local. There is no automatic fallback, publication, or admission.
Managed endpoints:
https://warf.astrognosy.comis the WARF Gateway.https://reason.astrognosy.comis the Reason Registry.https://xport.astrognosy.comremains a compatibility hostname.
The former Xchange and Xport names remain hidden compatibility aliases. New applications use arbitration, admission, Gateway, and Registry language.
One SDK and MCP lock
reason-rdn 0.5 and rdn/protocol-lock.json own the public artifact shape,
address grammar, parser, version identity, and MCP contract. The advertised MCP
tools are exactly remember, recall, resolve, arbitrate, admit, and
status. The private reason-py package is a compatibility facade and delegates
canonical parsing to this lock.
Components
rdn/client.py local and network client
rdn/reason.py high-level Python API
rdn/cli.py command line interface
rdn/mcp/server.py MCP tools
rdn/node/server.py embedded local memory node
rdn/dash.py optional dashboard
rdn/handoff/ fingerprints and repository handoffs
How the ecosystem fits together
ReasonRDN is the local memory and client layer. The WARF Gateway and Reason Registry provide managed arbitration and resolution; the WARF Scoring Service supplies selected scoring profiles; WARF Edge adds matching and action selection; and Xfer powers domain-specific verticals.
Applications can start with ReasonRDN alone and add WARF arbitration when a
handoff has competing submissions. A reason:// URI supplies the stable
address. The Registry current pointer is convenient; a returned sha256:
version pins immutable content and validation bytes.
IETF work
The submitted versions remain authoritative on IETF Datatracker:
Working RFCXML and rendered artifacts for the next revisions are maintained with the reference network implementation and reviewed before submission. The current working revision is local and unsubmitted.
AAIF interoperability concept
The focused open-source contribution is portable agent handoffs after a tool or
workflow finishes. See
docs/AAIF-INTEROPERABILITY.md for the small
cross-runtime demo and its boundary.
Development
pip install -e '.[full]'
python -m pytest -q
License
Apache-2.0. See LICENSE.
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 reason_rdn-0.5.0.tar.gz.
File metadata
- Download URL: reason_rdn-0.5.0.tar.gz
- Upload date:
- Size: 60.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f6ccb51a1a4b48dd0eaf0c6b19c9cb475d9949d9e5f7b575513d172d532ed8f
|
|
| MD5 |
7bea42a867a75ad7ee3f6653fee367e8
|
|
| BLAKE2b-256 |
7bb7ad01b5fe9e420a1977a0c7e513ff9ef4d02635e73c31552c8dc604bf694f
|
File details
Details for the file reason_rdn-0.5.0-py3-none-any.whl.
File metadata
- Download URL: reason_rdn-0.5.0-py3-none-any.whl
- Upload date:
- Size: 56.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01ef8d9f9b8b1052f2dc3960d0d4886126affcf50e762fe0a5a966618836121e
|
|
| MD5 |
e6222552f7c8e18ed1003d06656cb441
|
|
| BLAKE2b-256 |
7345716f2a7b9357cd5befa02e15519bff0fa49269d55efefa9d23a09a607c3f
|