# Client and agent verification Use these optional lanes to verify an installed client or evaluate an agent's REA workflow. [Testing REA](testing.md) provides the normal development commands and provider lanes. Each record below states its host, client version, model fixture, and remaining coverage; a native-client run with a loopback model does not establish live model-service acceptance. ## End-to-end, integration and golden evidence The optional `verify:qwen-client`, `verify:pi-client`, and `verify:hermes-client` lanes require an installed native client. Select its executable with `REA_VERIFY_QWEN_COMMAND`, `REA_VERIFY_PI_COMMAND`, or `REA_VERIFY_HERMES_COMMAND`. They configure disposable profiles through the public REA CLI, preserve caller settings and backups, and exercise real stdio MCP calls and skill loading. The `call` mode checks complete catalog discovery and actual JavaScript Evidence; pass `-- chat` to check plain chat with REA enabled. Qwen also reads the full result that its client offloads, and Pi exercises default codemode execution. Use `REA_VERIFY_RUNTIME_ROOT` to select a production-only installed REA package. Receipts retain client versions, result digests, host coverage and owned-process cleanup. These lanes use a deterministic loopback model and do not prove live model-provider compatibility. Pi and Hermes remain POSIX-only. Qwen, Pi and Hermes bind both `HOME` and `USERPROFILE` to the disposable account. Qwen and Pi discover the shared personal skill through their default search paths without an explicit skill setting; Hermes discovers it through the selected `HERMES_HOME`. Set `REA_VERIFY_HERMES_STICKY_PROFILE=1` to exercise native Hermes selection of a named sticky profile with `HERMES_HOME` still pointing to its root. The Qwen lane also supports native Windows (verified with Qwen Code 0.25.1 and Node 24.19.0 for both `chat` and `call`). With Node 24.18.0, the same `call` journey reached full Evidence readback but the client aborted during exit with `UV_HANDLE_CLOSING`; that run remains a failure, not a compatibility claim. Select the npm install's `node_modules/@qwen-code/qwen-code/cli-entry.js` with `REA_VERIFY_QWEN_COMMAND`, because `execFile` cannot launch the `qwen.cmd` shim directly. A selected `.js`, `.mjs` or `.cjs` entry point runs under the verifier's Node. Windows path checks use native separators; persisted output is read through Qwen's real shell tool with a shell-independent encoded Node payload. Windows receipts report process lineage as unavailable when the verifier has no retained native Job Object lease. `verify:gemini-client` requires an installed Gemini CLI (verified with `@google/gemini-cli@0.63.0` on POSIX and native Windows); select it with `REA_VERIFY_GEMINI_COMMAND`. A selected `.js`, `.mjs` or `.cjs` entry point runs under the verifier's Node. On Windows, select the npm install's `node_modules/@google/gemini-cli/bundle/gemini.js`, because only a `gemini.cmd` shim reaches `PATH`. The optional lane uses native `GEMINI_CLI_HOME` discovery in an isolated Git project, checks setup plans, backups and idempotence, activates the installed personal skill, validates all forwarded input JSON Schemas against their declared dialect, forwards the complete REA catalog and checks full JavaScript Evidence for a Unicode path. Use `-- chat` for ordinary chat with REA enabled, or `REA_VERIFY_RUNTIME_ROOT` for a production-only installed REA package. The local fixture exercises the real Gemini API adapter, including its `untrusted_context` tool-result envelope. Token counts are synthetic; live Google API compatibility remains unverified. The lane disables the client's memory-based relaunch to preserve the caller's Node heap budget. `verify:opencode-client` requires an installed OpenCode (verified with `opencode-ai@1.18.35`); select it with `REA_VERIFY_OPENCODE_COMMAND`. The optional POSIX lane configures isolated XDG roots and `OPENCODE_CONFIG_DIR`, checks setup plans, backups, preserved JSONC comments and idempotence, activates the installed skill, validates all forwarded input schemas and verifies complete JavaScript Evidence for a Unicode path. JSONC is the default fixture; set `REA_VERIFY_OPENCODE_CONFIG_FORMAT=json` for JSON. Use `-- chat` for ordinary chat or `REA_VERIFY_RUNTIME_ROOT` for a production-only installed package. The native core runs with external plugins disabled through `OPENCODE_PURE`; the local OpenAI-compatible fixture has a caller-declared one-million-token context and synthetic usage. Skills use an explicit isolated `skills.paths` directory, so default OS-home discovery remains unverified. Live model APIs and native Windows are also unverified. `verify:claude-client` requires installed Claude Code (verified with `@anthropic-ai/claude-code@2.1.296` on POSIX and native Windows); select it with `REA_VERIFY_CLAUDE_COMMAND`. On Windows, select `claude.exe`: npm installs put only a `claude.cmd` shim on `PATH`, and the real executable is under `node_modules/@anthropic-ai/claude-code/bin`. The optional lane uses native `CLAUDE_CONFIG_DIR` discovery, an independent Git workspace, user settings and default built-in tools. It preserves caller preferences and backups, checks idempotent setup, waits through the native `WaitForMcpServers` tool when discovery is pending, and validates the complete catalog and forwarded input schemas. Call mode loads the personal skill through native `Skill`, checks its full body and verifies named-schema JavaScript Evidence for a Unicode path. Use `-- chat` for ordinary chat with REA enabled, or `REA_VERIFY_RUNTIME_ROOT` for a production-only installed package. The local Anthropic Messages/SSE fixture preserves native resource-hint envelopes in its request artifacts. Usage is synthetic; live Anthropic API and bare-mode personal-skill activation remain unverified by this lane. `verify:copilot-client` requires installed GitHub Copilot CLI (verified with `@github/copilot@1.0.95`); select it with `REA_VERIFY_COPILOT_COMMAND`. The optional POSIX lane uses native `COPILOT_HOME` discovery, an independent Git workspace, guarded setup plans, preserved registrations, backups and idempotence. Native `skill add` registers the isolated installed skill; call mode loads its full body, validates all forwarded input schemas and checks named-schema JavaScript Evidence for a Unicode path. When Copilot spills a large MCP result, the model requests native `view` with `forceReadLargeFiles` and validates the complete returned Evidence rather than its preview. Use `-- chat` for ordinary chat or `REA_VERIFY_RUNTIME_ROOT` for a production-only installed package. The native offline BYOK adapter uses a loopback OpenAI completions/SSE fixture and `gpt-5.4` model metadata; model inference and token usage are synthetic. Set `REA_VERIFY_COPILOT_MODEL` to examine another client model ID and `REA_VERIFY_COPILOT_WIRE_MODEL` for its backend model name (defaults to the client ID). Every actual HTTP request's model is checked and recorded separately. Both `HOME` and `USERPROFILE` point to the disposable account; native `skill add` still selects the installed skill directory explicitly. The same native client passed full-profile chat and analysis with the actual wire model `gpt-4.1` under a distinct BYOK model ID: ```bash REA_VERIFY_COPILOT_MODEL=rea-gpt-4.1 REA_VERIFY_COPILOT_WIRE_MODEL=gpt-4.1 npm run verify:copilot-client -- chat REA_VERIFY_COPILOT_MODEL=rea-gpt-4.1 REA_VERIFY_COPILOT_WIRE_MODEL=gpt-4.1 npm run verify:copilot-client -- call ``` These runs retain full canonical input/output schemas, all tools, installed-skill loading and complete Evidence readback. They use the fixture's requested one-million-token BYOK prompt setting; effective capacity and live API acceptance remain unknown. With the built-in `gpt-4.1` model ID, the verified client still blocks the full input-schema profile before HTTP with `compaction_static_context_blocked`, even when requesting a larger BYOK prompt capacity. The effective capacity is unknown. The default verifier preserves the complete catalog and full schemas. To verify the existing compact profile: ```bash REA_VERIFY_COPILOT_MODEL=gpt-4.1 REA_VERIFY_COPILOT_SCHEMA_PROFILE=compact npm run verify:copilot-client -- chat REA_VERIFY_COPILOT_MODEL=gpt-4.1 REA_VERIFY_COPILOT_SCHEMA_PROFILE=compact npm run verify:copilot-client -- call ``` Both native workflows passed with the complete tool inventory. The verifier selects the profile only in its disposable Copilot registration and records it in the receipt. Compact advertisements can reduce nested validation structure; the server still validates complete canonical inputs. This is a tested alternate workflow, not a fix for the full-profile client/model limit tracked in #1554. Live model APIs, native Windows and default OS-home skill discovery remain unverified. `verify:grok-client` requires installed Grok Build (verified with the official Linux x64 1.0.50 binary); select it with `REA_VERIFY_GROK_COMMAND`. This optional POSIX lane isolates `GROK_HOME`, an independent Git workspace and additional skill roots, disables foreign configuration discovery, guards setup writes, preserves unrelated registrations/backups and checks idempotence. Call mode loads the full skill through native `read_file`, queries all REA names and input schemas through native `search_tool`, and calls analysis through `use_tool`. If discovery reports `partial`, the native agent diagnoses REA registration and retries discovery. No startup-timeout override or fixed readiness delay is used. A larger Unicode-path fixture exercises native result offloading: the full retained Evidence is validated against its named schema, then native terminal queries recover the selected export facts, subject and full artifact digest in the next model request. This verifies useful artifact recovery without claiming that every offloaded graph fact enters model context. Native line-number and truncation envelopes remain in the request artifacts. Use `-- chat` for ordinary chat, or `REA_VERIFY_RUNTIME_ROOT` for a production-only installed package. The loopback OpenAI completions/SSE custom model declares a one-million-token context and synthetic usage. Live xAI APIs, native Windows and default OS-home skill discovery remain unverified. `verify:commandcode-client` requires installed Command Code (verified with npm 1.79.2); select it with `REA_VERIFY_COMMANDCODE_COMMAND`. Auth, MCP tokens and sessions use the actual OS home, so provision a disposable POSIX account rather than overriding `HOME`. Set `REA_VERIFY_COMMANDCODE_ACCOUNT_HOME` to that account's actual home and create `.rea-client-verification` there with exactly `Disposable REA client verification account` followed by a newline. The lane owns that account's `.commandcode` configuration and shared REA skill. Build the runtime as the checkout owner, then run `node scripts/verify-commandcode-client.mjs` as the disposable account; the npm shortcut also needs a writable checkout. The verifier does not create accounts or install clients. It guards setup targets, preserves an unrelated registration and backups, checks idempotence, and verifies native default shared-skill discovery and complete activation. Default deferred-schema delivery stays enabled: the native prompt advertises every REA tool, exact-name `search_tools` returns every input schema, and a native shell query recovers the saved catalog's count and digest when the client spills it. Actual analysis of a Unicode-path fixture delivers full named-schema Evidence to the next model request. Use `-- chat` for ordinary chat or `REA_VERIFY_RUNTIME_ROOT` for a production-only installed package. The loopback OpenAI completions/SSE model is a keyless BYOK endpoint declaring a million-token context with synthetic usage. A synthetic account-key value satisfies the client's print-mode gate; native local-only mode refuses hosted API calls. Updates, telemetry and cron are disabled. Hosted authentication, live models and Windows remain unverified. `verify:omp-client` requires installed OMP (verified with the official Linux x64 18.8.7 binary); select it with `REA_VERIFY_OMP_COMMAND`. This optional POSIX lane isolates the default agent, global config and XDG roots, guards setup targets, preserves unrelated registrations and backups, and checks idempotence. It compares native rejection of an invalid profile with REA's refusal to plan fallback writes. OMP's default `xd://` interface mounts the complete REA catalog as devices: call mode reads the complete installed skill and tool documentation, then dispatches analysis through native `write`. It checks full named-schema JavaScript Evidence with a Unicode path in the next model request. Device metadata and documentation are distinct from forwarding all JSON schemas as model functions. Native print-mode MCP readiness uses its defaults. Use `-- chat` for ordinary chat or `REA_VERIFY_RUNTIME_ROOT` for a production-only installed package. The loopback OpenAI completions/SSE model fixture declares a one-million-token context and synthetic usage. Live model APIs, native Windows, named-profile native execution and default OS-home skill discovery are unverified; skill discovery uses an explicit isolated custom directory. `verify:deepseek-client` requires an installed DeepSeek Harness (`dsh`; verified with `@deepseek-ai/dsh@0.2.0-rc.2`) and Git. Set `REA_VERIFY_DEEPSEEK_COMMAND` to select its executable. This optional POSIX lane seeds caller model settings and a stale Cordis registration in an isolated `DSH_HOME`, then runs public `setup --client dsh` dry-run, setup, repeated setup, and scoped doctor. It checks the backup and unrelated patches before booting Harness with the generated registration. After native execution it uninstalls through the public CLI and checks that only caller patches remain. `HOME` and `USERPROFILE` point to the disposable account. The native default `~/.agents/skills` search path discovers the installed skill without a `DSH_AGENTS_HOME` override. A separate Git root prevents inherited project skills from masking a missing installation. The default `call` mode checks skill loading, complete catalog discovery, the actual forwarded input schemas and regexes, and full JavaScript Evidence for a Unicode path. Use `-- chat` for ordinary chat with REA enabled, or `REA_VERIFY_RUNTIME_ROOT` for an installed package. The fixture uses Harness's custom OpenAI adapter and the one-million-token context capacity declared by its default DeepSeek Flash model; it does not establish live DeepSeek API or native Windows coverage. Receipts include request artifacts, result digests and owned-process lineage. The DSH acceptance journey also exercises public setup, approval, doctor, generated-launcher MCP startup and uninstall without an installed Harness. That journey proves REA workflow behavior, not native Cordis expression evaluation. Filesystem regressions retain tagged values and unrelated rows across alias dependencies and check refusal of unsafe YAML without mutation. Full E2E tests invoke the production command dispatcher and real providers, without fake launchers, runners or responses. `verify:keyed-archive` writes Foundation binary, XML, and integer archives using one run-owned Swift module cache. It checks CLI and separate stdio MCP parity, pagination, escaping-path rejection, an XML graph golden, and numeric meaning for safe controls, unsafe integers, boxed numbers, and integral-valued reals. `verify:asset-catalog` compiles source-owned colors with `actool`, invokes real `assetutil`, then checks CLI/MCP results, exact catalog digest, every raw metadata field, pagination and malformed input rejection. Neither artifact workflow requires Hopper or launches it. Both run in macOS CI. `verify:macos-bundle` needs only macOS with Command Line Tools. It compiles a source-owned app with `clang`: a versioned framework, XPC services, an app extension, a login item, a privileged helper, launchd plists, and a helper tool, signed ad hoc. It packs the app as a directory, a `ditto` ZIP, and an APFS DMG, then checks that `inspect-artifact` plus `project-apple-application-graph` report the same bundle anatomy for all three through the CLI, with stdio MCP parity. It also checks that the DMG is detached afterwards. The same app covers `trace-dylib-resolution`: - each resolution status and finding, with CLI/MCP parity; - for every traced image, dependencies, rpaths, and install names equal to `otool -l`; - for the main executable and an XPC service, a predicted load order equal to the images dyld actually loads under `DYLD_PRINT_LIBRARIES`. The lane also compiles executable/library pairs with empty embedded directory, versioned-path, and suffix settings. It checks present and removed dependencies through CLI and MCP, and compares actual `DYLD_PRINT_SEARCHING` diagnostics for root-level candidates. These cases distinguish an empty search directory from an empty versioned scan or a suffix that only repeats the original path. It runs in macOS CI. Prepare the native inspector before cases that measure producer output or exit behavior; keep startup deadlines and cancellation in distinct cases. Run real process-capture verification separately from package or build checks. On macOS, new npm processes can become token-unreadable after changing their display title and prevent verified cleanup during a capture's ownership sweep. MCP SDK transport tests with recording providers remain integration tests. They are useful for schema drift and failure projection but do not prove that Hopper, Ghidra or another substituted engine works. `verify:package` proves packaging/install behavior and fake-provider integration; use the corresponding real-provider lanes for engine claims. Packed-bridge checks verify shipped files and Python syntax. Real Apple dispatch and Interface Builder verifiers currently prove format integration through production readers. `verify:hopper` exercises an installed Hopper through the production stdio MCP server and CLI. It checks source-owned call chains, CFG edges, references and complete large inventories, then probes unnamed bookmarks, annotation clearing, batch validation before mutation, malformed addresses and regexes, segment-end partial reads, and synthetic file-offset rejection. Advertised schemas are validated in their JSON Schema dialect and successful replies are checked against their advertised output schemas. Navigation checks cover interior-object cursor readback and mapped-memory boundaries. Annotation probes verify invalid native text and duplicate destinations/names before mutation, preserve unselected label owners, and exercise explicit batch label swaps. Function locals retain observed names and stack displacements. Graph probes check symbol/interior-address parity and a source-owned recursive cycle; literal tracing preserves complete queries and whitespace. Disposable binary copies prove that switching and closing actually removes the native document, and that CLI byte, function-dossier, literal-trace results and invalid-address diagnostics agree with MCP. No provider is mocked in this lane. Real search probes cover Unicode names, literal metacharacters, case and regex modes, annotation cache invalidation, complete native fragments of long literals checked against byte reads, escaped UTF-8/control text, byte-preserving Latin-1 decoding, and Hopper's UTF-16 symbol-name truncation boundary. It verifies native CallReference classifications across reference and dossier results, retains long string fragment metadata in dossiers, and exercises pathological regex deadline and cancellation followed by successful requests in the same native session. When the macOS Objective-C fixture is present, the lane also verifies native UTF-16 string objects and their inferred encodings against their actual bytes. Native terminal calls are checked across reference, instruction, assembly, block-range and procedure-length projections; block endpoints are normalized using actual native membership. Exact Objective-C names also exercise named CLI selectors for function, instruction, decompilation, reference and search operations. A literal `--help` trace query proves that selector data is preserved independently of global CLI flags. Unmapped annotation destinations and oversized later batch names fail before any earlier edit is applied. `verify:hopper:deadlines` checks the native client's optional request deadlines on macOS with an owned source-built fixture. Zero and elapsed deadlines must leave native comments unchanged, including when a synchronous progress observer delays timer dispatch. It also observes a short analysis deadline and verifies subsequent wire recovery and clean shutdown. Caller timeout does not interrupt Hopper's synchronous native operation. Socket boundary tests deterministically cover active and queued expiry, late replies and timer cleanup. The Linux demo lane remains a separate `verify:hopper:linux` command. Hopper 6.4.2's ELF loader did not recognize the original 4,119-byte literal or three non-ASCII byte strings in the measured fixtures. The lane retains complete raw byte checks for those literals through source-owned symbols. Recognition of the original full-length literal is bound to its exact source address; its decoded object coverage remains explicitly unverified on Linux even when recognized. Absent non-ASCII recognition also reports decoded-object coverage as unverified. Recognized non-ASCII and control-text objects must still match their source bytes, encoding, filters and searches. A separate 548-byte ASCII literal requires native fragmentation, shortened provider display, complete decoded fragments and dossier provenance on Linux; the macOS lane retains the original full-length recognition requirement. These are observed fixture/build capabilities, not universal Hopper length limits. Its lifecycle checks attempt competing CLI launches for the active target and a different target, requiring rejection before either can change the owning MCP session's documents or procedures. Lease boundary tests also preserve unresponsive or malformed live endpoints while allowing confirmed stale sockets to recover. `verify:setup:linux` exercises installation on a clean supported Linux runner as root. Use a disposable VM: this lane installs Hopper and its Linux runtime dependencies through the system package manager. Set `REA_VERIFY_SERVER_COMMAND` to the CLI entrypoint being verified. The command builds and checks source-owned ELF fixtures before testing the read-only Hopper setup plan, approved installation, scoped doctor, real CLI/MCP analysis, rejection of a modified launcher, idempotent setup without requesting a reinstall, and owned child cleanup. Before installation and after teardown, a clean-runner process scan also rejects surviving Hopper demo helpers or Xvfb groups, including orphans whose launcher exited. This scan observes processes without signaling them. Hopper detection compares executable file identity through `/proc`, covering alternate or configured launcher paths even after an invoked symlink is removed. The dedicated runner must have no unrelated Hopper/Xvfb sessions. It requires the repository's pinned development toolchain and an existing host C compiler, `file`, `nm`, and `strings`. Use `verify:hopper:linux` instead when Hopper is already installed. `verify:hopper:fat` is a separate macOS lane requiring installed Hopper and the existing Xcode clang/lipo toolchain. It compiles arm64/x86-64 thin executables and one- and two-slice FAT32 containers, verifies exact/interior address mappings against bytes in the original files, checks CLI/MCP parity, and checks owned runtime cleanup. Source byte changes, removal, permission denial (for non-root callers), and nonregular replacement must retain native partial mapping facts, reject unverified original-file coordinates, and recover after restoration. Single-slice FAT cases also relocate the slice without changing its loaded bytes. `verify:hopper:fat64` additionally checks FAT64 preparation through Hopper's native Mach-O loader, source-container mappings, profile identity, malformed and ambiguous slice rejection, and temporary-image lifetime. Both lanes have been verified on Hopper 6.1.0-demo; this establishes REA's prepared FAT64 workflow, not native FAT64-loader support. Cross-architecture fixture compilation is not required by `verify:hopper`. Golden tests use immutable captured text inputs with producer/source provenance under `tests/fixtures/golden/`. Expected results are reviewed for the semantic claim; capture commands do not automatically approve new expected outputs. Do not call handcrafted utility output or synthetic binary builders real-data goldens. Keep unsupported binary layouts and malformed boundaries as targeted regressions until a real fixture establishes equivalent coverage. `verify:browser` exercises source-map failure isolation and expanded-output limits through the compiled CLI and stdio MCP with real Chrome. It also submits five 2 MiB source-map annotations, checks retained script identities and explicit map omissions, and closes its owned fixture target. Replacement and document-reset behavior has separate producer-boundary coverage. The raw Chrome fixture launchers use `--password-store=basic` so Linux startup does not wait for an unlock prompt from a reachable but locked desktop keyring. Such a stall leaves the initial page unloaded with empty or placeholder CDP URLs; it does not establish permission to capture that page. See [the keyring diagnosis](https://github.com/morluto/rea/issues/1384#issuecomment-6093781686). On Windows, browser verifier lanes that launch an owned fixture require a standard, non-elevated caller token. They inspect the verifier caller before allocating fixture resources and refuse elevated or unobservable tokens; they do not change caller authority or claim to inspect the browser process token. `verify:browser` also captures a source-owned noise canvas as a real PNG above 8 MiB through the CLI and stdio MCP, with complete byte/digest parity and real PNG decoding. Its SDK client explicitly permits the larger inline JSON response; this lane does not establish large image-comparison request transport coverage. The scenario checks read locale, timezone, device scale and viewport dimensions from actual page JavaScript through CLI and stdio MCP DOM captures. They also verify that attached-page emulation is released after success, initialization failure, action failure and cancellation while the external target stays open. `verify:browser:network` is a focused real-browser lane for transaction identity, selected request/response bytes, binary and compressed responses, duplicate headers, credential and declared-secret redaction, redirects, streaming cutoff, CLI/MCP parity, and owned-profile cleanup. Set `REA_BROWSER_EXECUTABLE` to an installed Chrome-family browser. An optional script argument selects an already installed package's `scripts/rea.mjs` entry point for packaged-artifact checks. The complete `verify:browser` lane includes these same checks. After building, `verify:browser:dom` checks empty and HTML-whitespace form destinations against a native Chrome DOM-property oracle through CLI and stdio MCP. It requires `REA_BROWSER_EXECUTABLE` and accepts an optional installed REA entrypoint. The full browser lane includes the same public-adapter assertions before other fixtures navigate the selected page. `verify:browser:scripts` checks active script capture → exact-byte export → existing static JavaScript analysis through CLI and stdio MCP, including manifest readback, competing query variants, and resolved relative imports. It uses an installed browser and accepts an optional installed REA entrypoint. The complete `verify:browser` lane also exercises passive script export through both public adapters. See [website script export](website-script-export.md). `verify:browser:modules` compares CLI and stdio MCP traces against an independent real Chromium module-loading fixture: import-map scopes, package prefixes, null/backtracking rejection, query/fragment identities, repeated module instances, lazy and computed unknowns, exact source/map identities and no implicit refetch. Set `REA_BROWSER_EXECUTABLE`; the optional script argument selects an installed package entrypoint. The complete `verify:browser` lane and existing conditional Chrome CI include this verifier. See [module relationships](website-module-trace.md). ## Agent evaluation and conformance records Evaluate native, JavaScript, managed and browser investigation tasks through a real local Codex CLI with: ```bash npm run verify:agent ``` The lane runs scenarios sequentially in standalone Codex (`--no-daemon`) with a disposable HOME and CODEX_HOME under `~/.cache/rea-agent-evaluations/`. Set `REA_AGENT_EVAL_ROOT` to choose another parent directory outside the OS temporary directory: current Codex refuses helper aliases under `/tmp`, preventing shell commands and skill reads even if MCP works. Each owned run directory is removed after verification unless fixture retention is requested. The lane installs the packaged skill and MCP registration through public `rea setup`, rather than copying a skill into a project that also inherits the caller's skills and configuration. Only authentication is copied, when present, and it is removed even with `REA_AGENT_EVAL_KEEP_FIXTURES=true`. No user configuration, rules, plugins or history is copied; shell snapshots and additional agents are disabled. Existing API-key environment authentication remains available. The native missing-provider scenario preapproves only `open_binary` and `close_binary` in the disposable client so it reaches REA's actual provider boundary instead of stopping at Codex approval. This does not validate a real native engine or authorize arbitrary runtime execution. Select a smaller run with `REA_AGENT_EVAL_SCENARIOS`, a comma-separated list of scenario IDs. `asar-zh` exercises the packaged desktop rubric from a Chinese request. `javascript-module-view` exercises summary analysis, module paging and item inspection in a tree with unrelated modules; its routing and text checks remain heuristic, so review the retained transcript for selector choice and coverage claims. Set `REA_CODEX_CLI` to an installed Codex executable and `REA_AGENT_EVAL_MODEL` to an account-supported model. Use an external resource limit for the whole process tree when testing on a constrained host; a Node heap limit alone does not bound client and child-process memory. `missing-target` leaves desktop fixtures visible without selecting one in the request. It requires zero REA calls and a structured request for an app name or artifact path. Its `expectedFirstTool` is `null`, and `targetClarificationPassed` grades that limited routing outcome independently of analysis prose heuristics. Analyzing a nearby example cannot pass this case. The packaged desktop, parser-comparison, and managed scenarios assess a closed set of known fixture claims. Each final answer must be a strict JSON manifest containing exactly the requested claim IDs, values, Evidence IDs, and Evidence authority and confidence. Golden values are not included in the prompt. The evaluator checks exact values against both the fixture oracle and authenticated successful REA results; an Evidence ID by itself is insufficient. Missing, duplicate, extra, contradictory, incorrectly sourced, or unsupported claims fail the scenario. The desktop rubric covers the exposed bridge API and members, renderer and main IPC operations, and the resolved preload. It binds its Evidence to the exact packaged artifact path and SHA-256. The parser rubric checks the precise heading depth addition, discriminant, complete comparison counts, and the explicit limit on runtime semantics. Its comparison must link to the two delivered source analyses and use the requested module and export selectors. Boundary tests package the same source-owned desktop fixture and compare the same source-owned parser files through actual MCP tool results, then verify that fabricated answers fail. The managed rubric checks the exact public top-level type set and the CLI entry point's declaring type and method name. The exact type-set claim requires an unfiltered member inventory: `selection` must be null and the Evidence parameters must omit `type_names`. A selected inventory can still ground the entry-point claim. Both inspections must describe the freshly built DLL's SHA-256. Entry-point resolution additionally requires complete artifact and member metadata, matching non-null module MVIDs, and a unique method at the header's metadata token. These are static metadata claims, not runtime behavior; compiler-generated member counts, token values, and MVIDs are not golden answers. Per-scenario `factualCorrectness` is `passed`, `failed`, or `not_assessed` within the `configured_fixture_claims` scope. A pass establishes only the configured claims, not unrestricted factual correctness. Native, browser, navigation-context, and address-context scenarios have no factual rubric and remain `not_assessed`. The closed factual scenarios request complete producer Evidence on the initial inspection or analysis so their source selectors can authenticate all configured facts. Summary/page/item workflows are exercised separately by `javascript-module-view`; its heuristic gate does not establish full-producer factual correctness. All scenarios retain routing, workflow, validation, repetition, process-exit, and token-use gates. Configured factual scenarios additionally require a factual pass. Their answer-text heuristics are diagnostic and do not affect the gate. Validation counts include complete text-only REA `invalid_request` envelopes and failed SDK calls whose arguments violate the named current REA contract. Client approval rejections and provider unavailability remain distinct failures; truncated JSON previews are not parsed into invented error codes. Repeated `binary_session` observations separated by a successful `open_binary` or `close_binary` are treated as lifecycle verification. An unchanged retry, including one after a failed lifecycle call, still counts as repetition. Scenarios without a rubric retain the legacy text-heuristic gate. `answerTermCoverageMet` checks case-insensitive substrings, `epistemicCuePresent` checks keywords, and `finalCitesEvidence` checks only an ID's presence. These metrics can still accept fabricated prose and must not be read as factual assessments. Set `REA_AGENT_EVAL_TRANSCRIPT_DIR` to retain complete tool results and final answers for review. Report schema version 4 adds negative routing scenarios with nullable `expectedFirstTool` and a `targetClarificationPassed` outcome. Consumers must allow an expected absence of REA calls; this does not make an analysis scenario pass without its required tools. Version 3 changed the top-level `factualCorrectness` from a constant string to an assessment summary with status, scope, and assessed/passed/failed/ not-assessed scenario counts. Scenario records include the factual assessment and configured claim IDs. The evaluation scope is `routing_workflow_and_configured_fixture_claims`. Update report consumers for these changes. The narrower heuristic field names introduced in version 2 remain: `answerHeuristicsMet`, `epistemicCuePresent`, `answerTermCoverageMet`, and `requiredAnswerTermGroups`. Regenerate the managed conformance manifest and Evidence completion ledger from live verification results, or check them for drift: ```bash npm run evidence:generate npm run evidence:check ``` The records preserve unsupported and unverified coverage as explicit unknowns. Run the matching real-tool prerequisites described in this guide.