Skip to content

Commit e2b651d

Browse files
committed
feat(evals): run isolated OMP trials through HarnessAgent
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.
1 parent 4c055ae commit e2b651d

14 files changed

Lines changed: 4780 additions & 301 deletions

File tree

README.md

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,18 @@ tarball installs and runtime checks. Nothing here publishes, releases, deploys,
6161
submits, or calls production during pull-request CI.
6262

6363
Live eval runners are `bun run eval:responses`, `eval:codex`, `eval:openrouter`,
64-
and `eval:claude`. Hermetic replay is `eval:replay`. Every live runner requires
65-
`ASK_GINA_ACCESS_TOKEN`. Responses and Codex also need `OPENAI_API_KEY`; Codex
66-
adds `CODEX_EVAL_EXECUTABLE` and `CODEX_EVAL_EXECUTABLE_SHA256`; OpenRouter needs
67-
`OPENROUTER_API_KEY`; Claude needs `ANTHROPIC_API_KEY` and
68-
`CLAUDE_EVAL_EXECUTABLE`. Optional `--max-steps` applies only to OpenRouter and
69-
`--max-turns` only to Claude. Both default to 8 and accept 1 to 32. Native Codex
70-
and Claude paths use explicit API keys, not a saved personal login. OpenRouter uses
71-
local AI SDK MCP; Responses uses OpenAI-hosted MCP. Neither proves native plugin
72-
activation. Codex and Claude adapters distinguish native skill events from task
73-
conformance. Claude's live plugin activation remains unverified; offline fixtures
74-
are not measured native-agent evidence. Flags, capture, and publication rules are in
75-
`packages/evals/README.md`.
64+
`eval:claude`, and `eval:omp`. Hermetic replay is `eval:replay`. Every live runner
65+
requires `ASK_GINA_ACCESS_TOKEN`. Responses and Codex also need `OPENAI_API_KEY`;
66+
Codex adds `CODEX_EVAL_EXECUTABLE` and `CODEX_EVAL_EXECUTABLE_SHA256`; OpenRouter
67+
needs `OPENROUTER_API_KEY`; Claude needs `ANTHROPIC_API_KEY` and
68+
`CLAUDE_EVAL_EXECUTABLE`; OMP needs `OMP_EVAL_API_KEY`,
69+
`OMP_EVAL_EXECUTABLE`, `OMP_EVAL_EXECUTABLE_SHA256`, a local Docker engine, and
70+
`--provider openai|anthropic|openrouter`. Optional `--max-steps` applies only to
71+
OpenRouter and `--max-turns` only to Claude. Both default to 8 and accept 1 to 32.
72+
OMP has no step or turn flag. Native Codex, Claude, and OMP paths use explicit API
73+
keys, not a saved personal login. OpenRouter uses local AI SDK MCP; Responses uses
74+
OpenAI-hosted MCP. Neither proves native plugin activation. Codex and Claude
75+
adapters distinguish native skill events from task conformance. Claude's live
76+
plugin activation remains unverified; offline fixtures and OMP Docker/runtime
77+
proof are not measured native-agent evidence. Flags, capture, and publication
78+
rules are in `packages/evals/README.md`.

bun.lock

Lines changed: 136 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"eval:codex": "bun run build && bun packages/evals/dist/bin/live.js --runner codex",
3636
"eval:openrouter": "bun run build && bun packages/evals/dist/bin/live.js --runner openrouter",
3737
"eval:claude": "bun run build && bun packages/evals/dist/bin/live.js --runner claude",
38+
"eval:omp": "bun run build && bun packages/evals/dist/bin/live.js --runner omp",
3839
"check:marketplace:codex": "bun run build && bun packages/evals/dist/bin/check-codex-marketplace.js",
3940
"effect-tsgo:patch": "bun scripts/effect-tsgo-patch-if-needed.ts",
4041
"prepare": "bun run effect-tsgo:patch",

packages/evals/README.md

Lines changed: 75 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
# @askgina/evals
22

33
One schema and rubric drive hermetic replay, OpenAI Responses API trials,
4-
OpenRouter trials, Codex CLI trials, and Claude CLI trials. Live runners use the
5-
same suite cases, reasoning mode, case selection, repetition count, and
6-
sanitized aggregate shape. Model IDs and turn limits remain backend-specific.
4+
OpenRouter trials, Codex CLI trials, Claude CLI trials, and OMP HarnessAgent
5+
trials. Live runners use the same suite cases, reasoning mode, case selection,
6+
repetition count, and sanitized aggregate shape. Model IDs and turn limits remain
7+
backend-specific.
78

89
`@askgina/evals` is a Bun 1.4.x-only compiled `dist` package. The root
9-
`eval:replay`, `eval:responses`, `eval:codex`, `eval:openrouter`, and
10-
`eval:claude` commands build the package graph, then execute
10+
`eval:replay`, `eval:responses`, `eval:codex`, `eval:openrouter`,
11+
`eval:claude`, and `eval:omp` commands build the package graph, then execute
1112
`packages/evals/dist/bin/*.js`; suite and observation YAML remain repository
1213
inputs.
1314
Artifact verification clean-installs the built tarball and exercises its compiled
@@ -78,23 +79,32 @@ The default live benchmark suite is `ask-gina-routing-smoke.yaml`.
7879
Every live runner requires `ASK_GINA_ACCESS_TOKEN`. The provider and native CLI
7980
credentials differ:
8081

81-
| Runner | Additional environment |
82-
| ------------- | ---------------------------------------------------------------------------------------------------------------------- |
83-
| Responses API | `OPENAI_API_KEY` |
84-
| OpenRouter | `OPENROUTER_API_KEY` |
85-
| Codex CLI | `OPENAI_API_KEY`, absolute `CODEX_EVAL_EXECUTABLE`, and its lowercase SHA-256 digest in `CODEX_EVAL_EXECUTABLE_SHA256` |
86-
| Claude CLI | `ANTHROPIC_API_KEY` and absolute `CLAUDE_EVAL_EXECUTABLE` |
82+
| Runner | Additional environment |
83+
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
84+
| Responses API | `OPENAI_API_KEY` |
85+
| OpenRouter | `OPENROUTER_API_KEY` |
86+
| Codex CLI | `OPENAI_API_KEY`, absolute `CODEX_EVAL_EXECUTABLE`, and its lowercase SHA-256 digest in `CODEX_EVAL_EXECUTABLE_SHA256` |
87+
| Claude CLI | `ANTHROPIC_API_KEY` and absolute `CLAUDE_EVAL_EXECUTABLE` |
88+
| OMP harness | `OMP_EVAL_API_KEY`, absolute `OMP_EVAL_EXECUTABLE`, its lowercase SHA-256 digest in `OMP_EVAL_EXECUTABLE_SHA256`, and a local Docker engine |
8789

88-
The supported native Codex and Claude paths use explicit API keys in isolated
89-
evaluation homes. They do not reuse a saved personal login. Saved-login reuse,
90-
refresh ownership, and personal-home integration remain deferred.
90+
The supported native Codex, Claude, and OMP paths use explicit API keys in
91+
isolated evaluation homes. They do not reuse a saved personal login. Saved-login
92+
reuse, refresh ownership, and personal-home integration remain deferred. OMP does
93+
not read `~/.omp` or inherit `OPENAI_API_KEY` / `ANTHROPIC_API_KEY` /
94+
`OPENROUTER_API_KEY`.
9195

9296
Responses and Codex accept model IDs understood by their OpenAI backends, such as
9397
`gpt-5.1`. OpenRouter uses its `provider/model` namespace, such as
9498
`openai/gpt-5.1`. Claude uses a Claude CLI model ID or alias without the
95-
`anthropic/` prefix, such as `claude-sonnet-4-5-20250929`. These examples show the
96-
required ID shapes. They do not declare a benchmark configuration or claim that a
97-
live run was performed.
99+
`anthropic/` prefix, such as `claude-sonnet-4-5-20250929`. OMP requires `--provider`
100+
to select `openai`, `anthropic`, or `openrouter`; `--model` uses that provider's
101+
backend ID. For example, `--provider openai --model gpt-5.1` records
102+
`openai/gpt-5.1`, while `--provider openrouter --model openai/gpt-5.1` records
103+
`openrouter/openai/gpt-5.1`. The report, attempt input, and observation keep that
104+
same identity. There is no separate displayed model. These examples show the
105+
required ID shapes.
106+
They do not declare a benchmark configuration or claim that a live run was
107+
performed.
98108

99109
```sh
100110
bun run eval:responses -- \
@@ -138,12 +148,26 @@ bun run eval:claude -- \
138148
--account-class eval \
139149
--timeout-ms 120000 \
140150
--max-turns 8
151+
152+
bun run eval:omp -- \
153+
--suite packages/evals/src/fixtures/ask-gina-routing-smoke.yaml \
154+
--run-id local-omp-example \
155+
--candidate main \
156+
--provider openai \
157+
--model gpt-5.1 \
158+
--reasoning medium \
159+
--repetitions 3 \
160+
--account-class eval \
161+
--timeout-ms 120000
141162
```
142163

143164
Repeat `--case <case-id>` to run a strict subset. `--timeout-ms` is required for
144165
the per-trial budget. `--max-steps` is optional only for OpenRouter, and
145166
`--max-turns` is optional only for Claude. Both default to `8` and accept `1` to
146-
`32`. The other runners reject those flags. Secrets have no command-line flags.
167+
`32`. `--provider` is required only for OMP. The other runners reject those
168+
flags. OMP rejects `--max-steps` and `--max-turns`. ACP does not expose a
169+
portable native model-step boundary, so OMP does not claim an equal step budget
170+
with OpenRouter or Claude. Secrets have no command-line flags.
147171
A missing required flag or backend credential fails closed. The CLI does not
148172
switch runners or auth methods. Add
149173
`--attempts-output /tmp/eval-private/attempts.json` to any command when retained,
@@ -153,10 +177,12 @@ section still apply.
153177
OpenRouter executes Gina tools through the local AI SDK MCP client. Responses
154178
uses OpenAI-hosted MCP. Neither proves native plugin activation, and these two
155179
execution paths retain separate runner identities. Codex and Claude load the
156-
repository plugin through their native CLIs. Task conformance and observed
157-
plugin activation are scored separately. The Claude adapter has offline
158-
verification only. Synthetic events and loopback model fixtures do not establish
159-
measured native-plugin activation; Claude's live activation remains unverified.
180+
repository plugin through their native CLIs. OMP talks to `omp acp` through
181+
HarnessAgent in Docker and keeps the `omp_harness` target distinct. Task
182+
conformance and observed plugin activation are scored separately. The Claude
183+
adapter has offline verification only. Synthetic events, loopback model
184+
fixtures, and OMP Docker/runtime proof do not establish measured native-plugin
185+
activation; Claude's live activation remains unverified.
160186

161187
Claude requires a CLI supporting `--restricted` and `--permission-prompts none`;
162188
the flag set was checked against version `2.1.263`. Bare mode is not used because
@@ -182,6 +208,33 @@ only the observed Gina MCP tools. Trials also use no approvals, ignored
182208
user/project rules, bounded output, and a minimal child environment. Unsupported
183209
platforms fail closed.
184210

211+
OMP requires the tested `18.1.14` executable and a local Docker engine at
212+
`/var/run/docker.sock`. The CLI verifies its SHA-256 and snapshots it once, then
213+
starts a fresh Docker session per trial. The default Node image is digest-pinned.
214+
Containers run as a non-root user, with a read-only root filesystem and runtime
215+
mount, writable temporary filesystems, and no host Docker socket or personal OMP
216+
configuration mounted inside. Bootstrap installs the pinned ACP bridge dependencies.
217+
218+
The selected provider API key is forwarded into the isolated child environment.
219+
This local Docker provider does not broker credentials outside the container.
220+
The Gina bearer stays on the host, where canonical MCP reads execute. The native
221+
guard permits only the canonical MCP inventory and exact staged skill reads;
222+
URL reads, other files, shell tools, and unregistered tool attempts fail the trial.
223+
The ACP launcher requires loaded guard evidence before forwarding the first prompt.
224+
The guard waits up to five seconds for native MCP registration, within the trial
225+
deadline, then requires the exact tool inventory before any model request. This
226+
startup wait does not retry model or MCP calls. OMP itself can reissue failed
227+
provider requests; the absolute trial deadline still applies. Host-side JSON
228+
Schema validation rejects invalid arguments before MCP execution.
229+
230+
Skill activation requires a successful native read, not loaded metadata or an ACP
231+
intent title. Token usage comes only from native guard evidence and remains absent
232+
when unavailable. A successful result also requires completed native generation
233+
and removal of the owned Docker resources. Failed or cancelled trials allow up to
234+
eight seconds for cleanup without replacing the original failure. Synthetic model/MCP fixtures exercise
235+
the real OMP process and protocol; they do not prove real model behavior, production
236+
Gina connectivity, or measured native-plugin activation.
237+
185238
Each live run writes exactly one mode-`0600` aggregate below the ignored
186239
`.plugin-eval-runs/` directory. Raw prompts, final answers, tool arguments,
187240
provider payloads, HTTP bodies, child output, and credential material are never

0 commit comments

Comments
 (0)