* feat: make contract id: optional and hold every declared id to its format The format doc required id: on every responsibility and the compiler CLI preflighted for it, yet nothing downstream read the field: the IR keys nodes by slug, the state backends key the world model by node, and the fingerprint is over content. Sixty-seven of 86 example responsibilities had no id and half of the ids that existed were hand-typed slugs, so 12 of 29 examples refused to compile for a rule with no consumer. id: is now optional on responsibilities and gateways: the slug is the identity by default, and a declared id is the source identity that survives renames. The format doc, compiler instruction, CLI preflight, changelog conventions, and language spec all say the same thing. The eleven hand-typed slug ids in the corpus are dropped, since they named nothing the slug does not, and the two over-long compiler fixture ids are trimmed to the documented 26-character Crockford shape. scripts/mint-contract-id.mjs mints ids for authors who want one and repairs malformed ids in place. A new corpus suite walks every example and holds each declared id to the format, checks uniqueness, and keeps version: in semver form. * fix: fold every example section into the canonical set Twenty-two headings across 18 example contracts were near-misses of a canonical section, so the VM lowered them to plain documentation instead of the semantics their authors meant. Continuity headings that carried the driven-ness in the title become a bare Continuity section with the driven-ness as its first bullet. Postconditions bullets fold into Maintains. Facets become named parts under Maintains, each with a material boundary. Failure containment becomes Invariants, a Continuity recheck becomes the self-driven bullet, and a gateway's watched globs move into Receives. A new corpus suite walks every example and holds each ### heading to the canonical table in the format doc, cross-checking its own list against the table so the two cannot drift apart. The three inbound- email examples join the intelligent-react shape suite, and the four implementation-pipeline contracts join the facet-named-parts suite, so no example is invisible to CI. * fix: every example Requires now names a producer in its own set Three examples carried needs that Forme could never satisfy from their own contracts. competitor-activity named three signal feeds that existed only in parentheticals; research-inbox-triage named a question list and an owner roster nothing produced; agent-observatory named four adapter mount instances that lived only in its README. The format doc gains a short rule for facet families and per-entity mounts: a placeholder facet heading declares a family, a placeholder need subscribes to one member, and the harness binds the member at mount time while the compiler emits the family. Forme's matching step says the same. competitor-activity gains a signal-feeds gateway with one facet per signal, so the monitor's three needs resolve facet by facet. research-inbox-triage gains a research-registry gateway that brings the human-maintained questions and roster into the graph. agent-observatory rewrites its adapter needs in family form and stays at nine contracts. Each example reaches Forme with zero unsatisfied needs and an acyclic topology. The new contracts join the facet-named-parts suite, and competitor-activity joins the intelligent-react shape suite. * docs: attribute described example topologies to the reference harness Eight example READMEs state node and edge counts that mounting src/ alone cannot produce; the numbers come from the reference harness's per-entity expansion. Each README now says so in the sentence that carries the count and points at the repository README's Harnesses section, and no Conformance expectations section states a count that src/ cannot mount. The corpus index says the same for the set. A new corpus suite walks every example README, counts the contracts src/ mounts, and requires any larger claim to share its sentence with the attribution, so a future README cannot over-claim silently. * docs: specify node identity, artifact locators, and the receipt cost shape The IR doc keyed every worked example by slug without saying what the node key is. It now states the two-identifier model: node is mount identity, unique within a manifest and defaulting to the slug for a single mount, while a declared frontmatter id: is the source identity behind it and is not emitted in a version 2 manifest. The same doc says what an artifact locator resolves against: the OpenProse root, for canonicalizers and postconditions alike. The reconciler concept doc gives the receipt cost field its sub-shape, including the surprise_cause that must equal the wake source, which is what makes cost-scales-with-surprise observable. Doc-conformance assertions pin each addition in the suite that already owns the file. No IR schema bump; the expected and invalid fixtures validate unchanged. * docs: cite in-repo sections instead of private design documents Thirty shipped files, from the format doc and the state backends to the example contracts and the conformance tests, cited design documents by section that live outside this repository. A public clone should never point its readers at text they cannot open. Every citation now names the in-repo section that owns the rule, such as the named-parts rule in the format doc or the fingerprint rules in the reconciler concept, or the sentence simply stands on its own where it needed no support. Test titles that carried a citation are retitled. No links were added; the replacements are prose a stranger can follow. * docs: pin harness status facts and guard the spec against rot The spec marked implementation-status facts with the word "today" and no attribution, so they would rot silently now that the reference harness versions on its own. Six claims about poll cadence, the unwired commit gate, the thin v0 receipt, the flat serve loop, and the dropped Schedule section now name the reference harness and the version they describe, and point once per document at the repository README's Harnesses section. The two spec documents agree on a harness-chosen receipt ledger layout. Two ideation links and a stray phase marker are gone, the README's Harnesses link targets the harness spec, and its version sentence defers to SKILL.md as the version of record. The version script writes each manifest field on its own line instead of round-tripping the file through jq, so a bump no longer reflows the codex manifest; that manifest's capabilities array is collapsed back to one line. Three guards land in the suites that own the territory: no shipped file may cite a private design document, every relative link in spec/ and skills/ must resolve, and the README may not hardcode a skill version. * chore: release skill 0.18.0 The format doc gained documented surface this cycle: id: is optional with the slug as default identity, version: is author-owned provenance, and facet families and per-entity mounts have a notation. The example corpus is compiler-clean under those rules and the keyless conformance suite proves it. That is a minor bump on the skill track. The changelog entry tells an author what changed in authored files and that a missing id: is no longer a compile error. runtime_contract stays at 2, so prose upgrade needs no source rewrite. The version script now touches exactly one line per manifest, which this bump demonstrates.
56 KiB
OpenProse
Standing AI jobs, declared as durable Markdown contracts.
This document is the specification of the OpenProse Language & Framework —
the durable *.prose.md contract format, the skill semantics that interpret
it, the model-run compiler that lowers it, and the standard library that
packages reusable behavior. It is the spec for what ships bundled as the
SKILL.
The OpenProse corpus divides labor exactly, and each document maps to what ships:
- 01-Language.md — this document, the Language & Framework, bundled as the SKILL: syntax, kinds, sections, compile model, std/co.
- 02-Harness.md — the Harness contract: what any conforming harness (a CLI, a server, a hosted runtime) must do to serve these contracts — the loop, invariants, the reconciler, memoization, forecast, receipts, composition.
- 03-AuthoringPattern.md — the Authoring
Pattern, SKILL-bundled but harness-governed: how to write
*.prose.mdso a conforming harness's mechanisms engage. It bridges this doc and the Harness doc. - 00-Tenets.md — the constitution. When any document tensions with a tenet, the tenet wins.
This file has three parts, mirroring its companions:
- The ideal OpenProse language and framework.
- What exists today (the current
platform/external/proseskill package, treated as ground truth). - What is next to bring the current skill to the ideal.
Part I — The Ideal OpenProse Language & Framework
OpenProse is a contract format, runtime doctrine, skill package, and standard
library for making agent work readable, reviewable, versioned, reusable, and
inspectable. A user writes one *.prose.md file of durable intent. The
compile phase (Forme) wires the responsibility DAG from the contract set; a
Prose Complete agent host then serves that DAG — spawning isolated bounded
sessions and leaving a durable receipt under an OpenProse root.
The central idea:
Markdown source defines intent.
Skill and interpreter docs define semantics.
A model-run compiler lowers semantics into IR; deterministic code validates it.
The harness serves IR.
Runs interpret and act inside bounded activations.
The commitments that define the language
Each is a Tenet made concrete at the language layer. They are the north star; Part II is honest about how far the current skill has climbed toward them.
- Markdown is the only contract (Tenet 1).
*.prose.mdcarries 100% of semantic weight. Compiled IR and other projections are derived views; if any disagrees with the Markdown, the Markdown is right. There is no second surface where intent lives — not a prompt, not a tool config, not a hidden judge prompt (Tenet 1). - The responsibility is the program (the inversion). A standing goal
written as durable intent is the top-level authored object — a
kind: responsibility, mounted as a node whose truth is maintained over time. Node-ness comes from mounting, never from statefulness: a bounded, no-continuity job is akind: function(a called, ephemeral helper that binds### Parametersand returns### Returns), not a lesser kind of loop. - The same Markdown runs on any Prose Complete host (Tenet 1). Every
contract authored against this spec executes identically on any compliant
host. A fresh
git cloneis a first-class experience; a long-lived host adds reliability and scale, never semantics. - Intelligence lives in the model, not in deterministic code (Tenet 2). Compilation is itself model work — intelligent sessions lower a contract into its IR (the Forme topology, the per-node canonicalizer, and the postcondition validators — deterministic where the obligation is expressible, render-attested where it is semantic); deterministic code only validates that IR, wires connectors, enforces boundaries, schedules, and signs. The language never grows a config format to encode what the model should decide.
- The authored surface is small, stable, and complete. Five kinds
(
responsibility,function,gateway,pattern,test), the canonical###section set (### Description,### Goal,### Requires,### Maintains,### Continuity,### Invariants,### Errors,### Strategies,### Execution, plus### Parameters/### Returnsfor afunction, the gateway ingress sections (### Schedule/### Receives/### Emits/### Payload), the test and pattern sections (### Fixtures/### Expectsfor atest,### Slots/### Config/### Delegationfor apattern), and the carried### Shape/### Environment/### Skills/### Tools/### Runtime), and the header hierarchy are the entire language. Persistence is conferred by mounting a responsibility — the harness gives a mounted node its single durable world-model — not by a config flag. New capability is new semantics in skill docs, never new syntax or a YAML overlay. - Material change is declared, then frozen into a fingerprint (cost scales
with surprise). The author declares, inside
### Maintains, what counts as a material change — which fields matter, how text/sets/numbers normalize, and (optionally) how the truth divides into facets. Compilation lowers that prose into a deterministic canonicalizer, and the run phase fingerprints each render's output through it. An unmoved fingerprint means the world did not materially change, so the dumb reconciler skips the render at zero cost — there is no judge re-deciding "did this change." The fingerprint is one term of the node's three-part memo key(contract_fingerprint, input_fingerprints, freshness_epoch); a declared freshness window (valid_until) is the third term, so silent staleness still forces a re-render even when nothing observable moved (see### Requires). Absent a material/immaterial split, maintenance cost scales with the clock, not with surprise. The normalization convention is the author's prose inside### Maintains; the compiled mechanics are the harness's (02-Harness.md). - The language packages reusable behavior and stays a public good.
stdandcoprove OpenProse programs compose like code. The language, runtime doctrine, and skill are MIT and free, forever; commerce is out of scope of this specification and nothing here depends on it. - Agents are first-class authors. Humans and agents co-equally author, fork, and compose contracts. Every surface, error, and metadata field is designed for both readers from the start.
- Every contract is portable (Tenet 6). The Markdown, with its durable trail, can leave for any Prose Complete harness with no lost semantics. The public artifact is the contract; the deployment's secrets and data stay private.
What the responsibility's load-bearing sections mean
Most ### sections' meaning is self-evident
from their name. Four carry the semantic load of a kind: responsibility and
the Ideal must state them rather than defer: ### Requires, ### Maintains,
### Continuity, and ### Invariants.
### Maintains is the world-model schema — the truth this node keeps
current. It does four jobs at once: it types the maintained truth; it
carries the canonicalization spec (which fields are material, how they
normalize) that compiles into the node's fingerprint; it declares facets
(below); and it states postconditions — the obligations a render must satisfy
before it may commit. There is no separate judge and no ### Criteria:
satisfaction folds into ### Maintains, checked deterministically where it can
be expressed as a validator and self-attested by the render where it is
semantic. A render that cannot satisfy its postconditions commits nothing — the
prior truth stands and a failed receipt records why: a reason addressed to the
contract author, naming exactly what the render could not satisfy. (A harness
whose receipt does not yet carry that reason field honors the naming only
in-render — see 02-Harness.md Open specification items.)
Facets make subscription structural. A #### sub-heading inside
### Maintains declares a facet — a named part of the truth. Its name is, at
once, its fingerprint unit (the canonicalizer emits one token per facet, plus
an always-on atomic token over the whole truth), its subscription symbol (a
consumer names it in ### Requires, and the reconciler wakes that consumer only
when that facet's token moves — Requires.<facet> ↔ Maintains.<facet>), and
its region of the world-model. Declaring no parts is the atomic default — one
truth, one token — and costs nothing. Symmetrically, a consumer whose
### Requires names the producer without a facet binds to that always-on atomic
token and so wakes on any material change (the OR of every facet); naming a
facet is how a consumer narrows that to one region. This adds no new grammar; it
reuses the heading hierarchy and the Requires↔Maintains join. Structure is
subscription.
### Requires declares what the node subscribes to. It names the upstream
facets this node consumes; Forme matches each ### Requires entry to a
producer's ### Maintains facet and draws the subscription edge. ### Requires
is the input side of the memo key: the run phase fingerprints the node's
contract together with its subscribed inputs and its freshness epoch, and
re-renders only when one of them moves. (A harness may realize the freshness
term as a forecast-driven self-receipt over a two-part (contract_fingerprint, input_fingerprints) key rather than a literal third element; the decision
semantics are identical — see 02-Harness.md Quiescence.)
### Continuity declares the wake source — when, beyond an input change, a
node should re-render. It is not a schedule. A node is input-driven by
default (it wakes when a subscribed facet moves); ### Continuity adds a
self-driven cadence (the truth goes stale on its own — a valid_until
freshness state the node carries in its world-model, read on a forecast cadence)
or marks a kind: gateway as external-driven (an ingress event wakes it).
Freshness state lives in the world-model as data; ### Continuity carries only
the policy that reads it. When a valid_until lapses, the harness mechanically
moves the affected facet's fingerprint and wakes the node — no model call to
decide that time has passed.
### Invariants declares the render's actuation boundary — the bound on how it
may touch the world. A render may act (send the mail, write the register), but
### Invariants states the rate and scope of that world-mutation and the
mutations it must not make ("only the published truth is writable; never modify
the observed system"). It is the authoring-time half of the render/commit split:
only the canonicalized published truth re-enters the memo, and ### Invariants
bounds everything else the render may do. (This is the capability rate/scope
bound; which collaborators a render may call is ### Shape's job.) In the ideal
the harness lowers and enforces this boundary at the render/commit split; today
it is authored prose the render is asked to honor until a harness lowers it —
see 02-Harness.md Metaphor, seam 2.
The author writes these; the harness owns the fingerprinting, the forecast cadence, the receipts, and the subscription wiring. The granular how-to — declaring material fields, faceting the truth, giving the world a cheap content identity, projection-only shapes — is the authoring pattern's (03-AuthoringPattern.md); the runtime mechanics are the harness's (02-Harness.md).
The full mechanics of the runtime that serves these contracts — the two-phase compile/run split, the memo engine, the deterministic continuity clock, the receipt ledger, composition — are not specified here. This document states their language-level semantics — what the author declares (a freshness window, a postcondition, the receipt as the commit object) and what it means — and leaves the mechanics that realize them to the harness (02-Harness.md). This document's ideal is the language: the contract a human or agent writes, and the semantics by which it is understood.
Part II — What Exists Today
This part is a synthesis of the current
openprose/proserepository, treated as the source of truth, measured honestly against Part I. Thev0.15.0"Intelligent React" overhaul advanced the skill'sruntime_contractfrom1to2, retiring the judge / verdict / pressure / fulfillment loop and re-cleaving the kind taxonomy around a single render atom. That migration is now essentially complete across the corpus: the teaching docs (SKILL.md,contract-markdown.md,concepts/,changelog.md), the library examples underskills/open-prose/examples/, and the bundledpackages/std/andpackages/co/contracts all carry the current vocabulary — zerokind: service,kind: system, or### Ensuresremain. The legacy@openprose/prose-clibinary has been removed: the language is embodied by the SKILL in-session, and a conforming harness (02-Harness.md) compiles and serves standing responsibilities. Older framing around hosted cloud products, social execution networks, company financing,kind: program, standalone.prosesource files, and the old registry model is not part of this synthesis unless the current repo still contains a live implementation.
Current Shape
The skill (SKILL version: 0.16.0, runtime_contract: 2) has five load-bearing
spec files plus the reconciler-semantics concept docs the v0.15.0 overhaul added:
| Piece | Location | Role |
|---|---|---|
| Contract Markdown | skills/open-prose/contract-markdown.md |
Canonical *.prose.md source format for responsibilities, functions, gateways, patterns, tests |
| Forme | skills/open-prose/forme.md |
Compile-phase wiring render: matches ### Requires ↔ ### Maintains and draws the responsibility-DAG subscription edges |
| Prose VM | skills/open-prose/prose.md |
Bounded-render execution semantics: one session reads evidence, queries prior world-model by reference, writes the world-model, signs a receipt |
| ProseScript | skills/open-prose/prosescript.md |
Imperative choreography inside ### Execution and pattern ### Delegation |
| Responsibility Runtime | skills/open-prose/responsibility-runtime.md |
The compile (intelligent) / run (dumb) split, repository IR, compile, serve, and status |
| Concepts | skills/open-prose/concepts/{responsibility,reconciler}.md |
The kind: responsibility semantic contract and the dumb fingerprint-comparison reconciler (no judge) |
The shippable repository also contains:
| Area | Location | Role |
|---|---|---|
| OpenProse skill | skills/open-prose/ |
Agent-facing runtime/spec bundle — the language's execution surface (the agent embodies the VM in-session) |
| Standard library | packages/std/ |
Reusable roles, patterns, ops, delivery, memory, and evals (migrated to the current vocabulary) |
| Company-as-Prose package | packages/co/ |
Generic company-operations starter contracts (migrated to the current vocabulary) |
| Examples | skills/open-prose/examples/ |
Native OpenProse repositories; migrated to responsibility/function/gateway |
| Tests and fixtures | repo-root skill tests (tests/open-prose/) |
Skill/spec conformance and compile-validation |
| Plugin envelopes | .codex-plugin/, .claude-plugin/, .agents/plugins/ |
Marketplace/install metadata |
OpenProse is distributed as an MIT-licensed beta. The SKILL and the language
collect no telemetry; whether a harness does is that harness's own documented
concern, outside this repository. There is no longer a prose binary: the
language is embodied by the SKILL in-session, and served responsibilities are
the job of a conforming harness (02-Harness.md).
What OpenProse Is Not
The current repository narrows the ground truth:
- Current source files are
*.prose.md, not plain.mdcontracts or standalone.proseprograms. - Current authored kinds taught by the skill are
responsibility,function,gateway,pattern, andtest.kind: servicewas renamed tokind: function(a called, ephemeral helper with### Parameters→### Returns);kind: systemwas deleted (composition is intra-node ProseScriptcallor a cross-node### Requires↔### Maintainssubscription, never a third autowired graph kind). - The judge model is retired. There is no judge, no verdict, no
up/drifting/down/blockedstatus enum, no pressure record, no separate fulfillment activation, and no policy-compile loop. Commit-gating is deterministic postcondition validators (lowered from### Maintains) plus the render's self-attestation; receiptstatusisrendered|skipped|failed. - The retired sections are gone from the taught surface:
### Ensuresbecame### Maintains(re-purposed as the world-model schema, not a renamed output list);### Criteriafolded into### Maintainspostconditions;### Memoryfolded into the single persisted world-model;### Fulfillmentfolded into the render or a delegated function;### Services/### Wiringwere deleted withsystem. kind: program,kind: composite,compose:, old.deps/layout,~/.prose, and.prose/runs/are legacy upgrade context.prose migrate,prose wire, and old compile-as-lint wording are retired; current migration isprose upgrade, and current Responsibility Runtime compilation isprose compile.- Bare
owner/repoidentifiers andp.prose.mdregistry resolution are reserved/inert. Current dependency resolution is explicit git-host based, withstd/andco/shorthands. - The current repo does not specify a product/business platform surface like Cloud billing, sprites, Constellation, or an investor narrative. An earlier ideation note explored the hosted product, public/social surface, and go-to-market motion (stale product ideation, not a live spec); another sketched forward-looking subscription, royalty, and dependency-graph economics (hypothetical, not a live spec and not load-bearing); the brand and design surface is a product concern kept outside this repository. None of that is live OpenProse language/runtime material; this file remains the language and runtime spec only.
Prose Complete
OpenProse runs inside an agent host. A host is "Prose Complete" when it can map the abstract VM primitives onto real capabilities:
| Primitive | Required behavior |
|---|---|
spawn_session |
Run a render (a responsibility or a called function) in an isolated agent/session with a prompt, optional model, and access to declared input/output paths |
ask_user |
Pause for missing required caller input and resume with the answer |
read_state / write_state |
Read and write run state through the selected backend (<openprose-root>/runs/{id}/ artifacts and durable records) |
copy_binding |
Publish a declared output through the active backend (filesystem writes the canonical artifact to world-model/ and signs a receipt; never publishes undeclared scratch) |
check_env |
Confirm an environment variable exists without exposing its value |
Codex-style and Claude Code-style coding agents are the primary documented hosts.
There is no prose binary that forwards to a separate harness: the SKILL-loaded
coding-agent session is the host and embodies the VM directly. OpenProse
commands are therefore first an agent-session command language. An in-session
instruction such as:
prose run src/hello.prose.md
means "embody the OpenProse VM and execute this contract here, in-session" — the
agent maps the primitives onto its own host tools (spawning sub-sessions, reading
and writing run state, checking env). It never parses .prose semantics
mechanically; the SKILL-loaded session embodies the VM. Continuous, served
responsibilities are reconciled in-session by prose serve (a bounded reconcile
pass); a conforming harness may deliver the same lifecycle durably, outside the
session (02-Harness.md).
OpenProse Root
Every run happens relative to an OpenProse root:
| Scope | Root |
|---|---|
| Native repository | Repository root |
| Attached repository | repo/.agents/prose |
| User-global | ~/.agents/prose |
The root layout is:
| Path | Purpose |
|---|---|
src/ |
Authored intent: responsibilities, functions, gateways, patterns, tests |
dist/ |
Compiled intent (repository IR manifest.next.json / manifest.active.json) |
runs/ |
Activation receipts for bounded VM runs |
state/ |
Durable cross-run state |
state/agents/ |
Durable agent memory |
state/world-model/{node}/ |
Each responsibility's persisted canonical world-model, with its signed, append-only receipt ledger in a harness-chosen receipt ledger layout (the reference harness ships a flat receipts.json) — this is the language VM root layout, and a harness may lay out its own state-dir differently (02-Harness.md); no separate status/pressure store — the judge loop is retired |
deps/ |
Installed git-native dependencies |
prose.lock |
Dependency lockfile |
.env |
Local runtime environment |
This root model matters because OpenProse is not just syntax. Its runtime contract includes where runs are recorded, how dependencies are found, and where standing goals keep their history.
Contract Markdown
Contract Markdown is the human-facing language surface. A *.prose.md file has
small YAML frontmatter for identity and Markdown ### sections for contracts,
runtime hints, shape, execution, and world-model semantics.
A responsibility — the headline kind — declares both halves of its reactive
interface (### Requires it subscribes to, ### Maintains it keeps current):
---
name: research-report
kind: responsibility
id: 067NC4KG01RG50R40M30E20918
---
### Goal
A current, sourced answer to the tracked question is maintained.
### Requires
- A current view of the source material for the question.
### Maintains
A concise answer with citations.
Material: the answer text and its sources. Immaterial (excluded from the
fingerprint): `fetched_at`, request ids, cosmetic ordering.
Postconditions:
- Every claim is backed by a cited source.
### Continuity
input-driven; self-driven daily.
A kind: responsibility or kind: gateway file may carry an id: frontmatter
field: a tooling-minted, UUIDv7-compatible identifier (rendered as 26 characters
of uppercase Crockford base32) that gives the contract an identity surviving
name: and filename renames. Without one, the slug is the identity. World-model
and receipt-ledger state is keyed by the mounted node, which defaults to the
slug. Authors do not hand-write id:; tooling mints it.
The five current authored kinds are:
| Kind | Run model | Purpose |
|---|---|---|
responsibility |
Served (continuously reconciled) | The headline kind: a mounted DAG node maintaining a standing truth over time |
function |
Called (one-shot) | A stateless, ephemeral helper: bind ### Parameters, run one render, return ### Returns. No Forme phase, no world-model. (Renamed from service.) |
gateway |
Mounted as external-driven | Sugar for an external-driven responsibility; compiled into a trigger registration the harness serves |
test |
Via prose test |
Fixtures plus natural-language assertions against a subject responsibility or function |
pattern |
Instantiated at compile time | Reusable coordination algorithm expanded into nodes; never directly run |
Canonical sections include:
| Section | Applies to | Meaning |
|---|---|---|
### Description |
all | Human summary; preserved for readers, not a contract |
### Goal |
responsibility, gateway | The render's one-sentence standing intent |
### Requires |
responsibility, pattern slots | Subscription contracts naming facet-level needs; Forme's match target (Requires.<facet> ↔ Maintains.<facet>) |
### Maintains |
responsibility, gateway | The world-model schema doing four jobs at once: type, canonicalization spec (material vs immaterial fields), facets (a #### sub-heading), and postconditions |
### Parameters / ### Returns |
function | The plain call interface (inputs, return value) |
### Continuity |
responsibility, gateway | The structural wake-source declaration: input-driven (default), self-driven (cadence), external-driven (gateway) |
### Errors |
responsibility, function | Declared failures the node may signal |
### Invariants |
responsibility, function, pattern | Properties that hold regardless of outcome |
### Strategies |
responsibility, function, test | Judgment rules and edge-case guidance |
### Environment |
responsibility, function | Required runtime variables, checked by name only |
### Skills |
responsibility, function | Agent harness skills the component requires, as namespace:name; resolved fail-closed against ./skills/, ~/.claude/skills/, ~/.codex/skills/, ~/.agents/skills/ |
### Tools |
responsibility, function | Host tools (cli:<name>, mcp:<name>) declared by name only |
### Runtime |
responsibility, function | Execution hints such as model |
### Shape |
responsibility, function | Capability boundaries: self, delegates, prohibited work |
### Execution |
responsibility, function | ProseScript render body that pins choreography |
### Fixtures / ### Expects / ### Expects Not |
test | Test data and assertions |
### Slots / ### Config / ### Delegation |
pattern | Pattern interface and algorithm |
### Schedule / ### Receives / ### Emits / ### Payload |
gateway | Time/event ingress declarations |
The retired judge-era sections (### Ensures, ### Criteria, ### Fulfillment,
### Constraints, ### Memory, ### Services, ### Wiring) are documented in
contract-markdown.md and changelog.md only as fold/upgrade targets, not as
authoring surface.
Header hierarchy is part of the language, and the #### level is now load-bearing:
| Header | Meaning |
|---|---|
# |
Optional human title |
## |
Inline responsibility/function boundary inside multi-node files |
### |
Section inside the current responsibility, function, gateway, pattern, or test |
#### inside ### Maintains |
Semantic: a facet — a named, independently-subscribable part of the maintained truth; its name is the fingerprint unit, the subscription symbol, and the world-model subtree |
#### inside ### Requires |
Semantic: a facet-need — a named subscription Forme matches Requires.<facet> ↔ Maintains.<facet> |
Composition has exactly two forms (there is no system graph kind): intra-node
choreography is a ProseScript call inside one render's ### Execution;
cross-node composition is a Forme-wired ### Requires ↔ ### Maintains
subscription between responsibilities. Pattern instances remain current YAML
syntax, declared in a responsibility's slots:
- name: reviewed-output
pattern: std/patterns/worker-critic
with:
worker: writer
critic: reviewer
config:
max_rounds: 3
Forme
Forme is OpenProse's semantic wiring layer. Traditional containers wire by type.
Forme wires by reading contracts. Since v0.15.0 it is a compile-phase render
that produces the resolved responsibility DAG (the topology world-model), not a
per-system manifest compiler.
Forme:
- Reads the full set of mounted responsibility contracts.
- Resolves local nodes, dependency paths, and pattern files; expands pattern instances into concrete nodes.
- Matches each
### Requiresfacet-need to a producer's### Maintainsfacet (Requires.<facet>↔Maintains.<facet>), using exact names, semantic equivalence, and shape hints. - Surfaces unsatisfied or ambiguous matches as diagnostics — never a silent guess.
- Draws the subscription edges and registers external-driven entry points (gateways).
- Produces the topology world-model — the resolved DAG with its
edges— that the dumb reconciler reads to schedule and propagate.
The repository keeps the Forme doctrine in skills/open-prose/forme.md. The
packages/std/ops/wire.prose.md contract is a migrated kind: function (invoked
in-session as prose run std/ops/wire). Forme running standalone (no harness) is
still well-defined: a single responsibility
applies its compiled canonicalizer locally to fingerprint its own receipt.
Prose VM
The Prose VM is the execution semantics. When an agent runs OpenProse, it is
not merely describing a VM. It performs the VM by mapping the spec to host
tools, spawning real sessions, writing real artifacts, and evaluating real
contracts. The render atom both phases agree on is
(contract, evidence, prior world-model) → (new world-model, receipt).
For a called function:
- Snapshot the invoked source.
- Bind
### Parameters. - Spawn one session with the function contract, inputs, and workspace.
- Wait for the declared
### Returnsvalue. - Return it and record the run. (A function is stateless: no world-model, no Forme phase.)
For a responsibility render:
- The reconciler computes the memo key
(contract_fingerprint, input_fingerprints); if neither half moved and novalid_untilhas lapsed since the last receipt, it writes askippedreceipt and spawns nothing. - Otherwise spawn one bounded session — the render — which reads the evidence the wake delivered and queries the prior world-model by reference (never pre-stuffed into context).
- The render writes the updated world-model and signs a receipt carrying the new fingerprints.
- On a
renderedreceipt whose fingerprint moved, wake the downstreams subscribed to the moved facet(s).
The default filesystem backend creates, under each run, a control-plane envelope
(the compiled Forme topology or a minimal activation record for a lone function,
root.prose.md, and sources/) before reporting success:
runs/{run-id}/
root.prose.md
sources/
workspace/
world-model/
receipts/
vm.log.md
agents/
The separation matters:
| Directory | Meaning |
|---|---|
sources/ |
Immutable source snapshots for the run |
workspace/ |
Private, never-fingerprinted render scratch |
world-model/ |
The published, canonically-serialized + fingerprinted truth visible downstream |
receipts/ |
The signed, append-only receipt ledger for the run |
OpenProse also specifies in-context, SQLite, and PostgreSQL state backends. Filesystem is the default and normative reference. In-context is for small ephemeral runs. SQLite and PostgreSQL are experimental durable alternatives that keep the run envelope but move events and data-plane bindings into database records.
ProseScript
Contract Markdown is declarative. ProseScript is the pinning layer.
Use ProseScript when order, loops, branching, retries, parallelism, or exact call choreography matters:
### Execution
```prose
let findings = call researcher
topic: topic
let report = call writer
findings: findings
return report
```
ProseScript supports call, parallel, for, loop, if, choice,
try/catch/finally, throw, agent, session, resume, blocks, and
pipeline-style operations. In current Contract Markdown, the reactive interface
belongs to ### Requires and ### Maintains (responsibility) or
### Parameters and ### Returns (function); embedded ProseScript should not
redeclare them.
Responsibility Runtime
Responsibility Runtime is the continuity layer for repositories that need standing goals to remain true over time. Its spine is the compile (intelligent) / run (dumb) split: intelligence decides what counts as a change once, at compile time; determinism checks whether one happened every time, at run time.
The stack is:
| Layer | Role |
|---|---|
| Responsibility | The standing truth kept current (a mounted node) |
| Reconciler | The dumb run phase: compare fingerprints, skip / render / propagate |
| Forme | Compile-phase wiring of ### Requires ↔ ### Maintains |
| Prose VM | One bounded render that computes the next world-model and signs a receipt |
A kind: responsibility file is semantic and normative. It defines ### Goal
(the standing intent), ### Requires (subscriptions), ### Maintains (the
world-model schema: type, canonicalization, facets, postconditions), and
### Continuity (the wake-source declaration: input-driven, self-driven, or
external-driven).
A kind: gateway is sugar for an external-driven responsibility: it declares
### Continuity: external-driven, has no ### Requires, maintains the latest
incoming truth, and describes ingress (schedules, local HTTP routes, webhooks,
provider events) that inference cannot safely recover.
The reconcile loop is dumb on purpose (the full semantics are in
concepts/reconciler.md):
- A receipt arrives. Its
wake.sourceisinput(an upstream facet moved),self(the continuity clock's synthetic self-receipt), orexternal(a gateway turning a trigger into an edge receipt). - Compute the memo key
(contract_fingerprint, input_fingerprints). If neither half moved and novalid_untilhas lapsed, write askippedreceipt and spawn nothing. - Otherwise spawn one render. It computes the new truth, leaves its
### Maintainspostconditions satisfied, writes the world-model, and signs a receipt withstatusrenderedorfailed. - Only a
renderedreceipt whose fingerprint moved wakes downstreams subscribed to the moved facet(s).
There is no judge in the wake or commit decision, no status enum, no pressure
record, and no separate fulfillment activation. A render that errors or leaves a
postcondition unsatisfied commits nothing (the last-good truth stands) and writes
a cheap failed receipt. Freshness state (valid_until) lives in the
world-model; a lapse mechanically moves a facet fingerprint via the self-driven
tick — a zero-token continuity move, not a model re-render.
Current live serve support includes local cron and HTTP adapters. Queues, file watches, provider subscription setup, webhook authentication, and automatic manifest reload are explicitly later phases.
Compile-Phase IR (v2)
prose compile lowers source under an OpenProse root into generated compiled
intent. Markdown remains the durable authoring surface; IR is disposable
compiled intent consumed by deterministic infrastructure. The v0.15.0 overhaul
re-shaped the IR around the compile/run split: it is now the compile-phase
output — the topology, the per-node canonicalizers, the per-node postcondition
validators, and the frozen contract fingerprints — not a judge-era
activations/criteria manifest.
The v2 top-level shape (compiler/ir-v0.md) is:
{
"kind": "openprose.compile-phase-ir",
"version": 2,
"sources": [],
"topology": {},
"canonicalizers": [],
"postconditions": [],
"contract_fingerprints": {},
"diagnostics": []
}
The canonical output files are:
| File | Meaning |
|---|---|
dist/manifest.next.json |
Fresh compile output |
dist/manifest.active.json |
The promoted manifest the served runtime consumes |
Promotion from next to active is explicit.
IR records include:
| Record | Meaning |
|---|---|
sources[] |
Discovered contract set (allowed kinds: responsibility, function, gateway, pattern, test, unknown); only responsibilities and gateways become topology nodes — functions appear when discovered but never as nodes |
topology |
Forme's resolved DAG: nodes (each with contract_fingerprint and wake_source), edges, and the acyclic postcondition |
canonicalizers[] |
One per node: the deterministic lowering of ### Maintains — canonicalizer(world-model) → fingerprints |
postconditions[] |
One set per node: validators lowered from ### Maintains postconditions (deterministic where expressible, render-attested otherwise) |
contract_fingerprints |
The frozen { node → fingerprint } map — the memo key's first half |
diagnostics[] |
Info/warning/error messages (unsatisfied/ambiguous Forme matches, missing structured backings) with optional source paths |
The canonical compiler is a pinned ProseScript program at
skills/open-prose/compiler/index.prose.md whose agents are compile-step
renders — Forme (wiring), the canonicalizer compiler, and the postcondition
compiler — so the compile output is itself auditable (Tenet 2). A conforming
harness realizes the same compile phase through its own compile adapter
(content-addressed IR cache; 02-Harness.md).
There is no separate deterministic source-compiler binary — the deprecated prose
CLI that once shipped one has been removed.
Important compiler doctrine:
- Discover every
.prose.mdunder the source root. - Match
### Requires↔### Maintainsonly when the resolution is clear; warn instead of guessing wiring, timing, or facet matches. - Lint any subscribed field that lacks a structured, canonicalizable backing.
- Do not invent provider auth, queue names, routes, payload schemas, or subscription setup the source does not supply.
- Write
manifest.next.jsononly after the IR shape is valid. - Stop after writing; the harness performs deterministic validation.
The compile-phase IR is source-derived: it is a function of the *.prose.md
source set and nothing else. The harness's token-truth receipts, forecasts,
freshness state, and reconciler decisions are sibling runtime state owned by
the harness — not IR fields and not new source syntax. See Boundary with the
harness (Part III) and 02-Harness.md.
Commands
There is no prose binary. prose … is a command vocabulary the SKILL
embodies in-session: the user (or an agent) types prose <verb> and the
SKILL-loaded session performs it by mapping to host tools — not a shell-out to an
installed package. The legacy @openprose/prose-cli (an Oclif binary) has been
removed.
The SKILL also embodies the served lifecycle for responsibilities in-session:
prose compile emits the compile-phase IR, prose serve runs a bounded reconcile
pass over the active manifest, and prose status reads the receipt ledger back.
A conforming harness (02-Harness.md) may deliver the same
lifecycle durably, outside the session, behind a standing cron or HTTP ingress.
The in-session command vocabulary:
| Command | Role |
|---|---|
prose compile [path] [--out <dir>] |
Emit the compile-phase IR (topology, canonicalizers, validators, fingerprints, diagnostics) into dist/manifest.next.json |
prose serve |
Validate dist/manifest.active.json, register local cron and HTTP trigger adapters, launch bounded activations |
prose status |
Summarize active IR, diagnostics, trigger plan, recent runs, and responsibility status from the receipt ledger |
prose run <file.prose.md|package/handle> |
Run a responsibility or a called function in-session |
prose test <path> |
Execute kind: test contracts |
prose lint <file.prose.md> |
Validate source structure and contract consistency |
prose preflight <file.prose.md> |
Check dependencies and ### Environment without executing |
prose inspect <run-id> |
Inspect a completed run (std/evals/inspector) |
prose install [--update] |
Install and pin git-native dependencies |
prose examples [name] |
List or run bundled examples |
prose upgrade [--dry-run] |
Migrate legacy source/layout conventions (including the v0.15.0 kind/section rewrites) |
prose write [request...] |
Generate validated OpenProse source from rough English or pseudo-Prose (backed by std/ops/prose-author) |
The host for an in-session prose run is the coding agent itself (Codex- or
Claude-Code-style); there is no harness-selection binary. The durable form of
the compile → run → serve lifecycle — a standing continuity loop, HTTP trigger
surface, and connector ingress — is the harness's, specified in
02-Harness.md.
Dependencies
OpenProse dependencies are git-native and disk-only at runtime.
Canonical dependency identifiers use explicit git hosts:
github.com/openprose/prose/packages/std/evals/inspector
gitlab.com/alice/research/tools/summarizer
git.company.com/team/internal-system
Two first-party shorthands exist:
| Shorthand | Expands to |
|---|---|
std/... |
github.com/openprose/prose/packages/std/... |
co/... |
github.com/openprose/prose/packages/co/... |
prose install populates <openprose-root>/deps/ and writes
<openprose-root>/prose.lock. Runtime resolution reads installed dependencies
from disk. Missing dependency identifiers should fail with a message telling
the user to run prose install.
Standard Library
packages/std/ is the standard library. It is not just helper text; it is a
library of OpenProse contracts written in the language itself.
| Category | Contents |
|---|---|
roles/ |
10 atomic role contracts: classifier, critic, verifier, extractor, summarizer, formatter, researcher, writer, planner, router |
patterns/ |
19 reusable coordination patterns: worker-critic, pipeline, map-reduce, fan-out, race, guard, fallback-chain, retry-with-learning, dialectic, oversight, ensemble-synthesizer, proposer-adversary, assumption-miner, blind-review, coherence-probe, contrastive-probe, ratchet, refine, stochastic-probe |
ops/ |
Operational contracts: lint, preflight, wire, status, diagnose, profiler, plus prose-author (the backing contract for prose write, with a test suite) |
delivery/ |
Human gate, email, Slack, webhook, HTML rendering, and file writing |
memory/ |
Project and user memory contracts |
evals/ |
Inspector, contract grader, regression tracker, cross-run differ, eval calibrator, system improver, platform improver, prose-contributor |
Roles are the atoms; patterns are the molecules (slots, config, invariants, and delegation algorithms a responsibility instantiates). The eval and ops libraries make the feedback loop explicit: a run can be inspected, graded against contracts, compared across runs, diagnosed, profiled, and used to propose source or platform improvements.
Migration status: packages/std/ and packages/co/ are now migrated to
the current vocabulary — zero kind: service, kind: system, or
### Ensures remain. Their contracts use kind: function (≈35 files), the
unchanged kind: pattern (19), kind: test, and kind: responsibility (in
std only — co is functions, patterns, and tests). (co
keeps its on-disk directory names services/ and systems/ for path stability,
even though the contracts inside are migrated.)
Company-As-Prose Package
packages/co/ is a first-party but domain-shaped package. It sits beside
std, not inside it.
std is use-case agnostic. co is an opinionated starter kit for operating a
company as an OpenProse-native repository. Current public contracts include:
| Contract | Role |
|---|---|
co/services/agent-readiness |
Probe a company's website for agent-discoverability and plain-HTML readiness |
co/systems/company-repo-checker |
Verify a company-as-prose repo matches shared layout and contract expectations |
co/evals/* |
Evaluations for the package contracts |
The package explicitly avoids OpenProse, Inc. private business logic. It is
generic company-operations scaffolding. Its on-disk directory names (services/,
systems/) are kept for path stability, but the contracts inside are migrated to
the current function / responsibility vocabulary.
Examples
The examples under skills/open-prose/examples/ are OpenProse Native
Repositories on the current vocabulary (their src/ carries only kind: function,
kind: responsibility, and kind: gateway; no service, no system). Each
uses:
src/ authored responsibility, gateway, and function contracts
dist/ compiled intent
runs/ bounded activation receipts
state/ durable responsibility/application state
deps/ installed dependencies
prose.lock
The shared lifecycle is:
# Embody and run the repository in-session:
prose run
# Or compile it and let a conforming harness serve the standing goal
# (02-Harness.md):
prose compile
Current standing-goal example repositories include stargazer-outreach,
incident-briefing-room, customer-risk-radar, release-readiness,
vendor-renewal-watch, research-inbox-triage, content-performance-loop,
compliance-evidence-tracker, and competitor-activity. Each demonstrates the
current architecture: a responsibility defines the standing goal, a gateway
provides time/event ingress, the render (or a delegated function) composes the
work, and the persisted world-model updates durable ledgers, registers, or
histories.
The examples directory also contains minimal feature demos that each isolate one language feature:
| Example | Demonstrates |
|---|---|
declared-skills |
### Skills resolution and the skill_unresolved diagnostic |
declared-tools |
### Tools resolution and the tool_unresolved diagnostic |
auto-pocock |
A non-interactive multi-step function pipeline adapting an external skill workflow |
session-to-prose |
Turning a working session into authored *.prose.md source |
Tests And Release
The current repository validates the language surface at several layers (the
repo-root tests/open-prose/ skill suite):
| Layer | Coverage |
|---|---|
| Skill/spec conformance | tests/open-prose/ asserts the SKILL docs (contract-markdown, concepts, state, compiler) embody the current model — kinds, sections, the no-judge reconciler, and the world-model state shape |
| Compile-validation tests | Compile-phase IR shape (topology, canonicalizers, postconditions, contract fingerprints) and root resolution |
| CI workflows | Skill install smoke, OpenProse smoke, plugin manifest validation, and the skill conformance suite |
The release process uses independent tracks (.version-bump.json): the
skill track moves the SKILL and both plugin manifests together — SKILL.md,
.claude-plugin/plugin.json, .codex-plugin/plugin.json — because the Claude
Code marketplace deduplicates by manifest version. Harness implementations
release on their own trains, outside this repository. There is no prose-cli
release train (the binary was removed).
Mental Model
OpenProse is best understood as typed, inspectable agent software, built around
the render atom (contract, evidence, prior world-model) → (new world-model, receipt):
- A prompt is useful for one-off work.
- A
*.prose.mdcontract is useful when the work has a standing truth to keep current, roles, handoffs, retries, or a receipt. - A
kind: responsibilityis the headline kind: a mounted DAG node whose maintained truth the reconciler keeps current; akind: functionis a called, stateless helper. - Forme wires the responsibility DAG at compile time by matching
### Requires↔### Maintains. - The Prose VM is the agent-session runtime that performs each render.
- ProseScript is how authors pin choreography (including the intra-node
call) when declaration is not enough. - Responsibility Runtime keeps standing goals true across bounded renders via the dumb reconciler: cost scales with surprise, not the clock.
stdandcoare proof that OpenProse programs can package reusable behavior like code.
Glossary
| Term | Meaning |
|---|---|
| Activation | One bounded VM render, launched in-session by prose run or by a conforming harness's run/serve |
| Binding | A published declared output: the canonical world-model artifact a downstream subscribes to |
| Canonicalizer | The deterministic lowering of ### Maintains that maps a world-model to its fingerprints |
| Contract Markdown | The canonical *.prose.md source format |
| Facet | A #### part under ### Maintains: a named, independently-subscribable unit of truth (fingerprint unit + subscription symbol) |
| Fingerprint | A cheap token that moves iff the semantically-relevant content moved |
| Forme | Compile-phase wiring render that resolves ### Requires ↔ ### Maintains into the topology |
| Function | A called, stateless helper: ### Parameters → ### Returns, no world-model (renamed from service) |
| Gateway | Sugar for an external-driven responsibility; compiled into a trigger registration |
| OpenProse root | Root directory containing src, dist, runs, state, deps, and lock/env files |
| Pattern | Reusable coordination algorithm instantiated by a responsibility |
| Prose Complete | Host capability threshold for running OpenProse |
| Prose VM | Execution semantics (the render) embodied by the agent host |
| ProseScript | Imperative choreography language inside ### Execution and ### Delegation |
| Reconciler | The dumb run-phase model: compare fingerprints, skip / render / propagate (no judge) |
| Receipt | The signed commit object; status ∈ {rendered, skipped, failed}; the unit of the append-only ledger |
| Repository IR | The compile-phase IR (topology + canonicalizers + postconditions + contract fingerprints) consumed by deterministic infrastructure |
| Responsibility | The headline kind: a standing truth kept current over time, mounted as a DAG node |
| World-model | A node's maintained truth (the DOM analogue), persisted under state/world-model/{node}/ |
Part III — What Is Next
Part I is now substantially real at the language layer. The v0.15.0
"Intelligent React" overhaul reshaped the taught taxonomy to the Ideal (five
kinds; the load-bearing ### Requires / ### Maintains / ### Continuity
sections; facets; the dumb reconciler; receipts with status ∈ {rendered,
skipped, failed}), and the corpus migration that once dominated this roadmap
is done: packages/std/ and packages/co/ carry zero kind: service,
kind: system, or ### Ensures, and the teaching docs (SKILL.md,
contract-markdown.md, concepts/, changelog.md) are on the current model.
The legacy prose CLI binary is gone; the language is embodied by the SKILL
in-session, and the deterministic-source-compiler fallback it once carried is
resolved by removal (compilation is model-run, Tenet 2). No new *.prose.md
syntax is owed.
What remains is not language work but harness affordances the language already describes — promised by the contract an author writes, delivered by a conforming harness (02-Harness.md) — plus the one language-level recursion the Ideal keeps as its closing item. Each item below is scoped to the residual gap and cross-linked to the harness contract it depends on; a harness tracks its own engineering detail.
1. Data-driven freshness (the default valid_until projector)
Part I's self-driven continuity — a lapsed valid_until mechanically moves a
facet fingerprint via the self-tick — needs a default projector in the served
continuity loop. As of the reference harness 0.3.3 (see the repository README
under Harnesses), its loop runs on a flat poll cadence and arms no per-facet
valid_until by default, so ### Continuity: self-driven runs at a fixed
interval rather than the Ideal's "wake exactly when the soonest valid_until
lapses." The author already writes the valid_until; the cadence tightens
harness-side without a source change. (02-Harness.md Open
specification items §6.)
2. The deterministic commit gate, wired
### Maintains postconditions lower to deterministic validators (in the
reference harness 0.3.3, compilePostconditions runs on the compile path), but
the gate that evaluates them at commit, gateCommit, is built and unwired
as of that release — the live commit rides the render's own ### Maintains
self-attestation. The language promises "a render that cannot satisfy its
postconditions commits nothing"; making that deterministic rather than
self-attested is harness wiring, not a syntax change.
(02-Harness.md invariant 6.)
3. The failed-receipt reason (durable receipt shape)
The language promises a failed receipt "addressed to the author, naming
exactly what it needs." The v0 receipt the reference harness 0.3.3 ships is too
thin to carry that — no as_of, no failure reason, no author-addressing field
— so the naming is honored only in-render and dropped at commit. Widening the
durable receipt is harness work the language's failed-receipt promise depends
on. (02-Harness.md Open specification items §1.)
4. The actuation boundary, enforced
### Invariants declares the rate/scope/prohibited-action bounds on a render's
world-mutation. Today that boundary is authored prose the render may ignore —
never lowered or harness-enforced. Lowering it into the render (with an actuation
sink) makes "the only writable surface is the published truth" a guarantee rather
than a request. (02-Harness.md Metaphor, seam 2.)
5. Facet inference
Facets are author-declared today (#### parts under ### Maintains). Inferring a
reasonable facet split from an undivided ### Maintains — so authors get
subscription granularity without hand-faceting — is deferred compile-phase work;
the atomic default is correct but coarse until then.
6. Richer served ingress
A served responsibility's wake sources beyond local cron-poll and HTTP — queues,
file watches, provider subscription setup, and webhook authentication — are later
harness phases. Until they land, a file-watch-shaped contract is authored as a
poll ### Continuity with the intended ingress noted, so it migrates cleanly.
7. Cross-trust composition (the cryptographic signer)
### Requires can pin a consumed revision today, but the acceptable-signer-set
half of cross-trust composition waits on a real signing identity: the receipt's
sig is a meaning-layer attestation over a null signer, not a cryptographic
byte-hash chain. A signing adapter and byte-hash chain are deferred.
(02-Harness.md Open specification items §2.)
8. The fixpoint (topology-as-responsibility)
Part I keeps, as its closing recursion, the fixpoint: wiring the graph is
itself a maintained truth, so Forme is a kind: responsibility whose world-model
is the resolved DAG and whose render is the wiring step — memoized like any node,
bootstrapped by a tiny deterministic seed. Today Forme is a compile-phase render
that produces the topology but is not yet mounted as a node in the graph it
draws. Closing the loop is explicitly post-v1.
Boundary with the harness
The language has one source-derived compile: prose compile (source →
compile-phase IR). The IR is a function of the *.prose.md source set and
nothing else. The harness's token-truth receipts, forecasts, freshness state, and
reconciler decisions are sibling runtime state owned by the harness —
not IR fields and not new *.prose.md syntax. The render seam (a
bounded-activation agent SDK adapter over a model gateway) carries no reconciler
control logic. The full runtime mechanics live in
02-Harness.md; this disclaimer is the language
side of that seam.
Definition of done for the language layer
The corpus migration and the SKILL sweep that headlined earlier roadmaps are done (std/co and the teaching docs carry zero retired vocabulary). What remains is the harness delivering the language's standing promises:
- The default
valid_untilfreshness projector and adaptive serve cadence ship, so self-driven continuity is data-driven rather than fixed-interval. gateCommit's deterministic validators are wired onto the live commit step, so "a render that cannot satisfy its postconditions commits nothing" is enforced, not only self-attested.- The durable receipt carries
as_of, a failurereason, and an author-addressing field, so the failed-receipt-that-names-the-gap survives commit. - The
### Invariantsactuation boundary is lowered and enforced at the render/commit split. - No new
*.prose.mdsyntax is introduced; the fixpoint remains the explicitly labeled post-v1 recursion.