The Reactor is an evented reconciliation harness for AI-maintained
world state. Cost scales with surprise, not time.
This adds:
- @openprose/reactor — the runtime: content-addressed receipt
kernel, memoization, dual-clock forecast scheduling, model-authored
policy compile/recompile/rollback, composition with cycle
detection, two adapter seams.
- @openprose/reactor-cradle — the deterministic evaluation harness.
- The prose CLI wired to the Reactor (prose compile / serve / status).
- Bundled examples that run end-to-end from a clean checkout.
- The OIDC trusted-publishing CI workflow.
Measured cost thesis (deterministic Cradle scenarios):
static 24h world — Reactor 46 fresh : 46 reused / 2 model calls
no-memo control 92 : 0
naive loop 256 : 0
event-changing — Reactor 74 : 74 / 2 model calls
no-memo control 148 : 0
naive loop 148 : 0
Spec: index/spec/02-ReactorHarness.md (openprose/index).
9.1 KiB
OpenProse Post-Release Playtest
This document describes a maintainer-run "play with the release" session for the public OpenProse release. It complements CI and smoke tests by simulating real users installing the published CLI and SKILL/plugin bundle in fresh environments, trying varied OpenProse programs, and reporting anything confusing or broken.
The goal is not to prove every path exhaustively. The goal is to discover the rough edges that only appear when the package is downloaded, installed, and used from many different working directories, shell setups, harnesses, and program shapes.
When To Run
Run a post-release playtest after publishing an OpenProse release, especially when the release changes:
- installation or release packaging
- harness behavior, streaming, exit codes, or signal handling
- SKILL installation, version metadata, or prompt loading
- provider selection or provider documentation
- path handling, current-working-directory behavior, or generated state
For patch releases, a one-hour session is often enough. For larger runtime changes, budget several hours and include at least one Linux runner and one macOS machine.
Principles
- Use the public package and release artifacts, not a local checkout.
- Give each worker a fresh temp directory, fresh
HOME, and isolated install path so state does not leak between scenarios. - Capture commands, stdout, stderr, exit codes, versions, and notable timing.
- Prefer real commands over assertions about how commands should behave.
- File GitHub issues for reproducible problems, confusing UX, or documentation gaps. Do not bury findings in chat transcripts.
- Do not paste secrets, API keys, private customer paths, or proprietary program contents into artifacts or issues.
Suggested Parallel Shape
Fan out independent workers. Each worker owns one temp root and one scenario family. Keep live model calls bounded so the session stays useful and does not create provider noise.
Example worker families:
npm-fresh: npm global install, cleanHOME, first-run behavior.tarball-fresh: curl installer, checksum verification, shim behavior.codex-sdk: default harness, OpenAI credentials, git and non-git dirs.claude-sdk: Claude SDK harness, streaming, skill loading.skill-state: missing, existing, or damaged skill installs.path-edge: spaces in paths, absolute paths, relative paths, temp dirs.native-repo: compile, serve, status, and run in one small native repo.program-shapes: single service, caller input, wiring, ProseScript.docs-user: follow only the README/release docs and note gaps.
Do not make every worker run every harness. A good playtest covers breadth through parallel specialization.
Session Setup
Start with the released version and record it:
version="0.13.0"
npm view @openprose/prose-cli@"$version" version dist-tags.latest
gh release view "v$version" --repo openprose/prose
command -v prose || true
which -a prose || true
prose --version || true
For each worker, create an isolated root:
root="$(mktemp -d)"
export HOME="$root/home"
export XDG_CONFIG_HOME="$HOME/.config"
mkdir -p "$HOME"
Install from npm in one scenario:
npm install --global --prefix "$root/npm-global" @openprose/prose-cli@"$version"
prose_bin="$root/npm-global/bin/prose"
"$prose_bin" --version
"$prose_bin" --help
Install from the tarball flow in another scenario:
PROSE_VERSION="$version" \
PROSE_INSTALL_DIR="$root/install" \
PROSE_BIN_DIR="$root/bin" \
sh -c "$(curl -fsSL https://raw.githubusercontent.com/openprose/prose/main/tools/cli/install.sh)"
prose_bin="$root/bin/prose"
"$prose_bin" --version
"$prose_bin" --help
Keep each worker's raw logs under its temp root:
mkdir -p "$root/logs"
When a command matters, capture stdout, stderr, and status:
set +e
"$prose_bin" doctor >"$root/logs/doctor.stdout" 2>"$root/logs/doctor.stderr"
status=$?
set -e
printf '%s\n' "$status" >"$root/logs/doctor.status"
Scenario Matrix
Cover a representative subset of these scenarios.
Installation
npm install --global --prefix "$root/npm-global"- tarball installer with checksum verification
npx @openprose/prose-cli@<version> --help- reinstall over an existing install
- install with
PROSE_VERSION,PROSE_INSTALL_DIR, andPROSE_BIN_DIR - install from a directory whose path contains spaces
Skill State
- fresh
HOMEwith no installed skill prose doctorprose doctor --install- installed SKILL version matches the released OpenProse version
- first real
prose runthat must install the skill automatically - existing
~/.agents/skills/open-prose - missing provider-specific skill target
- intentionally damaged
SKILL.mdfrontmatter in a disposableHOME
Harnesses
prose run <program> --harness mockprose run <program> --harness codex-sdkprose run <program> --harness claude-sdkPROSE_HARNESS=<name> prose run <program>- missing credentials for each real harness
- invalid harness name
Working Directories And Paths
- home directory, outside a git repository
- inside a git repository
- temp directory with no project files
- absolute program path
- relative program path
- path with spaces
- nested directory several levels deep
Programs
Use small fixtures first, then try one or two realistic programs.
- single-service program
- program requiring caller input
- auto-wired services
- explicit wiring
- ProseScript or worker/critic pattern
- program that writes run receipts under the active OpenProse root
- program expected to fail cleanly
prose compile,prose serve, andprose statusin a native repositoryprose runagainst the compiled system or a focused service
Runtime Behavior
- stdout and stderr streaming
- exit code on success
- exit code on harness failure
SIGINTbehavior during a live run- whether errors identify the failing harness/provider clearly
- whether installer and skill setup output feels readable
- whether generated files land in the expected directory
Worker Prompt
When using async helper runs, give each one a narrow brief. For example:
You are Worker npm-fresh in a post-release playtest for OpenProse <version>.
Use only temp directories. Install from npm with a fresh HOME. Run --version,
--help, doctor, mock run, one real codex-sdk run if credentials are available,
and one no-git working-directory run. Capture exact commands, exit codes, and
concise observations. File no issues yourself; return issue drafts with
reproduction steps for anything suspicious.
For workers that may file issues directly, add:
If you find a reproducible bug or documentation gap, open a GitHub issue with
the label cli. Include version, OS, install method, harness, command, expected
behavior, actual behavior, exit code, and sanitized logs. Do not include
secrets or private paths.
Findings And Issues
File an issue when a finding is:
- reproducible in a fresh temp environment
- likely to affect a real user
- not already covered by an open issue
- actionable with a clear command and expected behavior
Use a title shaped like:
cli: <short user-visible problem>
Issue body template:
## Summary
<What went wrong, in user-facing terms.>
## Environment
- CLI version:
- OS and shell:
- Install method:
- Harness:
- Working directory type: git repo / non-git / temp / path with spaces
## Reproduction
```bash
<sanitized commands>
```
## Expected
<What should have happened.>
## Actual
<What happened instead. Include exit code.>
## Notes
<Sanitized stdout/stderr excerpts, links to artifacts, or suspected area.>
If a finding is real but not urgent, file it anyway and label it as polish or docs. Release playtests are valuable because they capture friction while it is fresh.
Final Report
End the session with a short report:
- released version tested
- install methods tested
- harnesses tested
- number of temp environments/workers
- commands that passed
- issues opened
- suspicious behavior that did not reproduce
- follow-up recommendations
Keep the report factual. Distinguish "release blocker", "bug", "docs gap", "polish", and "could not reproduce".
Good Signs
- Public npm and tarball installs both work from clean temp directories.
prose --helpexposes the expected commands and provider selection docs.prose doctorclearly reports skill state.- First real runs install or find the OpenProse skill without noisy output.
- Real harnesses stream output and preserve meaningful failures.
- Non-git working directories work for Codex-backed harnesses.
- Generated run artifacts appear under the active OpenProse root.
Common Follow-Ups
After one or two manual sessions, consider automating the highest-signal pieces:
- a GitHub Actions workflow that installs the published npm package
- a workflow that downloads the latest release tarball and runs the shim
- scheduled
skillsinstall/discoverability checks - targeted real-harness smoke workflows with a small fixture set
Keep the exploratory playtest even if automation improves. The point is to notice what the deterministic checks did not know to ask.