MIT licensed · 1,000+ GitHub stars · 7,000+ installs · Backed by Y Combinator
The Intelligent VM
The session is the computer.
Last generation, you were a conversant with the model. This generation, you are a tool call to it.
What changed when the model moved outside the chat.
Chatbot generation
Intelligent VM
Runs to send the next message
Runs in an outer loop, outside of a chat
Tools serve the reply
The reply is a tool
You are the conversant
You are a tool call
ChatGPT · Claude.ai · Gemini
Claude Code · Codex · Press · Pi · Amp
The anatomy. An Intelligent VM is a sufficiently intelligent model plus a harness. The harness needs three things: a loop (the clock), a REPL-like execution environment (the CPU), and a filesystem (memory and disk). Give a capable model those three and it simulates a computer you can program — in English.
You’re probably already programming this computer. Every SKILLS.md, every CLAUDE.md, every well-crafted system prompt is a program in English. Markdown is already the source. Coding agents are already the runtime. The discipline just doesn’t have a name yet.
And those programs are loosely typed. No dependency resolution. No inversion of control. No composition primitives. One file grows to a thousand lines and it starts to fray — the model loses the plot, agents collapse into each other, the same work gets done twice. OpenProse is a subset of Markdown that supplies what’s missing: contracts, shapes, semantic auto-wiring, and a catalog of composition patterns. The same Markdown you already write — with structure where it helps.
Two concepts
Everything is either a Component or the Container.
The system has two concepts. Everything else is an implication.
Component
A service with a contract. It may delegate to other components (via shape) or not. There is no architectural distinction between a “leaf” and a “coordinator” — a component that delegates is just a component whose shape mentions other components. Same file format, same contract surface, same rules.
Container
The intelligent orchestrator ( Forme + harness) that reads all components, auto-wires them by contract matching, and executes the dependency graph. Analogous to Spring’s DI container, but wires by understanding rather than type matching.
The rough map. If you’ve written Spring, this is mostly a rename.
Spring
Prose
@Component
A .md file with kind: service
@Autowired
Contract matching (requires matched to ensures)
@SpringBootApplication + @ComponentScan
Entry point file with kind: program + services: [...]
@Test + JUnit assertions
kind: test with fixtures:, expects:, expects-not:
applicationContext.xml
manifest.md (the materialized wiring graph)
new Service() inline
Execution block with explicit let + call statements
Explainer · 3.5 min
Learn OpenProse in under five minutes.
A Prose program
Valid Markdown. No custom syntax.
YAML frontmatter for metadata. Markdown sections for the contract. Multiple services per file via ## headings. The entry point is whichever file has kind: program.
researcher.md
---name:researcherkind:serviceshape:self:[evaluate sources, score confidence]delegates:summarizer:[compression]prohibited:[direct web scraping]---requires:-topic: a research question to investigateensures:-findings: sourced claims from 3+ distinct sources, each with confidence 0-1-sources: all URLs consulted with relevance ratings-if sources are unavailable: partial findings from cached data, flagged as staleenvironment:-SEARCH_API_KEY: provided by the runtime for web search accesserrors:-no-results: no relevant sources found for this topicinvariants:-audit log is appended with this invocation's outcomestrategies:-when few sources found: broaden search terms-when many low-quality sources: prioritize academic and primary sources
That file is the whole component. Multi-service programs use ## headings to delimit services within a file, or split one service per file in the same directory. Programs can import others from the registry at p.prose.md.
Contract surface
Six sections. Most are optional.
The container wires on requires matched to ensures. The other four — errors, invariants, strategies, environment — declare failures, truths, behaviors, and runtime dependencies when a service needs them.
Section
Meaning
requires:
What the caller must provide (inputs + constraints on them).
ensures:
What this service produces on success. Conditional clauses express degraded or fallback outputs.
errors:
Declared failure conditions this service can signal, with accompanying data.
invariants:
What is true regardless of success or failure. Checked after the run completes.
strategies:
Prioritized behavioral options the model selects from based on state.
environment:
Runtime dependencies provided by the container, not by the caller. The model references them by variable name — never reads, logs, or includes the value in any output.
Author control
Declarative by default. Imperative when needed.
Three levels of specification. Each level's explicit code is what the level above would generate automatically if omitted. You trade adaptability for determinism, and you decide where on the spectrum to sit.
Level
What you write
Spring analog
When to use
1 · Contracts only
requires + ensures on each component
@Autowired
Default. Trust the model. Programs improve as models improve.
2 · Wiring declaration
Explicit dependency graph mapping outputs to inputs
applicationContext.xml
When you want to inspect, debug, or pin the graph.
3 · Execution block
Explicit let + call sequence
new Service() inline
Full procedural control. Deterministic — model follows exactly.
Within execution blocks the full imperative grammar is available: parallel:, loop until, for each, try/catch, if/elif/else, choice.
Forme
The framework wires by understanding.
Forme is Phase 1 of a program run. It reads the contracts, resolves requires to ensures, and emits a manifest. Analogous to Spring's DI container — but it disambiguates by reading natural language, not by matching types.
Traditional container
Forme container
Resolves by type signature
Resolves by semantic understanding of contracts
Fails on ambiguous types
Disambiguates by reading natural language
Requires explicit annotations
Infers relationships from requires to ensures
Static wiring at compile time
Intelligent wiring at run time
The wiring algorithm
Read the entry point — find the file with kind: program.
Resolve component files for each name in services.
Forme ships reusable structural components in three categories. Composites combine services into multi-agent patterns; controls manage delegation flow; roles fill leaf slots.
Composites
multi-agent structural patterns
worker-critic
Work, evaluate, retry until accepted
proposer-adversary
Propose then attack; parent decides
dialectic
Argue positions; disagreement is output
ensemble-synthesizer
K agents work, synthesizer merges
witness
Independent observation; discrepancies flag ambiguity
ratchet
Advance and certify; never roll back
Controls
delegation flow patterns
pipeline
Sequential transformation chain
map-reduce
Split, delegate in parallel, merge
gate
Check precondition, fail-fast if unmet
retry-with-learning
Retry with failure analysis between attempts
progressive-refinement
Iteratively improve to threshold
Roles
single-agent leaf behaviors
critic
Evaluate quality; accept or reject with reasoning
verifier
Check formal correctness against specification
summarizer
Compress preserving key information
classifier
Categorize input into a given set of labels
extractor
Map unstructured input to a typed schema
Runtime
Prose Complete — the minimum capability threshold.
A harness is Prose Complete if it can run a .prose program of arbitrary complexity. Maintain state in context or files, spawn real subagents, evaluate discretion conditions intelligently. The LLM is the CPU. The harness is the computer.
A System is Prose Complete if it can run a .prose program of arbitrary complexity.
Known Prose Complete harnesses. Same program, different computer.
Harness
Type
Status
Claude Code
Coding agent (Anthropic)
Primary dev + prod harness
OpenCode
Open-source coding agent
Prose Complete
Pi
Open-source coding agent
Prose Complete
Codex CLI
Coding agent (OpenAI)
Prose Complete
Amp
Coding agent (Sourcegraph)
Prose Complete
Press
Purpose-built RLM runtime
@openprose/press on npm
Two-phase execution. Forme writes the manifest; the harness reads it.
Phase
Who
Input
Output
1 · Wiring
Forme
.md component files
manifest.md
2 · Execution
Prose VM (harness)
manifest.md
Program output
The manifest is a Markdown file. You can read it, diff it, and check it in. Inspect it to debug; pin it for determinism; regenerate it if the underlying programs change. Single-component programs skip Phase 1 entirely — the .md file is the program.
Benchmarks
Results on standard benchmarks.
Press running Prose programs on current-generation RLM benchmarks.
Benchmark
Best result
Notes
ARC-AGI-2
85.28%
Python reference via arcgentica
LongMemEval
89.8%
Near-SOTA (Raymond Weitekamp, dspy.RLM)
OOLONG
58.4%
Long-context aggregation, Gemini 3 Flash
Observability
The trace is the record.
The runtime emits structured events propagated through the full delegation tree. Every event carries runId, invocationId, parentId, depth, and timestamp.
Lifecycle
run:start
run:end
invocation:start
invocation:end
iteration:start
iteration:end
LLM
llm:request
llm:response
llm:error
Delegation
delegation:spawn
delegation:return
delegation:error
State
sandbox:snapshot
Token tracking and cost attribution are built in — events capture input/output token counts per LLM call, enabling cost breakdown by phase, service, and depth.
prose status --graph reconstructs the DAG of runs from upstream: headers in state.md, showing which runs consumed which prior runs. Lineage is visible across program boundaries.