mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #5819] [MERGED] perf(javascript): reuse the source-analysis worker within a process #7083
Closed
opened 2026-11-01 21:45:15 +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#7083
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/5819
Author: @morluto
Created: 10/21/2026
Status: ✅ Merged
Merged: 10/21/2026
Merged by: @morluto
Base:
main← Head:cursor/reuse-js-analysis-worker-dc95📝 Commits (10+)
a02c4aaperf(javascript): reuse the source-analysis worker within a process1a98f89fix(cli): close the JavaScript worker when dispatch throwsbc41270fix(artifacts): report close-hook failures with retained cleanup55b358dfix(javascript): stop a replaced analysis worker before the next one starts9ab49e6style: format worker-reuse close and launch helpers407069emerge: bring origin/main into the JavaScript worker reuse branch40cd0f4merge: bring origin/main into the JavaScript worker reuse branch1c55374fix(cli): report a failed JavaScript worker shutdown before exitaee3828fix(javascript): keep a worker parked during an overlapping limit change69e1434fix(artifacts): run later close hooks when an earlier hook fails📊 Changes
15 files changed (+925 additions, -77 deletions)
View changed files
📝
scripts/rea.mjs(+94 -39)📝
src/application/javascript/JavaScriptArtifactReconstruction.ts(+2 -1)📝
src/artifacts/ArtifactResourceScope.test.ts(+83 -0)📝
src/artifacts/ArtifactResourceScope.ts(+95 -1)📝
src/artifacts/javascript/JavaScriptSourceAnalysis.ts(+145 -2)📝
src/cli.ts(+2 -0)📝
src/cli/javascriptApplicationAnalysis.ts(+40 -3)📝
src/javascript/analysis/JavaScriptAnalysisWorker.ts(+45 -3)➕
tests/boundary/cli/cliJavaScriptResourceClose.test.ts(+66 -0)📝
tests/boundary/cli/dispatcher.test.ts(+65 -22)📝
tests/boundary/filesystem/javascript-applications/javascriptApplicationService.test.ts(+1 -1)📝
tests/boundary/javascript/javascriptSourceAnalysisWorker.test.ts(+274 -0)📝
tests/boundary/javascriptSemanticTraceEvidence.test.ts(+6 -2)📝
tests/support/cli/cliCommandSessionWorker.mjs(+5 -2)📝
tests/support/cli/compiledCliWorker.mjs(+2 -1)📄 Description
Summary
Sequential
analyze-javascript-applicationcalls each started a new Node analysis worker. That process startup, not fixture I/O or the already-shared CLI session, was the large cost in the slowest JavaScript acceptance files. A healthy worker now stays parked on the artifact resource scope (and on one CLI-process scope) until that owner closes.Problem and expected behavior
CI fast timings from run 39553734979 (
d672cc239,test-results/test-timings.json; two commits before the previous main) rank the suite at 6515s across 1898 files. Acceptance, boundary, MCP, and CLI are most of that. The longest files:tests/acceptance/applications/javascriptLoaderReviewBoundaries.test.tstests/acceptance/applications/exportedFunctionBindingsCli.test.tstests/boundary/cli/clientProfiles.test.tstests/acceptance/setup/piClientSetup.test.tstests/acceptance/applications/javascriptFactoryCompletion.test.tstests/boundary/mcp/analysisViewMcp.test.tstests/acceptance/setup/registrationRuntimeEnvironmentCli.test.tstests/acceptance/tools/qlogCapture.test.tstests/acceptance/applications/javascriptIndirectLoaderOwners.test.tstests/acceptance/setup/hermesClientSetup.test.tstests/boundary/mcp/callRelationshipAvailability.test.tstests/acceptance/process/processFinalization.test.tstests/acceptance/applications/mobileDirectoryComponents.test.tstests/acceptance/electronFusesCli.test.tstests/acceptance/setup/dshClientSetup.test.tsA CPU profile of one worker startup (215ms, 185 samples) was
compileSourceTextModule23.2%, GC 8.1%, idle 7.6%. The ready handshake alone was about 164–216ms. Bundling the worker andNODE_COMPILE_CACHEonly moved ready to about 126–140ms and 134ms, so those were not shipped. After the process was warm, per-file semantic work was spread acrossdomain/javascriptwith no single function worth a separate change. Zod parse of the result was 9–28ms.Warm compiled-CLI commands on the loader “returned module” fixture were 405–607ms, with a 242–294ms gap before the first JavaScript file. The shared CLI session was already warm; the worker child was the gap.
Expected behavior: a later analysis on the same scope and the same heap/timeout reuses that process. A failed, cancelled, or limit-changed analysis does not. Scope close, session stdin end, and one-shot
process.exitstill stop the process and remove its private root. CLI and MCP results stay the same. A limit change closes the previous worker before the replacement is constructed, and does not replace a worker a concurrent analysis parked during that close. If that close fails, the request fails and the still-live worker stays owned; a replacement is not started. Dispatch cleanup still runs whenserveor output rendering throws. A failed shutdown stays owned for a retry and is reported before the one-shot process exits. A closed stdout pipe still exits 141.Change and scope
createJavaScriptSourceAnalysiskeeps one idle worker perArtifactResourceScope. Reconstruction already passes the caller’s scope, so MCP uses the server scope thatcreateServercloses on shutdown. The CLI keeps one process-lived scope, retries failed owners without closing a healthy worker, andcloseCliJavaScriptResourcesruns fromscripts/rea.mjs(including afinallyaround dispatch), the compiled CLI session, and the command session. In-processjavascriptSemanticTraceEvidencecloses that scope inafterAll.The CLI shutdown is one shared promise. The scope stays owned until that close succeeds, so the exit callback and the dispatch
finallyobserve the same attempt. The exit callback writes a cleanup failure and exits non-zero; a closed stdout pipe still exits 141. DifferentheapMb/timeoutMsclose the parked process, then start another. If that close fails, checkout throws before constructing a replacement and puts the still-live worker back in the slot when it is empty. The replacement claims the slot only when it is still empty; otherwise the extra process is closed through its own port. Result-budget admission is refreshed from the current parent heap on reuse. Every close hook runs. A close that fails both retained cleanup and a close hook reports both resources and both causes.Follow the contribution scope. This stays inside the existing static JavaScript analyzer. It does not add target execution, injection, mutation, or protection recovery. Maintainer scope decision: not applicable.
Contract and boundary impact
evidence_idparity.retryCleanup. A close hook still runs when other retained cleanup is failing, and both failures stay visible. Later hooks still run when an earlier hook fails.docs/public/product-catalog.json), package, or installation impact (CI generates and validates ignored catalogs andskills/; edit authored instructions in.agents/skills/reverse-engineer-anything/and never commit build outputs): 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
javascriptSourceAnalysisWorker.test.ts); close hook still runs when retained cleanup fails, both failures are reported, and a later hook still runs when an earlier hook fails (ArtifactResourceScope.test.ts); CLI shutdown retries after a failed close and shares one in-flight close (cliJavaScriptResourceClose.test.ts); dispatcher reports a failed shutdown as exit 1 and keeps closed-pipe status 141 (dispatcher.test.ts); in-process CLI closes the parked worker (javascriptSemanticTraceEvidence.test.ts).npm run test:focusedon main’s compile, then on this branch. Loader review 60.28s → 30.77s (124 passed both). Factory completion 34.88s → 21.57s; the 40-scenario test 24482ms → 11595ms. The before runs were second, so disk cache favored the slower baseline.exportedFunctionBindingsCli.test.tsandjavascriptIndirectLoaderOwners.test.tsuse the same command and were not timed again. Client-profile, setup, qlog, and process-finalization files are a different cost and were not changed. A long MCP session’s child heap was not load-tested; the worker already collects whenheapUsedexceeds half its limit. Full CI shard wall was not re-measured.peResourcesacceptance timing out at 30s is the same failure on current main and is not changed here.For evidence-bearing changes:
Validation performed
npm run test:focused -- tests/acceptance/applications/javascriptLoaderReviewBoundaries.test.ts— before 60.28s / 124 passed; after 30.77s / 124 passed.npm run test:focused -- tests/acceptance/applications/javascriptFactoryCompletion.test.ts— before 34.88s (24482ms and 7974ms); after 21.57s (11595ms and 7166ms).npm run test:focused -- tests/boundary/javascript/javascriptSourceAnalysisWorker.test.ts tests/boundary/cli/cliJavaScriptResourceClose.test.ts tests/boundary/cli/dispatcher.test.ts tests/acceptance/applications/peResources.test.ts— 21 passed. The new casedoes not start a replacement when closing the previous worker failspassed in 544ms.peResourcespassed locally in 18.9s.npm run format:check— passed (4676 files).npm run check:fast— typecheck and lint passed.69e1434b(run 39585068374, job 119172814208) and on mainc324d31b(run 39584670117, job 119171892915) both fail onlytests/acceptance/applications/peResources.test.tswithTest timed out in 30000ms. Boundarytests/boundary/filesystem/peResources.test.tspassed on both shards (562ms and 463ms). This PR does not change PE inspection.Compatibility, safety, and release
rea-provider-root. One-shot CLIprocess.exitreports a failed worker shutdown and exits non-zero, except a closed stdout pipe, which stays 141. A thrown dispatch still reaches that cleanup. A replaced worker is closed before the next process starts. A failed close does not start that next process. A worker parked during that close stays owned.Author readiness
Human owner: @morluto
Before merge
Profile evidence, same VM:
compileSourceTextModule23.2%, GC 8.1%, idle 7.6%. Ready handshake about 164–216ms. Per-file work after ready had no single dominant frame.a/package.jsonat 45ms).javascriptLoaderReviewBoundaries.test.ts: 60.28s → 30.77s. Steady cases fell under Vitest’s 300ms slow-test print; they were about 420–460ms before.javascriptFactoryCompletion.test.ts: 34.88s → 21.57s (hot test 24482ms → 11595ms).Review follow-up on
2a94716e: a limit change whose previous worker cannot be stopped fails the request before a replacement starts, and that worker stays owned. Shutdown remains one shared close. A limit change claims the slot only when it is still empty. Later close hooks still run when an earlier hook fails.peResourcesacceptance timeout is the same single failure on mainc324d31bshard 7/8. It is not fixed in this PR.This branch includes
origin/mainthrough5eebe2fd, which treats omittedexactOptionalinputs as optional. No product conflict edits were required.Not changed: shard count, cancel-in-progress, workflow concurrency, the shared compiled CLI session from #5676 / #5784, and PE resource tests.
type(scope): outcome.No linked issue: this follows measured CI file time after #5799, and the timings above are the report. No user-visible CLI/MCP output change on the successful analysis path, so there is no new sample output. A failed worker shutdown on one-shot exit, and a limit change that cannot stop the previous worker, are error paths.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.