rea/docs
Jeremy Levartovsky 1ebbc3b371
fix(managed): pair members by declared identity before name-free remaps (#2116)
* fix(managed): pair members by declared identity before name-free remaps

The first matching round keyed methods on signature and normalized CIL,
and fields on signature, without the declared type or name. Identical
members of different types fell into one ambiguous group, so a file
compared with itself reported unknowns, and a lone match across types
was reported as an unchanged exact pair while the member's own
counterpart went unpaired.

Pair by declared type, name, and exact CIL/signature first, then by
declared type, name, and raw signature. The name-free CIL/signature,
field-signature, and structural rounds now run last, as remaps, and
skip a pair across declared identities while either member's own type
and name remain unpaired on the other side.

Nested types that share a bare name still share one declared identity,
so their identical members stay ambiguous in a self-comparison.

* fix(managed): keep members with kept identities out of remap rounds

The cross-identity check applied only to one-to-one groups. A member
whose own declared type and name were still unpaired on the other side
could fall into a larger remap group and be reported ambiguous, and a
blocked candidate could make an otherwise unique remap ambiguous.

A remap round now drops such members before grouping, along with
members whose declaring type is unresolved. Same-identity structural
pairs get their own round before the remaps. Each member's declared
identity is computed once.

Ambiguity limitations now name the evidence a group shares, which
stays true whether the round keyed on names or not.

* fix(managed): keep names in unresolved identities and hold ambiguous ones

A member of an unresolved declaring type had no declared identity, so
the declared-identity rounds keyed it by CIL or signature alone. Two
unresolved members with different names paired as an exact match, and
a file compared with itself reported unresolved members ambiguous.

The declared identity now always includes the name, with a null type
for an unresolved one. Remap rounds still leave such members out.

A remap round now also leaves out a member whose own identity sits in
an ambiguous group on the other side, not only one left one-sided.

The undecoded-counterpart check uses the same declared identity.

* fix(managed): keep remap groups with unresolved owners ambiguous

Remap rounds dropped members of an unresolved declaring type before
grouping. Such a member can be another member's own counterpart, so a
resolved member could remap to a copy in another type while its
unresolved counterpart was reported added.

Unresolved members now join remap grouping, and a group that contains
one stays ambiguous instead of pairing.

The undecoded-counterpart set reuses each member's computed identity.

* fix(managed): keep ownerless members out of declared rounds when shared

A member whose declaring type did not resolve has a declared identity
of a null type and its name. The declared rounds paired two such
same-named members even when the other side also held a resolved
member with the same CIL and signature, which could be the owner. The
old name-free first round reported that group as ambiguous.

An ownerless member now enters the declared rounds only when no other
member on either side shares its exact CIL/signature key, and never
the declared structural round. Otherwise it reaches the remap rounds,
which keep any group with an unresolved member ambiguous.

* fix(managed): keep competitors of an ownerless member out of the declared round

When an ownerless member shares its exact CIL/signature key with another
member on the same side, its owner may be that member. The resolved
members holding the key now stay out of the declared round too, so they
cannot pair and consume the candidate the ownerless member may own, and
the remap round keeps the whole group ambiguous as main does. A lone
ownerless member still pairs with its lone counterpart.

* test(managed): split the ownerless comparison tests under the function length limit

The ownerless describe block reached 181 lines, past oxlint's
max-lines-per-function limit of 150. Move the structural-competitor
case into its own block.

* fix(managed): contest signatures and remap only open candidates

* fix(managed): retain blocked raw-signature choices as unknown

* fix(managed): keep member names in signature contention

* fix(managed): scope residual signature contention by name once

ownerlessContested applies competitionIdentityKey itself, but
unresolvedSignatureAmbiguities passed it keys that were already
name-scoped, so the contested set never matched the groups and the
same-signature, different-body case reported additions and removals
instead of one unknown group. Pass the raw signature key.

* fix(managed): constrain matchObserved to declared members

matchObserved passes its items to matchByKeys, which needs Declared, so
its looser { declaring_type } bound failed typecheck (TS2344, TS2322).

* fix(managed): retain held ownership contention for residual matches

* fix(test): bind workspace fixture in Hopper launch cases

* fix(ci): prepare worker tests and preserve Hopper cleanup ordering

---------

Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
2026-10-14 06:36:43 +08:00
..
.vitepress feat(ghidra): admit 32-bit big-endian PowerPC ELF (#1747) 2026-10-14 06:35:55 +08:00
assets docs: keep license sections text-only 2026-10-10 00:09:46 +08:00
readme docs(readme): restore Greek guide and official-source links (#3021) 2026-10-14 05:45:07 +08:00
releases chore(main): release rea-agents 6.4.0 (#1399) 2026-10-11 11:57:29 +08:00
specs feat(wasm): compare retained core-module interfaces (#2464) 2026-10-13 23:49:04 +08:00
adb-device-analysis.md fix: align MCP archive contracts and documentation (#2478) 2026-10-13 12:06:41 +08:00
android-analysis.md docs(android): link the JADX provider download 2026-10-14 05:25:39 +08:00
apktool-resource-analysis.md fix(apktool): run Windows batch launchers through cmd.exe (#1777) 2026-10-11 17:16:48 +08:00
apple-application-analysis.md fix(apple): limit already-loaded reuse to rpath dependencies (#2292) 2026-10-13 14:40:43 +08:00
architecture.mermaid fix(reverse): reconcile cleanup ownership and mutation diagnostics (#2799) 2026-10-14 04:47:34 +08:00
binary-diagnostics.md fix(pwntools): let callers widen the artifact input bound (#2486) 2026-10-13 21:18:12 +08:00
browser-observation.md fix(browser): report complete storage key inventory changes (#2861) 2026-10-14 03:02:57 +08:00
browser-scenario-contract.md fix(browser): report mismatched event family selection as unknown in capture comparison (#2239) 2026-10-13 02:36:45 +08:00
cli.md feat(native): read embedded cargo-auditable Rust dependency lists (#2456) 2026-10-14 02:50:30 +08:00
client-configuration.md feat(setup): add Kimi Code client support (#2744) 2026-10-13 23:36:54 +08:00
client-verification.md test(evaluation): grade managed agent fixture facts (#1924) 2026-10-13 23:34:17 +08:00
electron-observation.md fix(electron): support packaged app.asar pages and rewritten unpacked companions (#1400) 2026-10-10 23:01:54 +08:00
error-contract.schema.json feat(evm): inspect offline bytecode interfaces through EVMole (#1051) 2026-10-08 15:32:05 +08:00
evm-bytecode.md feat(evm): inspect lossless Solidity terminal CBOR metadata (#2790) 2026-10-13 21:55:30 +08:00
firmware-analysis.md feat(ghidra): admit RISC-V ELF analysis through a pinned generic lane (#2151) 2026-10-13 00:11:35 +08:00
flutter-analysis.md fix(flutter): reject ambiguous ELF mappings and bound note reads (#2334) 2026-10-13 22:13:22 +08:00
frida-instrumentation.md fix(frida): drain admitted operations and honor queued cancellation (#2305) 2026-10-14 02:56:00 +08:00
ghidra-dos.md docs: correct drift and reorganize English guides (#2207) 2026-10-12 22:14:25 +08:00
ghidra-mips.md feat(ghidra): admit recordless legacy MIPS32 ELFs with a pinned 32-bit language (#1898) 2026-10-13 21:42:38 +08:00
ghidra-nativeaot.md docs(nativeaot): document the verified Windows-host parser route (#2497) 2026-10-13 23:48:41 +08:00
ghidra-ppc.md feat(ghidra): admit 32-bit big-endian PowerPC ELF (#1747) 2026-10-14 06:35:55 +08:00
ghidra-provider.md feat(native): search analyzed memory for masked byte patterns (#2341) 2026-10-13 23:41:45 +08:00
ghidra-psp.md feat(ghidra): admit bounded PSP ELF through installed Allegrex (#1599) 2026-10-11 19:47:33 +08:00
ghidra-riscv.md feat(ghidra): support raw NMOS 6502 analysis (#2079) 2026-10-13 21:13:01 +08:00
go-binaries.md feat(go): inspect embedded binary build metadata (#1363) 2026-10-12 11:34:02 +08:00
harmony-analysis.md feat(harmony): project HarmonyOS package inventory evidence (#1447) 2026-10-11 20:09:21 +08:00
http3-capture-lab.md test(http3): add real MITM capture verification lab (#1997) 2026-10-14 01:09:19 +08:00
ida-provider.md fix(ida): report missing tools when a compatibility profile mismatches (#2307) 2026-10-13 21:58:36 +08:00
index.md feat(native): read embedded cargo-auditable Rust dependency lists (#2456) 2026-10-14 02:50:30 +08:00
installation.md fix(process): expose Darwin swiftc compile deadline via env (#2240) 2026-10-14 02:59:54 +08:00
javascript-application-graph.md fix(javascript): retain compiler-dependent module resolution facts 2026-10-13 15:58:25 +08:00
javascript-application-workflows.md fix(javascript): retain getter receivers through local aliases (#2778) 2026-10-13 21:26:13 +08:00
javascript-artifact-reconstruction.md docs: correct drift and reorganize English guides (#2207) 2026-10-12 22:14:25 +08:00
javascript-recovery.md feat(javascript): recover code-split bundles from multiple inputs (#1686) 2026-10-11 18:39:49 +08:00
javascript-runtime-observation.md fix(runtime)!: preserve unknown debugger attachment state 2026-10-12 12:37:00 +08:00
javascript-runtime-reconciliation.md fix: align MCP archive contracts and documentation (#2478) 2026-10-13 12:06:41 +08:00
jeb-analysis.md feat(jeb): add JEB engine provider over its MCP interface (#1536) 2026-10-10 23:03:27 +08:00
managed-code-analysis.md fix(managed): pair members by declared identity before name-free remaps (#2116) 2026-10-14 06:36:43 +08:00
mcp-contracts.md fix(artifacts): compare inventories using declared coverage (#2214) 2026-10-14 03:00:27 +08:00
mcp-prompts.md docs: correct drift and reorganize English guides (#2207) 2026-10-12 22:14:25 +08:00
migration-6.2.md docs: correct MCP error and capture import guidance 2026-10-10 05:41:52 +08:00
native-investigation.md feat(native): search analyzed memory for masked byte patterns (#2341) 2026-10-13 23:41:45 +08:00
packet-captures.md feat(captures): discover installed protocol and field definitions (#2496) 2026-10-13 15:55:25 +09:00
pcap-analysis.md feat(pcap): add bounded capture summaries through CLI and MCP 2026-10-13 04:53:03 +00:00
process-capture.md fix(process): add an opt-in Swift module cache (#2252) 2026-10-13 02:26:16 +08:00
raw-binary.md feat(ghidra): support raw NMOS 6502 analysis (#2079) 2026-10-13 21:13:01 +08:00
reconstruction-obligation-ledgers.md refactor: return complete analysis results inline 2026-09-29 08:07:24 +08:00
reconstruction-readiness.md docs(readiness): align required stage identifier and checks with evaluator (#2200) 2026-10-13 00:15:54 +08:00
recorded-crashes.md feat(recorded-crash): decode AArch64 core register notes (#2505) 2026-10-13 23:48:24 +08:00
releasing.md ci: separate fast feedback from full qualification 2026-10-13 17:09:53 +08:00
reverse-engineering-tools.md fix(reverse): reconcile cleanup ownership and mutation diagnostics (#2799) 2026-10-14 04:47:34 +08:00
roadmap.md docs: remove retired architecture and migration artifacts 2026-10-10 05:41:45 +08:00
rust-binaries.md feat(native): read embedded cargo-auditable Rust dependency lists (#2456) 2026-10-14 02:50:30 +08:00
signal-recordings.md feat(signals): discover installed decoders and option help (#2487) 2026-10-13 15:58:19 +09:00
sqlite-databases.md feat(sqlite): inspect offline snapshots with selective evidence (#2271) 2026-10-12 18:33:23 +00:00
testing.md perf(ci): start source feedback early and diagnose stalled runs (#3013) 2026-10-14 06:07:08 +08:00
tool-design.md docs: define performance priorities for analysis workflows (#2245) 2026-10-13 00:42:06 +08:00
user-visible-errors.csv feat(native): search analyzed memory for masked byte patterns (#2341) 2026-10-13 23:41:45 +08:00
wasm-artifacts.md fix(wasm): report WABT output past its budget as a resource constraint (#2117) 2026-10-14 02:58:41 +08:00
web-network-captures.md feat(analysis-view): report observed query parameter names (#2982) 2026-10-14 04:00:21 +08:00
web-runtime.md fix(browser): treat module-import initiator positions as script positions 2026-10-08 16:44:25 +00:00
web-source-location.md fix(bun): report the real runtime and enforce worker memory budgets on Windows (#1730) 2026-10-11 19:20:00 +08:00
website-module-trace.md feat(browser): trace captured website module imports (#879) 2026-10-07 14:59:52 +08:00
website-script-export.md fix(browser): preserve body API provenance through script export 2026-10-12 14:12:19 +08:00
windows-ghidra-p0.md docs(nativeaot): document the verified Windows-host parser route (#2497) 2026-10-13 23:48:41 +08:00