Repository navigation
fix(browser): preserve passive network inventory uncertainty - #3082
Conversation
…reads Main fails five source tests after 04672f2 and d4bd65c. - Ambient write resolution used the caller's write site for every alias read it reached, so `alias = alias.globalThis` resolved its own self-read only to the reassignment and lost the original `globalThis` identity. Reads reached through an initializer now select initializers at their own position; the written target keeps the caller's write site. - Process escape tracking recorded `Number(process.env.PORT)` and `Number(process.argv[2])` as escapes of the read slot, which dropped the configuration read inside functions. Node stores env values and argv entries as strings, so passing one exposes no mutable object; replacing an entry still records its own write or receiver escape. - The dynamic isolated-world test now expects the direct observation that the proven Webpack bootstrap resolution produces. - The native IDA admission test now matches d4bd65c: attached profiles report the bound document and still refuse address resolution. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits. |
[Medium impact] The PR appears safe to merge; no new actionable defects were found. SummaryPreserves uncertainty when passive network captures omit request types or inventory entries.
Both earlier unnumbered findings are addressed: dropped requests now limit absence claims, and missing types no longer turn repeated requests into false modifications. Reviewed the full PR because the merge-base checks differed. Diagram%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Supplied captures] --> B[Check HTTP inventory]
A --> C[Check WebSocket inventory]
A --> D[Find ambiguous request types]
D --> E[Exclude ambiguous typed groups]
E --> F[Compare known HTTP facts]
B --> F
C --> G[Compare WebSocket facts]
F --> H{Proven difference?}
G --> H
H -->|Yes| I[Changed]
H -->|No| J{All required facts complete?}
J -->|Yes| K[Unchanged]
J -->|No| L[Unknown]
Reviews (10) · Last reviewed commit: "chore: synchronize passive comparison re..." · Reviewed by Greptile |
- Cover configuration reads after passing env/argv values to a call, and keep reads unknown after replacing an argv entry directly, through an alias, or after a container escape. - b58adaf added `resolution_status` to source-map edges. Expect it, and pair each alias edge with the script that declared it instead of relying on content-derived edge ID order. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
e572c38 replaced the localized guide URLs in the translated readmes with repository-relative guide links, so the drift fixture no longer contained `https://rea.tools/zh-CN/guides/native/`. Exercise the same missing-target, wrong-locale, and query drift on a localized showcase link the readme still carries, and add drift for the new relative guide link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Want your agent to iterate on Greptile's feedback? Try greploops. |
…tput b58adaf emits `interpretation: "candidate"` on static endpoint findings, but the worker's strict endpoint schema still rejected the key, so `analyze_javascript_application` failed output validation for any source with a candidate endpoint. Admit the field as an exact optional literal. Update application acceptance and boundary expectations to current main: endpoint identity keys tag literal values (88afcc7), source-map observations and edges carry `resolution_status` (b58adaf), and a proven Webpack bootstrap reports bundled contextBridge exposures as direct syntax. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…fails d4bd65c moved a failed LaunchSupport helper's output into the nested `command_outcome`, but the cause projection also returned early for those failures and dropped `launch_support`. A `-vmargs` failure therefore lost the warning that the successful `-envvars` helper had already reported. Keep the retained helper outputs and skip only the launcher outcome that the nested cause now owns. Update the Ghidra launch and Hopper startup boundary expectations to current main: failed helpers report through `cause.command_outcome`, and bridge startup results carry the launched `processId` (599a8ee), asserted against the exact retried process. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Chrome's DOMSnapshot interns empty or null strings as index -1. bffdd91 began rejecting every negative string index, so real Chrome snapshots lost each element node (whose nodeValue is -1) and any node with an empty attribute value, and the headless Chrome SVG xlink:href lanes found no anchors. Simulated snapshots interned "" as a table entry and missed it. Parse snapshot strings at one owner: names still require a table entry, while node values, attribute values, and baseURL accept -1 as "". The SVG ancestry projection shares the same parser instead of its own copy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29a2d13 classifies an over-budget expanded SAZ archive as invalid input with an out_of_range `capture_path` issue that names the expanded-byte maximum. Assert that projection through the CLI instead of the previous execution failure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…acement DirectoryArtifactReader yields a directory's entries in `opendir()` order and reads queued child directories only after that directory is exhausted. The root-replacement test assumed APFS order (`sub` before `sample.txt`), so it failed on Linux ext4. Require both root entries in either order before the descent into the replaced root is rejected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The exact-selection tests from 4d4631a match the child Vitest summary as plain text. In the CI lane the child inherited color, so ANSI styling split "Test Files 2 passed" and both tests failed there while passing locally; `FORCE_COLOR=1` reproduces it. Run the child with `NO_COLOR=1`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…er only (cherry picked from commit ea4cfc9)
Assert SAZ expansion-limit code and byte constraint through stdio MCP as well as CLI, without partial results or source mutation. Align schema presentation guidance with canonical runtime partner validation. The general MCP documentation paragraph preserves the upstream explanation from 5447a5d in PR morluto#2877. Co-authored-by: Omisakin Joshua <117924167+thefolahan@users.noreply.github.com> (cherry picked from commit 5d906ecbe1ef7e6ca9e2129dd9dbc25d6145d1e9)
(cherry picked from commit 4dc37dc8210509c66b2fe4313525736978b8bd07)
Check one copy of each generic caveat in the workflow result and one in its Evidence envelope, following the scoped assertion proposed by N0zoM1z0 in PR morluto#2933. Keep distinct caveats and confirm a later trace does not inherit a caveat from an observation only used by the earlier graph. Retain explicit -2 node/attribute value rejection alongside the valid -1 empty-string regression supplied by the upstream browser repair. Validation: 88 source tests, 24 boundary tests (including all three real Chrome SVG/XHTML lanes), npm run check, and test discovery passed on Node 24.18.0/npm 11.16.0 and Chrome 155.0.8059.79 on macOS 15.7.7. (cherry picked from commit 2cd292ca495ddb57fc6ac0f7f51449aa4fc6e95c)
Main d4bd65c intentionally refuses saved Hopper database analysis on macOS because its launcher cannot run the analysis bridge for that target kind. The production stdio smoke test still expected a successful fake reply. Assert the typed target_kind_unsupported Hopper rejection, retained target identity and an unbound provider instead. After the refusal, verify the same stdio session still serves its complete catalog and session status. Retain the structured warning/error record and no-fatal assertions. The unchanged test fails on clean main d901561 and the shared CI repair head 3d3076a. The updated runtime suite and Hopper discovery suite each pass all four cases on macOS 15.7.7, Node 24.18.0 and npm 11.16.0. npm run check passes. These tests use the explicit Node fake launcher; no live Hopper installation or user document is opened or modified. (cherry picked from commit 33ec4cee9c3e982c9712d082aec98fd035ce209f)
…c root 599a8ee replaced the host-wide `ps` scan with a scan of the supplied proc root, but the reparented demo-helper case only mirrored its process into the synthetic root in alternate-launcher mode. The renamed `Xvfb` helper was therefore invisible and the clean-runtime check resolved. Mirror the fixture process in both modes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> (cherry picked from commit d4df0a6)
Preserve the original passive-network commits and current main behavior. Resolve the comparison conflict by retaining main's redirect response field owner together with the PR's per-kind inventory coverage. Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com> Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>
Compare nullable redirect types only where both captures retain them, with completeness owned alongside the shared metadata projection. Hash HTTP rows as they are projected and retain only content digests. Incomplete inventories do not establish duplicate request multiplicity; WebSocket whole-inventory digests also require their own coverage. Keep independently known metadata changes and full-inventory count changes. Cover omissions and positive controls through domain and public CLI/MCP regressions. Give each CLI comparison its own test deadline while reusing one owned MCP connection; preserve existing timeouts and assertions. Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com> Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>
Preserve upstream tuple/schema-profile parity, scoped MCP fault probes, and Frida partial-evidence retention fixes. Revalidate the public comparison and SDK paths against these current contracts. Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com> Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>
|
Thanks for the careful work on #3082, @To3akaRin. The comparison now keeps proven HTTP additions visible while carrying uncertainty through missing metadata and incomplete HTTP or WebSocket coverage; that distinction makes the offline results much more useful to interpret. Great work tracing the edge cases back to the comparison owner. |
Summary
Offline passive network comparisons now preserve uncertainty when request types, selected metadata, or per-kind inventory coverage are incomplete. Missing body/response content no longer erases a proven HTTP addition; incomplete HTTP coverage cannot establish WebSocket absence.
Follow-up to #2609. The original commits/authors are preserved, integrated with main through b8510ee. Additional review reproduced and repaired nullable redirect-type and duplicate-count false modifications.
Change and ownership
webCaptureDiff.ts.Shared fixes already included in the original branch remain: conservative JavaScript process-configuration escapes, malformed JSON rejection coverage, schema-projection documentation, cancellation at controlled child progress boundaries, and SAZ byte/provenance checks. Current main's redirect response owner, tuple/schema-profile fixes and MCP fault barriers are retained.
CLI/MCP schemas, Evidence and session envelopes remain unchanged by the network fix. It compares supplied observations; no new capture, replay, execution, injection or installation authority is added. This is an ordinary correctness fix within existing scope; an additional capability decision is not applicable.
Executed correctness evidence
Linux, Node 24.18.0 / npm 11.16.0; serial two-CPU / 8 GiB guards:
npm run check,npm run docs:checkandnpm run verify:test-discoverypassed; 1,287 test files discovered exactly once. On final head 4121cfa, current-main static checks, docs checks and the six actual-file CLI/SDK comparisons all passed again.Real program/provider evidence: a local HTTP redirect/fetch application in Chromium 153.0.8010.12, observed through the production CDP provider. Two recordings each retained two HTTP requests and one redirect;
200 → 201was correctly reported as one metadata modification. A separately labelled derivative with one optional redirect type omitted returnedunknownin both directions. An initial navigation attempt correctly returnedtarget_changed; changing the probe to fixed-page fetches respected the inspection boundary. Browser/profile cleanup completed.Those actual recordings and the labelled derivative passed six public CLI/real stdio SDK calls, including output-schema validation and unchanged source-file SHA-256 checks. No complete live-CDP inventory, native Windows/macOS execution or deep native provider coverage is claimed. The normalized fixture matrix and amplified benchmark are labelled synthetic.
Performance and context
Equivalent completed domain task with 10,000 synthetic repetitions of a genuine recorded API request: integration baseline first/warm comparisons 334 / 268–273 ms, updated 318 / 259–260 ms. Sampled peak process RSS 181 → 160 MiB; result JSON remained 2,136 bytes. Three samples are observations, not a statistical speedup claim. No persistent cache or new result fields were added.
Real public calls returned 3.7–3.8 KB CLI JSON; final warmed SDK calls took 9 ms after the first 113 ms call (the initial run was 11–13 / 160 ms). SDK full transport responses were 7.7–8.0 KB because they include text and structured content. Agent tokens were not measured. The existing one-time SDK catalog was measured separately at 3.09 MB initially and 3.17 MB after current main's schema changes and is outside this network-change scope.
Full related testing peaked at 2.05 GiB; static checks at 4.46 GiB; real Chromium at 1.10 GiB. No local guard stop or OOM.
Author readiness
Human owner: @N0zoM1z0
Recorded from the owner's explicit standing declarations for the remaining approved bug-fix batch. Technical review and executed evidence above were performed by the agent; ownership remains with the named human.