Skip to content

fix(browser): preserve passive network inventory uncertainty - #3082

Merged
N0zoM1z0 merged 38 commits into
morluto:mainfrom
To3akaRin:codex/browser-request-inventory-coverage
Oct 14, 2026
Merged

N0zoM1z0 merged 38 commits into
morluto:mainfrom
To3akaRin:codex/browser-request-inventory-coverage

Conversation

@To3akaRin

@To3akaRin To3akaRin commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

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

  • Keep identity/type ambiguity, selected-content projection and HTTP/WebSocket inventory coverage with webCaptureDiff.ts.
  • Exclude potentially matching unknown-type groups before their counts/content fingerprints can invent a match. Skip that endpoint index when all types are known.
  • Select only mutually known redirect metadata, including resource type, and have that owner report completeness directly.
  • With incomplete HTTP inventory, compare distinct known content samples without claiming duplicate request multiplicity. WebSocket stream inventories/counts require complete WebSocket coverage. Independently known metadata and complete-inventory count changes remain reportable.
  • Hash HTTP rows during projection and retain digests rather than an intermediate collection of raw projection objects.
  • Give each public CLI case its own deadline and reuse one owned SDK connection for the MCP matrix. No timeout, retry, assertion or CI selection was loosened.

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:

  • Original domain cases: 35 passed after integration. New known↔missing redirect-type cases failed in both directions before repair. Three dropped/truncated/unavailable duplicate-request cases also failed before repair.
  • Current domain suite: 45 passed, including negative and positive redirect, HTTP and WebSocket controls. Incomplete capture keeps known metadata changes while retaining uncertainty about counts/absence.
  • Full related selection: 196 passed / 3 conditionally skipped across 13 files, including JavaScript configuration/cancellation, JSON, SAZ, CLI and real stdio MCP. The initial aggregate CLI case exceeded its 30-second deadline; splitting its cases fixed this structural failure without increasing timeouts.
  • Public matrix: 20 individually tested CLI comparisons plus 20 comparisons on one production SDK connection; 21 tests passed. After current main's contract updates, 51 tests across the public comparison selections passed.
  • npm run check, npm run docs:check and npm run verify:test-discovery passed; 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 → 201 was correctly reported as one metadata modification. A separately labelled derivative with one optional redirect type omitted returned unknown in both directions. An initial navigation attempt correctly returned target_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.

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

To3akaRin and others added 3 commits October 14, 2026 09:41
…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>
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Repo admins can enable using credits for code reviews in their settings.

@greptile-apps

greptile-apps Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

RetriggerView in GreptileConfidence Score: 5/5 Tier: plus

[Medium impact] The PR appears safe to merge; no new actionable defects were found.

Summary

Preserves uncertainty when passive network captures omit request types or inventory entries.

  • Browser comparisons keep HTTP and WebSocket uncertainty separate.
  • Unknown process configuration selections keep later reads uncertain.
  • MCP schemas explain linked fields without unsupported dependency keywords.
  • Regression checks keep existing CLI and MCP contracts clear.

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. git diff --check passed; tests were not run. Whether another PR supersedes this one could not be checked because GitHub access was unavailable.

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]
Loading

Reviews (10) · Last reviewed commit: "chore: synchronize passive comparison re..." · Reviewed by Greptile

Comment thread src/domain/webCaptureDiff.ts Resolved
kaoru0822-kitauji and others added 6 commits October 14, 2026 02:01
- 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>
@To3akaRin To3akaRin changed the title fix(browser): preserve request inventory changes with unavailable shapes fix(browser): preserve passive network inventory uncertainty Oct 14, 2026
@greptile-apps

greptile-apps Bot commented Oct 14, 2026

Copy link
Copy Markdown
Contributor

Want your agent to iterate on Greptile's feedback? Try greploops.

kaoru0822-kitauji and others added 14 commits October 14, 2026 02:36
…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>
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)
Comment thread src/domain/webCaptureDiff.ts Resolved
To3akaRin and others added 12 commits October 14, 2026 11:28
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)
@morluto morluto added the bug Something isn't working label Oct 14, 2026
N0zoM1z0 and others added 3 commits October 14, 2026 17:09
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>
@N0zoM1z0
N0zoM1z0 merged commit e79e014 into morluto:main Oct 14, 2026
36 of 39 checks passed
@morluto

morluto commented Oct 20, 2026

Copy link
Copy Markdown
Owner

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants