`reactor trigger` never threaded the configured provider into the render: it called the run-project with no provider, model, or decoding settings, so a live trigger always fell back to the SDK's default OpenRouter provider and model regardless of reactor.yml. With only the configured provider's key present, every trigger produced a bare, causeless `failed` receipt (model "none", zero tokens). Separately, the reason a render failed was computed but never persisted, so every surface could only say `failed` with no way to learn the cause without editing the source. This fixes both: - `trigger` resolves the provider plan, fails fast with an actionable error naming the exact env var when a custom provider's key is missing, and threads render_model, temperature, and reasoning_effort plus the provider into the render exactly like `run` and `serve`. - A failed render now records its reason on the receipt, inside the semantic_diff (no new receipt field and no schema change, so existing .reactor/ ledgers keep verifying), and `run`, `trigger`, `logs`, `trace`, and `inspect` all show it. Secret material in a reason is scrubbed before it is stored or printed. - `serve` reports per-gateway poll activity each cycle, so a poll that stages nothing is no longer indistinguishable from a healthy one. Behavior changes: `trigger` now exits non-zero on a failed render or a missing provider key (it previously returned 0), and a project configured for a non-default provider with only OPENROUTER_API_KEY present now errors asking for the configured key instead of silently rendering through the wrong provider.
23 KiB
Changelog
All notable changes to OpenProse will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
prose react "<use case>"— A command for taking an English standing goal to a running, inspectable Reactor on the@openprose/reactor-cli(reactor) binary. The open-prose skill gains areactor.mdoperator guide (install, thecompile → run → servelifecycle,reactor.yml, theprose reactplaybook, and the keylessreactor-devtoolsreplay),SKILL.md/help.mdrouting, and the note that — unlike embodiedprose run—reactoris a deterministic host the agent does shell out to.prose react [use case...] [--start]is embodied by the skill in-session (there is noprosebinary): by default the agent prints thereactorcommands for the user to run, and--startdrives the live lifecycle.model.reasoning_effort(reactor.yml) /reasoningEffort(SDK render and compile options). Passed verbatim intomodelSettings.reasoning.effort— values are model-dependent and validated by the provider. OpenAI reasoning models accept a custom temperature only when effort isnone, so this keeps deterministic setups expressible on those models (temperature: 0+reasoning_effort: none).- A failed render now records why it failed, and every command surfaces it.
The reason is persisted on the
failedreceipt (inside itssemantic_diff, so no receipt field or schema changed and existing.reactor/ledgers keep verifying) and shown byreactor run,reactor trigger,reactor logs,reactor trace, andreactor inspect. API keys and other secret material in a reason are scrubbed before it is stored or printed. Previously a failed render surfaced onlyfailed, with no way to learn the cause without editing the source. reactor servereports per-gateway poll activity in its heartbeat. Each cycle now printsgateways: <source> ingested=N skipped=M, so a poll that stages nothing (an empty payload, or a backlog the cursor already deduped) is no longer indistinguishable from a healthy one. Hosts with no configured gateways print nothing new.
Changed
- An unset
temperatureis now omitted from model requests instead of silently becoming 0. OpenAI reasoning models (gpt-5.5, the o-series) reject any explicit temperature, so "send no temperature" has to be representable: deleting thetemperature:line fromreactor.yml— or leaving the SDK'sRenderOptions.temperature/CompileSessionConfig.temperatureunset — now sends none, and the provider's default applies. Projects that relied on the implicit 0 should settemperature: 0explicitly (thereactor initscaffold already writes it). Type surface:ModelConfig.temperatureis now optional, andmergeModelSettingsomits the temperature key when none resolves. reactor triggernow exits non-zero when a render fails or the configured provider is missing its key. It previously returned0even when the triggered render failed, and a project configured for a non-default provider with onlyOPENROUTER_API_KEYpresent appeared to succeed by rendering through the wrong provider.triggernow fails fast with an actionable error naming the exact env var when a custom provider's key is absent, and exits1on anyfaileddisposition — matchingreactor run.
Removed
- The legacy
@openprose/prose-cli(tools/cli/) is removed. The Oclifprosebinary and itscodex-sdk/claude-sdk/mockharnesses are deleted; the OpenProse language is embodied by the SKILL in-session and the Reactor SDK +reactorCLI are the deterministic harness. The separately-authored### Criteriasection is also removed (postconditions live solely in### Maintains).
Fixed
reactor.yml'stemperaturenow governs run/serve renders, not only compile.run,serve, and the multi-reactor host threadmodel.temperature/model.reasoning_effortinto the render exactly likerender_model; previously a configured temperature reached compile sessions while renders silently used the SDK default.reactor doctor --liveno longer pins temperature 0 in its connectivity probe (it 400ed against reasoning render models), and the temperature-rejection 400 from a provider now maps to an actionable hint naming thereactor.ymlline to fix.reactor triggernow honorsreactor.yml's provider and model. It threaded no provider, model, or decoding settings into the render, so a live trigger always fell back to the SDK's default OpenRouter provider and model regardless of configuration — and with only the configured provider's key present, every trigger produced a bare, causelessfailedreceipt (model: "none", zero tokens).triggernow resolves the provider plan and threadsrender_model,temperature, andreasoning_effortinto the render exactly likerunandserve.
[0.15.0] - 2026-06-04 — open-prose skill & plugin
Skill/plugin-track release. The @openprose/prose-cli CLI is unaffected and
stays at 0.14.0: the SKILL, the Claude/Codex plugin manifests, and the CLI now
version on independent release tracks (see RELEASE.md).
Changed
- Intelligent React overhaul (
runtime_contract: 1 → 2). The judge → verdict → pressure → fulfillment loop is retired for a deterministic reconciler: a render runs only when a node's subscribed input fingerprints or its own contract fingerprint move, and each commit is aReceipt(rendered | skipped | failed) with no LLM in the wake/commit decision. The kind taxonomy is re-cleaved around the single render atom —kind: service→kind: function,kind: systemremoved,kind: responsibilityreshaped with### Requires/### Maintains, and### Ensures→### Maintains. ProseScript and theprose compile/serve/runcommand surface are unchanged in shape. Full migration map andprose upgraderewrites live inskills/open-prose/changelog.md.
Release process
- Decoupled version tracks.
.version-bump.jsonnow groups version surfaces into independent tracks —skill(both plugin manifests +SKILL.md, locked together for Claude Code marketplace dedup) andcli(@openprose/prose-cli+ installer).bump-version.shgains--track <name> <X.Y.Z>and per-track--check/--list; the CLI release preflight validates only theclitrack. Restores the plugin↔CLI independence the packaging originally intended and lets the skill release without a CLI bump.
[0.14.0] - 2026-05-19
Added
prose writeauthoring workflow — Addedstd/ops/prose-authorandprose write [request...]for turning rough English or pseudo-Prose into a validated OpenProse source package. Direct in-harnessprose writeis interactive by default and can ask targetedask_userquestions after a read-only landscape scan and shape/root inference. The shell CLI wrapper remains non-interactive, forwards argv/stdin withinteractive: false, and returnsunresolved-intentrather than guessing when blocking decisions are missing.- Shape-aware authoring guidance —
prose-authornow records whether the output should be a compact single file, imperative-heavyindex.prose.md, multi-service folder, native OpenProse root,.agents/prosesidecar, or~/.agents/proseuser-global agent, then loads the targeted Contract Markdown, ProseScript, Forme, Responsibility Runtime, and filesystem state guidance needed for that shape. - Declared
### Skillssection — Components may now declare the agent harness skills they require in a### Skillssection using thenamespace:namecolon form (e.g.document-skills:pdf). The compiler program resolves declared skills against./skills/,~/.claude/skills/,~/.codex/skills/, and~/.agents/skills/, andprose compilefails closed with askill_unresolveddiagnostic naming the skill and the searched paths if any are missing. OpenProse never installs harness skills — installing them remains the user's responsibility (BYO harness). Seeskills/open-prose/contract-markdown.md(Skills),skills/open-prose/compiler/index.prose.md(skills_resolver), andskills/open-prose/examples/declared-skills/for the spec and a worked example. Resolves #60. - Declared
### Toolssection — Components may now declare host CLI executables they require in a### Toolssection usingcli:<name>declarations. The compiler program resolves supported declarations through a PATH executable check, fails closed withtool_invalid,tool_unsupported_kind, ortool_unresolveddiagnostics, and emits resolved tools into Forme manifests withrequiredByattribution. OpenProse never installs or modifies host tools. Tracks #76.
Fixed
- Serve shutdown logging — In-flight activations interrupted by
prose serveshutdown now log as shutdown cancellations instead of generic trigger failures. - Status wording —
prose statusnow describes absent responsibility state asno runtime status yetinstead ofmissing. - Compiler discipline — The bundled compiler program now returns after
writing
manifest.next.jsonand leaves deterministic validation to the CLI. - Smoke postconditions — OpenProse smoke checks now trust verified run artifacts when a model exits nonzero after satisfying the fixture contract.
- Dependency audit — Refreshed the
brace-expansionlockfile entry so the production dependency audit passes with no advisory findings.
[0.13.1] - 2026-05-05
Fixed
- Compile success detection —
prose compilenow accepts a freshly written validmanifest.next.jsonwhen the harness exits nonzero afterward, while still rejecting missing manifests, invalid IR, error diagnostics, and aborted runs. - Serve trigger behavior — HTTP triggers now acknowledge immediately while dispatching activations in the background, and cron-only manifests still expose the local health endpoint.
- Smoke fixture isolation — Responsibility Runtime smoke fixtures stay inside their source root and include the local pattern dependencies needed by the compiler.
[0.13.0] - 2026-05-04
Added
- Canonical compiler IR contract — Added
skills/open-prose/compiler/ir-v0.mdand refactored the bundled compiler into a compact ProseScript service that emits the v0 repository IR directly. - Unified release preflight — Added one OpenProse release preflight for CLI, SKILL, plugin manifests, installer defaults, changelog notes, npm uniqueness, and GitHub release/tag uniqueness.
Changed
- Single release train — The CLI, SKILL metadata, plugin manifests, package lock, and tarball installer now share one OpenProse version.
- Release workflow — Replaced split CLI/plugin release ownership with one protected OpenProse release workflow.
- Smoke visibility — OpenProse smoke fixtures now run as separate GitHub Actions jobs and emit progress while live agent cases are running.
[0.12.0] - 2026-05-04
Added
- Responsibility Runtime live serve —
prose servenow runs local cron and HTTP trigger adapters from compiledtriggers[], dispatches events into ordinary boundedprose runactivations, and feeds unhealthy judge status into deduped pressure fulfillment. - Responsibility Runtime source model — Added Responsibility-Oriented Architecture docs for standing goals, Reactor reconciliation, gateways, compile-time Forme wiring, judge activations, pressure, and deterministic runtime status.
- Compiler program docs — Added
skills/open-prose/compiler/with the bundled compiler program and pass docs for source discovery, responsibility lowering, gateway lowering, Forme compilation, IR emission, and IR validation. - Native repository examples — Replaced the old numbered examples with eight small OpenProse Native Repositories:
stargazer-outreach,incident-briefing-room,customer-risk-radar,release-readiness,vendor-renewal-watch,research-inbox-triage,content-performance-loop, andcompliance-evidence-tracker.
Changed
- OpenProse root model — Documented native, attached, and user-global OpenProse roots with
src/,dist/,runs/,state/,deps/,prose.lock, and.envas the current filesystem convention. - Command routing — Restored
prose compileas the Responsibility Runtime compiler command that emitsdist/manifest.next.json;prose serveconsumesdist/manifest.active.json, andprose statusinspects active IR and runtime receipts. - Plugin descriptions — Updated plugin metadata to describe run receipts under the active OpenProse root instead of assuming only
.agents/prose/runs/.
Fixed
- Responsibility Runtime validation —
prose compilenow validates the emittedmanifest.next.json; repository IR rejects invalid cron expressions, wrong trigger fields, and live triggers that wake no activations. - Responsibility Runtime freshness —
prose compileclears stale compile output before running;prose serverejects stale judge status output, validates that status belongs to the launched judge activation, and marks older pressure as resolved once a newer healthy status is recorded. - Responsibility Runtime source safety — Repository IR now rejects non-root-relative source paths and requires live triggers to wake the judge for their responsibility.
- Responsibility Runtime pressure — Pressure dedupe now keys on the source status timestamp so fresh unhealthy judgments can each drive one reconciliation attempt.
- Stale compile doctrine — Removed the old skill guidance that treated
prose compileas folded intoprose lint.
Removed
- Outdated examples — Removed the legacy numbered example set and the older
kind: program-first examples from the distributable skill.
[0.11.0] - 2026-05-01
Added
- Codex plugin envelope — Added
.codex-plugin/plugin.jsonand.agents/plugins/marketplace.jsonso OpenProse is discoverable through native Codex marketplace paths with first-classinterfacemetadata. The manifest sits ready for OpenAI's self-serve plugin directory submission window.
Changed
- Current contract conventions — Authored Prose files now use
*.prose.mdwithkind: service,kind: system,kind: test, orkind: pattern; older plain.mdcontracts,.prosesource files,kind: program,kind: composite, andcompose:are legacy upgrade inputs. - Package/library migration — Public docs now describe
packages/std/andpackages/co/as first-party libraries of service/system/test/pattern contracts rather than the older repo-local stdlib/composite model. - Upgrade workflow —
prose upgradeandprose upgrade --dry-runare the current self-healing migration commands. Historicalprose migrate,.deps/, rootprose.lock, and.prose/runs/references remain part of older entries and are superseded by this guidance.
[0.10.0] - 2026-04-20
Added
- Canonical Contract Markdown section syntax — Added
skills/open-prose/contract-markdown.mdas the source of truth for Markdown program/service files. Canonical contracts now use### Services,### Requires,### Ensures,### Runtime,### Shape, and related Markdown sections, while lowercaserequires:/ensures:blocks remain supported as compatibility syntax. - ProseScript reference — Added
skills/open-prose/prosescript.mdto separate pinned choreography (### Execution,.prosescripts, loops, branches, retries, and explicit calls) from declarative Contract Markdown authoring. - Git-native dependency resolution — Programs declare dependencies via
use "owner/repo/path"statements;prose installclones repos into.deps/and pins versions inprose.lock(committed to git). Runtime resolution reads from disk only, no network calls. Replaces the earlierp.prose.mdregistry fetch with GitHub as the authoritative source. runas a first-class keyword type — Programs can now declarerunandrun[]inrequires:to depend on completed runs, enabling provenance tracking, DAG reconstruction, and staleness detection across workflows.environment:contract section — Addedenvironment:as a contract section for declaring runtime dependencies (API keys, secrets, tool access) with VM-enforced security constraints: variables are verified at wiring time but never logged, embedded in artifacts, or passed to subagents that don't declare them.- CLI commands refactored as stdlib sugar — Added
prose lint,prose preflight,prose inspect, andprose statusas thin wrappers around standard-library programs. Retires the transitionalprose compile/prose wire/prose migratesurface now that Contract Markdown is primary. - Agent onboarding narrative — Added
skills/open-prose/agent-onboarding.mdso agents can quickly learn when to propose OpenProse, how to activate the skill, and how to map host primitives to the VM. - Codex entrypoint — Added
AGENTS.mdat the repo root as Codex's native router intoskills/open-prose/SKILL.md, with a recommended[agents]config block (max_depth = 2) for recursive multi-service programs. - LongCoT benchmark automation — Added GitHub Actions workflows and helper scripts for LongCoT benchmarking and the
longcot-rlmifyworkflow dispatcher.
Changed
- Services are now a Markdown contract section — Program topology moved from frontmatter
services:into### Services, matching the rest of the human-readable contract surface. - Skill docs now route by intent — Reworked
skills/open-prose/SKILL.md,README.md,help.md, Forme, VM, guidance, and examples around a smaller "load what you need first" flow for agents. - Examples follow current Contract Markdown — Updated bundled examples to the section-based contract style and clarified multi-service wiring, composites, runtime hints, and execution blocks.
- Stdlib is external — Documentation now points to
openprose/std; repo-localskills/open-prose/lib/andstd/README.mdcontent was removed from this package. - RFCs and skill references are self-contained — Cleaned RFC and skill docs so public references no longer depend on internal planning context.
Fixed
- Spec-to-skill documentation alignment — Documented
eachpostcondition evaluation inensures:blocks, added environment security constraints to Forme wiring rules, introduced runtime delegation markers (__delegate/directory), and rewrotehelp.mdwith Contract Markdown as the primary surface and v0 as a clearly-scoped legacy subsection. - Internal consistency across skill files — Updated stale file-extension references (
.prose→.md), aligned v1/v2 terminology to legacy/declarative, added the missingprose installcommand to the CLI reference, and corrected cross-file pointers.
Removed
- Legacy internal skill artifacts — Removed
skills/open-prose/SOUL.mdand obsolete repo-local stdlib docs in favor of the current public skill and external stdlib model.
[0.9.0] - 2026-03-23
Breaking Changes
- Prose v2: programs are now Markdown files —
.mdwith YAML frontmatter and contract-based semantics (requires:/ensures:) replaces imperative.prosesyntax as the primary format. Legacy.prosefiles still run via v0 mode. - Two-phase execution — Programs with multiple services run through Forme (Phase 1: contract wiring) then the Prose VM (Phase 2: execution). Single-service programs skip Phase 1.
- Removed:
webshskill, voice alts, common library (moved elsewhere).
Added
- Forme Container (Phase 1) — Auto-wires multi-service programs by matching
requires:/ensures:contracts across components. Produces a manifest that the VM executes. - Contract semantics — Programs declare inputs (
requires:) and outputs (ensures:) instead of imperative orchestration. The container figures out the wiring. - Shapes — Typed structure declarations for contract values.
- Strategies — Declarative guidance for how the VM should handle edge cases during execution.
- Errors — Structured error declarations for programs.
- Invariants — Runtime constraints that must hold throughout execution.
- Test programs —
prose testcommand for running test suites against programs. - Standard library (
lib/) — 9 utility programs: calibrator, cost-analyzer, error-forensics, inspector, profiler, program-improver, project-memory, user-memory, vm-improver. - Migration tooling —
prose migrateconverts.prosefiles to.mdformat. - 50 example programs — All examples rewritten in v2
.mdformat, covering basics through complex multi-service orchestrations.
Changed
- v0 VM moved to
v0/— Legacy specs (prose.md,compiler.md,state/,primitives/) relocated tov0/subdirectory. - New
prose.md— v2 VM execution semantics for.mdprograms. - New
forme.md— Forme container semantics for Phase 1 wiring. - New
state/filesystem.md— v2 file-based state with workspace/bindings model. - Guidance directory —
guidance/tenets.md,guidance/patterns.md,guidance/antipatterns.mdfor program authoring.
[0.8.1] - 2025-01-23
Changed
- Token efficiency improvements: State tracking is now significantly more compact, reducing context usage during long-running programs. Append-only logs replace verbose state files, and compact markers replace verbose narration.
[0.8.0] - 2025-01-23
Breaking Changes
- Registry syntax simplified: The
@prefix is no longer required for registry references.- Migration: Update your imports and run commands:
prose run @irl-danb/habit-minerbecomesprose run irl-danb/habit-mineruse "@alice/research"becomesuse "alice/research"
- Resolution rules: URLs fetch directly, paths with
/resolve to p.prose.md, otherwise local file
- Migration: Update your imports and run commands:
Added
-
Memory Programs (recommend sqlite+ backend):
user-memory.prose: Cross-project persistent personal memory with teach/query/reflect modesproject-memory.prose: Project-scoped institutional memory with ingest/query/update/summarize modes
-
Analysis Programs:
cost-analyzer.prose: Token usage and cost pattern analysis with single/compare/trend scopescalibrator.prose: Validates light vs deep evaluation reliabilityerror-forensics.prose: Root cause analysis for failed runs
-
Improvement Loop Programs:
vm-improver.prose: Analyzes inspection reports and proposes PRs to improve the OpenProse VMprogram-improver.prose: Analyzes inspection reports and proposes PRs to improve .prose source code
-
Skill Security Scanner v2: Enhanced with progressive disclosure, model tiering (Sonnet for checklist, Opus for deep analysis), parallel scanners with graceful degradation, and persistent scan history
-
Interactive Example: New example demonstrating input primitives
-
System Prompt: Added system prompt configuration
Removed
- Telemetry system: Removed all telemetry-related code, config, and documentation including USER_ID/SESSION_ID tracking and analytics endpoint calls
Changed
- User-scoped persistent agents now stored in
~/.prose/agents/ - Documentation updates for registry syntax changes