mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
[PR #6373] [CLOSED] fix(browser): record session load failures only for main-frame documents #7318
Closed
opened 2026-11-01 21:47:00 +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#7318
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/6373
Author: @Adolanium
Created: 10/22/2026
Status: ❌ Closed
Base:
main← Head:fix/observe-session-load-failures📝 Commits (10+)
dbd8aa3fix(browser): record session load failures only for main-frame documents1e48122Merge upstream/main into fix/observe-session-load-failuresa606416test(browser): announce failed main-frame documents in observation window fixtures1100ec5fix(browser): stop tracking main-frame documents once they finish loadingaceaa9cfix(browser): classify session load failures by the failure's resource typeab96b05fix(browser): judge untyped load failures only inside the observation window7395e1efix(browser): keep an omitted request frame unknown for session load failuresf8eab7cfix(browser): report possible document failures without a request ID as unknown70c2de5fix(browser): keep request ownership facts across redirect hops868b36cfix(browser): keep child-frame request ownership across redirect hops📊 Changes
7 files changed (+732 additions, -8 deletions)
View changed files
📝
docs/browser-observation.md(+1 -1)📝
src/browser/CdpCaptureEventHelpers.ts(+4 -0)📝
src/browser/CdpObservationSession.ts(+108 -4)📝
tests/boundary/browser/cdpBrowserProvider.lifecycle_failures.test.ts(+3 -0)📝
tests/boundary/browser/cdpObservationWindowBuffer.test.ts(+26 -2)📝
tests/boundary/browser/cdpObservationWindowScope.test.ts(+562 -1)📝
tests/fixtures/fakeCdpBrowserEvents.ts(+28 -0)📄 Description
Summary
Fixes #6374.
observe_web_sessionwas supposed to record only main-frame load failures, but its filter read aframeIdthat Chrome'sNetwork.loadingFailedevent does not carry. As a result, every failed request in the observed tab was recorded as a sessionload_failedevent, including images, scripts, blocked trackers and iframe documents. A failure is now recorded only when its request was announced as a main-frame Document request.Problem and expected behavior
In
src/browser/CdpObservationSession.ts,TimelineCapture.#loadingFailedskipped a failure only whenparams.frameIdwas present and named another frame. CDP'sNetwork.loadingFailedhasrequestId,timestamp,type,errorTextand related fields, but noframeId. So the filter never excluded anything, and a blocked ad image (net::ERR_BLOCKED_BY_CLIENT) appeared in the session timeline beside a real document failure. The public docs describe the timeline as reload, navigation, redirect, failure and lifecycle metadata for the observed page.Expected: a load failure appears in the timeline only when it belongs to a main-frame document request, the same scope
#redirectalready uses for redirects.Change and scope
TimelineCapturetracks the request IDs of possible main-frame Document requests fromNetwork.requestWillBeSent: thetypeis absent orDocument. For each, it records whether the request declaredDocumentand the frame ID its hops named (parsed withcdpFrameIdfromCdpCaptureEventHelpers.ts, the same non-empty rulecdpFrameIdentityuses, so an empty ID counts as omitted), plus whether hops named different frames. The candidate also records whether that frame was the main frame when a hop first named it. Ownership (main frame, another frame, or unknown) is decided when the failure arrives: a request admitted under the main frame stays main after a root replacement, a request naming a root replacement that commits before the failure is attributed to the new main frame, and a conflict between hops stays unknown. A failure owned by another frame is filtered silently; only unknown ownership reports incomplete coverage. A redirect continues under the same request ID: a later hop that omits a fact keeps what an earlier hop established, and a hop that contradicts it makes that fact unknown. Redirect scoping is unchanged from main.#loadingFailedconsiders a failure only for a tracked request ID, and removes the ID. The failure's owntype, which CDP requires onNetwork.loadingFailed, decides: onlyDocumentis recorded. When the failure omits it, the request's explicitDocumenttype is used. When neither event declares a type, the request omitted its frame, or the failure has no usablerequestId(so it cannot be joined to a frame), the failure is not recorded, and if it falls inside the observation window the timeline is marked incomplete withinvalid_protocol_value, so a main-frame request that omitted its optional type is not treated as proof of a document.Network.loadingFinishedremoves the ID of a finished document. It is handled outside the timeline and never buffered, so subresource completions do not use the pre-arm buffer. Before arming, a finished document's request may still be waiting in that buffer, so its ID stays tracked; such IDs are limited by the buffer's size. Requests are tracked even when theirrequestWillBeSentevent was buffered before the observation window was armed, so a document requested before arming whose failure arrives inside the window is still recorded. The window logic itself is unchanged.docs/browser-observation.mdnow says that main-frame document load failures are recorded and subresource load failures are not.cdpObservationWindowBuffer,cdpObservationWindowScope) sentNetwork.loadingFailedwith aframeIdand no preceding request. They now announce the failed request as a main-frame Document first and omit theframeId, matching CDP. Their timing and window assertions are unchanged.Follow the contribution scope.
Unresolved scope, authority, side effects, or required verification block
integration. Link the required maintainer scope decision for new providers or
capabilities involving target execution, injection, mutation, or protection
recovery; ordinary fixes within existing boundaries may state "not applicable".
Draft PRs may leave the scope decision pending and the readiness and merge checklists
unchecked. Maintainers can help resolve open questions.
Contribution scope: not applicable. This is a fix inside the existing browser observation contract.
Race-specific handling: the root-replacement cases need a cross-process root swap, which is uncommon because most Chrome navigations keep the main frame ID, while a document request is in flight. Without handling, a main-frame document failure is silently missing from the timeline. The handling added for it is one boolean per tracked request (
admittedAsMain) and the classification at failure time. It was requested in review (Codex threads and baron's review); the uncommitted-replacement case was left out as a known limit because it needs pending-navigation correlation. No maintainer decision on this scope is recorded yet.Contract and boundary impact
TimelineCaptureevent admission forNetwork.loadingFailed.observe_web_session/rea observe-web-sessiontimelines no longer containload_failedevents for subresources or iframe documents.requestWillBeSentwas never observed, for example a request already in flight before the event subscription, is not recorded, because its frame cannot be established. The timeline is already reported asattach_limitedfrom the start, which covers facts that depend on events before attachment. Known limits, each needing more than this filter can establish: a root-replacement Document request that fails before its navigation commits is treated as another frame's, because nothing at this boundary distinguishes it from a child frame without pending-navigation correlation; a request whosetypeis an unrecognized string counts as a non-document, since REA has no maintainedResourceTypeparser; and a redirect chain that changes resource type, combined with a failure that omits its requiredtype, is reported asinvalid_protocol_valuerather than ignored.load_failedevents keep their request ID, timestamp and safe error text.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
tests/boundary/browser/cdpBrowserProvider.lifecycle_failures.test.ts, "observes user-driven reload, SPA, redirect, failure, and lifecycle events", now also asserts that the timeline does not contain the subresource'sERR_BLOCKED_BY_CLIENT. The main-frame document failure is still recorded.cdpObservationWindowScope, "records a load failure only for a main-frame document that has not finished": after arming, one document request finishes and then receives a stray failure, and another document request fails. Only the second is recorded. Without theloadingFinishedcleanup, this test fails.cdpObservationWindowScope, "uses the failure's resource type when a main-frame request omits its type": three main-frame requests without a type fail asImage, asDocument, and with no type. Only theDocumentfailure is recorded, and the timeline reportsinvalid_protocol_value. If an untyped request is treated as a document regardless of the failure's type, this test fails.cdpObservationWindowScope, "does not report an untyped failure before the window as incomplete coverage": an untyped request and failure buffered before the window add noload_failedevent and no exclusion. Applying the exclusion before the window check fails this test.cdpObservationWindowScope, "reports a document failure whose request omitted its frame as unknown coverage": a Document request without aframeIdand a child-frame Document request both fail. Neither is recorded. The frameless one adds exactly oneinvalid_protocol_valueexclusion, and the child frame's adds none. Treating an omitted frame as another frame fails this test.cdpObservationWindowScope, "reports a possible document failure without a request ID as unknown coverage": anImagefailure and aDocumentfailure without arequestId. Neither is recorded. Only the Document one adds atimelineinvalid_protocol_valueexclusion (count 1). Dropping it silently fails this test.cdpObservationWindowScope, "keeps main-frame ownership across a redirect hop that omits its frame": a main-frame Document request is redirected under the same ID by a hop without aframeId, then fails. The failure is recorded. Letting the later hop overwrite the earlier facts fails this test.cdpObservationWindowScope, "keeps child-frame ownership across a redirect hop that omits its frame": a child-frame Document request is redirected under the same ID by a hop without aframeId, then fails. The failure is not recorded and no exclusion is added. Not tracking the other-frame first hop fails this test.cdpObservationWindowScope, "attributes a failure to a root replacement that commits after its request" and "keeps contradictory redirect ownership unknown after a later hop agrees again": the first records a Document failure whose request named the replacement frame beforePage.frameNavigatedcommitted it; the second sends hops naming the main frame, a child frame, then the main frame again, and reports the failure as unknown coverage instead of recording it. Classifying the frame when the request arrives fails the first; letting a later hop clear the conflict fails the second.cdpObservationWindowScope, "keeps a former main-frame document failure after a root replacement commits": a Document request namesframe-main, a root replacement commitsreplacement-main, then the request fails. The failure is recorded. Dropping the admission-time fact from#ownershipfails this test only.cdpObservationWindowScope, "treats an empty request frame ID as unknown ownership": a Document request withframeId: ""fails; nothing is recorded and the timeline reportsinvalid_protocol_value. Parsing the frame withcdpStringValueagain fails this test.cdpObservationWindowBufferandcdpObservationWindowScopestill pass with realistic events: failures before the window are dropped, failures inside it are kept, and a zero timestamp is preserved.#loadingFailedrestored to main'sframeIdfilter, the lifecycle test above fails, because the blocked image is recorded. Each new test above also fails when its fix is reverted, as noted in its entry.timeline.For evidence-bearing changes:
Validation performed
On Linux (WSL Ubuntu, Node 24.22.1) at
70d890280(upstream/main015414130merged, including #4040), afternpm ciandnpm run build:cached:npx tsc -p . --noEmitpassed.npx oxfmt --checkon the changed files: clean.npx oxlinton the changed source and test files: 4 warnings, the same as on main.npm run docs:checkpassed.npx vitest run tests/boundary/browser src/browser: 1917 tests passed, 4 skipped, in two runs. Two tests failed intests/boundary/browser/cdpScriptMetadata.test.ts("keeps invalid protocol scripts out of policy filtering", "reports unsupported and invalid script exclusions separately"). They fail the same way on upstream/main015414130without this change; the failure sets are identical.1100ec56cthrough4dac93f6a.At
8789ea7b1(admission-time main-frame ownership), same environment:npx tsc -p . --noEmitpassed;oxfmt --checkclean andoxlint4 warnings (unchanged) on the two changed files;npx vitest run tests/boundary/browser: 1091 passed, 4 skipped, in two runs, with the same twocdpScriptMetadatafailures as main. RemovingadmittedAsMainfrom#ownershipfailed only the new test.docs:checkandsrc/browserwere not re-run for this commit.Compatibility, safety, and release
Author readiness
Human owner: @Adolanium
Before merge
type(scope): outcome.🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.