Skip to content

feat(evals): add multi-provider and native-agent runners - #64

Merged
ericjuta merged 12 commits into
mainfrom
feat/eval-multi-runner
Sep 9, 2026
Merged

ericjuta merged 12 commits into
mainfrom
feat/eval-multi-runner

Conversation

@ericjuta

@ericjuta ericjuta commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Add multi-provider and native-agent execution adapters behind the existing evaluator. This branch contains 12 commits and changes 28 files relative to main at ff235a40e9063a3cc6d9846ad7e7c1f3f01a76a6.

  • Add an AI SDK OpenRouter runner, an isolated API-key Claude CLI runner, and a pinned OMP 18.1.14 runner through official HarnessAgent/createACP with a local Docker sandbox.
  • Preserve separate Responses, Codex, OpenRouter, Claude and OMP observation targets. Keep the shared suites, grading, replay validation, exact-report-bound attempt capture and manual publication approval.
  • Add runner-specific credential preflight and CLI options. Saved-login reuse remains deferred; Gina MCP authorization is separate from model credentials.
  • Preserve canonical MCP tool names while adapting native wire names, require exact OMP startup inventory and guard evidence, and restrict native actions to staged skill reads and canonical MCP tools.
  • Support provider-qualified model identities through report/export contracts and browser decoding. Update dependencies, artifact admission and runner documentation.

Related: multi-provider evaluation map and implementation tracker. Deferred authentication and comparison-identity decisions remain open; this PR does not close the map.

Known unresolved failure

Track intermittent OMP MCP-error observation loss contains the public-safe retained evidence summary and receipt fingerprints.

One synthetic MCP-error run failed with generation-failed despite native terminal completion and one host MCP call. It failed closed, but did not retain the expected canonical failed tool observation. The bounded investigation already included exception instrumentation, four diagnostic passes and one final unchanged-source pass. The cause remains unknown; later passes are not a fix. No investigation or native scenario was rerun to open this PR.

Retry and isolation limits

OMP retry.enabled: false and retry.modelFallback: false disable agent-level TurnRecovery and configured fallback. OMP 18.1.14 provider clients still have hard-coded HTTP retries: the retained HTTP500 probes observed 11 Anthropic requests and 12 OpenAI/OpenRouter requests. The original one-request assertions remain failed. There is no universal one-request guarantee and no runtime fork in this PR.

The Docker provider is network-configurable; its default owned network is not an internal-only network. The contained synthetic proof explicitly supplied an Internal:true network from container creation and used offline bootstrap caches prepared separately. Do not confuse that proof configuration with the default production network policy. The Gina bearer stays on the host; the provider credential is forwarded into the isolated native runtime, not brokered outside it.

Existing verification

Head: 4fa4c6f2578268c60b60c454a3fc1a495dc0b64a, GitHub signature verified.

  • CI passed on this head.
  • CodeQL passed on this head.
  • Latest local source verification: non-incremental typecheck covering 984 files, changed-runtime lint with zero diagnostics, and 29 focused tests: runner.test.ts 20 and live-cli.test.ts 9.
  • A prior source-bound CLI-help case timed out once; the isolated case and settled focused batch passed without raising its timeout. The original failure remains recorded.
  • Retained native proof: query/path calls keep canonical SQL identity; intent tracing is absent from the final native tool schema; empty input makes zero MCP calls and retains a failed observation; missing guard makes zero provider requests; the final MCP-error smoke retains a canonical failed observation. Query/path baselines also passed, so no attribution regression was causally reproduced.

These are source, CI and synthetic protocol results. They are not measured model quality, production Gina connectivity, or evidence that a model independently discovered the plugin. Private raw captures and host paths are not published here.

Separately approved next milestone

Paid evaluations are not authorized or executed by this PR. Before the planned four cases × three repetitions per selected runner, separately approve the runner/model selection, reasoning and cost limits, and provide the required provider credentials and Gina MCP read authorization privately. Retain failures, aggregate reports and exact-report-bound attempts. Public results still require explicit review of their exact content; neither this PR nor a successful run grants publication approval.

No merge, deployment or release is part of this PR-opening step.

Admit OpenRouter and Claude native targets without conflating requested and displayed models. Reject manifest identity drift, invalid repetition counts, and mismatched attempt provenance on direct replay as well as file loading.
Run an AI SDK model tool loop through a read-only MCP catalogue and parse native Claude plugin evidence under an isolated environment. Preserve unavailable usage, canonical tool names, bounded output and deadlines, and fail closed on unexpected native tools or initialization.

The pinned Claude 2.1.263 loopback probe exercised Skill loading, canonical MCP dispatch, main retry-budget control and streaming-failure behavior. This is offline execution proof, not measured live plugin activation.
Add OpenRouter and Claude commands beside Responses and Codex. Require only each runner's credentials, validate runner-specific options and plugin prerequisites, and keep exact-report-bound attempt capture and publication approval unchanged.
Document provider-specific credentials, isolated native execution, Claude retry exceptions and step-versus-tool-call limits. Distinguish offline verification from measured activation and keep saved-login support and publication approval explicit.
Keep CI from reintroducing the Claude 2.1.263 flag that the native loopback probe showed suppresses Skill despite an explicit tool allowlist. This only strengthens the existing argv regression; runtime behavior is unchanged.
Keep slash-separated model identities through sanitized reports, public exports, and browser publication and index decoding without relaxing other identifiers.
Add the pinned API-key ACP profile in local Docker with guarded skill reads and canonical MCP tools. Preserve native pre-dispatch failures, wait boundedly for MCP registration, and remove owned containers independently of stalled child helpers.
Resolve Hono through the existing compatible range. Override Dockerode's uuid dependency to the patched CommonJS release for this workspace; the override is not a downstream package resolution guarantee.
Use a static private provider and credential environment to keep native discovery from sending keys before tool admission. Preserve backend model identity and explicit reasoning through the selected transport. Verified with 24 real-OMP synthetic scenarios, including zero provider HTTP requests across nine rejected startups.
Keep the exact compiled-file inventory and require the shared omp-harness declaration emitted by the CI build.
Preserve HTTPS URL rejection coverage without embedding userinfo-shaped credentials in public test fixtures.
Classify native ACP tools by wire name and disable intent tracing. Disable TurnRecovery retries and configured fallback while documenting the independent provider-client retries in OMP 18.1.14. Clarify that input validation applies after native argument coercion.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant