Architecture — radioactive-ralph¶
This page describes the current architecture direction for the live product. The implementation still has gaps, but the contract is now clearer than it was: radioactive-ralph is a binary-first tool with in-code personas, and Claude Code is treated as a client of that binary over stdio MCP.
Core commitment¶
The repo is no longer trying to be all of these at once:
a Claude marketplace plugin
a family of slash-command skills
a binary
a durable HTTP MCP service
a provider-agnostic runtime
The active direction is narrower:
One binary —
radioactive_ralphOne durable state model — repo config plus XDG/App Support runtime state
One Claude integration path — stdio MCP
One persona source of truth — code-defined Ralph variants
Product shape¶
Layer |
Role |
|---|---|
|
The product boundary: init, plan store, supervisor, doctor, and MCP server |
Claude Code MCP |
Structured control plane into the binary |
Variant profiles |
Built-in Ralph personas that shape system prompt, safety posture, and runtime behavior |
Provider bindings |
Future abstraction for non-Claude agent CLIs |
Repo-visible state¶
Every repo that uses Ralph has .radioactive-ralph/ alongside .git/:
.radioactive-ralph/
├── config.toml
├── .gitignore
├── local.toml
└── plans/
├── index.md
└── <topic>-advisor.md
config.tomlis committed repo policy.local.tomlis gitignored operator-local state.plans/contains the human-readable planning artifacts.
Machine-local state¶
Machine-local runtime state lives under the Ralph state root:
$XDG_STATE_HOME/radioactive-ralph/
└── <repo-hash>/
├── plans.db
├── sessions/
├── logs/
└── worktrees/
This is where the durable plan DAG, runtime sessions, and per-repo transient
state belong. Never store this under .claude/.
Claude integration¶
Claude Code is integrated through stdio MCP:
radioactive_ralph initregisters the binary withclaude mcp addClaude spawns
radioactive_ralph serve --mcpthe MCP server exposes plan and runtime control surface
the binary remains the authority over variant behavior and state
The abandoned complexity was trying to make plugin skills, service-managed HTTP, and binary control all equally primary. They are not.
Personas, not skills¶
Ralph has many personalities, but the source of truth is now the code:
internal/variant/defines the behavioral profilesinternal/voice/defines the Ralph voice layerdocs/variants/explains each personality to operators
This keeps the canon in one place. A persona may eventually be surfaced through different front ends, but it should not require a separate parallel skill spec to exist.
Current provider reality¶
Today the runtime still assumes the claude CLI for agent execution. The code
therefore still knows about Claude-specific concerns such as model tier names,
reasoning effort, and CLI session behavior.
That is current implementation, not the long-term contract.
Provider direction¶
The target shape is a declarative provider binding layer inside repo config. Conceptually that means each repo can say:
which agent CLI to invoke
how to set model
how to set effort
how to append the Ralph persona prompt
how to pass the task/user prompt
what structured output format to expect back
That would allow the same Ralph personas to drive Claude, Codex, Gemini, OpenAI CLI tooling, or any other provider with the necessary bindings.
Current gaps¶
Fixit still writes markdown advice but does not yet fully populate the live DAG.
Plan gating is not yet properly repo-scoped.
runstill exposes less safety/runtime wiring than the variant docs imply.Provider bindings are still a design direction, not live code.
See state for the explicit status of those gaps.