mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #2881] [CLOSED] fix(javascript): classify member assignment targets as property writes #5465
Closed
opened 2026-10-31 01:06: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#5465
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/2881
Author: @0x-saurabh
Created: 10/13/2026
Status: ❌ Closed
Base:
main← Head:fix/javascript-member-write-classification📝 Commits (4)
fb4b8a4fix(javascript): classify member assignment targets as property writes0439fd2fix(javascript): retain reads for wrapped member update targets0ec4480refactor(javascript): share read-modify-write predicateef85297fix(javascript): resolve wrapped write targets through the shared write-site owner📊 Changes
10 files changed (+297 additions, -49 deletions)
View changed files
📝
src/application/javascript/JavaScriptSemanticGraphBuilder.test.ts(+26 -0)📝
src/domain/javascript/javascriptAstValues.ts(+54 -0)📝
src/domain/javascript/javascriptElectronMemberWrites.ts(+3 -10)📝
src/domain/javascript/javascriptSemanticAnalysis.dataflow.test.ts(+89 -0)📝
src/domain/javascript/javascriptSemanticAnalysis.ts(+9 -6)📝
src/domain/javascript/javascriptSemanticMemberMutations.ts(+3 -6)📝
src/domain/javascript/javascriptSemanticObjects.ts(+27 -9)📝
src/domain/javascript/javascriptSemanticProjection.ts(+26 -8)📝
src/domain/javascript/javascriptSymbolicBindings.test.ts(+28 -0)📝
src/domain/javascript/javascriptSymbolicBindings.ts(+32 -10)📄 Description
Summary
Fixes #2567.
JavaScript semantic analysis classified a member expression as a property write only when its immediate parent was an assignment or update expression. A member that is the target of a destructuring assignment (
[o.count] = [2]), afor...of/for...inhead (for (o.count of list)), ordelete o.counttherefore produced areadobject operation and a falsereads-propertyrelation in the semantic graph, although none of these forms reads the property value.Problem and expected behavior
Smallest trigger:
ir.objectOperationsreported["read"]and the graph projected aread:/countoccurrence with areads-propertyrelation. The violated invariant is the one the sibling member-mutation analysis already follows: these constructs assign into their target and are writes, so the object operation must bewrite, the occurrencewrite:/count, and the relationwrites-property. A directsource.count = 2must stay a write; a plainsource.countaccess, and a member used as a destructuring default value ([v = source.count] = []), must stay reads.Change and scope
The object collector now classifies a member from its owning write site rather than from its immediate parent. When the traversal enters a write site it records each written member leaf, keyed to that site, through the existing
semanticWriteTargetswalker;collectMemberconsumes the entry. Read-before-write is decided from the owning site through a new shared predicate,semanticWriteSiteReadsFirst, so TypeScript-wrapped targets such assource.count!++or(source.count as number) += 1keep their property read (previously these were read-only, since the wrapper hid the assignment parent).The notion of "which constructs are write sites" previously lived inline in
javascriptSemanticMemberMutations.tsand again injavascriptElectronMemberWrites.ts. It is now one exported helper,semanticWriteSiteTarget, injavascriptAstValues.tsnext tosemanticWriteTargets, and the object collector, the member-mutation analysis, the Electron provenance collector, the identifier reference collector, binding assignment, and the symbolic bindings resolver all dispatch through it. No consumer reinterprets the syntax.Review follow-ups on the same owner:
semanticReadsBeforeWritedelegates tosemanticWriteSiteTargetandsemanticWriteSiteReadsFirst(maintainer commit5fbeb4313), so identifier references and member operations share one read-before-write rule.count! += 1,(count as number)++) are classified from their write site through a newsemanticWrappedWriteSitehelper, so the reference collector emits the read and the write, and binding assignment sees through the wrapper so the old exact value is not retained.javascriptSymbolicBindings.ts) dispatches throughsemanticWriteSiteTarget. A direct identifier or member target records its value as before; a destructuring pattern or loop head is flattened withsemanticWriteTargetsand each leaf conservatively invalidates its root binding, so[table[1]] = [replacement]orfor (table[1] of list)no longer leaves a stale bootstrap slot. Wrappers inside a member chain ((table as never)[1]) are unwrapped during the walk, matching the object collector.Not included: the value-projection side (
writes-propertyrelations added from the value analysis) is untouched; this change only removes the false read occurrence and adds the missing write occurrence at the object-operation boundary. No CLI, MCP, or catalog contract changes.Follow the contribution scope.
Contract and boundary impact
collectJavaScriptSemanticObjectsinsrc/domain/javascript/javascriptSemanticObjects.ts(domain static analysis). The graph projection inJavaScriptSemanticGraphObjectProjection.tsconsumes the corrected operation kind unchanged.writes-propertyrelation and loses a falsereads-propertyrelation for the same location. No identity or provenance fields change.docs/public/product-catalog.json), package, or installation impact: none.Expected effects:
Evidence and regression coverage
Tests added or updated (listed per file; the last two bullets are the review follow-ups):
src/domain/javascript/javascriptSemanticAnalysis.dataflow.test.ts: sevenit.eachcases (destructuring assignment, with default, nested, rest,for...ofhead,for...inhead,delete) assertobjectOperationsis exactly["write"]; one control asserts a member in a destructuring default value stays["read"]. Four wrapped read-modify-write cases (source.count!++,source.count! += 1,(source.count as number) += 1,(source.count)++) assert["read", "write"], and two wrapped write-only cases ((source.count as number) = 2,delete source.count!) assert["write"]. The existing direct-assignment and read-modify-write cases remain and still pass.src/domain/javascript/javascriptSemanticAnalysis.dataflow.test.ts(wrapped binding targets):count! += 1; (count as number)++; const copy = count!yields reference rolesread, write, read, write, readand the binding value becomes unknown;count! = 2yields a singlewrite.src/domain/javascript/javascriptSymbolicBindings.test.ts: a bootstrap module slot overwritten through a destructuring assignment, afor...ofhead, or a wrapped member chain makes the laterload(1)unknown.src/application/javascript/JavaScriptSemanticGraphBuilder.test.ts:[source.count] = [2]projects a singlewrite:/countoccurrence with a resolvedwrites-propertyrelation to the/countslot and noreads-propertyrelation.Base reproduction or other evidence: executed. With the source files stashed and only the tests applied, the seven new dataflow cases fail (each reports
["read"]); the direct-assignment control and the default-value control pass. The three TypeScript-wrapped read-modify-write cases fail against the first commit of this PR (write-only) and pass after the second. With the fix applied all cases pass.User-visible CLI/MCP output (if applicable): not applicable.
Remaining proof gaps: none known for the listed forms. Member targets inside destructuring declarations (
const [x] = ...) cannot contain member expressions and are unaffected.Observed, derived, and inferred claims remain distinguishable.
Artifact identity, source provenance, and failed attempts remain preserved.
Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.
Validation performed
npm run test:focused -- src/domain/javascript/javascriptSemanticAnalysis.dataflow.test.ts src/domain/javascript/javascriptSymbolicBindings.test.ts src/domain/javascript/javascriptSemanticAnalysis.member_mutations.test.ts src/application/javascript/JavaScriptSemanticGraphBuilder.test.ts— 4 files, 336 tests passed (at 7051da087).aa3047ad5(tests only) — the five review follow-up cases fail (two wrapped-identifier, three symbolic-bindings); the rest pass.["read"]; both controls pass. Confirms the regression reproduces on the base.npm run check:fast— typecheck and lint, 2 tasks successful (at 7051da087).npm run check:changed— 89 test files, 2000 tests passed (at 7051da087).git diff --check— clean..nvmrc), npm 11.16.0, macOS arm64. No real-provider lane applies.Compatibility, safety, and release
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.