mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #5699] [MERGED] feat(environment): compare an environment with probe captures of its application #7034
Closed
opened 2026-11-01 21:44:51 +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#7034
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/5699
Author: @earakely-scale
Created: 10/20/2026
Status: ✅ Merged
Merged: 10/22/2026
Merged by: @morluto
Base:
main← Head:feat/environment-fidelity📝 Commits (4)
761a2bdchore: restack environment fidelity onto main1874b20fix(environment): keep served collection order with the fidelity checks9549f74fix(environment): translate an object's keys only when it is keyed by learned ids462434cfix(merge): reconcile environment comparison with list queries📊 Changes
40 files changed (+4360 additions, -117 deletions)
View changed files
📝
docs/agent-environments.md(+64 -1)📝
docs/cli.md(+16 -0)➕
docs/specs/agent-environments/fidelity-compare/plan.md(+12 -0)➕
docs/specs/agent-environments/fidelity-compare/spec.md(+86 -0)➕
docs/specs/agent-environments/fidelity-compare/tasks.md(+12 -0)➕
docs/specs/agent-environments/fidelity-compare/verification.md(+146 -0)📝
docs/specs/agent-environments/state-writes/spec.md(+25 -13)➕
src/application/environment/environmentCompare.test.ts(+723 -0)➕
src/application/environment/environmentCompare.ts(+508 -0)➕
src/application/environment/environmentCompareDiff.test.ts(+307 -0)➕
src/application/environment/environmentCompareDiff.ts(+355 -0)➕
src/application/environment/environmentCompareIds.test.ts(+251 -0)➕
src/application/environment/environmentCompareIds.ts(+424 -0)➕
src/application/environment/environmentCompareMatch.ts(+178 -0)➕
src/application/environment/environmentCompareProbe.ts(+177 -0)📝
src/application/environment/environmentReplay.test.ts(+11 -0)📝
src/application/environment/environmentReplay.ts(+3 -3)📝
src/application/environment/environmentSource.ts(+22 -5)📝
src/application/environment/environmentStateAnswer.test.ts(+60 -0)📝
src/application/environment/environmentStateAnswer.ts(+3 -3)...and 20 more files
📄 Description
Summary
An environment is only as useful as it is faithful: an agent graded or trained on it should meet the behaviour of the application it was captured from. REA checks an environment only against its own capture, so nothing measured how far it drifts from the application on calls the capture did not make, after writes, or on errors. Every important gap found so far came from ad hoc replays against live applications.
This PR adds
rea environment-compare, which measures that. It compares an environment with probe captures: recordings of call sequences made against the live application, each after a reset. It reports how many calls the environment answers as the application did, which tools disagree and how. The command only reads Evidence and makes no network call.Part of #4933. Stacked on #5600, which carries #5351 and #5352; it is merged in at
5327e598. Until #5600 lands, the diff against main includes it. The new work is:src/application/environment/environmentCompare*.tsand their tests;src/cli/environmentCommands.tsandsrc/cliCommandNames.ts;tests/boundary/cli/environmentCompareCli.test.ts;docs/specs/agent-environments/fidelity-compare/.Problem and expected behavior
Each
--probeisinspect-web-network-captureorcapture-browser-scenarioEvidence of one sequence, recorded against the application after a reset. For each probe, the comparison:Id mapping. A re-seeded application holds the same entities under other ids, so the comparison maps them:
Normalisation. After mapping:
The report counts each kind.
Report. Agreement overall, per probe and per tool, plus agreement ignoring order for applications that return sets in no fixed order. Differences are categorised as
status,missing-field,extra-field,value,length,order,clock-format,refused,not-served,no-toolandunmapped-id, each with a JSON pointer.Change and scope
environmentToolAnswerwith a fresh state store per probe), so it measures exactly what an agent meets. Probes load with the capture parser, now exported.Contract and boundary impact
src/application/environment/) and the CLI.environment-comparewith a repeatable--probe; no MCP tool, so the catalog is unchanged.environment-servedoes; the report cites every Evidence id and is not itself Evidence.docs/public/product-catalog.json), package, or installation impact: none.Expected effects (check known effects; use documentation-only on its own).
Unchecked items do not establish absence; leave uncertainties visible.
Evidence and regression coverage
Tests added.
Executed evidence: six environments against their live applications. The same images were seeded by the same scripts and restored from a snapshot before every sequence (7 to 80 s).
A driver outside REA recorded three kinds of sequence:
The environments' manifests use
prefix-variance, so the comparison ran on a local build with #5664 merged.Environment gaps the runs found, which are the next things to fix:
domainparameter;"<scrubbed>".Differences not caused by the environment:
The six runs also found six ways the comparison itself was wrong. Each was fixed with a test before the next run:
Details are in
docs/specs/agent-environments/fidelity-compare/verification.md.User-visible output. The summary for Komga:
Remaining proof gaps:
For evidence-bearing changes:
Validation performed
Run on macOS with Node v22.23.1 at
235b22f2(verification commit20ad6618), then again after merging #5600's head into64b4994a.At
235b22f2:npm run build:cached,npm run check:fast,npm run format:check,npx knip,npm run scan:todos,npm run docs:check,npm run verify:test-discovery,npm run mcp-catalog:check— passed.npm run jscpd— 3.46% over 3609 files.npx vitest run --project domain --project services— 7487 passed, 5 pre-existing skips.npm run test:prepare, thennpm run test:focused --the environment-compare, export and serve CLI boundaries, the serve MCP boundary and tool schema validity — 5 files, 30 passed.At
64b4994a:npm run build:cached,check:fast,format:check,knip,mcp-catalog:checkanddocs:checkpassed;jscpdat 3.46%;Review round (head
473d03c4): fixed the 11 Greptile threads and two findings of my own.b6c3b168) and were merged here (631a7120).bbbdea20and7832f7eb: ids learned only from answers to the call, and also per collection; paging values never translated; calls checked against the served tools' input schemas; browser probes keep their bodies; empty and large binary bodies compare as served; scalar sets compare after mapping; overlapping id-keyed objects pair.check:fast, format, knip, todos, docs, test discovery, module boundaries and catalog; domain and services 7504 (5 pre-existing skips); focused boundaries 80; conformance;jscpd3.46%.Review round 2 (head
c63bcb7b): merged #5600'sf2b95351(a write of a missing entity never answers with a 2xx), then fixed Greptile's four follow-ups in736bf384.de2fc018. Gates passed again (domain and services 7508, boundaries 80, conformance,jscpd3.46%), and the six environments still compare exactly as in the table.Review round 3 (head
5604d55f): entities inside an envelope keep their collection's mapping: the answer's own entities are found at the view's entity or list pointer, or the write's response pointer (8ef92577). Its test fails onc63bcb7b; domain and services 7509 passed, boundaries 80, and the six environments are unchanged.Review round 4 (head
7e26d996): no new findings; merged the write-plan branch at9edbabe8andfc403d98(main335c042dand the base branches' review fixes). Gates passed (domain and services 7637, 5 pre-existing skips; boundaries 80; conformance;jscpd3.44%; the environment application tests 189 after the last merge).Review round 5 (head
71a50f07): merged #5600's1d1c4787in9622c5da, then fixed Greptile's three findings. The required-field finding was #5600 code, fixed there. The other two are fixed in71a50f07.unobservedwith their reason, and left out of agreement.unobserved_bodies.7e26d996. Gates passed:check:fast, format, knip, todos, docs, discovery, module boundaries, catalog, no oxlint warnings; domain and services 7647 (5 pre-existing skips); the compare, export, serve and analysis-view boundaries 69; conformance 279;jscpd3.44%.Review round 6 (head
bacafc5d): merged #5600'sdc5e2aadin8996fbf2. That fixes the two findings Greptile raised on both PRs: derived update changes are weighed, and a reset or load resets collection spellings.bacafc5d). Its test fails on71a50f07.jscpd3.44%, no oxlint warnings.Review round 7 (head
ac3ca8a3): Greptile's two findings on round 6 were in #5600's code, fixed there infe8ab584and merged here ind58c9aba. Gates passed: domain and services 7653 (5 pre-existing skips), boundaries 69, conformance,jscpd3.44%. The six environments compare exactly as in the table.Review round 8 (head
779910e1): Greptile's finding on round 7 was in #5600's store, fixed there in73c0e9b5and merged here. Gates passed: domain and services 7654, boundaries,jscpd3.44%. The six environments compare exactly as in the table.Review round 9 (head
ce491696): fixed Greptile's two findings on round 8 in5020a833: a probe with any undated record keeps its recorded order, as state extraction does, and a browser probe that makes POST, PUT or PATCH calls without recorded request bodies is refused. It also merged morluto'sa36cdf46and #5600 at3580d85cand43d98ea9, whose gate fix settles the finding Greptile raised here about overwritten document writes. Both new tests fail on the previous head, and the six environments compare exactly as before, on the probes and against their own captures.Review round 10 (head 6c13ef71):
other-origin. The origin choice moved toenvironmentManifestOrigin.ts, shared by the manifest and the comparison.264ce410,0ae64400,6257de93,466ed8b4,7cef2fb2,45a5c8b9and325c128f(6a633659, aa33d424, 2431c91a, 22fad94a, 194493e9, 097d3796, 6c13ef71). Their fixes settle the nine findings Greptile raised here against that branch's code: pending writes a summary read showed nothing of, encoded update and delete paths, later document replacements, flat entity fields that look like pointers, zero page sizes (twice), partial write responses taken for removals, and interference timed by a tool's call elsewhere or by an overwritten effect. The paging rules, with this branch'sisPagingParameter, moved toenvironmentStatePaging.ts.ce491696. Gates passed on 6c13ef71:check:fast, format, knip, todos, docs, discovery, module boundaries and catalog, with no oxlint warnings in the changed files; domain and services 7789 (5 pre-existing skips); environment boundaries 65; conformance 265;jscpd3.43%.Review round 11 (head
ea72e299):b0856b1ethroughc2ec9f56).717ac2c4ina3a19849, and main2451e187in8285d9b1. The only conflict was an import list.c2ec9f56and is fixed in7ad2fd2a. The gate's simulated state now keeps serving's state order and remembers collections in the order they were first known, so a tie between equal spellings resolves to serving's collection. Both new tests fail onc2ec9f56; the state-writes spec states the tie order.format:checkfailed on two docs tables and three test files; they are formatted in6c1e5a8eandea72e299.check:fast, format, knip, todos, docs, discovery, module boundaries and catalog; domain and services 7912 (5 pre-existing skips); environment boundaries 65;jscpd3.47%.7ad2fd2a. Against 6c13ef71, only Komga's self-comparison changed. A step that already differed now also reports the listed book's id, instead of counting it as generated. Agreement is unchanged at 93.1%.Review round 12 (head 5a09aae9):
project.idand user ids, and agreement fell from 23.9% to 20.9%. That thread stays open.1c979337on #5600: a create's path fields come from the selected collection. Tests for the tied case are here.src/main/deferredRuntime.tsinside a conflicted merge.check:fast, format, knip, todos, docs, discovery, module boundaries and catalog; domain and services 7969 (5 pre-existing skips); environment boundaries 67;jscpd3.40%.state, comes from #5600. The smoke ran 31/31.Review round 13 (head
9549f74e): fixed Greptile's finding on1874b20c, the Cursor agent's restack onto main after #5600 landed.Differ.objecttranslates keys only for an object keyed by learned ids, read as learning reads one, so ordinary fields compare by name and a real rename shows. The new test fails on1874b20c.check:fast, format, knip, todos, docs, discovery, module boundaries and catalog; domain and services 7982 (5 pre-existing skips); environment boundaries 67;jscpd3.39%.Merge resolution validation
At
462434c03, mergedmain(293832baf) while preserving its per-line whole-list membership, query-aware list serving, and extracted helper owners alongside this PR's shared encoded-path matching and stable collection ordering. Paging regressions now distinguish learned offset queries from unproved whole lines, use an explicit page size for later-page fixtures, and retain positive-page-base uncertainty. Removed the unreferencedInspectApkSignatureInputtype after confirming the Knip finding also on clean main.npm run check— exit 0, including typecheck, lint, formatting, Knip, metadata, module boundaries, and architecture guards.npm run check:fast— exit 0.npm run docs:generateandnpm run docs:check— exit 0, including 9 README consistency tests.Compatibility, safety, and release
Author readiness
Human owner: @earakely-scale
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.