mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #1971] feat(evaluation): run agent evaluation against Claude Code and Gemini CLI #4943
Open
opened 2026-10-31 00:57:13 +00:00 by bsakaguchi
·
0 comments
No Branch/Tag specified
main
codex/procedure-reference-stacked
release-please--branches--main--components--rea-agents
release-please--branches--main--components--rea-agents--release-notes
codex/kuna-independent-retry
codex/byte-search-overlay-coverage
codex/open-failure-target-receipt
codex/kuna-xref-evidence
codex/ghidra-ambiguous-procedure-recovery
codex/function-source-bundle
codex/trace-function-integration-prototype
codex/snapshot-source-closure
codex/recorded-evidence-array-pages
codex/evidence-recovery-redesign
codex/trace-feature-address-scope
codex/call-discovery-scope
codex/ghidra-literal-candidate-evidence
codex/decompile-directory-independent-retry
codex/retry-provenance-base
codex/value-flow-capability-experiment
codex/ghidra-containing-instruction
cursor/readme-discord-button-ef9f
dependabot/github_actions/actions/setup-node-7.1.0
dependabot/github_actions/actions/upload-artifact-7.0.2
dependabot/npm_and_yarn/npm-minor-and-patch-d8d97ce6df
codex/kuna-1989
fix/8559-native-ui-fixture-ownership
fix/8555-go-verifier-mcp-ownership
codex/provider-capability-recovery
fix/8642-rizin-target-stdin
codex/ghidra-memory-effect-scope
codex/ghidra-annotation-entry-selector
codex/ghidra-readonly-recovery
codex/ghidra-regex-verifier-recovery
codex/evidence-discovery-view-guidance
fix/8545-bulk-append-overflow
fix/8428-navigation-refusal-alternatives
codex/address-context-recovery
codex/matching-member-limitations
codex/unknown-scope-contract
codex/evidence-view-guidance
feat/8373-native-trace-views
codex/ghidra-snapshot-verifier-binding
codex/elf-export-visibility
codex/evidence-view-recovery
codex/native-reference-cli-help
codex/provider-candidate-observation-scope
codex/kuna-session-verification
codex/ghidra-switch-lifetime-guidance
codex/pseudocode-paging-discovery
codex/clarify-evidence-view-support
codex/kuna-xrefs-selector-recovery
codex/context-capacity-recovery
codex/evidence-closure-large-links
codex/same-function-evidence-identity
codex/ghidra-verifier-inspected-jdk
codex/audit-guided-workflows
codex/crash-prompt-retained-dossiers
codex/analysis-view-error-recovery
codex/kuna-verifier-target-selection
codex/ghidra-selected-project-call-coverage
codex/docs-native-analysis-scope
codex/ghidra-java-socket-boundary
codex/ghidra-retained-snapshot-verifier
codex/ghidra-search-inventory-facts
fix/8284-zero-argument-parameter-bindings
fix/8198-ui-action-handler-offset
fix/8257-elf-entry-label-identity
fix/8304-deferred-output-schema-projection
fix/8277-call-path-computed-target-uncertainty
fix/pr-8089-conflicts
fix/ci-static-duplicate-export
dependabot/npm_and_yarn/lint-staged-17.6.0
dependabot/github_actions/actions/download-artifact-8.0.2
dependabot/npm_and_yarn/write-file-atomic-8.0.0
dependabot/npm_and_yarn/canonicalize-5.1.0
dependabot/github_actions/actions/cache/restore-6.1.0
dependabot/npm_and_yarn/toon-format/toon-4.4.0
dependabot/github_actions/actions/deploy-pages-5.0.1
codex/review-fixes-pr-2403
codex/review-fixes-pr-2400
codex/process-terminal-width
codex/test-brittleness-cleanup
verify/7167-browser-connect-macos
fix/7167-browser-connect
feat/native-matching-allowance-setting
feat/browser-scenario-dry-run
test/managed-caller-parameters-20261024
codex/parser-fortythird-boundaries
fix/6926-pinvoke-platform-decorations-20261023
fix/6889-har-body-encoding-20261023
fix/6888-sqlite-schema-budget-20261023
fix/dependency-security-gates-6708
cursor/evidence-overwrite-rebase-b4ac
feat/4057-verify-native-exports
fix/windows-acl-observer-overhead-20261022
cursor/erlang-beam-restack-4476
cursor/pe-certificate-review-bf32
fix/6116-javascript-application-fs-errors
fix/6061-unmapped-runtime-script-unknown
feat/browser-scenario-summary
fix/pe-certificates
codex/verify-3407
cursor/rebase-5699
cursor/rebase-5352
cursor/rebase-5600
cursor/fix-cli-schema-omission-10a8
codex/audit-hopper-shutdown-reasons-20261021
fix/demangle-swift-omitted-record
fix/nib-boolean-value-types
cursor/cancellation-partial-observation-a5ac
fix/ib-object-limit-reasons
fix/electron-fuse-limit-advice
fix/kuna-doctor-dangling-cache
fix/fixed-budget-refusal-advice
fix/js-ipc-listener-dedup
fix/js-return-member-provenance
fix/dmg-integrity-retry-advice
fix/ida-doctor-readiness
fix/kuna-version-probe-output-drain
fix/legacy-swift-runtime-name-matching
fix/dylib-lazy-load-commands
fix/browser-scenario-startup-cancel
fix/swift-nested-punycode-classification
fix/compare-unselected-scopes
fix/objc-method-budget-coverage
fix/dmg-mounted-root-observations
audit/ci-tests-20261019-round2
release/6.7.0
fix/wabt-cleanup-retry-resolution
fix/electron-fuse-elf-pe-architecture
fix/native-plist-descriptor-ownership
fix/kuna-caller-cleanup-ownership
experiment/atomic-codemode-20261016
review/first-contributor-3776
fix/call-resolution-full-read-cycles
fix/member-mutation-selection-repeat
experiment/atomic-re-tools-20261015
perf/member-mutation-lazy-origins
perf/static-network-mutation-index
fix/hopper-startup-lifecycle
audit/3050-windows-proof-20261015
feat/windows-window-capture-2183
audit/3049-windows-proof-20261015
audit/3735-macos-fixtures-20261015
fix/batch-decompile-null-pseudocode
fix/kuna-inventory-honors-jobs
experiment/browser-codemode-tool-design-20261015
fix/hopper-clean-runtime-argv
codex/review-2049-27f1b367
review-fixes/pr-2787-routing
fix/3360-scoped-this-emitters
fix/3367-replaced-global-effects
fix/3838-compact-any-value-items
test/hopper-download-probe-20261015
codex/windows-runtime-creation-red-green-20261015
codex/windows-readonly-root-red-green-20261015
codex/windows-root-share-red-green-20261015
codex/exp-1685-win-mcp-startup
codex/bug-sweep-20261015
investigate/2190-windows-package-phases
investigate/3543-macos-cli-deadline
perf/3281-reverse-tools-feedback-quality
fix/3406-hopper-doctor-fixture
fix/3341-wrapper-require-test-context
fix/3301-owned-uninstall-fixtures
fix/3164-compiler-input-ownership
fix/pcap-cleanup-stdout-newline-20261014
perf/interface-builder-summary
codex/review-fixes-pr-1977
fix/ghidra-effective-jvm-platform
fix/docs-turkish-rust-link-20261013
fix/main-maintenance-ci-20261010
fix/recover-binary-session-process-effects
codex/review-fixes-pr-2457
codex/ci-required-cancellation-gate
fix/main-format-baseline-20261013
fix/setup-preserve-entry-fields
cursor/restore-main-checks-1ffc
fix/ghidra-bridge-hashmap-import
codex/shared-ci-jadx-json-default-20261013
codex/shared-ci-ghidra-test-groups-20261013
codex/shared-ci-java-fixture-format-20261013
codex/fix-intrinsic-invocation-boundaries
test/release-preflight-reusable-jobs
test/js-parameter-provenance-expectation
fix/linux-hopper-verification-current
test/2419-ghidra-elf-probe-size
followup/pr-1544-native-ida
codex/fold-pr-2230-contribution
docs/readme-responsible-use
fix/issue-2064
fix/issue-2050
fix/issue-2053
fix/issue-1968
fix/issue-1945
experiment/codemode-bridge-20261011
fix/tool-effects-negative-wording-1904-20261012
fix/1842-electron-interop-provenance
feat/recover-javascript-multi-input
refactor/website-i18n-prep
fix/nativeaot-pe-virtual-extent
fix/browser-verifier-ci-hang
fix/pe-resources-input-selection
docs/beginner-friendly-guides
docs/beginner-setup-guide
fix/javascript-analysis-worker-1563
fix/1649-ghidra-duplicate-names
fix/javascript-export-keys-integration-1369
test/maintenance-boundary-contracts-20261011
review/javascript-export-keys-1369
review/process-live-progress-1483
test/javascript-1495-growth-ratio
fix/ci-escape-timing
docs/normalized-terminal-geometry-1450
release/6.3.0
archive/release-6.3.0-pr1381
release/6.2.0
fix/electron-preload-dynamic-override
fix/javascript-self-referential-bundler-edges
release/6.1.0
cursor/grok-client-cherry-pick-0b56
feat/signature-posture
feat/dyld-shared-cache
feat/artifact-integrity-policy
feat/pkg-inventory
release/6.0.0
chore/sync-release-5.0.0
release/5.0.0
cursor/cloud-agent-node-787e
fix/javascript-xhr-open-endpoints
review/pr-711-realpath-fallback-wording
cleanup/replay-confinement
codex/test-suite-performance
codex/issue-foundations
codex/address-open-issues-2026-07-20
agent/javascript-vite-rollup-esbuild-adapters
agent/process-cleanup
agent/triage-integration
agent/unknown-commands-registry
feat/mcp-identity-metadata
morlvps/issue_cleanup
codex/installer-redesign
morl/roadmap-investigation-core
morl/roadmap-investigation-docs
release-please--branches--main--components--rea
rea-agents-6.8.0
rea-agents-6.7.0
rea-agents-6.6.0
experiment/atomic-codemode-wait-runtime-20261016
rea-agents-6.5.0
rea-agents-6.4.0
rea-agents-6.3.0
rea-agents-6.2.0
rea-agents-6.1.0
rea-agents-6.0.0
rea-agents-5.0.0
rea-agents-4.1.0
rea-agents-4.0.1
rea-agents-4.0.0
rea-agents-3.2.1
rea-agents-3.2.0
rea-agents-3.1.0
rea-agents-3.0.0
rea-agents-2.7.0
rea-agents-2.6.0
rea-agents-2.5.1
rea-agents-2.5.0
rea-agents-2.4.0
rea-agents-2.3.0
rea-agents-2.2.0
rea-agents-2.1.0
rea-agents-2.0.0
rea-agents-1.7.0
rea-agents-1.6.0
rea-agents-1.5.0
rea-agents-1.4.0
rea-agents-1.3.0
rea-agents-1.2.0
rea-agents-1.1.0
rea-agents-1.0.0
rea-agents-0.5.0
rea-agents-0.4.0
rea-agents-0.3.0
rea-0.2.1
rea-0.2.0
Labels
Clear labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
Mirrored from GitHub Pull Request
question
roadmap
triage
No labels
area: bridge
area: bridge
area: build
area: build
area: build
area: cli
area: domain
area: evidence
area: mcp
area: native
area: providers
area: runtime
area: server
area: setup
area: tests
bug
design
documentation
enhancement
enhancement
enhancement
experiment
help wanted
i18n
invalid
P0: critical
P1: high
P2: medium
P2: medium
P2: medium
P3: low
performance
provider-request
pull-request
question
roadmap
triage
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
morluto/rea#4943
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
📋 Pull Request Information
Original PR: https://github.com/morluto/rea/pull/1971
Author: @Nick-800
Created: 10/11/2026
Status: 🔄 Open
Base:
main← Head:feat/agent-eval-clients📝 Commits (10+)
95cbdeffeat(evaluation): run agent evaluation against Claude Code and Gemini CLI7e5869dfix(evaluation): own agent client processes and credentials05cdc28fix(evaluation): preserve client authority and isolated permissionsa84907bfix(evaluation): retain verified process ownership and selected authenticationb79e445fix(eval): admit only unambiguous terminal Codex routinga3d2ea9fix(evaluation): preserve client identity and process ownershipa1576a3Merge commit 'ebaaa79ca0' into HEADbab7827fix(evaluation): preserve client command and evidence identity1ce664cMerge branch 'main' into feat/agent-eval-clientsb17b9b6Merge branch 'main' into feat/agent-eval-clients📊 Changes
20 files changed (+3174 additions, -470 deletions)
View changed files
📝
docs/client-verification.md(+68 -5)📝
docs/testing.md(+5 -3)➕
scripts/lib/agent-eval-clients.d.mts(+53 -0)➕
scripts/lib/agent-eval-clients.mjs(+394 -0)📝
scripts/lib/agent-evaluation-commands.mjs(+16 -32)📝
scripts/verify-agent-experience.mjs(+85 -74)📝
tests/boundary/mcp/agentKnownAnswerMcp.test.ts(+12 -1)📝
tests/boundary/process/agentEvaluationCleanup.test.ts(+1 -1)📝
tests/boundary/process/agentEvaluationCommands.test.ts(+10 -9)📝
tests/evaluation/model-evals/AgentEval.ts(+55 -128)📝
tests/evaluation/model-evals/AgentEvaluationReport.ts(+3 -0)📝
tests/evaluation/model-evals/AgentEvaluationScenarios.ts(+29 -5)➕
tests/evaluation/model-evals/AgentTranscript.ts(+786 -0)📝
tests/evaluation/model-evals/KnownAnswerEvaluation.ts(+10 -209)📝
tests/evaluation/model-evals/agentEval.test.ts(+15 -1)📝
tests/evaluation/model-evals/agentEvaluationReport.test.ts(+15 -0)📝
tests/evaluation/model-evals/agentEvaluationScenarios.test.ts(+60 -1)➕
tests/evaluation/model-evals/agentTranscript.test.ts(+1098 -0)📝
tests/evaluation/model-evals/knownAnswerEvaluation.test.ts(+22 -1)➕
tests/process-global/agentEvalClients.test.ts(+437 -0)📄 Description
Summary
npm run verify:agentcan now run the same scenarios, fixture claims and gates through Claude Code or Gemini CLI as well as Codex. Choose the client withREA_AGENT_EVAL_CLIENT=codex|claude-code|gemini-cli. Codex is still the default.Fixes #1932
Problem and expected behavior
verify:agentwas the only lane that measures REA's agent experience against a real model, and it only drove Codex. Theverify:claude-client/verify:gemini-clientlanes use a local model fixture, so they check integration, not investigation quality. Parsing was Codex-shaped in two places:evaluateCodexEventsand the known-answer grader'scompletedCall/deliveredCodexEvidence. That meant a regression that only shows up with another client went unmeasured.Change and scope
tests/evaluation/model-evals/AgentTranscript.ts, beside the other development-owned evaluation modules main moved there; the verifier loads it from source like the fixtures and scenarios). It owns result parsing for every client: failure, error-code certainty (no code is chosen among duplicate JSON members) and the successful content used for Evidence authentication are derived once per call. Each client's events are parsed once into MCP calls, retained results, the final answer and token usage.parseCodexEvents,parseClaudeCodeEventsandparseGeminiCliEventseach follow their client's own grammar:item.completed/mcp_tool_call.tool_use/tool_result, plus the raw MCPtool_use_resultthat keepsstructuredContenteven when model-visible content was spilled to a file. The raw detail is attached only when one result block makes it unambiguous; batched parallel results each stand on their own block content.tool_use/tool_result, where only joined MCP text is kept.evaluateAgentTranscript(tests/evaluation/model-evals/AgentEval.ts, replacingCodexAgentEval.ts) andevaluateKnownAnswersread the shared record;KnownAnswerEvaluationauthenticates Evidence from it instead of parsing Codex items itself. The Codex-only interpretation is removed; main's grader tests keep their event shapes through a test-localevaluateCodexEventswrapper.item.completedwithoutresult/output(or with a non-object one), and any result whosestructuredContentandstructured_contentcontradict each other, keeps its routing facts but is not a completed workflow step, so two such records cannot satisfy the nativeopen_binary/close_binarysequence.clientFailures): Claude Codepermission_denialsentries andis_errorresults, a Gemini CLI result status other thansuccess, a Gemini tool result that failed without REA's own MCP tool error type, and a Claude Code error result without REA's own error envelope (a policy refusal, an unavailable or unregistered server, a client exception). REA's own error results stay ordinary call failures, and an error code is exposed only when every simultaneously present error record agrees on it. Any entry failsagentEvaluationPassedeven when the client still returned an answer, so a refuseddontAskrequest cannot pass a scenario on an "unavailable" explanation.443c7aff; this branch's earlier server-less legacy Codex routing is gone.scripts/lib/agent-eval-clients.mjs). Each client gets an isolated profile configured through publicrea setup --client <id>(dry run, then--yes), and only its authentication is copied in. Processes run through main's sharedcreateAgentEvaluationCommandsowner, generalized fromrunCodextorunClient/readCommandVersionover the selected client'slaunch; a selected JavaScript entry point (cli.js,bundle/gemini.js) runs under the verifier's Node for the preflight and every scenario. Each client names its credential destination before preparation, so a run that fails earlier still removes it. The version preflight receives the client's non-authentication containment controls (no self-update, no nonessential traffic, no relaunch) without credentials.Read,Grep,Glob,Skill,ToolSearch,WaitForMcpServers) indontAskmode. claude.ai account connectors are disabled.ANTHROPIC_AUTH_TOKENis forwarded besideANTHROPIC_API_KEYfor gateway authentication. An emptyCLAUDE_CONFIG_DIRcounts as unset, as REA's own client resolver reads it.activate_skillso the REA skill can load. The caller's settings file is read through the owning client-configuration parser, so an empty placeholder counts as no settings.effects: a tool that may run foreign code, change a device, discard caller state, launch a process, or reach the network is refused unless the scenario approves it by name. Every scenario additionally approves by name the tools its own contract requires (expected first tool and required subsequence, beside explicit approvals), so the JavaScript scenarios may runanalyze_javascript_application, which main's audit marks as launching a worker process. The MCP hints derived from those effects are not consulted, so a hint edit cannot change permissions.client,clientCommandandclientVersion, names the setup methodrea_setup_<client>, and records each scenario'sclientFailureswith their total inclientFailureCount. Codex reports keepcodex,codexVersionandisolatedCodexHome.Contract and boundary impact
tests/evaluation/model-evals/AgentTranscript.ts).verify:gemini-client.auth.json,.credentials.json,.gemini/oauth_creds.json) are removed infinally, as before.OPENAI_BASE_URL,ANTHROPIC_BASE_URLorGOOGLE_GEMINI_BASE_URL).tests/evaluation/model-evals/and is not part of the shipped runtime, soknip.jsonis unchanged.Evidence and regression coverage
tests/evaluation/model-evals/agentTranscript.test.tsadds Claude/Gemini parser tests on shapes trimmed from real transcripts. They cover call/result pairing, client-reported failures with REA error codes, non-reaservers, subagent text, token totals, missing usage, permission denials and terminal client errors, delivery requiring a retained result (missing, non-object and empty-object Codex results), duplicate JSON error members, conflicting duplicate reports, and reused call IDs.agentEval.test.ts(main'scodexAgentEval.test.tsthrough the wrapper),knownAnswerEvaluation.test.ts,agentEvaluationScenarios.test.tsandtests/boundary/mcp/agentKnownAnswerMcp.test.ts(main's Notes cases included) go throughparseCodexEvents→evaluateAgentTranscript. Two of main's lifecycle-accounting cases now supplyresult: {}on their completed steps, matching the delivery contract above.agentEvaluationReport.test.tsrejects a result with client failures;agentEvaluationScenarios.test.tscovers scenario approvals and grades an unconfirmed open or close as failed.tests/process-global/agentEvalClients.test.tscovers the effects-based allow-list againstTOOL_CONTRACTS[].effects, the JavaScript entry launch, the Claude auth token, and credential destinations;tests/boundary/process/agentEvaluationCommands.test.tsdrives the generalized command owner.asarandmissing-targetscenarios did not complete because of the free-tier daily quota. Theactivate_skillpolicy fix has not been checked on a real run.Validation performed
Re-fit onto main at
ff6d96bce(2026-10-25, mergeb04661d54, follow-ups07f44cae8,5763d60ef,69c22a621,0963d13c2,d2e1a7aa5,86ae9b4bf,ed2e3ba1b,4dbebd70c,38a51aa91,6d2d2c328andd00eca532for the Greptile and Codex findings on the pushed heads), then re-fit again onto main atd6f88becd(2026-10-27, mergef36dcbd4e; one conflict, in the verifier's import block, where main now loadsparseSkillManifestMetadatathroughimportVerifierSource; follow-upfbd8e10fcfor the Greptile finding on that head), Linux, Node 24.22.1 from.nvmrc,npm ci,npm run build:cached:npm run test:focusedonagentEval,knownAnswerEvaluation,agentEvaluationReport,agentTranscript,agentEvaluationScenarios,agentEvalClients,agentKnownAnswerMcp,agentEvaluationCommandsandagentEvaluationCleanup: 9 files, 170 tests pass (the last two driveverify-agent-experience.mjswith fixture clients, including the early-failure credential cleanup).tests/evaluation/: 21 files, 450 passed, 1 skipped (pre-existing).node scripts/run-typescript.mjs --noEmit,npm run lint(no errors; the complexity/length warnings on the verifier and transcript parser are of the same kind main already carries),oxfmt --check .,npx knip: clean.fbd8e10fc:node scripts/run-typescript.mjs --noEmit,oxlinton the parser and its test, the pre-pushcheck:fast, and the six evaluation suites that import the transcript parser: 166 tests pass.f36dcbd4e:npm run build:cached,node scripts/run-typescript.mjs --noEmit,oxfmt --checkandoxlinton the lane's files, the pre-pushcheck:fast(turbo typecheck and lint), and the same nine focused suites: 196 tests pass. The firstagentEvaluationCleanupcase timed out once on a cold cache right after the rebuild and passed on re-run (4/4). Not re-run on this head: every file undertests/evaluation/,oxfmt --check .over the whole repo,npx knip.npm run docs:check, Windows or macOS. Thepermission_denialsandtool_use_resultshapes are thosescripts/verify-claude-client.mjsalready asserts; the Geminiresult.statusshape is the one recorded inagentTranscript.test.ts.Earlier evidence, recorded on the pre-merge head
b17b9b6cebefore the delivery and client-failure gates existed:REA_AGENT_EVAL_CLIENT=claude-code REA_AGENT_EVAL_SCENARIOS=asar,native,missing-target):asar: passed. All configured fixture claims were correct, against authenticated delivered Evidence.native: failedcorrectFirstTool. Claude calledbinary_sessionbeforeopen_binary. The lifecycle subsequence was met, with no repeats or validation failures.missing-target: failedtargetClarificationPassed. Claude correctly asked for the target, but wrapped the required JSON in prose and a code fence.gemini-3-flash-preview, API-key auth), run before theactivate_skillfix:native:open_binarywas the first call, followed by 13 calls, 1 repeat and 1 validation failure (~1.6M input tokens).asar: Evidence was parsed from Gemini's text-only results, then the run stopped at the daily quota.missing-target: stopped at the daily quota.Compatibility, safety, and release
schemaVersion4 → 5, which is additive. Codex reports keep their existing fields.Author readiness
Human owner: @Nick-800
Before merge
type(scope): outcome.🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.