RLM — Language-Based Workflows (Rhai/.ragsh) Integration Plan
Goal: expose TinyAgents' Rhai-backed REPL language (the .ragsh / RLM /
CodeAct surface, gated behind the repl cargo feature in
vendor/tinyagents/Cargo.toml) as a first-class rlm tool in the
OpenHuman Rust core, so the orchestrator agent can write its own workflow
scripts — fan-out over subagents, batched tool/model calls, loops,
conditionals — and execute them deterministically, similar to Claude Code
Workflows and Recursive Language Models (RLMs).
Why
Today the orchestrator composes work through fixed primitives:
spawn_subagent, spawn_parallel_agents, run_workflow (WORKFLOW.md
bundles), and typed tinyflows graphs. None of these let the model express
ad-hoc control flow — "spawn N readers, dedupe their findings, verify each
survivor with 3 refuters, loop until dry". The .ragsh session in TinyAgents
is exactly that surface: a sandboxed, policy-bounded scripting engine whose
only host access is capability functions (model_query, tool_call,
agent_query, batched variants), with fail-closed limits on operations,
wall-clock time, output bytes, call counts, and recursion depth.
Architecture summary
Orchestrator model turn
└─ rlm tool call { script, session_id?, timeout_secs?, limits? }
└─ src/openhuman/rlm/ (new domain)
├─ session manager (persistent ReplSession per rlm session_id)
├─ capability bridge (openhuman Tools/Subagents/Provider →
│ tinyagents CapabilityRegistry)
├─ policy mapping (autonomy tier + SecurityPolicy → ReplPolicy)
├─ progress bridge (ReplCallRecord / EventSink → AgentProgress
│ + DomainEvent bus)
└─ tinyagents::ReplSession::eval_cell (spawn_blocking)
└─ rhai engine — model_query / tool_call / agent_query /
*_batched / emit / answer (fail-closed ReplPolicy)
Two repos change:
vendor/tinyagents(submodule, separate PR againsttinyhumansai/tinyagents): host-embedding gaps — external cancellation flag, live capability-call events on theEventSink, async-embedding documentation. Branch:feat/repl-host-embedding.openhuman(one gigantic PR againsttinyhumansai/openhuman): thereplfeature flag, the newsrc/openhuman/rlm/domain, therlmtool, prompt/docs surfacing, and tests. Branch:feat/rlm-language-workflows, including the submodule pointer bump once the tinyagents PR lands.
Phases
| Phase | File | Deliverable |
|---|---|---|
| 1 | phase-1-research.md | Research findings: what tinyagents repl provides, what openhuman provides, the gaps |
| 2 | phase-2-tinyagents.md | TinyAgents-side changes (cancellation, live events) — separate PR |
| 3 | phase-3-rlm-domain.md | src/openhuman/rlm/ domain: sessions, capability bridge, policy |
| 4 | phase-4-rlm-tool.md | First-class rlm tool: schema, registration, prompt surfacing |
| 5 | phase-5-hardening.md | Error handling, timeouts, cancellation, limits, observability |
| 6 | phase-6-tests.md | Tests (written last): unit, timeout/cancel/limit, RPC E2E |
| 7 | phase-7-delivery.md | PR strategy: tinyagents PR + one gigantic openhuman PR |
Tests are deliberately the final implementation phase (per the feature brief): phases 3–5 land the behavior with verbose debug logging; phase 6 back-fills unit and E2E coverage to the ≥80% changed-line gate before the PR is opened.