The deferred upgrade brain: current conventions (authored .prose.md source, optional Crockford-base32 id: minted by scripts/mint-contract-id.mjs, optional semver version:, cli: and mcp: Tools, src/architecture/dist/runs/state/deps plus prose.lock and .env layout, index.prose.md multi-file roots, std/ops/compose for init and compose) plus version history from v0.4.x through v0.18.1. Key entries include v0.18.1 contract execution-versus-assessment terminology, v0.18.0 compiler-clean examples with facet families and per-entity mounts, v0.17.0 init/compose, v0.12.0 Responsibility Runtime release, the v0.15.0 runtime_contract 1-to-2 overhaul (service renamed to function, system deleted, Ensures to Maintains, judge loop retired for the reconciler, Forme to compile-phase render), and v0.16.0 Reactor extraction. It gives the prose upgrade and dry-run procedures, the path migration map (.prose/ to root, .deps/ to deps/, run manifest/root/state names), the kinds-and-sections rewrite table with greenfield receipt data and manual-review diagnostics, and standalone .prose script inference rules. Maintainers read this only for prose upgrade runs or when diagnosing outdated layouts, retired kinds, or legacy sections.
role: upgrade-history
summary: |
Compact OpenProse version history and model-guided upgrade instructions.
Load only for prose upgrade, prose upgrade --dry-run, or when diagnosing
potentially outdated project structure.
OpenProse Changelog
This file is the deferred upgrade brain. SKILL.md names old-structure smells;
load this file only after the user asks for an upgrade or wants the migration
plan.
Current Conventions
- Authored source files are
*.prose.md. id:frontmatter is optional on responsibilities and gateways: 26 characters of uppercase Crockford base32 minted by scripts/mint-contract-id.mjs, for identity that survives renames. The slug is the default identity.version:frontmatter is optional, author-owned provenance in semver form. The compiler ignores it; it is not the skill version.### Toolsapplies tofunctionandresponsibility. Tool declarations support bothcli:<name>andmcp:<name>and fail closed when the host cannot resolve a declared capability. Resolved responsibility tools are preserved in the compile-phase IR and run activation payloads.- Every workspace has an active OpenProse root.
- Native repositories use the repository root as the OpenProse root.
- Attached repositories use
repo/.agents/prose. - User-global OpenProse uses
~/.agents/prose. - The root contains
src/,architecture/,dist/,runs/,state/,deps/,prose.lock, and.env. Canonical authored truth remains insrc/;architecture/contains supporting Compose decisions and projections. - Durable cross-run agents live in
state/agents/. - Each responsibility's persisted world-model and its signed, append-only receipt ledger are the durable cross-run truth; there is no separate status or pressure store (the judge loop is retired).
- Multi-file systems conventionally use
index.prose.md. prose initandprose composerun thestd/ops/composedirectory package. Compose progressively materializes a canonical directory package, develops semantic tests outside-in, and routes framework feedback to public issues rather than implementing it during composition.- Generated run internals include the compiled activation manifest,
root.prose.md, andvm.log.md.
Unreleased
History
-
v0.18.1: Contract execution and assessment terminology. Contract authoring expresses intent by composing requirements. The executor performs work; the evaluator assesses whether requirements are satisfied. A result includes its supporting evidence, and an assessment records the evaluation and findings. Successful execution does not by itself establish contract fulfillment or adequacy. No source rewrite is required: preserve authored syntax, function return declarations, responsibility interfaces, saved records andruntime_contract: 2. Review explanatory prose when upgrading; do not rename protocol fields or historical evidence. -
v0.18.0: Example corpus made compiler-clean.id:frontmatter is now optional on responsibilities and gateways: the slug is the identity by default, and a declared id is the source identity that survives filename andname:renames. A missingid:is no longer a compile error. Where an id is present it must be 26 characters of uppercase Crockford base32, minted by scripts/mint-contract-id.mjs (which also repairs a malformed id in place) and never hand-typed; the hand-typed slug ids in the examples were dropped, not replaced, since they named nothing the slug does not.version:frontmatter is documented as optional author-owned provenance in semver form, ignored by the compiler.contract-markdown.mdgains Facet families and per-entity mounts: a#### name:<placeholder>heading under### Maintainsdeclares a family, a placeholder facet-need in### Requiressubscribes to one member,# Title [instance]marks a contract mounted once per entity, and the harness binds members at mount time while the compiler emits the family. Every###heading in the examples is now a canonical section (### Continuity: external-drivenbecame### Continuitywith an- external-drivenbullet;### Postconditionsand### Facetsfolded into### Maintains;### Watchesmoved into### Receives), and every### Requiresnames a producer in its own example (competitor-activity gains asignal-feedsgateway, research-inbox-triage aresearch-registrygateway). Example READMEs whose node and edge counts exceed what mountingsrc/alone produces now attribute the count to the reference harness's per-entity expansion.compiler/ir-v0.mdspecifies node identity (nodeis mount identity, defaulting to the slug for a single mount) andartifactlocators (paths relative to the OpenProse root);concepts/reconciler.mdgives the receiptcostfield its sub-shape ({ provider, model, tokens: { fresh, reused }, surprise_cause }). Implementation-status claims in spec/01-Language.md and spec/03-AuthoringPattern.md name the reference harness version they describe.runtime_contractis unchanged (2): no source rewrite is needed.prose upgrademay drop anid:that merely repeats the slug; it must never add one. -
v0.17.0: introducedprose init/prose composeand the obligation-centeredstd/ops/composedirectory package, including bounded architectural fronts, progressive Contract source, derived visual views, outside-in semantic test ordering, and issue-routed OpenProse feedback. -
v0.4.x: early skill discovery,prose help, filesystem state, examples in the skill directory, migration guide. -
v0.5.x: SQLite state management, recursive blocks, PostgreSQL state backend. -
v0.6.xandv0.7.x: RLM examples, mid-program inputs, remote program resolution, registry URL documentation, meta-level examples. -
v0.8.x: library and memory programs, simplified registry syntax, interactive example, system-prompt support. -
v0.9.0: v2 migration. Legacy.prosefiles were removed, examples and library programs moved to Contract Markdown.md, and the old migration helper moved under the open-prose skill. -
CLI
0.1.x: realproseCLI and harness support shipped, including Claude and Codex plugin surfaces. -
v0.12.0: Responsibility Runtime release. Vocabulary settled onkind: service,kind: system,kind: gateway,kind: test,kind: pattern, andkind: responsibility; patterns replaced topology/composite language; source files moved to*.prose.md; generated run files were disambiguated; the filesystem model settled on a single OpenProse root withsrc/,dist/,runs/,state/, anddeps/;prose compileemitsdist/manifest.next.json;prose serveconsumesdist/manifest.active.json;prose statusreads active IR, trigger plans, recent runs, and responsibility status/pressure from the OpenProse root. -
v0.15.0(runtime_contract: 1 → 2): Intelligent React overhaul. The judge → verdict → pressure → fulfillment loop is retired wholesale and replaced by a deterministic reconciler: a render runs only when a node's subscribed input fingerprints or its own contract fingerprint move, and the commit object is aReceiptcarryingfingerprints/wake/status(rendered|skipped|failed) — there is no LLM in the wake/commit decision. The kind taxonomy is re-cleaved around the single render atom:kind: serviceis renamed tokind: function(a called, ephemeral helper with### Parameters→### Returns);kind: systemis deleted (composition is intra-node ProseScriptcallor cross-node subscription, not a third autowired graph kind);kind: responsibilityis reshaped into an executable mounted DAG node that gains### Requires+### Maintainsand loses its judge framing;kind: gatewaystays as sugar for an external-driven responsibility (now declares### Continuity: external-driven).### Ensuresis renamed to### Maintainsand re-purposed as the world-model schema (type / canonicalization spec / facets / postconditions), not just an output list.### Criteriafolds into### Maintainspostconditions;### Memoryfolds into the persisted world-model on a responsibility and is dropped on a function;### Fulfillmentfolds into the render or a delegated function. Forme moves from a per-systemmanifest compiler to a compile-phase render that wires the responsibility DAG (### Requires↔### Maintains) and registers external-driven entry points. ProseScript, theprose compile/serve/runcommand surface, dependency resolution (deps.md), and single-sessionfunctionrun semantics are unchanged in shape — only the vocabulary they carry moves. Existing runtime data (oldReceiptV0ledgers, the policy registry, bundledruns//state//dist/) is greenfield, not migrated; only source text upgrades.prose upgradegains the source rewrites below — mechanical where safe, surfaced as manual-review diagnostics where judgment is needed (system/### Wiringflatten-or-split). -
v0.16.0: Reactor harness extracted.prose reactand thereactor.mdoperator guide are removed from the skill;prose compile/prose serve/prose runare the whole command surface, embodied in-session. The Reactor harness (@openprose/reactor*, thereactorbinary) now lives at github.com/openprose/reactor and is experimental (alpha) — early software with no stability guarantees; installs keep working under the same names.runtime_contractis unchanged (2): no source rewrite is needed. Renamed, same content, harness-agnostic names:concepts/reactor.md→concepts/reconciler.md;spec/02-ReactorHarness.md→ spec/02-Harness.md (the contract any conforming harness must satisfy);spec/03-ReactorPattern.md→ spec/03-AuthoringPattern.md. A workflow that invokedprose reactshould compile and serve the same contracts with a conforming harness instead.
Upgrade Command
prose upgrade --dry-run:
- Inspect the current working directory, repository root when detectable, and any explicitly supplied path.
- Look for old structures:
.prose/,~/.prose/,.deps/,.agents/prose/agents/,dist/prose/, lockfiles outside the active OpenProse root, plain source*.mdwithkind:, standalone*.prose,index.md,manifest.md,root.md, andstate.md. - Inspect nearby files before deciding. Do not rely only on filenames.
- Print the exact planned moves, renames, content rewrites, and skipped ambiguous items. Do not edit files.
prose upgrade:
- Run the same inspection and planning pass.
- Apply only changes with clear source and destination paths.
- Preserve content and provenance. Prefer moves/renames over delete/recreate.
- Update nearby references after renaming files.
- Report every change and every ambiguity left for the user.
Migration Map
| Old | Current |
|---|---|
.prose/.env |
<openprose-root>/.env |
.prose/runs/ |
<openprose-root>/runs/ |
.prose/agents/ |
<openprose-root>/state/agents/ |
.agents/prose/agents/ |
<openprose-root>/state/agents/ |
~/.prose/ |
~/.agents/prose/ |
.deps/ |
<openprose-root>/deps/ |
dist/prose/ |
<openprose-root>/dist/ |
misplaced prose.lock |
<openprose-root>/prose.lock |
source *.md with kind: |
*.prose.md under <openprose-root>/src/ |
index.md system root |
index.prose.md |
standalone *.prose |
*.prose.md with Contract Markdown frontmatter and ### Execution |
run manifest.md |
compiled activation manifest |
run root.md |
root.prose.md |
run state.md |
vm.log.md |
Migration Map: Kinds & Sections (runtime_contract: 1 → 2)
This is the v0.15.0 source rewrite. prose upgrade keys its applicability off
runtime_contract: a file or root still on contract 1 (or unversioned) is a
candidate. Rename kinds and sections, fold deleted sections with provenance
preserved, and surface judgment calls as diagnostics rather than guessing.
| Old | New | Note |
|---|---|---|
kind: service |
kind: function |
callable; ### Requires/### Ensures → ### Parameters/### Returns |
kind: system + ### Services/### Wiring |
(removed) | flatten to intra-node call, or split into responsibilities wired by Forme — manual-review diagnostic, never auto-guessed (sequential workflows flatten; parallel fan-in splits) |
kind: responsibility (judge-era) |
kind: responsibility (reshaped) |
add ### Requires + ### Maintains; fold ### Criteria → ### Maintains postconditions, ### Fulfillment → render/function, ### Constraints → ### Invariants/### Shape |
kind: gateway |
kind: gateway |
add explicit ### Continuity: external-driven |
### Ensures |
### Maintains |
world-model schema (type / canonicalization / facets / postconditions) — re-purpose, not just rename |
### Memory |
(removed) | folds into the persisted world-model (responsibility) / dropped (function) |
### Criteria (responsibility) |
(removed) | folds into ### Maintains postconditions — no separate judge beat |
### Wiring / ### Services (system) |
(removed) | deleted with system; composition is call or subscription |
judge runtime (runtime/judge-responsibility.prose.md, status/pressure/verdict) |
(removed) | retired; the deterministic reconciler replaces it |
What is greenfield, not migrated. The vocabulary upgrade covers source
text only. Existing runtime data — old ReceiptV0-shaped ledgers, the policy
registry, and bundled runs//state//dist/ artifacts — is abandoned, not
converted. No receipt-data migrator is written.
Manual-review diagnostics. prose upgrade --dry-run flags, without
auto-applying: any kind: system (flatten vs split), any ### Wiring, any
judge-era kind: responsibility, and any service-with-subscription-shaped
### Requires that is only called (it may be a function, not a node). Each
is surfaced with a clear explanation so the author decides.
Standalone .prose Migration
Infer the Contract Markdown wrapper:
input name: "description"becomes a### Parametersentryname(callable) or a### Requiresentryname(a mounted, subscribed responsibility).output name = expressionbecomes a### Returnsentrynameon afunction, or a### Maintainstruth on aresponsibility; preserve the expression in### Execution.return valueremains the execution result.usedeclarations remain in the execution block when the script intentionally calls installed dependencyfunctions directly via ProseScriptcall.- Add
kind: functionfor a plain callable. A standalone script that composes several steps becomes oneresponsibility(intra-nodecallchoreography in### Execution) or several responsibilities wired by Forme — neverkind: system, which no longer exists.
When the old script's interface cannot be inferred confidently, dry-run must name the uncertainty. Full upgrade should ask before changing that file.