Files
openprose__prose/CHANGELOG.md
Jose Montes de Oca 82fcc15f12 fix: honor reactor.yml's provider in trigger and surface render failure reasons (#138)
`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.
2026-06-13 20:15:39 -04:00

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 a reactor.md operator guide (install, the compile → run → serve lifecycle, reactor.yml, the prose react playbook, and the keyless reactor-devtools replay), SKILL.md/help.md routing, and the note that — unlike embodied prose run — reactor is a deterministic host the agent does shell out to. prose react [use case...] [--start] is embodied by the skill in-session (there is no prose binary): by default the agent prints the reactor commands for the user to run, and --start drives the live lifecycle.
  • model.reasoning_effort (reactor.yml) / reasoningEffort (SDK render and compile options). Passed verbatim into modelSettings.reasoning.effort — values are model-dependent and validated by the provider. OpenAI reasoning models accept a custom temperature only when effort is none, 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 failed receipt (inside its semantic_diff, so no receipt field or schema changed and existing .reactor/ ledgers keep verifying) and shown by reactor run, reactor trigger, reactor logs, reactor trace, and reactor inspect. API keys and other secret material in a reason are scrubbed before it is stored or printed. Previously a failed render surfaced only failed, with no way to learn the cause without editing the source.
  • reactor serve reports per-gateway poll activity in its heartbeat. Each cycle now prints gateways: <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 temperature is 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 the temperature: line from reactor.yml — or leaving the SDK's RenderOptions.temperature / CompileSessionConfig.temperature unset — now sends none, and the provider's default applies. Projects that relied on the implicit 0 should set temperature: 0 explicitly (the reactor init scaffold already writes it). Type surface: ModelConfig.temperature is now optional, and mergeModelSettings omits the temperature key when none resolves.
  • reactor trigger now exits non-zero when a render fails or the configured provider is missing its key. It previously returned 0 even when the triggered render failed, and a project configured for a non-default provider with only OPENROUTER_API_KEY present appeared to succeed by rendering through the wrong provider. trigger now fails fast with an actionable error naming the exact env var when a custom provider's key is absent, and exits 1 on any failed disposition — matching reactor run.

Removed

  • The legacy @openprose/prose-cli (tools/cli/) is removed. The Oclif prose binary and its codex-sdk/claude-sdk/mock harnesses are deleted; the OpenProse language is embodied by the SKILL in-session and the Reactor SDK + reactor CLI are the deterministic harness. The separately-authored ### Criteria section is also removed (postconditions live solely in ### Maintains).

Fixed

  • reactor.yml's temperature now governs run/serve renders, not only compile. run, serve, and the multi-reactor host thread model.temperature / model.reasoning_effort into the render exactly like render_model; previously a configured temperature reached compile sessions while renders silently used the SDK default. reactor doctor --live no 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 the reactor.yml line to fix.
  • reactor trigger now honors reactor.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, causeless failed receipt (model: "none", zero tokens). trigger now resolves the provider plan and threads render_model, temperature, and reasoning_effort into the render exactly like run and serve.

[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 a Receipt (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: system removed, kind: responsibility reshaped with ### Requires / ### Maintains, and ### Ensures → ### Maintains. ProseScript and the prose compile/serve/run command surface are unchanged in shape. Full migration map and prose upgrade rewrites live in skills/open-prose/changelog.md.

Release process

  • Decoupled version tracks. .version-bump.json now groups version surfaces into independent tracks — skill (both plugin manifests + SKILL.md, locked together for Claude Code marketplace dedup) and cli (@openprose/prose-cli + installer). bump-version.sh gains --track <name> <X.Y.Z> and per-track --check/--list; the CLI release preflight validates only the cli track. 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 write authoring workflow — Added std/ops/prose-author and prose write [request...] for turning rough English or pseudo-Prose into a validated OpenProse source package. Direct in-harness prose write is interactive by default and can ask targeted ask_user questions after a read-only landscape scan and shape/root inference. The shell CLI wrapper remains non-interactive, forwards argv/stdin with interactive: false, and returns unresolved-intent rather than guessing when blocking decisions are missing.
  • Shape-aware authoring guidance — prose-author now records whether the output should be a compact single file, imperative-heavy index.prose.md, multi-service folder, native OpenProse root, .agents/prose sidecar, or ~/.agents/prose user-global agent, then loads the targeted Contract Markdown, ProseScript, Forme, Responsibility Runtime, and filesystem state guidance needed for that shape.
  • Declared ### Skills section — Components may now declare the agent harness skills they require in a ### Skills section using the namespace:name colon form (e.g. document-skills:pdf). The compiler program resolves declared skills against ./skills/, ~/.claude/skills/, ~/.codex/skills/, and ~/.agents/skills/, and prose compile fails closed with a skill_unresolved diagnostic 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). See skills/open-prose/contract-markdown.md (Skills), skills/open-prose/compiler/index.prose.md (skills_resolver), and skills/open-prose/examples/declared-skills/ for the spec and a worked example. Resolves #60.
  • Declared ### Tools section — Components may now declare host CLI executables they require in a ### Tools section using cli:<name> declarations. The compiler program resolves supported declarations through a PATH executable check, fails closed with tool_invalid, tool_unsupported_kind, or tool_unresolved diagnostics, and emits resolved tools into Forme manifests with requiredBy attribution. OpenProse never installs or modifies host tools. Tracks #76.

Fixed

  • Serve shutdown logging — In-flight activations interrupted by prose serve shutdown now log as shutdown cancellations instead of generic trigger failures.
  • Status wording — prose status now describes absent responsibility state as no runtime status yet instead of missing.
  • Compiler discipline — The bundled compiler program now returns after writing manifest.next.json and 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-expansion lockfile entry so the production dependency audit passes with no advisory findings.

[0.13.1] - 2026-05-05

Fixed

  • Compile success detection — prose compile now accepts a freshly written valid manifest.next.json when 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.md and 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 serve now runs local cron and HTTP trigger adapters from compiled triggers[], dispatches events into ordinary bounded prose run activations, 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, and compliance-evidence-tracker.

Changed

  • OpenProse root model — Documented native, attached, and user-global OpenProse roots with src/, dist/, runs/, state/, deps/, prose.lock, and .env as the current filesystem convention.
  • Command routing — Restored prose compile as the Responsibility Runtime compiler command that emits dist/manifest.next.json; prose serve consumes dist/manifest.active.json, and prose status inspects 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 compile now validates the emitted manifest.next.json; repository IR rejects invalid cron expressions, wrong trigger fields, and live triggers that wake no activations.
  • Responsibility Runtime freshness — prose compile clears stale compile output before running; prose serve rejects 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 compile as folded into prose 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.json and .agents/plugins/marketplace.json so OpenProse is discoverable through native Codex marketplace paths with first-class interface metadata. The manifest sits ready for OpenAI's self-serve plugin directory submission window.

Changed

  • Current contract conventions — Authored Prose files now use *.prose.md with kind: service, kind: system, kind: test, or kind: pattern; older plain .md contracts, .prose source files, kind: program, kind: composite, and compose: are legacy upgrade inputs.
  • Package/library migration — Public docs now describe packages/std/ and packages/co/ as first-party libraries of service/system/test/pattern contracts rather than the older repo-local stdlib/composite model.
  • Upgrade workflow — prose upgrade and prose upgrade --dry-run are the current self-healing migration commands. Historical prose migrate, .deps/, root prose.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.md as the source of truth for Markdown program/service files. Canonical contracts now use ### Services, ### Requires, ### Ensures, ### Runtime, ### Shape, and related Markdown sections, while lowercase requires: / ensures: blocks remain supported as compatibility syntax.
  • ProseScript reference — Added skills/open-prose/prosescript.md to separate pinned choreography (### Execution, .prose scripts, 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 install clones repos into .deps/ and pins versions in prose.lock (committed to git). Runtime resolution reads from disk only, no network calls. Replaces the earlier p.prose.md registry fetch with GitHub as the authoritative source.
  • run as a first-class keyword type — Programs can now declare run and run[] in requires: to depend on completed runs, enabling provenance tracking, DAG reconstruction, and staleness detection across workflows.
  • environment: contract section — Added environment: 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, and prose status as thin wrappers around standard-library programs. Retires the transitional prose compile / prose wire / prose migrate surface now that Contract Markdown is primary.
  • Agent onboarding narrative — Added skills/open-prose/agent-onboarding.md so 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.md at the repo root as Codex's native router into skills/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-rlmify workflow 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-local skills/open-prose/lib/ and std/README.md content 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 each postcondition evaluation in ensures: blocks, added environment security constraints to Forme wiring rules, introduced runtime delegation markers (__delegate/ directory), and rewrote help.md with 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 missing prose install command to the CLI reference, and corrected cross-file pointers.

Removed

  • Legacy internal skill artifacts — Removed skills/open-prose/SOUL.md and 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 — .md with YAML frontmatter and contract-based semantics (requires:/ensures:) replaces imperative .prose syntax as the primary format. Legacy .prose files 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: websh skill, 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 test command 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 migrate converts .prose files to .md format.
  • 50 example programs — All examples rewritten in v2 .md format, covering basics through complex multi-service orchestrations.

Changed

  • v0 VM moved to v0/ — Legacy specs (prose.md, compiler.md, state/, primitives/) relocated to v0/ subdirectory.
  • New prose.md — v2 VM execution semantics for .md programs.
  • 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.md for 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-miner becomes prose run irl-danb/habit-miner
      • use "@alice/research" becomes use "alice/research"
    • Resolution rules: URLs fetch directly, paths with / resolve to p.prose.md, otherwise local file

Added

  • Memory Programs (recommend sqlite+ backend):

    • user-memory.prose: Cross-project persistent personal memory with teach/query/reflect modes
    • project-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 scopes
    • calibrator.prose: Validates light vs deep evaluation reliability
    • error-forensics.prose: Root cause analysis for failed runs
  • Improvement Loop Programs:

    • vm-improver.prose: Analyzes inspection reports and proposes PRs to improve the OpenProse VM
    • program-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