Commit Graph

11 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
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