Commit Graph

40 Commits

Author SHA1 Message Date
irl-dan cfd9623fa7 feat: add guided prose compose package 2026-08-27 15:59:31 -04:00
Jose Montes de Oca 2c338823f3 feat: de-brand the run-phase model and release skill 0.16.0 (#167)
With the Reactor harness in its own repository, the language describes
its run-phase model for what it is rather than after one implementation
of it.

- concepts/reactor.md → concepts/reconciler.md; spec/02 keeps only the
  contract any conforming harness must satisfy (02-Harness.md) and
  spec/03 becomes 03-AuthoringPattern.md. "Reactor" in the model sense
  is now "the reconciler" across the Skill, std, and the examples.
- The example corpus is harness-neutral: authored intent plus the
  observable behaviour a harness must preserve. Quick Start examples
  carry the Skill's own flow (prose compile → promote → prose serve)
  and say what serve waits for; expanded-topology examples state what
  src/ ships and what a harness's expansion produces from it.
- The Skill's run-flow docs agree with each other and with the spec:
  serve defines the manifest promotion step, compile names what
  ir-v0.md emits, ir-v0.md is the authoritative IR contract, and the
  spec lists compile/serve/status as in-session verbs that a conforming
  harness may deliver durably outside the session.
- A harness-surface conformance test keeps product tokens out of the
  Skill, spec, std/co, and root docs, outside the README's Harnesses
  section and the Skill changelog.

Skill 0.16.0; runtime_contract stays 2. The Skill changelog records the
migration so prose upgrade can route workflows that used prose react.
2026-08-25 21:21:03 -04:00
Jose Montes de Oca eaf683c2fd feat: extract the Reactor harness into openprose/reactor (#166)
Reactor now lives at github.com/openprose/reactor with its complete
history and a pinned copy of the Skill at skill-v0.15.0; its packages
(@openprose/reactor 0.3.3, reactor-cli 0.2.4, reactor-devtools 0.3.1)
publish from there and are labelled experimental (alpha).

This repository is OpenProse only again: the language spec, the Skill,
std/co, and the examples — installable and testable with no build step.

- Remove packages/reactor*, tools/eval-harness, the Reactor-driven
  example suites and test kits, both Reactor workflows, and the vitest
  aliases into packages/reactor/dist.
- Retire `prose react`, the reactor shell-out exception, and reactor.md
  from the Skill; replace the README's Reactor section with a short
  "Harnesses" pointer.
- Keep the four corpus-wide example guards as tests/open-prose/examples-corpus.
- Add ci-skill.yml: pnpm install --frozen-lockfile && pnpm test:skill —
  the conformance suites now run in CI for the first time.
- Record the `prose react` and reactor-cli changelog entries under the
  tags they actually shipped in.

The run-phase vocabulary (concepts/reactor.md, the spec titles) is
de-branded in a follow-up.
2026-08-24 16:45:51 -04:00
dan 779138a615 release(reactor): reactor 0.3.2, reactor-cli 0.2.3, reactor-devtools 0.3.0 (#163)
Cut the reactor train so the #136 canonicalizer fix (#153) reaches npm, along
with the reactor.yml provider/temperature fixes (#137, #138), the key-material
scrub, the MK-1 height-ordered drain, and the re-skinned replay viewer.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 12:01:24 -04:00
Jose Montes de Oca f7fa6770c4 chore: harden dependency installs and CI execution paths (#161)
Dependency installs and CI jobs both executed code this repo never
reviewed. This closes those paths without changing what anything
resolves to.

pnpm 9 ran every dependency's install lifecycle script and had no
allow-list model, so CI executed install hooks from the whole tree on
every PR. pnpm 10.34.5 blocks them by default and carries the fix for
the fail-open integrity check in CVE-2026-50021. minimumReleaseAge holds
freshly published versions out of resolution for 48 hours, the window in
which a registry compromise is typically caught and yanked.

The two `*` peer ranges in reactor-cli were the only place the workspace
opted out of range discipline: any future major satisfied them, including
a hijacked one. Both now carry carets on the versions already resolved,
and the README install lines are pinned to match, since a 0.x caret does
not cross the minor line.

Third-party actions take the commit SHA their movable tags resolved to,
with a monthly grouped Dependabot entry so those pins do not go stale.
GitHub-maintained actions stay on tags as a stated trust decision rather
than a claim that pinning them would buy nothing.

The benchmark jobs needed the most work, since they run an external
repository's code with five LLM provider keys in scope. Dispatch inputs
now travel through the step environment as quoted variables instead of
being interpolated into shell. The pi version is hardcoded rather than
dispatchable: npm accepts package sources after the `@` — an alias, a
repository, a tarball URL — so an input in that position chose a package
rather than a version. The remaining ref override is documented as an
operator escape hatch whose clone target is fixed.

The publish job holds a credential that can publish under our name and
installed npm at latest before using it. It now pins an exact version
above the floor OIDC trusted publishing requires, and fails at that step
if the pin does not take.

CI also fails on a tampered or unsigned tarball now, checked per
publishable package rather than once at the root where npm would only
see dev tooling. The advisory audit runs alongside it as a signal, not a
gate.

Nothing re-resolves: no version or integrity line in the lockfile moves.
2026-08-10 12:53:42 -04:00
devanonyme42 b6767de1e6 fix: exclude @-prefixed JSON files from backing selection (#153)
Rendered artifacts can contain both an `@atomic.json` status file and a real
structured backing such as `sources.json`. The lexicographic fallback selected
the reserved status file first, reducing declared facets to `null` and
preventing downstream propagation.

Exclude `@`-prefixed JSON basenames from structured-backing candidates while
preserving the `state/` preference and deterministic fallback ordering. Add
regression coverage for root and nested reserved files, reserved-only
artifacts, and the existing `state/` behavior.

Fixes #136.
2026-07-30 12:16:50 -04:00
Jose Montes de Oca 1542e62410 docs: remove readme references readers cannot follow
The CLI and devtools readmes pointed at notes that are not in the
repository. Drop the dangling pointers so every reference on the public
surface resolves.
2026-07-15 06:12:05 -07:00
Raymond Weitekamp 3228b6a35a Add missing OpenProse source versions 2026-06-25 10:05:08 -07:00
Raymond Weitekamp 57c99573f2 Fix company repo checker contract lint 2026-06-25 10:05:08 -07:00
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
Jose Montes de Oca 4099fe7254 fix: omit unset temperature and honor reactor.yml temperature at render (#137)
OpenAI reasoning models (gpt-5.5, the o-series) reject any explicit
temperature unless reasoning_effort is none, but the reactor always sent
one: the config hard-defaulted a missing temperature to 0, the render and
compile harnesses coerced unset to 0, and mergeModelSettings always
attached the key. Deleting the temperature line from reactor.yml changed
nothing, so no configuration made these models compile or render.

Separately, a configured temperature only ever reached compile sessions —
run and serve renders silently used the SDK default, so reactor.yml's
temperature was honored at compile but ignored at render.

Temperature is now optional end to end. An absent reactor.yml line (or an
unset SDK RenderOptions/CompileSessionConfig temperature) sends no
temperature and the provider's default applies; an explicit value,
including 0 for greedy decoding, is sent verbatim. run, serve, and the
multi-reactor host thread the configured temperature into renders exactly
like render_model, so one reactor.yml value governs both compile and
render.

A new optional reasoning_effort key (model.reasoning_effort in reactor.yml,
reasoningEffort in the SDK render/compile options) passes through verbatim
into modelSettings.reasoning.effort, so a reasoning model can keep a custom
temperature by pairing it with reasoning_effort: none. doctor --live no
longer pins temperature 0 in its probe (it 400ed against reasoning render
models), and a provider temperature-rejection 400 now maps to an actionable
hint naming the reactor.yml line to delete.

Behavior change: a project with no temperature line previously sent an
implicit 0; it now sends none and decoding follows the provider default.
Set temperature: 0 to keep greedy decoding — the reactor init scaffold
still writes it, so new projects are unaffected.

Adds focused unit coverage for a path that had none: temperature omitted
when unset and sent exactly when configured (render and compile request
capture), the config parse and run-path threading, and the scaffold pin.
2026-06-13 19:00:18 -04:00
irl-dan 402b126d76 docs(reactor-evals): record validated OpenAI live path; ship the 174x fold
Live render path validated end-to-end on OpenAI gpt-5.4-mini direct (real
metered receipt 36/4/40) after the OpenRouter key hit its limit. Per
decision, the shipped headline is the deterministic, price-independent
174.71x fresh-token fold; the full metered N=1 dollar bill is a bounded
follow-up, not fabricated. Updates live_n1, model_pin, and limitations note.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:43:36 -07:00
irl-dan 0b16c8e7c1 fix(reactor-evals): poison-grep must boundary-match, not substring
The U12 poison guard used text.includes('256:0'), which false-matched the
'sha256:0…' content-hash prefix saturating every receipt ledger — so the
gate exited 1 on the committed runs-sample. Match poison tokens only when
they stand alone, so a reused FIGURE is still caught but a hash digest is not.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:43:36 -07:00
irl-dan 8a40d8ea86 docs(reactor): de-date the signer roadmap line (tracked, not yet scheduled)
The '2026 H2' target was an unratified placeholder. Replace with 'tracked
but not yet scheduled (C3)' at the three disclosure sites so no public
artifact commits to a quarter that isn't on the roadmap.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:43:36 -07:00
irl-dan 96b1226334 fix(reactor): scrub provider key material from surfaced render errors
A live provider 403 ('Key limit exceeded') echoes the key's SHA-256 in an
openrouter.ai/.../keys/<hash> management URL — a key fingerprint that reached
test output / CI logs. Add redactSecrets/redactError (scrubs sk-* key
families, Bearer/Authorization headers, /keys/<hash>, and bare long-hex
fingerprints) and apply at the two render error chokepoints (render-backend
re-throw + smokeRun). 7 redaction unit tests with fully fabricated fixtures;
verified the real BYO live 403 now surfaces as .../keys/***REDACTED***.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 20:43:36 -07:00
irl-dan 4c92d52e39 Merge feat/reactor-evals-surprise-cost: FR-3 SURPRISE-COST benchmark
New packages/reactor-evals/ — preregistered, equal-correctness-gated
offline benchmark minting the first measured 'cost scales with surprise'
result (~174x fewer fresh tokens than an equal-correctness cron at lambda=1%,
decaying to 1.36x at lambda=1.0). Deterministic ledger, 30/30 chain-verified
receipts, poison-grep + decidability guards. Authored against the public
SDK barrel; spec + reactor/src read-only. U10 live dollar-run is operator-
gated (follow-up).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:37:51 -07:00
irl-dan b3e10bee00 Merge feat/mk1-height-drain: MK-1 height-ordered reconciler drain
Replace both arrival-order FIFO drains (drain/drainAsync) with a
compile-time height-ordered, dirty-input-count-gated drain so a staggered
unequal-path diamond renders its join once per settled wave (kills the
double-render glitch reproduced live in masked-relay). reconcile/
reconcileAsync + single-flight guard reused byte-for-byte; public API
unchanged; no spec edit. 11 new red-first regression tests (sync+async).
Closes #132.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:37:51 -07:00
irl-dan 2520af5476 feat(reactor-evals): FR-3 SURPRISE-COST benchmark — offline spine (U1-U9, U11, U12)
Mints the first preregistered, equal-correctness-gated measurement that Reactor's
fresh-token spend scales with surprise, not time. New packages/reactor-evals/
authored against the PUBLIC @openprose/reactor barrel (EVALS.md discipline);
spec/ and packages/reactor/src/** read-only.

Headline (deterministic offline ledger): at lambda=1%, Reactor spends ~174x fewer
fresh tokens than an equal-correctness cron; the fold DECAYS with the change-rate
(~1390x at lambda=0 -> 1.36x at lambda=1.0). Per-tick fresh regresses on the
PREREGISTERED material-change indicator (slope=30, intercept~0, permutation
p~1e-4); the null 'spend tracks wall-clock/event-count' is rejected for Reactor
and not for the cron. Every cost row gated to equal correctness vs the oracle.

Units: U1 deterministic-cost-v1 (preregistered surrogate); U2 lambda world-gen +
material projection + labels + oracle; U3 sweep (real reconciler, per-tick fresh
off the receipts); U4 six contestants (reactor/oracle-cron/content-cache/
no-memo/byte-diff/react-loop); U5 prereg hashed before any run; U6 scorers
(surprise-cost regression + permutation test, propagation #2, amortization #9,
gateCommit #6, per-node chain-verify); U7 equal-correctness gate + regime matrix;
U9 offline invariants #4/#5; U11 report + hero figure + suite CLI; U12 poison-grep
+ decidability guards. 30/30 cells chain-verified; 8/8 unit tests pass; prereg
hash + REPORT.md byte-stable across runs.

Deviations/blocked (honest): .cjs not .ts (toolchain availability; layout matches
the PLAN 1:1); U10 real N=1 LIVE run BLOCKED (no OPENROUTER_API_KEY) and never
fabricated; U8 long-horizon + U9 #8/#12 scaffolded; baseline coincidences flagged
in REPORT.md. Full runs/ (87M) gitignored (byte-deterministic, regenerable);
runs-sample/ commits the headline pair as a frozen chain-verifiable replay.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:19:00 -07:00
irl-dan abd7a69386 fix(reactor): height-ordered, dirty-count-gated reconciler drain (MK-1)
The arrival-order FIFO drains rendered a recombinant (diamond) join with
UNEQUAL path lengths TWICE: once prematurely against a half-propagated input
set (a glitch — the short edge moved, the long path still stale), then again
once the long path settled (a redundant render). "Cost scales with surprise"
(Invariant 5) visibly failed for that topology — reproducible live in the
shipped masked-relay demo.

Replace both `drain` and `drainAsync` with a compile-time height-ordered,
dirty-input-count-gated drain (Minsky / self-adjusting computation): a node
fires exactly once, in ascending height, only after every dirty producer has
SETTLED — so a join renders once, against fully-settled inputs.

- `computeHeights` + producer/subscriber adjacency, derived once per epoch from
  the frozen topology edges ∪ entry_points (NOT topology.nodes, which is [] in
  the IR). Cycle-guard throw kept; static-topology marker left for the fixpoint.
- One shared `startFrontier` core (PASS-1 dirty closure + dirty-count, the
  height-ordered ready pick, settle-based decrement, move-aware prune) drives
  both the sync and async loops; only the render call differs. `reconcile` /
  `reconcileAsync` — including the per-node single-flight/coalesce guard — are
  reused byte-for-byte. Async awaits each fire fully before advancing the
  frontier (closes the await-frontier gap); stays serial (no Change-B parallelism).
- Settle-based (not move-based) decrement so a memo-skipping producer never
  starves a join; move-aware prune so a no-change re-drain renders zero and
  mints only the seed's skip; interior-seed gate so a directly-woken interior
  node still waits on its dirty upstreams.

Public API unchanged; no caller edits (drain returns fire-order, not FIFO —
audited: no consumer asserts arrival order). No spec edit.

Tests (red-first; the primary demonstrably failed on the pre-fix FIFO drain,
E=2 with a glitch, proven in a scratch build): staggered unequal-path diamond
(sync + async) → join renders once against settled inputs; symmetric equal-path
control; no-change re-drain → zero renders / one seed skip; two-seeds-on-one-
chain interior-seed gate; 3-deep prune-no-deadlock; computeHeights height
assertions + forged-cyclic-topology throw. Full @openprose/reactor suite green.

Refs: planning/plans/2026-06-07-mk1-drain-fix/PLAN.md; backlog MK-1;
prototype planning/ideation/minsky-experiments/c2-topo-drain/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 16:04:48 -07:00
irl-dan 2c363b8202 docs+devtools: credibility-seam batch (IDD-vers/reuse/footprint/skew, BR-F7)
Align the public artifacts with what npm and the code actually deliver — the
seams the 2026-06-06 investor-DD fanout independently verified as overstated.
Presentation/disclosure only; no runtime, invariant, or spec edit.

- IDD-vers: fix the two stale "live on npm" version callouts to reactor 0.3.1 /
  CLI 0.2.2 (devtools 0.2.0 unchanged); reactor README "ideal surface" 0.3.0->0.3.1.
- IDD-reuse (+G27): devtools --describe COST ROLLUP now leads with the defensible
  memo-skip count and demotes provider-prompt-cache `reuse=%` to a labeled
  secondary line ("provider-reported; can be 0% on the default model"); test added.
- BR-F7 (+G10): dated cryptographic-signer roadmap line (targeted 2026 H2, tracked
  as C3) at the three null-signer disclosure sites + the tamper-evident-not-proof
  threat-model sentence. Also fixed the broken `@openprose/reactor/sdk` subpath
  cites in the devtools README -> root `@openprose/reactor` (NOT `/internals` as
  the plan said; these symbols are root exports), and the non-public
  `new FileSystemReceiptLedger` -> the public `createFileSystemReceiptLedger`.
- IDD-footprint: rewrote the "Air-gapped?" note + added a quickstart footprint
  line with the measured ~99 MB / ~100 packages (2026-06-06), preserving the
  true SDK-core zero-dep claim.
- IDD-skew: ranged the devtools/CLI `@openprose/reactor` workspace ref
  workspace:* -> workspace:^ (pnpm pack now emits ^0.3.1, verified) so npm
  dedupes one SDK copy. (Republish of devtools 0.2.1 still required to land it on
  npm — separate release action.)

Gate: pnpm --filter @openprose/reactor-devtools test green (96/96).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 15:56:27 -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
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 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 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.
2026-06-03 12:12:45 -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).
2026-06-02 23:15:00 -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 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
dan 52724edc11 chore: prepare reactor 0.1.0 release (#98) 2026-05-22 19:29:03 -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
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
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 2cb079a995 std: add prose contributor program (#75) 2026-05-13 14:26:27 -07:00
dan 012650a201 [codex] Prepare OpenProse 0.12.0 responsibility runtime release (#57)
* Document native runtime skill semantics

* Rename native runtime to responsibility runtime

* Add responsibility runtime compiler skeleton

* Add responsibility compilation IR

* Compile Forme manifests into repository IR

* Serve static repository IR

* Tighten responsibility runtime review gaps

* Introduce OpenProse root model

* Harden OpenProse root resolution

* Add responsibility judge activation

* Add responsibility pressure fulfillment path

* Add repository status inspection

* Make triggers concrete gateway registrations

* Add live responsibility trigger adapters

* Refine responsibility runtime validation

* Harden responsibility runtime freshness

* Tighten responsibility runtime guardrails

* docs: replace skill examples with native repositories

* chore: release v0.12.0

* fix: tighten release review gaps
2026-05-04 09:26:26 -07:00
dan 624e75ad89 Refresh OpenProse skill conventions (#51)
* Refresh OpenProse skill conventions

* Align OpenProse skill with service system conventions

* Fix OpenProse PR review inconsistencies

* Clarify OpenProse state backend loading

* Enforce OpenProse smoke run state gate
2026-05-01 15:06:40 -04:00
irl-dan 2de0b5e7d7 feat(co): add agent-readiness as safe first-run demo program
Narrow intake a founder can run in under a minute. Three prompts, one
WebFetch batch across a fixed set of well-known paths, one screenshot-ready
markdown report written to ~/prose-<company>/agent-readiness.md.

Scores four dimensions (discoverability, parseability, structure,
api-readiness) 0-100 and surfaces exactly three concrete, file-path-level
fixes. No JavaScript execution, no fetches outside the target origin, no
writes outside the per-company workspace.

Built for the "claude \"prose run co/programs/agent-readiness\"" first
experience: all probes are static well-known paths, so it never fails on
a live JS-wall or a missing API.

Paired eval protects the demo: every finding must ground in a Raw Probe
Results row, every top_fix must name an exact file path, and any
JavaScript execution or cross-origin fetch fails the eval.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 15:27:11 -07:00
irl-dan 63c8ce4b23 Migrate std and co into packages/ monorepo layout
Move the standard library (previously `github.com/openprose/std`) and
the company-as-prose library (previously local dir
`/Users/sl/code/openprose/company-as-prose`) into this repository
under `packages/std/` and `packages/co/` respectively.

Motivation: concentrate attention on one repository so stars,
discussions, and issues aggregate. `openprose/std` was a genuinely
useful asset nobody could find because ~50 stars on its own repo
told a much worse story than 1,106 stars on `openprose/prose`
would have. Same logic applies to co.

Layout choice: `packages/{std,co}/` rather than `std/` + `co/` at
the repo root. Root siblings accumulate over time, and a flat
top-level made future libraries (hub, kit, dev, etc.) compete with
spec infrastructure. `packages/` is bounded — new libraries land
there without cluttering root. Matches pnpm/Deno/monorepo tooling
conventions.

Changes:

- New: `packages/std/` (copied from openprose/std, `.git` excluded)
- New: `packages/co/` (copied from company-as-prose, README updated
  for new name and location)
- `packages/std/README.md`: updated shorthand expansion reference
- `packages/co/README.md`: renamed "company-as-prose" to "co" in
  self-references, added std-vs-co split heuristic, updated
  `prose run` examples to use `co/` shorthand
- `skills/open-prose/deps.md`:
  - `std/` shorthand now expands to
    `github.com/openprose/prose/packages/std/`
  - `co/` shorthand added, expands to
    `github.com/openprose/prose/packages/co/`
  - Both shorthands resolve into the same clone of
    `openprose/prose` under `.deps/github.com/openprose/prose/`;
    `packages/std/` and `packages/co/` are sibling subdirectories
  - `prose.lock` format row updated to `host/owner/repo sha`
    (matches the explicit-host resolution that landed in #35)
  - `.deps/` directory structure example redrawn to show the
    `{host}/{owner}/{repo}/packages/{std,co}/...` shape
  - Error message and Interaction tables refreshed accordingly
  - Resolution Algorithm step 1 now documents both shorthands
- `skills/open-prose/forme.md`: Step 2 resolution list updated to
  include co/ shorthand and the host-keyed `.deps/` layout
- `skills/open-prose/help.md`: Q&A "How do dependencies work?"
  rewritten to name both shorthands and the new explicit-host model
- `skills/open-prose/state/filesystem.md`: `.deps/` directory
  tree re-drawn to include the `{host}/` layer with std/co as
  sibling packages inside the clone
- `skills/open-prose/guidance/patterns.md`,
  `skills/open-prose/guidance/antipatterns.md`: examples now use
  the `std/` shorthand or explicit `github.com/...` rather than
  the deprecated bare `openprose/std/` form
- `skills/open-prose/examples/registry-import/index.md`: sample
  service reference switched to `std/evals/inspector`
- `README.md`: Stdlib badge replaced with internal `packages/std/`
  link plus new `packages/co/` link; "Standard Library" section
  rewritten as "Libraries" with both packages described

Out of scope for this PR (deliberately):
- Tooling changes to `prose install` and Forme's `.deps/` writer
  to adopt the `{host}/{owner}/{repo}/` layout in practice — this
  PR is spec-only. Existing tooling continues to work against
  whatever layout it currently implements; the spec now describes
  the target.
- Retiring the `openprose/std` GitHub repo. Delete that repo
  separately after this merges.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 14:14:31 -07:00