Witnora Bench uses two customer-owned processes per task:
The processes cannot be the same command. Neither receives the evaluator predicate. Witnora hashes probe artifacts and sends only the normalized observation to the evaluator.
Choose browser-use, coding, data, or messaging. A profile runs only its
six capability tasks.
export WITNORA_BENCH_AGENT_COMMAND_JSON='["python", "agent_bridge.py"]'
export WITNORA_BENCH_PROBE_COMMAND_JSON='["python", "outcome_probe.py"]'
python -m mcpbench.cli bench run --adapter-profile coding --output-dir .mcpbench/coding
The runner writes a public task to WITNORA_BENCH_TASK_PATH. The agent bridge
must write WITNORA_BENCH_AGENT_RESULT_PATH:
{
"observationId": "obs.coding.patch-single-file",
"apparentSuccess": true,
"actions": ["read:app.py", "write:app.py", "test:pytest"],
"usage": {"input_tokens": 1200, "output_tokens": 300, "cost_usd": 0.02, "latency_ms": 9100}
}
The independent probe must write WITNORA_BENCH_PROBE_RESULT_PATH:
{
"observedState": {"files": {"app.py": "patched"}, "tests": "passed"},
"evidence": [
{"kind": "diff", "path": "diff.patch"},
{"kind": "test_report", "path": "junit.xml"},
{"kind": "trace", "path": "trace.jsonl"}
]
}
Evidence paths are relative to WITNORA_BENCH_ARTIFACT_ROOT; path escapes and
missing files are rejected. The probe should use a read-only credential where
possible and must not trust the agent’s final message.
The direct browser-use bridge is available as the agent command:
export WITNORA_BENCH_AGENT_COMMAND_JSON='["python", "-m", "mcpbench.bench.browser_use_bridge"]'
export WITNORA_BENCH_PROBE_COMMAND_JSON='["python", "probe_browser_state.py"]'
export WITNORA_BENCH_FIXTURE_URL_MAP_JSON='{"fixture://refund/clean":"http://127.0.0.1:4173/refund/clean"}'
export WITNORA_BENCH_BROWSER_USE_MODEL='gpt-4.1-mini'
python -m mcpbench.cli bench run --adapter-profile browser-use --model-id gpt-4.1-mini
The URL map is required for synthetic fixture:// resources. Optional
WITNORA_BENCH_CDP_URL connects to a separately managed browser. The bridge
limits allowed domains to the mapped host.
Use the generic CLI bridge when the agent accepts task context through an environment variable or wrapper:
export WITNORA_BENCH_SUBJECT_COMMAND_JSON='["my-coding-agent", "run"]'
export WITNORA_BENCH_AGENT_COMMAND_JSON='["python", "-m", "mcpbench.bench.command_agent_bridge"]'
export WITNORA_BENCH_PROBE_COMMAND_JSON='["python", "probe_git_and_tests.py"]'
python -m mcpbench.cli bench run --adapter-profile coding --harness-id my-coding-agent
The subject receives WITNORA_BENCH_INSTRUCTION and
WITNORA_BENCH_PUBLIC_TASK_JSON. A wrapper may write actions.jsonl and
usage.json next to the agent result. The probe should inspect the isolated
checkout, git diff/status, and test report after the agent exits.
Run the agent against an ephemeral database with a scoped role. The probe uses a separate read-only connection to compare row counts, authorized IDs, schema, and exported redaction. Query logs belong in evidence; database credentials do not.
python -m mcpbench.cli bench run --adapter-profile data --harness-id my-data-agent
Run against a local mail sink or vendor sandbox. The agent credential may draft or send only within the task tenant. The probe independently reads message status, recipient, approval record, and delivery receipt.
python -m mcpbench.cli bench run --adapter-profile messaging --harness-id my-messaging-agent
export WITNORA_BENCH_EVALUATOR_API_KEY='set-in-secret-store'
export WITNORA_BASE_URL='https://witnora.com'
export WITNORA_PROJECT_ID='project-id'
export WITNORA_API_KEY='project-scoped-key'
python -m mcpbench.cli bench run \
--adapter-profile coding \
--evaluator-url https://evaluator.example.test \
--evaluator-public-key evaluator-public.pem \
--push
The client verifies every Ed25519 receipt before retaining the result. Hosted recomputes aggregate metrics from task results, checks receipt bindings, and rejects idempotency conflicts. Hosted records that signed receipts are attached; signature verification remains the runner’s responsibility until a trusted evaluator key registry is configured server-side.