OpenProse
The foundation -- a programming language for AI sessions. You declare an ideal world-model in Markdown contracts, and any Prose-Complete harness keeps it true.
OpenProse
OpenProse is a programming language for AI sessions. You write a *.prose.md
contract that declares an ideal world-model -- the truths you want kept current
-- and an agent host reads that contract, wires the work, and keeps the truths
true. The program is not a Python graph or a hosted workflow. The program is the
Markdown, and it runs inside the agent session itself.
This is the foundation. Reactor is the deterministic harness built to run it. They are not two systems; they are one system, two layers. OpenProse is the language you author in. Reactor is the recommended host that serves it efficiently. The contract is harness-agnostic; the same Markdown runs on any compliant host.
Declare outcomes, not steps
A prompt says do this. A contract says these things must be true when you are
done, and they must stay true as the world changes. Intent lives only in the
contract (Tenet 1): the *.prose.md carries 100% of the semantic weight. There
is no second authored surface for meaning -- not a prompt, not a config, not a
tuned judge. Compiled artifacts and projections are derived views; when one
disagrees with the Markdown, the Markdown is right.
So you do not script a sequence of model calls. You declare a standing goal and the shape of the truth that satisfies it, and you let the host figure out the rest -- which is exactly what makes the work reusable, inspectable, and portable.
A type system for agent workflows
The cleanest way to hold OpenProse in your head is as a type system for agent work:
A bare prompt is
any-- it runs, but nothing is checked. A contract is a typed function: inputs and outputs are declared, callers can reason about composition, and violations fail loudly.
You would not write a 2,000-line TypeScript system in any. Multi-step agent
workflows are the same. A contract gives the model a typed shape to satisfy
instead of a pile of instructions, and gives you something better than vibes to
inspect afterward.
The render atom
Underneath every kind of contract is one operation that both the compile and run phases agree on -- the render atom:
(contract, evidence, prior world-model) -> (new world-model, receipt)A bounded agent session reads the contract and the new evidence, queries the truth it maintained last time, computes the next world-model, and signs a receipt. The receipt is the durable commit; it is the audit record, the composition edge, and the exit ticket all at once (Tenet 5). Continuity lives in that trail, not in a session that runs forever (Tenet 3) -- a one-shot run is just the degenerate case of a standing one.
The authored surface is small and complete
The whole language is five kinds and a fixed set of ### sections.
responsibility-- the headline kind. A standing goal mounted as a node whose maintained truth is kept current over time. Node-ness comes from mounting, never from statefulness.function-- a called, ephemeral helper that binds### Parametersand returns### Returns. Never a node.gateway-- an external source (webhook, cron, manual ingress) that maintains the latest incoming truth.pattern-- reusable coordination, expanded into nodes at compile time.test-- assertions over a subject's world-model or receipts.
The load-bearing section is ### Maintains: the world-model schema, doing four
jobs at once. It types the maintained truth, carries the canonicalization
spec (which fields are material and how they normalize), declares optional
facets (named sub-truths a consumer can subscribe to one at a time), and
states postconditions (the obligations a render must satisfy before it may
commit). A render that cannot satisfy its postconditions commits nothing -- the
prior truth stands and a failed receipt records why.
New capability in OpenProse is new semantics in the skill docs, never new syntax or a YAML overlay. The authored surface stays small, stable, and complete on purpose.
Hands off to Reactor
OpenProse defines the contract and what it means. It deliberately does not
define the runtime that serves it -- the two-phase compile/run split,
memoization, the continuity clock, receipts, and composition are the harness's
concern. Reactor (@openprose/reactor + reactor-cli +
reactor-devtools) is that harness: it compiles your contracts into a
content-addressed DAG and runs them so that expensive model work happens only
when something material actually moved. Cost scales with surprise, not the clock.
You can author OpenProse against any Prose-Complete host. Reactor is the recommended fast path because it makes the maintained-truth model real, deterministic, and observable.
Declare outcomes
Why you declare an ideal world-model to keep current, not a sequence of instructions.
Contracts
The five kinds and the load-bearing sections. Structure is subscription.
ProseScript
The optional imperative layer for when the order of operations matters.
Harness-agnostic
The Prose-Complete VM primitives, and why the session embodies the VM.
Setup
The agent-first path: keyless proof first, then init, doctor, compile, serve.
Run it with Reactor
The deterministic harness built to run OpenProse -- the recommended fast path.
Source of truth
The canonical execution behavior lives in the open-source
open-prose skill (currently 0.15.0).
These docs are orientation. If the docs and the skill ever disagree, trust the
skill.
The conversation always ends. The responsibility shouldn't have to.
OpenProse
One system, two layers. OpenProse is the paradigm you author in -- declare the outcomes you want kept true, in Markdown. Reactor is the harness that keeps them true, so cost scales with surprise, not the clock.
Declare outcomes, not instructions
The central teaching of OpenProse -- author an ideal world-model to keep true, not a sequence of steps to run. Intent lives only in the contract.