Commit Graph

234 Commits

Author SHA1 Message Date
irl-dan d3d28297db docs(reactor-cli): make docs-synthesis gateway/classifier inputs explicit
Point repo-changes at its upstream `inbox.json` (the phantom ingress producer)
and forbid git/filesystem inspection; point change-signal at the upstream
`changes` records and their `files` field. Clarifies the intended data path —
the connector stages PRs into the gateway's ingress, the gateway folds them, the
classifier routes by changed path.

NOTE (live-run finding): in the current CLI/SDK build the staged ingress inbox
does NOT surface as a readable upstream to the gateway render (a render's
readable upstream = its mounted inbound edges; the ingress is an unmounted
producer), so an LLM gateway cannot actually fold connector arrivals. The
canonical agent-observatory example exhibits the same empty result. Filed as
feedback; this wording is the correct intent for when that path is wired.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 21:28:30 -07:00
irl-dan f0c71e4d41 fix(reactor-cli): give docs-synthesis accumulators unique facet names
All five section accumulators exposed a facet literally named `pending-edits`,
so docs-pr's five requires were ambiguous and the *-pending -> docs-pr edges
failed to wire. Rename to cli-pending / sdk-pending / reactor-pending /
devtools-pending / openprose-pending (the same distinct-naming discipline
agent-observatory uses for unambiguous wiring) and point docs-pr at each.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 20:58:41 -07:00
irl-dan 11e87f6ad9 feat(reactor-cli): make docs-synthesis actuator target concrete
docs-pr now operates on the docs clone at $DOCS_SYNTH_DOCS_REPO with explicit
git/gh steps (branch docs-synthesis/prs-<cited-PRs>, edit named pages, push, gh
pr create). Generic and runnable; the dry-run guard is unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 20:47:08 -07:00
irl-dan f3c2d5200b feat(reactor-cli): add docs-synthesis example (merged PRs → docs PR)
A cost-tiered Reactor example, parallel to agent-observatory, that watches a
code repo's merged PRs and opens one PR against the public docs site to keep it
current. It is the worked example of the Cost and Context Discipline authoring
guidance (the PR→docs shape that guidance was written for):

- repo-changes (gateway): folds merged-PR deltas (changed-path list + diffstat,
  never the full diff).
- change-signal (cheap classifier): maps each PR's inline changed paths to
  per-section doc-impact signals, faceted so an unrelated PR wakes nobody.
- five section accumulators (cli/sdk/reactor/reactor-devtools/openprose): each
  subscribes to its one signal facet and accumulates pending edits (page + why +
  cited PR); memo-skips at zero cost otherwise.
- docs-pr (coalesced actuator): the one effectful node — reads only the pages it
  edits, drafts the .mdx changes, and opens one PR (git + gh). Dry under
  REACTOR_OFFLINE or DOCS_SYNTH_DRY_RUN, which is how the replay is produced.

Ships static PR fixtures (offline demo) and a git-log connectors.cjs.example
(live opt-in). Compile-check passes keyless. The committed replay/ + eval-harness
validation is a follow-up keyed run.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 15:08:40 -07:00
irl-dan 04ea91bc8b chore: remove the legacy prose CLI and the separate ### Criteria section
Completes the prose-CLI scrub the spec already documents as shipped: deletes tools/cli (the @openprose/prose-cli Oclif binary + eval harnesses), drops tools/cli from the workspace and lockfile, and removes the separately-authored `### Criteria` section from the reactor and reactor-cli contract loaders (postconditions live solely in `### Maintains`). Updates the accompanying skill tests, changelog, and release docs. Verified green: reactor SDK 458/0/10, reactor-cli 186/1 (pre-existing doctor test), devtools 96/0, skill 413/0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:49:49 -07:00
irl-dan 6cb6e45aa8 docs(spec): parity follow-ups from code-grounded verification
Repairs surfaced by an independent code-grounded verification pass. 00: cost is observed-not-budgeted (not 'resource budget the gates are constrained by'); Tenet 2's intelligence layer lists all three model-authored compile artifacts (Forme topology + canonicalizer + postcondition validators). 01: state the `### Invariants` actuation-boundary ideal in Part I (with a bridge note it is authored-only today); gateway compiles to a trigger the reactor serves (not `prose serve`); migration line corrected (`co` has no `kind: responsibility`; std has 3); note the language-root `receipts.jsonl` vs the harness `receipts.json`. 02: launch DoD no longer implies version-equality; new Part III §10 (declared-capability resolution + serve auth + async storage seam) so every Honest-Limit has a forward item. 03: signer rendered as shipped (`scheme: "none"`, no `kind:"null"|"signed"`); Part II honest that `### Tools`/`### Environment`/`### Skills` are name-only and not harness-consumed; `as_of` added to the gap-cluster-2 receipt set; gateway `### Schedule` forward item; no `reactor test` subcommand.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:28:16 -07:00
irl-dan 4e8979c9f4 docs(spec): bring Part I/II/III into parity (ideal / actual / path)
Reconcile the OpenProse spec so Part I states the implementation-agnostic ideal, Part II matches shipped code, and Part III is a real actual->ideal path. Memo key stated as the 3-tuple (shipped 2-tuple as a bridge note); ideal receipt schema gains as_of + failure reason + author-addressing; precedence-stack scope and commit-gate pillar reconciled across 00/02/03; prose-CLI and `### Criteria` residue removed from the ideal; Part III re-baselined off shipped reality (the corpus migration retired as done) with the receipt-shape and actuation gap-cluster items added so every Part II limit has a forward item.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 13:10:24 -07:00
dan f961d852e9 docs(skill): add Cost and Context Discipline to write guidance (#126)
Capture the agent-observatory Reactor learnings as authoring doctrine,
scoped to multi-node Reactor pipelines so they are not over-applied.

guidance/authoring.md gains a `## Cost and Context Discipline` section
(tier with a cheap gatekeeper; bound each narrow render to its inline
input; validate the cost-shape; keep renders cheap-model-small) plus
four matching anti-patterns. SKILL.md's Authoring Guidance points to it
for continuous / fan-out / high-event-volume pipelines.

Opens with an explicit trigger and a Tenet-2 caveat: it applies to the
narrow-transform renders that dominate a pipeline's volume, not to
one-shot functions or single responsibilities, and a render whose job is
to explore should still explore. CLI/version gotchas are deliberately
left to reactor.md, not authoring doctrine.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 13:01:42 -07:00
dan 2990882142 docs(examples): match inbound-email index bullets to the README restyle (#125)
The "Inbound email as a trigger" group was authored before the README index was
restyled to use a colon (not an em-dash) between each example link and its
description. Align the three bullets (support-inbox-router, feedback-pulse,
press-desk) to that convention. Cosmetic only.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:15:33 -07:00
dan caacca9015 Inbound primitive.dev email as a Reactor trigger (3 examples) (#120)
* feat(examples): inbound primitive.dev email as a Reactor trigger (3 examples)

Wire a primitive.dev email inbox in as an external-driven gateway and keep a
downstream world-model current from what arrives. Three distinct reactor shapes,
each shipping the full validity contract (committed replay/ + deterministic
tier-2 offline test) plus a key-gated tier-3 LLM-as-judge live test.

- support-inbox-router (marquee): a cheap-model spam/content filter + a faceted
  router whose facets are channels. A per-email triage drops spam (its `routed`
  facet stays the fixed NULL token, so junk lights nothing) and tags ham to a
  channel; the router catalogues one facet per channel (bug-reports,
  feature-requests, docs-questions, billing) so a docs question wakes ONLY the
  docs-gap tracker, never the bug board. `billing` has zero consumers on purpose
  (a facet is a subscription symbol). The docs-gap tracker feeds the agent-native
  docs / llms.txt surface.
- feedback-pulse: rollup aggregation + self-driven weekly `valid_until`
  freshness; the brief refreshes on cadence even when the inbox is quiet, at zero
  tokens on an unmoved rollup.
- press-desk: a deterministic human gate (gateCommit: needs_human,
  auto_reply:false) + a privacy projection facet that keeps sender PII out of the
  public view by construction.

Tier-2 offline: 45/45 new tests pass, byte-deterministic, chain-verifying; no
regression to the existing suite. Tier-3 live tests passing-skip offline and run
the render on a cheap model with a smart judge model when keyed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test(examples): validate tier-3 LLM-judge live tests on direct OpenAI

OpenRouter is over its account spend cap, so point the three live tests at the
OpenAI Chat Completions surface directly with OPENAI_API_KEY: the render-under-
test runs on the cheap model (gpt-5.4-mini) and the rubric judge on a smarter one
(gpt-5.5), both via the same key. gating now resolves OPENAI_API_KEY (process.env
then the .env at REACTOR_ENV_PATH, honoring REACTOR_OFFLINE) and the body still
passing-skips offline. temperature pinned to 1 (the gpt-5.x models reject 0).

All three live tests pass live at reliability >= 0.8 across their labeled sets
(support-inbox-router spam/bug/feature/docs, feedback-pulse themes, press-desk
relevance/kind/no-PII-leak), grounding guard held. Offline gate unchanged: 45/45
tier-2 pass, live bodies passing-skip.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:05:05 -07:00
irl-dan 7c9d5911b5 Merge feat/prose-react-cli: register prose react forwarded command (#48cca04)
# Conflicts:
#	CHANGELOG.md
2026-06-06 15:09:48 -07:00
Jose Montes de Oca cb61522a81 docs: lead the README with the declarative through-line (#124)
Frame OpenProse as a declarative language: you declare the ideal world
state, the Reactor keeps it true. Make that the spine across both layers
and present cost-scales-with-surprise as its consequence rather than the
headline. Sweep em dashes for a cleaner read.
2026-06-06 17:26:55 -04:00
Jose Montes de Oca 9248d949e7 chore: ship skill examples as copyable scaffolding (#123)
The open-prose skill ships as a plain folder, so everything under
skills/open-prose/examples/ reaches every install. Each runtime example
shipped a committed replay/ state-dir (around 480 binary world-model files), a
generator, and a test suite wired to the workspace through a dist alias with no
local package.json. That machinery is internal validation, not the template a
user lifts: it cannot run from a copied folder, and it shipped generated
artifacts nobody should copy.

Keep the shipped examples to what a user actually adapts, and move the
validation into the repo's test tree:

- Move each example's tests, generator, and committed replay/ into
  tests/open-prose/examples/<name>/. The shipped example is now its .prose
  contracts under src/, a README, and a .gitignore.
- Re-point the vitest include and the test scripts; the byte-deterministic
  offline coverage runs unchanged, just rooted under tests/.
- Rewrite the example READMEs to point at the reactor CLI for producing and
  replaying a run, and drop the stale committed-fixture sections.
- Update the examples-gate workflow description to match the new layout.

No language, CLI, or runtime behavior changes, and the example contracts are
untouched. Verified with the offline gate (REACTOR_OFFLINE=1): the conformance
suite, the relocated example tests, and the eval harness all pass.
2026-06-05 19:44:15 -04:00
dan ddc7736ec5 Deprecate prose-cli npm publish flow + park the eval suite (green the tree) (#122)
* fix(cli): typecheck repository-reactor-bridge test against branded Receipt fields

#106 hard-branded the reactor Receipt identity fields (node: NodeId,
contract_fingerprint / fingerprints: Fingerprint) and added this bridge test in
the same commit, constructing the Receipt fixture from raw strings — so the test
was born failing tsc. CLI Release Check only runs on tools/cli + release-script
paths and main has no required checks, so #106 merged with the typecheck red and
it stayed hidden (no cli-path change re-ran the check) until a release-infra PR
surfaced it.

Author the fixture with the same brand constructors the production bridge uses
(asNodeId / asFingerprint from @openprose/reactor/internals). The constructors are
identity-at-runtime brands, so behavior is unchanged: the affected test passes
10/10 and tsc is clean.

Note: this unmasks a SEPARATE pre-existing failure, also from #106 — the
repository-ir compiler fixtures were regenerated with kind
"openprose.compile-phase-ir" while validateRepositoryIr and its tests still expect
"openprose.repository-ir" (23 failing tests). That is a distinct IR-reconciliation
fix, tracked separately.

* fix(cli): restore repository-ir v0 validator tests with CLI-owned fixtures

#106 migrated the SKILL compiler's golden outputs (repo-root
tests/open-prose/compiler/) from repository-ir v0 to compile-phase-ir v2, but the
CLI's own compile path (compileRepositorySource -> validateRepositoryIr ->
repositoryIrToTopology) stayed v0. repository-ir.test.ts and
responsibility-status.test.ts borrowed those golden files across the package
boundary, so the v0 validator was being fed v2 inputs -> 21 failing tests.

Give the CLI's v0 validator tests their OWN v0 fixtures under
tools/cli/tests/prose/fixtures/repository-ir/ (recovered from f12dcda~1, the last
commit before the migration; the CLI compiler and validator are unchanged since,
so they still describe the current contract). The two compilers no longer share
fixtures: the SKILL compiler's compile-phase-ir fixtures are validated by
compiler-ir.test.ts; these repository-ir v0 fixtures are the CLI's. A README in the
fixtures dir documents the split and the migration path.

No validator or compiler change (not papering over) — the v0 validator is simply
fed correct v0 inputs. tools/cli suite: 573 -> 594 passing; the v0 validator suite
is 30/30. The 2 remaining failures (quickstart's dangling deleted-demo reference
and the agent-observatory example's missing id) are unrelated non-IR #106 fallout,
tracked separately.

* chore: deprecate prose-cli npm publish flow; park the eval suite

The `prose` CLI (@openprose/prose-cli) is deprecated in favor of the reactor
harness (@openprose/reactor + @openprose/reactor-cli) and the SKILL/plugin. This
removes its npm publish flow (it will be marked deprecated on npm manually) and
parks the eval harness out of the working tree.

Rip out the prose-cli publish flow:
- delete .github/workflows/{release,cli-release-check,cli-real-harness-smoke}.yml
  and scripts/release-preflight.sh (the "OpenProse Release" publisher + its
  preflight/checks).
- drop the `cli` track from .version-bump.json (only the skill/plugin track
  releases here now) and the prose-cli sections from RELEASE.md.
- decouple the root build/test/lint scripts from @openprose/prose-cli.

Park the eval suite (it is rethought from scratch in the reactor backlog):
- remove the judge-era harness tools/cli/src/evals (45) + tools/cli/tests/evals
  (18) and spec/04-Evals.md; they are copied verbatim into the planning
  backlog-reactor for rehydration, and the methodology is synthesized there.
  The harness was import-isolated (no code imported it); removal breaks nothing.
- fix the now-dangling spec/02 cross-reference to 04-Evals.md.
- remove the obsolete quickstart.test.ts (it read a #106-deleted demo test file).

The reactor packages, the new reactor-native tools/eval-harness, the skill
examples gate, and plugin-manifest are unaffected; prose-cli still typechecks.
2026-06-04 21:52:00 -07:00
dan d9a7f21eb4 feat(reactor-devtools): re-skin the replay viewer to the OpenProse machine surface (#121)
Re-skin the keyless DevTools replay SPA onto the apps/run design system's
"Reactor monitor" machine surface (DESIGN.md §1/§4 name it as a sanctioned dark
machine surface): a flat charcoal ground, single-voice self-hosted JetBrains
Mono, gold as the one brand accent, 1px hairlines + small radii + one soft
shadow framing, three-dot window chrome, and always-labeled status.

- Machine palette (variable NAMES preserved so app.js + every selector keep
  working; only values changed): --bg #1a1c22 flat (radial gradient removed,
  per "no gradients"), machine-bar chrome bars, machine-fg/dim text, white-alpha
  hairlines.
- Disposition + wake-cause hues mapped to the machine signal palette, kept
  distinct AND labeled (never colour-only): render = machine-ok green,
  active/lit path + per-facet edge-light + cost-fresh + external-wake =
  machine-gold, memo-skip = machine-dim grey, fail = machine red (deepened for
  AA on charcoal), self-tick = labeled violet.
- Self-host JetBrains Mono (400/500/700 woff2, latin subset, ~65KB) under
  src/public/fonts so the machine surface is the real face, offline + keyless.
- Fix copy:public to recurse (fs.cpSync) so the new fonts/ subdir builds and
  ships (the old non-recursive copy threw ENOTSUP on a subdir).

Scope: CSS + index.html + fonts only. No app.js logic changes; all class names
and animation hooks preserved, so replay/scrub/animation behaviour is identical.
Verified: pnpm build + typecheck pass and the built server serves /app.css and
/fonts/*.woff2 (200).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 14:52:45 -07:00
dan a62c5c53ca docs: remove the legacy Astro reports site (#117)
The Astro `reports` app (formerly apps/reports in openprose/platform,
publishing to reports.openprose.ai) is gone, leaving only this stale
`docs/reactor/v0.1/` content and a README describing a dead publishing
pipeline. The canonical documentation now lives at the Next.js/Fumadocs
site https://docs.openprose.ai (repo openprose/docs), which carries the
reactor technical report and architecture docs.

Removes `docs/` entirely and repoints the README's technical-report link
to the live docs site.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 14:43:43 -07:00
dan f16f9bf317 feat(examples): cost-tiered agent-observatory + eval-harness Anthropic judge (#119)
A Claude-Code session scanner piped into domain world-state. A cheap classifier
(session-signal) fans per-domain signals into four maintained truths
(decisions-log, eng-backlog, use-case-guide, attention-queue) and a coalesced
dashboard, so cost scales with surprise: a session moves only the domains it
touches; the rest memo-skip.

- 7 contracts + reactor.yml (OpenAI gpt-5.4-mini renders, gpt-5.4 compile),
  inline-flow static fixtures, opt-in real scanner (connectors.cjs.example),
  README + PIPELINE-DESIGN.md.
- Committed replay/ from a captured run (11 rendered, 2 skipped, 0 failed,
  ~38k fresh tokens) so the reactor eval-harness is reproducible.
- eval-harness: additive, env-gated Anthropic judge (JUDGE_PROVIDER=anthropic
  + JUDGE_MODEL, default claude-opus-4-8) via the CLI's native-Anthropic provider
  builder. Default OpenRouter behavior unchanged; REACTOR_OFFLINE still forces
  judges off. Eval result: 2/2 grade A (deterministic + opus judge).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 14:36:59 -07:00
dan fdd3423766 chore(release): decouple skill and CLI version tracks; release skill 0.15.0 (#118)
The SKILL, the plugin manifests, and the prose CLI were pinned to one shared
X.Y.Z by an earlier "unify release flow" change. Nothing couples them at runtime
— the skill carries its own runtime_contract compatibility signal — so the
shared version was process convention, not necessity, and a partial bump
(SKILL.md 0.15.0 vs everything-else 0.14.0) was stranding the Plugin Manifest
gate red on main.

Split .version-bump.json into two independent tracks:
- skill: both plugin manifests + SKILL.md, locked together (the plugin
  marketplace dedupes by manifest version, so a skill change only reaches plugin
  users when the manifest advances).
- cli: @openprose/prose-cli + install.sh.

bump-version.sh becomes track-aware (--track <name> <X.Y.Z>, per-track --check,
--list); release-preflight.sh validates only the cli track so a CLI release is
no longer blocked by the skill version. RELEASE.md documents both tracks and the
skill release flow; CHANGELOG gets a 0.15.0 skill entry.

Release the skill track at 0.15.0 (plugin manifests 0.14.0 -> 0.15.0; SKILL.md
already there): the Intelligent React overhaul, runtime_contract 1 -> 2. The CLI
stays 0.14.0. Clears the red Plugin Manifest check.
skill-v0.15.0
2026-06-04 00:42:52 -07:00
dan 870cedeaa6 fix(deps): bump vitest 3.2.4 → 4.1.8 (GHSA-5xrq-8626-4rwp, critical) (#115)
Closes the 3 critical Dependabot alerts (one advisory, GHSA-5xrq-8626-4rwp, CVSS 9.8). vitest is a devDependency; both configs run environment: node only. Offline gate verified green on the 3→4 bump. Resolved a pnpm-lock.yaml conflict with main by regenerating from main's base.
2026-06-04 00:34:21 -07:00
irl-dan 8a1cd89e30 docs(report): name the typed image as an authoring-surface frontier
Adds a forward-looking paragraph to §9 ("Deliberately not yet here"): the
authored source need not be text. Because compile is an intelligent render
and Forme's topology is itself a world-model, intent can arrive as a typed
image that the compile resolve inverts into `.prose.md` contracts — well-
typed by whether it compiles to an acyclic, round-trip-stable graph. Framed
honestly as a direction specified in the skill, not a shipped runtime path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 00:19:44 -07:00
dan a50628af93 skill: add the typed image as a visual Prose source (#116)
Adds `visual-source.md` to the open-prose skill: a pixel-only image that
an intelligent compile *resolve* turns into Prose contracts. A multi-node
image is a visual projection of a Forme topology world-model; inverting it
reconstructs the `### Requires`/`### Maintains` graph. The image sits one
rung above Contract Markdown — a brief, not a binary — and is "well-typed"
by compilation succeeding, not by a parser: `prose compile <image>` is the
typechecker (acyclic + round-trip-stable).

Defines the type (conceptual, checked by compile), three scope tiers
(system / single responsibility / single function), and three requirement
tiers (required structural skeleton; pin-or-interrupt for safety-bearing
freshness/postconditions; elaborated goal prose the resolve authors and a
human ratifies). Wires it into SKILL.md (Format Detection, Command Routing
for compile/run/react, First 90 Seconds, File Locations) and cross-links
forme.md.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-04 00:08:13 -07:00
irl-dan 48cca04cc4 cli: register prose react forwarded command
Adds `react` to the prose CLI command model so `prose react "<use case>"`
is a first-class forwarded command alongside run/serve/write — consistent
with the open-prose skill's `prose react` routing (reactor.md) added in #112.

- command-model.ts: add `react` to the CommandName union, supportedCommands,
  and usageByCommand; validate `[use case...] [--start]` (free-form text plus
  an optional --start flag; reject unknown long options and duplicate --start).
  canonicalPrompt forwards `prose react <args>` to the agent unchanged.
- commands/index.ts: register the `react` forward command (auto-wired into the
  command registry).
- command-model.test.ts: forwarding + validation cases for react.
- CHANGELOG: Unreleased entry.

Default forwards the reactor commands for the user to run; `--start` drives
the live lifecycle. Validated: command-model test (53 passing) + my files
typecheck clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 12:44:45 -07:00
dan 6b49de5221 feat(reactor-cli): route provider: anthropic through native Messages API (#113)
Anthropic's OpenAI-compat endpoint is documented as testing-only and ignores
response_format, so it rejects Reactor's JSON-schema structured outputs with
400 response_format.json_schema.strict. That made `provider: anthropic` a
footgun for the structured compile/render path (compile + render are both
structured, and renders drive tools).

Route the built-in `anthropic` provider through the official @openai/agents
AI-SDK adapter over @ai-sdk/anthropic (native Messages API), where structured
outputs and tools both work. Mechanism:

- ProviderPlan gains a keyless `transport` discriminator (openai-compat |
  anthropic-native); the anthropic built-in resolves to anthropic-native. The
  module stays keyless, so the offline boundary holds.
- live-provider builds an AI-SDK-backed ModelProvider for that transport; every
  other vendor keeps the scoped OpenAIProvider compat path. Both are scoped (no
  global mutation). The compile/run/serve call sites are unchanged.
- doctor --live smokes the native provider for an anthropic project.
- A new gated live test drives a structured render + tool through the native
  adapter (proven live: structured output parsed + tool called); it offline-skips
  like every live test. The reactor BYO live test notes the compat subtest is
  plain-text reachability only.

Bundles @openai/agents-extensions, ai, @ai-sdk/anthropic as CLI deps so an
installed reactor needs no extra setup. reactor-cli 0.2.1 -> 0.2.2.
reactor-v0.3.1-cli.0.2.2
2026-06-03 12:12:45 -07:00
dan 240251542a skill: teach the Reactor CLI via prose react "<use case>" (#112)
The open-prose skill described Reactor as a concept but never taught the
real `reactor` binary (`@openprose/reactor-cli`, live on npm) or how to
stand a Reactor up. This adds that path end to end.

- New `reactor.md`: operator guide for the `reactor` binary — global
  install, the keyless-vs-live boundary, the `compile → run → serve`
  lifecycle, `reactor.yml` (connectors, sandbox, ask-the-user-for-model),
  the `prose react` playbook, and the keyless `reactor-devtools` replay.
- SKILL.md: route `prose react [use case...] [--start]`, add a
  First-90-Seconds row, register `reactor.md`, and note the one case where
  an agent *does* shell out — the `reactor` binary is a deterministic host,
  not a wrapper. Also fixes a mashed-together File Locations table row.
- help.md: surface `prose react` in Available Commands and the goal-true path.

Default behavior prints the `reactor` commands for the user; `--start`
drives the live lifecycle directly.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 12:00:29 -07:00
Raymond Weitekamp 7690bbad5d fix README header image (#111) 2026-06-03 12:21:09 -04:00
dan efb9a48459 docs: use opengraph-image for README header (#110)
The readme-header.png render had overlapping headline text. Point the
README header at the opengraph-image route instead.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-03 09:09:14 -07:00
dan 0061ca35f1 feat(reactor-cli): configurable LLM provider + accurate cost labels (#109)
Reactor was hard-wired to OpenRouter on the CLI (only OPENROUTER_API_KEY was
ever read), stranding users holding OpenAI / Anthropic / Google keys. The SDK
already supported a scoped provider; this makes it real and elegant at the CLI.

reactor-cli (0.2.0 -> 0.2.1):
- reactor.yml model.provider now switches the live provider; built-ins
  openrouter|openai|anthropic|google resolve their endpoint + key env, and any
  OpenAI-compatible vendor works via model.base_url + model.api_key_env.
- A keyless ProviderPlan resolver + a model-bearing OpenAIProvider factory
  (reached only past the dynamic-import offline boundary), threaded into compile
  sessions and the run/serve render (incl. the configured render_model, which
  the run phase previously ignored).
- doctor reports the configured provider's key (not only OPENROUTER_API_KEY) and
  doctor --live smokes the configured endpoint; a missing key fails non-zero with
  the exact env var (never misdirects to OpenRouter, never exits 0).
- Tests: ProviderPlan resolver + a hermetic missing-key compile.

reactor (0.3.0 -> 0.3.1):
- Receipt Cost now reports the real provider + model instead of a hardcoded
  openrouter / gemini-3.5-flash (cost-only labels, never fingerprinted). New
  optional RunProjectRender.providerLabel + CostLabels.
- Tests: cost-labels + a key-gated bring-your-own-provider live smoke.

Build: each reactor package cleans its output dir before tsc, so local
incremental builds cannot accumulate orphaned dist test artifacts.

Known limitation: Anthropic's direct OpenAI-compat endpoint rejects our
structured-output response_format unless strict:true; route Anthropic models
through OpenRouter today (documented).
reactor-v0.3.1
2026-06-02 23:15:00 -07:00
dan a77c8b8d2a docs(readme): add agent-directed guidance on filing GitHub issues (#108)
Speak directly to agents driving Reactor: when blocked, open a GitHub
issue rather than working around silently. Includes when to file, a
search-first step, and a good-issue checklist (type, context/use case,
expected vs actual, minimal repro, evidence, environment incl. OS/agent/
model/versions, prior attempts) plus an honesty note and new-issue link.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-02 19:33:33 -07:00
dan 288dd83780 feat(reactor-cli): anonymous opt-out CLI-only telemetry (#107)
CLI-only, content-free, opt-out telemetry reusing the live POST /analytics backend (context.library + reactor.* discriminator). Zero SDK changes, zero new deps. 174 tests pass.
2026-06-02 19:02:14 -07:00
irl-dan cbd31df982 docs(readme): re-blend OpenProse + Reactor as one cohesive system
Lead with OpenProse the paradigm (declare outcomes in Markdown contracts +
ProseScript, runs on any Prose-Complete harness), then Reactor as the harness
built to run it (the fast path) — one system, two layers. Adds a 'shape:
OpenProse -> Reactor' connective section and an SDK front-door section
(reactor() facade + typed handle); agent-first setup path; honest-status kept;
React table demoted to an optional collapsible. Versions 0.3.0 / 0.2.0 / 0.2.0.
2026-06-02 14:41:53 -07:00
irl-dan f1f8f0cfa1 fix(ci): build reactor packages before the publish loop
When reactor is already published, publish_pkg returns before its pnpm-pack
builds reactor/dist, so reactor-cli + reactor-devtools fail to resolve
@openprose/reactor (TS2307) on an idempotent re-run. Build all three up front.
reactor-v0.3.0
2026-06-02 14:18:55 -07:00
irl-dan 8280b06db5 fix(release): add repository field to reactor-cli + reactor-devtools
npm --provenance validates package.json repository.url against the GitHub repo
from the OIDC attestation; these two lacked the field (reactor had it), so
publish failed E422 after reactor@0.3.0 already published. Additive metadata only.
2026-06-02 14:13:14 -07:00
dan f12dcda4d8 Release: the OpenProse Reactor harness (engine + CLI + devtools) — 0.3.0 ideal API surface (#106)
Ships @openprose/reactor 0.3.0, @openprose/reactor-cli 0.2.0, @openprose/reactor-devtools 0.2.0: the Reactor harness (compile-once-intelligent then dumb reconciler, content-addressed receipts, cost scales with surprise) with the distilled ideal public API — curated front door, full @openai/agents passthrough, one typed handle, one Substrate, unified observe, branded ids, and additive forward seams for the fixpoint.
2026-06-02 14:06:56 -07:00
Raymond Weitekamp 72077013c2 Add session-to-prose OpenProse example (#85) 2026-05-29 08:42:45 -07:00
dan 0d318ce0ee docs: v0.1 launch surface — article, technical report, tagline qualifier (#103)
* docs/reactor/v0.1: publish article + technical report into prose

Canonical source location for the v0.1 launch documents — moves the
generalist launch article and the technical report out of planning
drafts and into the public prose repo, alongside the spec they're
derived from.

docs/reactor/v0.1/article.md (243 lines) — "When the Conversation Ends,
the Responsibility Doesn't." Clean copy from the planning draft with
the four tenet-alignment edits (subhead audit-floor qualifier; receipt
verb tightening; line-217 freshness fix). Footer link to the technical
report updated from a github.com placeholder to the sibling ./report.

docs/reactor/v0.1/report.md (273 lines) — "Reactor: Cost Scales With
Surprise, Not Time." Clean copy from the planning draft. Date stamped
to 2026-05-22 (v0.1.0 release). §0 TL;DR carries the audit-floor
qualifier matching §7a; §10 already correctly discloses raw-evidence
retention as future work.

docs/reactor/v0.1/README.md — editorial discipline, versioning policy,
how-edits-get-published flow (commit here → bump platform/external/prose
submodule pin → fly deploy from apps/reports), and the publish-gate
checklist carried over from the technical-report authoring plan.

docs/reactor/v0.1/assets/ — placeholder for figures, kept empty.

The Astro renderer is being scaffolded at openprose/platform/apps/
reports/ in parallel; it reads from this directory via the
external/prose submodule.

* docs: qualify cost-thesis tagline + front-door trust artifact

Tagline qualified across README + package READMEs to match spec invariant 5 /
Pattern Rule 5 and technical report §7a: 'surprise — plus a bounded periodic
audit floor — not the arbitrary clock' (the bare one-liner was empirically
falsifiable in the audience-validation pass). Adds a dated v0.1.0 trust-artifact
blockquote to the front door.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-28 16:53:42 -07:00
dan 8564d8a7d2 feat(evals): reactor harness evaluation suite (phase 1b) (#102)
* feat(cli): add evaluation runner core

* feat(cli): add eval suite loading and cost mapping

* feat(cli): add public harness eval adapters

* feat(cli): add eval suite registry and runner helper

* fix(cli): harden eval runner safety gates

* feat(cli): harden eval evidence and isolation

* feat(cli): add eval claim eligibility gates

* Harden reactor eval claim eligibility

* Harden eval claim eligibility gates

* feat(eval): add reactor timeline case contract

* feat(eval): add reactor proof verdict library

* feat(eval): add timeline baseline adapters

* feat(eval): add docker isolation substrate

* feat(eval): add phase 1b reactor-independent tier 1

* feat(eval): add phase 1b cost and canary lanes

* feat(eval): add phase 1b statistical pilot

* feat(eval): reconcile openrouter costs and containerize competitors

* feat(evals): run isolated competitor harnesses locally

* feat(evals): add phase 1b report pilot runner

* feat(evals): add phase 1b confidence intervals

* fix(evals): harden provider host matching against URL prefix spoofing

CodeQL flagged "Incomplete URL substring sanitization" in
providerFromUrl: host.endsWith("anthropic.com") also matches an
attacker-controlled host like "evilanthropic.com". Match the exact
host or a proper subdomain (".anthropic.com") instead, applied to all
three provider domains via a hostMatches helper.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-28 16:17:42 -07:00
irl-dan d65a5892a9 spec: sync canonical spec from index (Tenet 7 + reconciliation)
Establishes prose/spec as the canonical home for the OpenProse spec,
current as of the index working state — Tenet 7 (one bounded run, one
session; the DAG composes) plus the Language / Harness / Pattern / Evals
reconciliation. index/spec becomes a pointer to here.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-28 15:56:28 -07:00
dan 119a125002 docs: publish reactor spec reconciliation (#99) 2026-05-22 19:38:50 -07:00
dan 52724edc11 chore: prepare reactor 0.1.0 release (#98) reactor-v0.1.0 2026-05-22 19:29:03 -07:00
dan a7b5d34920 fix: upgrade npm for reactor trusted publish
Install npm 11.5.1 in the Reactor package publish job before the provenance publish steps so npm Trusted Publishing can use the workflow OIDC token.
reactor-v0.1.0-rc.2
2026-05-22 17:52:38 -07:00
dan ecc230dd73 chore: cut reactor rc2 release
Prepare the Reactor packages for the interim 0.1.0-rc.2 release.

Narrow the package publish workflow to reactor-v* tags, bump Reactor and Cradle package versions, refresh the Cradle package pin for the rc.2 tarball, and update release-candidate evidence helpers and package docs.
2026-05-22 17:38:16 -07:00
dan 854aad4ec5 docs: sharpen reactor rc2 front door
Sharpen the Reactor front door for the rc.2 cut by adding the flat-tokens 46-vs-92 memoization contrast and updating the repo/package READMEs to lead with the surprise-not-clock hook.
2026-05-22 17:31:46 -07:00
dan 4603db9b19 fix: close reactor rc validation gaps
Closes the five approved post-PR-92 Phase 3 fixes: N13 invariant-6 fail-safe judging, N14 write-ahead fulfillment intent, N2b same-unit Cradle cost control, N17 compile nonzero failures, and N1 Reactor-forward front-door docs.

Verification:
- pnpm --filter @openprose/reactor test -> 154/154 green
- pnpm --filter @openprose/reactor-cradle test -> 121/121 green
- pnpm --filter @openprose/prose-cli test -> 284/284 green
- release verifier node --test suite -> 35/35 green
- pnpm build -> pass
- CI on PR #93 -> green
2026-05-21 22:17:36 -07:00
dan 5cfbac8048 fix: harden reactor rc onboarding and edges
Implements the approved Reactor v0.1 rc hardening set: adoption contract docs, standalone flat-tokens install, runnable SDK snippet, quickstart prereqs/build fix, Cradle scenario export, stable synthetic payload hashes, concurrency-safe pressure writes, and dropped-route diagnostics.
2026-05-21 17:16:50 -07:00
dan f9c84b834e Fix CLI workflows for the pnpm-workspace consolidation (#89)
* Fix CLI workflows for the pnpm-workspace consolidation

The Reactor consolidation moved the CLI into the pnpm workspace, but the
npm-to-pnpm workflow conversion was incomplete and broke CI on main.

- Add the missing pnpm/action-setup step before every setup-node that
  sets cache: pnpm (cli-real-harness-smoke, cli-release-check, release).
  Without pnpm on PATH, setup-node fails: "Unable to locate executable
  file: pnpm".
- Rework the npm-package-smoke job to pack with pnpm. npm pack does not
  rewrite the workspace: protocol dependency on @openprose/reactor;
  pnpm pack does. The install smoke now resolves that dependency from a
  locally packed reactor tarball so it does not depend on the registry.

* Build the Reactor dependency before the CLI compiles in CI

After the workspace consolidation the CLI typechecks and builds against
@openprose/reactor, which must be built first.

- Add a "Build workspace" step before every CLI typecheck/build step
  (node-checks, release-tarball-smoke, cli-real-harness-smoke, and the
  release workflow's verify-cli and release-assets jobs).
- Drop the deleted tools/cli/package-lock.json entries from
  .version-bump.json so bump-version.sh --check no longer fails.

* Drop Node 18 from the CLI check matrix

The CLI now requires Node 20+ (engines.node >=20.0.0, enforced by
install.sh). The Node 18 matrix leg fails install.sh's version gate.
2026-05-20 23:03:27 -07:00
irl-dan 5b4b42be8b Add the OpenProse Reactor harness (v0.1.0)
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).
2026-05-20 22:03:48 -07:00
dan 93a98dc22e Merge pull request #87 from openprose/codex/release-main-20260519
Prepare OpenProse 0.14.0 release
v0.14.0
2026-05-19 06:46:27 -07:00
irl-dan ff0618f045 Prepare OpenProse 0.14.0 release 2026-05-19 06:41:58 -07:00
Raymond Weitekamp f524eefec9 Add prose write authoring workflow (#86)
* std: add prose author workflow

* cli: refresh brace-expansion lockfile

* std: tighten prose author planning

* cli: make prose write self-contained

* cli: align harness smoke with bundled bootstrap

* Make prose write interactive in host

---------

Co-authored-by: irl-dan <97565471+irl-dan@users.noreply.github.com>
2026-05-19 00:20:56 -04:00
dan a81cab882a Refresh README brand hero
Update the prose README hero and tagline to match the OpenProse Author Outcomes brand.
2026-05-14 18:42:29 -07:00