HELIX

ADR-0002 — Two roles only: Runtime and Embedder

Context

ADR-0001 committed us to a protocol rather than a framework. A protocol needs a role split sharp enough that both sides can be implemented independently, by different teams, in different languages, without coordination.

Decision

AEP defines exactly two roles:

The wire protocol is the only coupling. An embedder written once drives any conforming runtime; a runtime exposes the same surface to every embedder.

The goal / non-goal pairing

Six goals shape the architecture. The load-bearing ones:

ID Goal
G1/G2 Portability of both sides — anyone can build a runtime and an embedder.
G3 First-class self-* with safety boundaries — spawn, prompt-modify, memory, peer messaging are protocol primitives, always bounded by ceilings, budgets and policy.
G4 MCP at the tool plane — every tool, local or remote, reached through MCP semantics.
G5 Compliance as a core concern — subject_id rides with any object that may contain PII.
G6 Implementable in about a week for the wire layer.

The non-goals matter as much, because they are what keep the protocol small enough to stay durable:

Consequences

The thesis this encodes: maximal autonomy inside a strict, declarative cage. An agent may rewrite its prompt, spawn helpers and accumulate memory — but only within ceilings it cannot raise, under a constitution it cannot fully unlock, inside a tree it cannot escape, using tools it cannot extend.

Because NG3 keeps model selection out of the protocol, provider choice becomes a runtime concern — see ADR-0006.