Skip to content

Runtimes Overview

Spawnfile compiles agent manifests to runtime-specific output. A runtime is an external system that hosts agents as long-lived services. The compiler uses runtime adapters to translate portable Spawnfile declarations into the configuration and workspace files each runtime expects.

A runtime is Spawnfile-compatible when it satisfies all of these requirements:

  1. It runs as a long-lived service or daemon. Spawnfile targets autonomous agent runtimes, not tools invoked per task.
  2. It uses a markdown workspace as a first-class agent surface. The runtime reads Markdown documents to define agent identity, behavior, and context.
  3. It exposes a declarative configuration surface that a compiler can emit (JSON config, TOML config, etc.).

Systems that are manually invoked per task (coding assistants, chat CLIs, one-shot agent shells) are not Spawnfile targets, even if they use workspace conventions or Markdown control files.

The runtime registry is a YAML file at the repository root: runtimes.yaml. It declares which runtimes the project knows about, pins the version each adapter was written against, and tracks lifecycle status.

runtimes:
<name>:
remote: <git clone URL>
ref: <pinned git ref>
default_branch: <main | master>
status: <active | exploratory | deprecated>
FieldRequiredDescription
remoteyesGit clone URL for the runtime repository
refyesPinned git ref — the latest stable release tag
default_branchyesThe repository’s primary branch name
statusyesLifecycle status in the Spawnfile project
StatusMeaning
activeHas a working compiler adapter in src/runtime/<name>/
exploratoryResearch exists but no adapter yet
deprecatedWas previously active, adapter no longer maintained

These runtimes have working adapters:

  1. OpenClaw — JSON config, rich workspace layout, MCP through mcporter bridge, native multi-agent sessions.
  2. PicoClaw — JSON config, workspace-first model, first-class MCP surface, spawned subagents.
  3. Daimon — Noopolis-native generated harness app backed by Pi, grouped team agents, subscription auth support, local model endpoints, shared workspace resources.
  4. Pi — compatibility alias for the Daimon runtime path.

These runtimes are tracked as adapter research targets but have no bundled adapter yet:

  1. NullClaw — JSON config, OpenClaw-compatible structure, stdio-first MCP, delegate agents.
  2. ZeroClaw — TOML config, strong auth story, named delegate sub-agents.
  3. OpenFang — declarative config and agent templates, not mapped to a Spawnfile adapter yet.
  4. Hermes Agent — active harness candidate; config, workspace, and skill surfaces still need research.
  5. OpenCode — active coding-agent harness candidate; long-running runtime behavior still needs research.

Runtime APIs, config formats, and CLI interfaces change across versions. An adapter written against one version may not produce valid output for a different version. Pinning makes this explicit.

The ref field should point to the latest stable release tag. Stable means no pre-release suffixes like -alpha, -beta, -rc, or -dev. If a runtime only publishes pre-release tags, pin the most recent one and note it.

Bump ref when:

  • A new stable release is available and the adapter has been verified against it
  • The adapter is being updated to support new features from a newer version

Do not bump ref speculatively. The pin represents “the adapter works at this version.”

scripts/runtimes.sh reads runtimes.yaml and clones or checks out each runtime at its pinned ref:

Terminal window
./scripts/runtimes.sh # sync all runtimes
./scripts/runtimes.sh openclaw # sync one runtime

Cloned repositories live in runtimes/ at the repo root (gitignored). These are for research, blueprint generation, and adapter development. The spawnfile compile command does not require local runtime clones.

Blueprints are frozen reference layouts that capture the expected config and workspace structure for each compatible runtime at its pinned version. Active and exploratory runtimes share the core pattern: a JSON or TOML config file plus separate markdown docs in a workspace directory.

Blueprints serve as the ground truth for adapter implementation. They document exactly what files the adapter should emit and where they should be placed for a given runtime version.

Spawnfile defines a portable surface that adapters attempt to preserve across runtimes:

  • Markdown document roles (identity, soul, system, memory, heartbeat, extras)
  • Skills with SKILL.md
  • MCP server declarations
  • Runtime binding and execution intent
  • Team structure, representatives, generated team-context artifacts, and team.networks[]
  • Communication surfaces (Discord, Telegram, WhatsApp, Slack, Moltnet, and Webhook in v0.1 alpha)

If a runtime cannot preserve part of this surface exactly, the adapter reports supported, degraded, or unsupported according to the compile policy. The compile report always records these capability outcomes so you know what was preserved and what was lost.

Support levels:

  • Supported — the adapter preserves the Spawnfile declaration in the generated runtime.
  • Degraded — the project still compiles, but the compile report warns that runtime behavior is partial or different.
  • Rejected — validation fails at compile-plan time.
  • Compiler-owned — implemented by Spawnfile container/startup logic, then mounted or written into the runtime workspace.
Spawnfile featureOpenClawPicoClawDaimon
Adapter shapeOne gateway target per agentOne gateway target per agentOne generated app target for all Daimon agents in the compile graph
workspace.docsSupported as role files under the runtime workspaceSupported as role files under the runtime workspaceSupported per concrete agent workspace, plus a harness-owned operating contract
workspace.skillsSupported under workspace/skillsSupported under workspace/skillsSupported per concrete agent workspace
workspace.resources volumeCompiler-owned symlink/backing directory in each runtime workspaceCompiler-owned symlink/backing directory in each runtime workspaceCompiler-owned symlink/backing directory in each concrete agent workspace
workspace.resources gitCompiler-owned clone/link at container startupCompiler-owned clone/link at container startupCompiler-owned clone/link at container startup
environment.env and environment.secretsCompiler-owned env and secret materializationCompiler-owned env and secret materializationCompiler-owned env and secret materialization
environment.packagesCompiler-owned container package installationCompiler-owned container package installationCompiler-owned container package installation
environment.mcp_serversDegraded through OpenClaw bridge pathSupported through PicoClaw MCP configDegraded; not lowered into the generated Daimon app yet
execution.sandbox.modeSupported through OpenClaw runtime/container workspace behaviorSupported through restrict_to_workspace and container workspace behaviorDegraded; container/workspace isolation only, Pi itself is not a sandbox engine
subagentsDegraded; lowered to routed sessions, not full Spawnfile parent-owned semanticsSupported through PicoClaw subagent behaviorDegraded; grouped app agents exist, but parent-owned subagent semantics are not preserved
Spawnfile featureOpenClawPicoClawDaimon
OpenAI api_key authSupportedSupportedSupported
OpenAI codex authSupportedSupportedSupported
Anthropic api_key authSupportedSupportedSupported
Anthropic claude-code authSupportedSupportedSupported through Pi’s Anthropic OAuth auth store
custom or local endpoint with api_key or noneSupported, except subscription-import authSupported for supported endpoint/auth combinationsSupported through generated Pi models.json
schedule.kind: cronDegraded; no OpenClaw schedule store is emitted in v0.1Supported through workspace/cron/jobs.jsonDegraded; the generated app only supports interval schedules
schedule.kind: everyDegraded; no OpenClaw schedule store is emitted in v0.1Degraded; PicoClaw lowering is cron-only in v0.1Supported by the generated app scheduler
schedule.kind: disabledSupported, emits no wake registrationSupported, emits no wake registrationSupported, emits no wake registration
Spawnfile featureOpenClawPicoClawDaimon
surfaces.moltnetSupported through generated MoltnetNode bridge and OpenClaw hooksSupported through generated MoltnetNode bridge and Pico channelSupported through generated MoltnetNode bridge and Daimon control endpoint
Moltnet wake policy all / mentions / thread_only / neverSupported by the generated bridge configSupported by the generated bridge configSupported by the generated bridge config
DiscordSupported: pairing, open, user/guild/channel allowlists with the documented one-guild channel rulePartial: open and user allowlists; pairing and guild/channel allowlists rejectedRejected
TelegramSupported: pairing, open, user/chat allowlistsPartial: open and user allowlists; pairing and chat allowlists rejectedRejected
WhatsAppSupported: pairing, open, user/group allowlistsPartial: open and user allowlists; pairing and group allowlists rejectedRejected
SlackSupported: pairing, open, user/channel allowlistsPartial: open and user allowlists; pairing and channel allowlists rejectedRejected
WebhookParsed by the manifest schema, but not lowered by active adapters in v0.1Parsed by the manifest schema, but not lowered by active adapters in v0.1Rejected
Spawnfile featureOpenClawPicoClawDaimon
spawnfile compileSupportedSupportedSupported
spawnfile build / run / upSupported with pinned npm installSupported with pinned GitHub release archiveSupported with pinned Daimon/Pi npm packages and generated app
spawnfile status --live runtime probesSupported through OpenClaw status probesSupported through PicoClaw status probesLimited: deployment state and logs work; runtime health probes are not implemented yet
Runtime activity streamNot normalized yet; use status/logsNot normalized yet; use status/logsSupported through spawnfile.activity.v1 buffer and SSE endpoint
spawnfile dev apply --agent hot-addNot supported in v0.1Not supported in v0.1Supported for Daimon app agents and their Moltnet bridge
Managed Moltnet servers and durable Moltnet stateCompiler-owned and runtime-independentCompiler-owned and runtime-independentCompiler-owned and runtime-independent