mech.app

The mech.app newsletter

Agentic AI, minus the noise.

Get practical field notes on AI agents, automation, developer tools and security delivered to your inbox.

No spam. Unsubscribe anytime.

Dev Tools

Prime Agent's Recursive Language Model: Prompt-as-a-Variable and Programmatic Subagents

How Prime Agent's RLM abstraction treats context as variables inside a persistent REPL, with durable harness state and programmatic subagent spawning.

Source: github.com
Prime Agent's Recursive Language Model: Prompt-as-a-Variable and Programmatic Subagents

Prime Agent (#2 on GitHub TypeScript trending, 12,870 stars) replaces the ephemeral chat window with two durable abstractions: the Recursive Language Model (RLM) and the Continual Harness. The RLM treats prompts as variables and tools as function calls inside a persistent IPython REPL. The Continual Harness stores supplemental prompts, memories, skill descriptions, and reusable subagent specifications as state that survives sessions and gets refined through evidence-backed updates.

This architecture makes long-running coding and research workflows programmatic. File operations, shell commands, tool use, subagents, and context management all happen through code. The built-in model tool is persistent IPython. Child agents spawn with rlm(...) for parallel or background work and marshal results back to the parent.

Recursive Language Model: Context as Variables

Traditional agent frameworks treat context as a growing message history. The RLM abstraction flips this: context becomes variables you manipulate programmatically inside a persistent REPL.

Prompt-as-a-variable pattern:

  • System prompts, user instructions, and intermediate results are Python variables.
  • You modify, compose, or discard them with normal code.
  • The model sees only what you explicitly pass in the next call.

Persistent IPython as the built-in tool:

  • The agent runs inside a long-lived IPython session.
  • File reads, shell commands, HTTP requests, and data transformations happen in the same environment.
  • State persists across model calls: variables, imports, function definitions, and open connections remain available.

This eliminates the context-window juggling that plagues chat-based agents. Instead of pruning message history or summarizing past turns, you manage state with assignment, scoping, and garbage collection.

Continual Harness: Durable State Across Sessions

The Continual Harness stores four categories of durable state:

  1. Supplemental prompts: Reusable instruction fragments for common tasks.
  2. Memories: Facts, preferences, or decisions the agent should remember.
  3. Skill descriptions: Documented capabilities the agent can invoke.
  4. Subagent specifications: Reusable child-agent configurations with their own prompts and tool access.

Persistence mechanism:

  • Harness state lives in local files by default.
  • The agent reads this state at startup and writes updates at session end.
  • Updates are small and evidence-backed: the agent logs why it added or changed a memory, skill, or subagent spec.

Refinement loop:

  • During a session, the agent identifies patterns worth preserving (a useful shell command sequence, a debugging heuristic, a data-cleaning function).
  • It proposes an update to the harness with a rationale.
  • The update is logged and applied, so future sessions start with that knowledge.

This creates a feedback loop where the agent improves its own operating environment over time, without requiring external training or fine-tuning.

Programmatic Subagent Spawning with rlm(...)

Prime Agent treats subagents as function calls. The rlm(...) primitive spawns a child agent, waits for its result, and returns it to the parent.

Isolation boundaries:

  • Each subagent runs in its own IPython session.
  • The parent passes in a prompt, a subset of tools, and optionally a slice of harness state.
  • The subagent cannot modify the parent’s variables or file handles.

Result marshaling:

  • The subagent returns a structured result (string, JSON, file path, or error).
  • The parent receives this result as a normal Python value and continues execution.

Parallel execution:

  • Multiple rlm(...) calls can run concurrently.
  • The parent blocks until all children return, or it can poll for partial results.

This pattern enables divide-and-conquer workflows: the parent agent decomposes a task, spawns subagents for each subtask, and aggregates their outputs.

Architecture: Persistent REPL + Durable Harness

┌─────────────────────────────────────────┐
│         Prime Agent Session             │
├─────────────────────────────────────────┤
│  Persistent IPython REPL                │
│  ├─ Variables (context, results)        │
│  ├─ Imports & function definitions      │
│  └─ Open file handles, connections      │
├─────────────────────────────────────────┤
│  Continual Harness (durable state)      │
│  ├─ Supplemental prompts                │
│  ├─ Memories                            │
│  ├─ Skill descriptions                  │
│  └─ Subagent specifications             │
├─────────────────────────────────────────┤
│  Model calls (LLM API)                  │
│  └─ Receives prompt + harness context   │
├─────────────────────────────────────────┤
│  Subagent spawning via rlm(...)         │
│  ├─ Child IPython session               │
│  ├─ Isolated variables & tools          │
│  └─ Structured result return            │
└─────────────────────────────────────────┘

Execution flow:

  1. Agent starts, loads harness state from disk.
  2. User provides a high-level goal.
  3. Agent decomposes the goal into steps, each expressed as Python code.
  4. For each step, the agent either executes code in the persistent REPL or spawns a subagent with rlm(...).
  5. Results accumulate in variables.
  6. At session end, the agent proposes harness updates (new memories, refined skills, reusable subagent specs).
  7. Updates are logged and written to disk.

Observability and Debugging

Execution traces:

  • Every model call, tool invocation, and subagent spawn is logged with input, output, and latency.
  • The persistent REPL means you can inspect variables at any point.

Harness update log:

  • Each proposed update includes a rationale and the evidence that triggered it.
  • You can review and approve updates before they persist, or configure auto-approval for low-risk changes.

Subagent isolation:

  • Child agents log to separate files.
  • If a subagent fails, the parent sees the error and can retry or adjust the prompt.

Trade-offs and Failure Modes

DimensionStrengthRisk
Context managementVariables replace message history, eliminating context-window bloatRequires explicit state management; easy to lose important context if not assigned to a variable
DurabilityHarness state persists across sessions, enabling long-term improvementStale or incorrect harness entries can degrade performance; no automatic cleanup
Subagent isolationClean boundaries prevent interferenceOverhead of spawning new IPython sessions; latency for parallel work
Programmatic controlFull Python expressiveness for orchestrationSteeper learning curve than chat-based agents; requires coding fluency
Evidence-backed updatesHarness refinements are logged and traceableUpdate proposals can be noisy; requires tuning approval thresholds

Common failure modes:

  • Variable shadowing: Subagents or nested calls overwrite parent variables with the same name.
  • Harness bloat: Memories and skills accumulate without pruning, slowing startup and confusing the model.
  • Subagent deadlock: Parent waits for a subagent that itself spawns a child and blocks, creating a dependency cycle.
  • Tool access leakage: Subagent inherits too many tools from parent, enabling unintended side effects.

Security Boundaries

Execution sandbox:

  • The persistent IPython session has full access to the host filesystem and network.
  • No built-in sandboxing: the agent can execute arbitrary shell commands.

Subagent privilege reduction:

  • You can spawn subagents with a restricted tool set (read-only filesystem, no network, no shell).
  • This limits blast radius if a subagent is compromised or misbehaves.

Harness integrity:

  • Harness updates are append-only by default.
  • You can enable cryptographic signing of updates to detect tampering.

Recommended mitigations:

  • Run Prime Agent inside a container or VM with limited host access.
  • Use read-only mounts for sensitive directories.
  • Review harness updates before approving them in production.

Deployment Shape

Local development:

  • Single-user workstation with local LLM or API key.
  • Harness state in ~/.prime-agent/.

Team collaboration:

  • Shared harness repository (Git or object storage).
  • Each developer runs their own agent session, pulls harness updates, and pushes refinements.

Long-running automation:

  • Agent runs as a daemon, polls a task queue.
  • Harness state in a persistent volume.
  • Subagents spawn in ephemeral containers for isolation.

Scaling considerations:

  • Persistent IPython sessions are single-threaded; horizontal scaling requires multiple agent instances with partitioned work.
  • Subagent spawning is I/O-bound (session startup); pre-warm a pool of idle IPython sessions to reduce latency.

Technical Verdict

Use Prime Agent when:

  • You need long-running coding or research workflows that span multiple sessions.
  • You want programmatic control over context and tool use, not a chat interface.
  • You value durability: the agent should remember past decisions and refine its own operating patterns.
  • You are comfortable writing Python orchestration code and debugging REPL state.

Avoid Prime Agent when:

  • You need a sandboxed execution environment with strong security boundaries (the persistent REPL has full host access).
  • You want a low-code or no-code agent builder (Prime Agent requires fluency in Python and agent architecture).
  • Your tasks are short-lived and stateless (the harness and persistent REPL add overhead for one-shot queries).
  • You need sub-second latency for subagent spawning (IPython session startup is slow).

The RLM abstraction and Continual Harness represent a shift from ephemeral chat to durable, programmatic agent environments. This pattern trades simplicity for power: you get full control over state, context, and orchestration, but you must manage that complexity yourself.