[PR #3850] [CLOSED] fix(browser): keep a CDP inventory unknown when the producer omits it #5946

Closed
opened 2026-10-31 01:10:39 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/3850
Author: @YunzhouLi-hub
Created: 10/15/2026
Status: ❌ Closed

Base: main ← Head: fix/browser-3376-3379-unknown-inventories


📝 Commits (3)

  • 49e4c7c fix(browser): keep a CDP inventory unknown when the producer omits it
  • 63132b4 Merge remote-tracking branch 'origin/main' into sweep/3850
  • 504f896 test(browser): restore the frame regression and pin the subtree ledger

📊 Changes

14 files changed (+891 additions, -50 deletions)

View changed files

📝 src/browser/CdpCaptureDocuments.test.ts (+116 -1)
📝 src/browser/CdpCaptureDocuments.ts (+27 -5)
📝 src/browser/CdpCaptureEventHandlers.ts (+2 -2)
📝 src/browser/CdpCaptureEventHelpers.ts (+2 -2)
📝 src/browser/CdpCaptureStorage.ts (+2 -2)
📝 src/browser/CdpCaptureStorageFingerprints.ts (+9 -9)
📝 src/browser/CdpCaptureValues.test.ts (+28 -1)
📝 src/browser/CdpCaptureValues.ts (+18 -7)
➕ src/browser/CdpCaptureWorkers.test.ts (+266 -0)
📝 src/browser/CdpElectronInspection.test.ts (+390 -10)
📝 src/browser/CdpElectronInspection.ts (+14 -7)
📝 src/browser/CdpPageCapture.ts (+1 -0)
📝 src/browser/CdpPageCaptureWorkers.ts (+14 -2)
📝 src/browser/CdpWebMcpDiscovery.ts (+2 -2)

📄 Description

Summary

recordsValue collapsed three producer states that differ on the wire into one empty array: a present empty array, a missing or non-array field, and an array carrying malformed entries. Callers that must report coverage read "no nodes" for a producer that never answered, so inspect_web_page and inspect_electron_page reported complete coverage and their comparison reported the section unchanged.

Fixes #3376
Fixes #3379

Problem and expected behavior

Smallest trigger — a DOM.getAccessibilityTree (web) or Page.getResourceTree / DOMSnapshot.captureSnapshot (Electron) answer whose inventory field is absent, null, or a non-array:

{ "frameTree": { "frame": { "id": "f", "url": "file:///app/index.html" } } }

Violated invariant — AGENTS.md: "Unresolved identity or applicability must remain unknown rather than be treated as absent, foreign, or aligned." An unanswered command was reported as an examined, empty inventory.

Expected behavior — an absent or non-array field leaves the corresponding unavailable_sections / excluded entry populated and moves the capture off complete_within_window, while a genuinely present empty array still reports a complete empty inventory.

Change and scope

The producing boundary is src/browser/CdpCaptureValues.ts. recordsValue is replaced by two exports:

  • admitRecords(value) returns undefined for an absent or non-array field, so only a present array carries producer evidence.
  • admittedRecords(value) keeps the previous per-entry record filtering for callers that do not account for omissions. Its doc comment states that malformed entries are dropped without a count and names admitRecords as the alternative.

recordsValue is deleted rather than left as an alias, because leaving it would leave the collapsing default available to the next caller. Ten call sites that need no ledger are a pure rename; their behavior is byte-for-byte unchanged.

Six call sites whose completeness ledger must reflect an unanswered command now use admission plus a per-entry recordValue check, matching the web-side captureResources idiom that already exists at src/browser/CdpCaptureDocuments.ts:103-114:

Site Section Behavior
CdpCaptureDocuments.ts captureAccessibility accessibility exclude("accessibility", "invalid_protocol_value", null)
CdpElectronInspection.ts captureResources resources exclude("resources", "invalid_protocol_value", null)
CdpElectronInspection.ts captureDom dom exclude("dom", "invalid_protocol_value", null)
CdpPageCaptureWorkers.ts captureWorkers workers unavailable("workers")
CdpElectronWorkers.ts captureElectronWorkers workers unavailable("workers")

Electron captureResources also drops its hand-written breadth-first walk in favour of the shared walkFrameTrees traversal, which already reports malformed child frame subtrees. The superseded representation and its missing ledger disappear in the same change.

captureDom stops entirely when the string table is absent. Without it, documentURL indices cannot be resolved, and continuing would fabricate empty names and misattribute every document as out_of_target_scope — a policy exclusion that lands in policy_filtered_sections instead of unavailable_sections, which is the wrong cause.

Intentionally not included — thirteen further call sites have no reachable completeness ledger and are reported as remaining cleanup rather than changed here:

  • CdpCaptureDocuments.ts accessibilityStates: a malformed state property is dropped without a count and treeIncomplete cannot see it. Reporting it needs a new schema field, which belongs to its own change.
  • CdpCaptureStorageFingerprints.ts (eight sites): already carries its own Array.isArray guards and a cookies.length !== cookieValues.length drop counter.
  • CdpCaptureStorage.ts, CdpCaptureEventHelpers.ts, CdpCaptureEventHandlers.ts, CdpWebMcpDiscovery.ts.

Contract and boundary impact

  • Semantic owner and earliest changed stage: src/browser/CdpCaptureValues.ts owns producer-array admission; the earliest changed stage is the CDP answer boundary in captureAccessibility, captureResources, captureDom, captureWorkers, and captureElectronWorkers. No downstream consumer reinterprets a raw field.
  • Contribution scope fit and linked maintainer decision: not applicable — ordinary fix within existing boundaries; no target execution, injection, mutation, or protection recovery.
  • CLI and MCP/tool-catalog contract: no schema, tool name, parameter, or catalog change. inspect_web_page and inspect_electron_page responses gain ledger entries only where the producer did not answer.
  • Provider, bridge, target-format, or platform compatibility: none. Loopback CDP fixtures cover the change; no real Chrome or Electron is required.
  • Evidence, artifact, provenance, or reconstruction contract: completeness.unavailable_sections and completeness.excluded now distinguish provider_unavailable / invalid_protocol_value from an examined empty inventory. src/domain/browserCompleteness.ts:104 already maps unavailableSections to attach_limited, so no schema change was needed.
  • Target selection, authority, upstream behavior, and cleanup details: not applicable — no process is launched, attached to, or mutated.
  • Generated metadata, package, or installation impact: none. No docs/public/product-catalog.json or skills/ output changes.

Expected effects:

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction.
  • Not sure yet; investigation or maintainer guidance needed.

None of the effect boxes apply: this changes how an already-captured CDP answer is interpreted.

Evidence and regression coverage

  • Tests added or updated: 20 new tests across four files. CdpCaptureValues.test.ts (+3) pins the admission contract at the producing boundary. CdpCaptureDocuments.test.ts (+7, 26 total) covers accessibility: a present empty tree stays complete, a missing nodes field, a non-array nodes field, a [null] entry, a mixed [null, valid, "not-a-record"] frame, and a malformed frame beside a legitimately empty sibling. CdpElectronInspection.test.ts (rewritten to 10) covers resources and DOM the same way, including a malformed child frame subtree and a child frame whose resources survive after the parent answered. CdpCaptureWorkers.test.ts (new, 7) covers the cross-adapter Target.getTargets defect on both the web and Electron sides.
  • Base reproduction or other evidence: the admission boundary was reverted in place — admitRecords returned [] instead of undefined, which is exactly the old collapsing primitive — and 12 of the 47 tests failed, one per affected section:
src/browser/CdpCaptureValues.test.ts > keeps an absent field distinct from a present empty array
src/browser/CdpCaptureDocuments.test.ts > reports a frame that answered without its node inventory
src/browser/CdpCaptureDocuments.test.ts > reports a non-array node inventory rather than an empty tree
src/browser/CdpCaptureDocuments.test.ts > distinguishes a malformed frame from a legitimately empty sibling
src/browser/CdpElectronInspection.test.ts > reports a frame whose resource inventory is missing rather than empty
src/browser/CdpElectronInspection.test.ts > reports a non-array resource inventory rather than empty
src/browser/CdpElectronInspection.test.ts > keeps a child frame's authorized resources after its parent answered
src/browser/CdpElectronInspection.test.ts > reports a snapshot without its string table rather than empty names
src/browser/CdpElectronInspection.test.ts > reports a snapshot whose documents field is not an array
src/browser/CdpCaptureWorkers.test.ts > web: reports a missing target inventory as unavailable rather than no workers
src/browser/CdpCaptureWorkers.test.ts > web: reports a non-array target inventory as unavailable
src/browser/CdpCaptureWorkers.test.ts > Electron: reports a missing target inventory as unavailable rather than no workers

The representative assertion on the base revision:

-   "excluded": [{ "count": null, "reason": "invalid_protocol_value", "section": "resources" }],
-   "unavailable_sections": ["resources"],
+   "excluded": [],
+   "unavailable_sections": [],

The remaining eight new tests pass both ways by design: they exercise the per-entry recordValue path, which the base revision already handled, and they are the controls that keep the change from over-reporting.

  • User-visible CLI/MCP output (if applicable): inspect_web_page on a page whose accessibility tree answer omits nodes now reports completeness.unavailable_sections: ["accessibility"], completeness.conditions: ["attach_limited", ...], and status: "attach_limited" instead of complete_within_window.
  • Remaining proof gaps: the thirteen call sites listed under Change and scope keep their current silent-drop behavior; no test pins their ledger because none exists to pin. No real Chrome or Electron session was driven — the change is covered by loopback CDP fixtures, which is the same boundary the existing browser tests use.

For evidence-bearing changes:

  • 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

All commands run on the rebased base 788864d52 (perf(javascript): index object literal members for exact-key reference lookup (#3836)):

  • node ./node_modules/typescript/bin/tsc --noEmit -p tsconfig.json — clean.
  • npm run check:fast — 2/2 tasks successful (typecheck + lint).
  • npm run test:local -- src/browser/CdpCaptureValues.test.ts src/browser/CdpElectronInspection.test.ts src/browser/CdpCaptureWorkers.test.ts src/browser/CdpCaptureDocuments.test.ts — 4 files, 47/47 passed.
  • npm run test:local -- all 34 src/browser/*.test.ts files — 452/452 passed.
  • npm run test:local -- tests/evaluation/moduleBoundaries.test.ts — 113/113 passed.
  • npm run verify:test-discovery — "Discovered all 1313 test files exactly once."
  • npx oxfmt --check src/browser/ — all matched files use the correct format.
  • npm run docs:check — 4/5 tasks pass. artifacts:managed-evidence fails with EPERM: operation not permitted, mkdtemp 'C:\Users\ADMINI~1\AppData\Local\Temp\rea-managed-conformance-XXXXXX'; the same failure reproduces on a clean tree with no changes, so it is environmental and unrelated.

Real Hopper/Ghidra, browser, or OS coverage: not applicable — no native provider, browser, or OS surface is touched.

Compatibility, safety, and release

  • Breaking changes or migration steps: none. The two replaced exports are internal to src/browser/; no public CLI, MCP, or package surface changes. admitRecords and admittedRecords replace recordsValue, which had no external consumers.
  • Real Hopper/Ghidra, browser, or OS coverage: none required. The affected boundary is the CDP answer interpreter, exercised through loopback fixtures; driving a real Chrome or Electron would exercise the same code with no additional coverage of the changed branch.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: the change only makes an unanswered producer state visible. No new file, network, process, or credential surface.

Author readiness

Human owner: @YunzhouLi-hub

  • 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.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

Follow-up: review-requested test repairs (commit 504f896fb)

baron's CHANGES_REQUESTED and greptile-apps' three inline findings are addressed:

  1. Restored the parameterized captureFrames regression for malformed child frame IDs (7 and undefined) that the Electron test rewrite had removed: a malformed child ID must reach unavailable_sections: ["frames"] as invalid_protocol_value with count: 1, must not reach policy_filtered_sections, and conditions must contain attach_limited.
  2. Pinned the malformed child frame subtree test with resources: [] on the child, so it no longer passes when the childFrames ledger breaks; the exact { section: "resources", reason: "invalid_protocol_value", count: null } entry is asserted.
  3. Removed the unused admittedRecords import from src/browser/CdpPageCaptureWorkers.ts.

Local results on this head: tsc --noEmit clean; 293 tests across the 25 src/browser/*.test.ts files; tests/evaluation/moduleBoundaries.test.ts 113; npm run check:fast 2/2; npm run verify:test-discovery 1322 files once; npx oxfmt --check src/browser/ clean.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/morluto/rea/pull/3850 **Author:** [@YunzhouLi-hub](https://github.com/YunzhouLi-hub) **Created:** 10/15/2026 **Status:** ❌ Closed **Base:** `main` ← **Head:** `fix/browser-3376-3379-unknown-inventories` --- ### 📝 Commits (3) - [`49e4c7c`](https://github.com/morluto/rea/commit/49e4c7c8bf9a21ea3ecb9cf80b72ff8d0d49212e) fix(browser): keep a CDP inventory unknown when the producer omits it - [`63132b4`](https://github.com/morluto/rea/commit/63132b4fca6b01c6fb0a48673e55e9e500da9b09) Merge remote-tracking branch 'origin/main' into sweep/3850 - [`504f896`](https://github.com/morluto/rea/commit/504f896fbeacabc427fada44e10ab8ffb9f42523) test(browser): restore the frame regression and pin the subtree ledger ### 📊 Changes **14 files changed** (+891 additions, -50 deletions) <details> <summary>View changed files</summary> 📝 `src/browser/CdpCaptureDocuments.test.ts` (+116 -1) 📝 `src/browser/CdpCaptureDocuments.ts` (+27 -5) 📝 `src/browser/CdpCaptureEventHandlers.ts` (+2 -2) 📝 `src/browser/CdpCaptureEventHelpers.ts` (+2 -2) 📝 `src/browser/CdpCaptureStorage.ts` (+2 -2) 📝 `src/browser/CdpCaptureStorageFingerprints.ts` (+9 -9) 📝 `src/browser/CdpCaptureValues.test.ts` (+28 -1) 📝 `src/browser/CdpCaptureValues.ts` (+18 -7) ➕ `src/browser/CdpCaptureWorkers.test.ts` (+266 -0) 📝 `src/browser/CdpElectronInspection.test.ts` (+390 -10) 📝 `src/browser/CdpElectronInspection.ts` (+14 -7) 📝 `src/browser/CdpPageCapture.ts` (+1 -0) 📝 `src/browser/CdpPageCaptureWorkers.ts` (+14 -2) 📝 `src/browser/CdpWebMcpDiscovery.ts` (+2 -2) </details> ### 📄 Description ## Summary `recordsValue` collapsed three producer states that differ on the wire into one empty array: a present empty array, a missing or non-array field, and an array carrying malformed entries. Callers that must report coverage read "no nodes" for a producer that never answered, so `inspect_web_page` and `inspect_electron_page` reported complete coverage and their comparison reported the section unchanged. Fixes #3376 Fixes #3379 ## Problem and expected behavior Smallest trigger — a `DOM.getAccessibilityTree` (web) or `Page.getResourceTree` / `DOMSnapshot.captureSnapshot` (Electron) answer whose inventory field is absent, `null`, or a non-array: ```json { "frameTree": { "frame": { "id": "f", "url": "file:///app/index.html" } } } ``` Violated invariant — AGENTS.md: "Unresolved identity or applicability must remain unknown rather than be treated as absent, foreign, or aligned." An unanswered command was reported as an examined, empty inventory. Expected behavior — an absent or non-array field leaves the corresponding `unavailable_sections` / `excluded` entry populated and moves the capture off `complete_within_window`, while a genuinely present empty array still reports a complete empty inventory. ## Change and scope The producing boundary is `src/browser/CdpCaptureValues.ts`. `recordsValue` is replaced by two exports: - `admitRecords(value)` returns `undefined` for an absent or non-array field, so only a present array carries producer evidence. - `admittedRecords(value)` keeps the previous per-entry record filtering for callers that do not account for omissions. Its doc comment states that malformed entries are dropped without a count and names `admitRecords` as the alternative. `recordsValue` is deleted rather than left as an alias, because leaving it would leave the collapsing default available to the next caller. Ten call sites that need no ledger are a pure rename; their behavior is byte-for-byte unchanged. Six call sites whose completeness ledger must reflect an unanswered command now use admission plus a per-entry `recordValue` check, matching the web-side `captureResources` idiom that already exists at `src/browser/CdpCaptureDocuments.ts:103-114`: | Site | Section | Behavior | | --- | --- | --- | | `CdpCaptureDocuments.ts` `captureAccessibility` | `accessibility` | `exclude("accessibility", "invalid_protocol_value", null)` | | `CdpElectronInspection.ts` `captureResources` | `resources` | `exclude("resources", "invalid_protocol_value", null)` | | `CdpElectronInspection.ts` `captureDom` | `dom` | `exclude("dom", "invalid_protocol_value", null)` | | `CdpPageCaptureWorkers.ts` `captureWorkers` | `workers` | `unavailable("workers")` | | `CdpElectronWorkers.ts` `captureElectronWorkers` | `workers` | `unavailable("workers")` | Electron `captureResources` also drops its hand-written breadth-first walk in favour of the shared `walkFrameTrees` traversal, which already reports malformed child frame subtrees. The superseded representation and its missing ledger disappear in the same change. `captureDom` stops entirely when the string table is absent. Without it, `documentURL` indices cannot be resolved, and continuing would fabricate empty names and misattribute every document as `out_of_target_scope` — a policy exclusion that lands in `policy_filtered_sections` instead of `unavailable_sections`, which is the wrong cause. Intentionally not included — thirteen further call sites have no reachable completeness ledger and are reported as remaining cleanup rather than changed here: - `CdpCaptureDocuments.ts` `accessibilityStates`: a malformed state property is dropped without a count and `treeIncomplete` cannot see it. Reporting it needs a new schema field, which belongs to its own change. - `CdpCaptureStorageFingerprints.ts` (eight sites): already carries its own `Array.isArray` guards and a `cookies.length !== cookieValues.length` drop counter. - `CdpCaptureStorage.ts`, `CdpCaptureEventHelpers.ts`, `CdpCaptureEventHandlers.ts`, `CdpWebMcpDiscovery.ts`. ## Contract and boundary impact - **Semantic owner and earliest changed stage:** `src/browser/CdpCaptureValues.ts` owns producer-array admission; the earliest changed stage is the CDP answer boundary in `captureAccessibility`, `captureResources`, `captureDom`, `captureWorkers`, and `captureElectronWorkers`. No downstream consumer reinterprets a raw field. - **Contribution scope fit and linked maintainer decision:** not applicable — ordinary fix within existing boundaries; no target execution, injection, mutation, or protection recovery. - **CLI and MCP/tool-catalog contract:** no schema, tool name, parameter, or catalog change. `inspect_web_page` and `inspect_electron_page` responses gain ledger entries only where the producer did not answer. - **Provider, bridge, target-format, or platform compatibility:** none. Loopback CDP fixtures cover the change; no real Chrome or Electron is required. - **Evidence, artifact, provenance, or reconstruction contract:** `completeness.unavailable_sections` and `completeness.excluded` now distinguish `provider_unavailable` / `invalid_protocol_value` from an examined empty inventory. `src/domain/browserCompleteness.ts:104` already maps `unavailableSections` to `attach_limited`, so no schema change was needed. - **Target selection, authority, upstream behavior, and cleanup details:** not applicable — no process is launched, attached to, or mutated. - **Generated metadata, package, or installation impact:** none. No `docs/public/product-catalog.json` or `skills/` output changes. Expected effects: - [ ] Read existing files or captured data. - [ ] Launch or attach to a process. - [ ] Inject instrumentation or run scripts/code. - [ ] Change process memory, registers, files, or configuration. - [ ] Contact network services. - [ ] Recover protected code or work around protections. - [ ] Documentation or usability only; no target interaction. - [ ] Not sure yet; investigation or maintainer guidance needed. None of the effect boxes apply: this changes how an already-captured CDP answer is interpreted. ## Evidence and regression coverage - **Tests added or updated:** 20 new tests across four files. `CdpCaptureValues.test.ts` (+3) pins the admission contract at the producing boundary. `CdpCaptureDocuments.test.ts` (+7, 26 total) covers accessibility: a present empty tree stays complete, a missing `nodes` field, a non-array `nodes` field, a `[null]` entry, a mixed `[null, valid, "not-a-record"]` frame, and a malformed frame beside a legitimately empty sibling. `CdpElectronInspection.test.ts` (rewritten to 10) covers resources and DOM the same way, including a malformed child frame subtree and a child frame whose resources survive after the parent answered. `CdpCaptureWorkers.test.ts` (new, 7) covers the cross-adapter `Target.getTargets` defect on both the web and Electron sides. - **Base reproduction or other evidence:** the admission boundary was reverted in place — `admitRecords` returned `[]` instead of `undefined`, which is exactly the old collapsing primitive — and 12 of the 47 tests failed, one per affected section: ``` src/browser/CdpCaptureValues.test.ts > keeps an absent field distinct from a present empty array src/browser/CdpCaptureDocuments.test.ts > reports a frame that answered without its node inventory src/browser/CdpCaptureDocuments.test.ts > reports a non-array node inventory rather than an empty tree src/browser/CdpCaptureDocuments.test.ts > distinguishes a malformed frame from a legitimately empty sibling src/browser/CdpElectronInspection.test.ts > reports a frame whose resource inventory is missing rather than empty src/browser/CdpElectronInspection.test.ts > reports a non-array resource inventory rather than empty src/browser/CdpElectronInspection.test.ts > keeps a child frame's authorized resources after its parent answered src/browser/CdpElectronInspection.test.ts > reports a snapshot without its string table rather than empty names src/browser/CdpElectronInspection.test.ts > reports a snapshot whose documents field is not an array src/browser/CdpCaptureWorkers.test.ts > web: reports a missing target inventory as unavailable rather than no workers src/browser/CdpCaptureWorkers.test.ts > web: reports a non-array target inventory as unavailable src/browser/CdpCaptureWorkers.test.ts > Electron: reports a missing target inventory as unavailable rather than no workers ``` The representative assertion on the base revision: ``` - "excluded": [{ "count": null, "reason": "invalid_protocol_value", "section": "resources" }], - "unavailable_sections": ["resources"], + "excluded": [], + "unavailable_sections": [], ``` The remaining eight new tests pass both ways by design: they exercise the per-entry `recordValue` path, which the base revision already handled, and they are the controls that keep the change from over-reporting. - **User-visible CLI/MCP output (if applicable):** `inspect_web_page` on a page whose accessibility tree answer omits `nodes` now reports `completeness.unavailable_sections: ["accessibility"]`, `completeness.conditions: ["attach_limited", ...]`, and `status: "attach_limited"` instead of `complete_within_window`. - **Remaining proof gaps:** the thirteen call sites listed under Change and scope keep their current silent-drop behavior; no test pins their ledger because none exists to pin. No real Chrome or Electron session was driven — the change is covered by loopback CDP fixtures, which is the same boundary the existing browser tests use. For evidence-bearing changes: - [x] Observed, derived, and inferred claims remain distinguishable. - [x] Artifact identity, source provenance, and failed attempts remain preserved. - [x] Unsupported, incomplete, unavailable, or uncertain outcomes remain visible. ## Validation performed All commands run on the rebased base `788864d52` (`perf(javascript): index object literal members for exact-key reference lookup (#3836)`): - `node ./node_modules/typescript/bin/tsc --noEmit -p tsconfig.json` — clean. - `npm run check:fast` — 2/2 tasks successful (typecheck + lint). - `npm run test:local -- src/browser/CdpCaptureValues.test.ts src/browser/CdpElectronInspection.test.ts src/browser/CdpCaptureWorkers.test.ts src/browser/CdpCaptureDocuments.test.ts` — 4 files, 47/47 passed. - `npm run test:local --` all 34 `src/browser/*.test.ts` files — 452/452 passed. - `npm run test:local -- tests/evaluation/moduleBoundaries.test.ts` — 113/113 passed. - `npm run verify:test-discovery` — "Discovered all 1313 test files exactly once." - `npx oxfmt --check src/browser/` — all matched files use the correct format. - `npm run docs:check` — 4/5 tasks pass. `artifacts:managed-evidence` fails with `EPERM: operation not permitted, mkdtemp 'C:\Users\ADMINI~1\AppData\Local\Temp\rea-managed-conformance-XXXXXX'`; the same failure reproduces on a clean tree with no changes, so it is environmental and unrelated. Real Hopper/Ghidra, browser, or OS coverage: not applicable — no native provider, browser, or OS surface is touched. ## Compatibility, safety, and release - **Breaking changes or migration steps:** none. The two replaced exports are internal to `src/browser/`; no public CLI, MCP, or package surface changes. `admitRecords` and `admittedRecords` replace `recordsValue`, which had no external consumers. - **Real Hopper/Ghidra, browser, or OS coverage:** none required. The affected boundary is the CDP answer interpreter, exercised through loopback fixtures; driving a real Chrome or Electron would exercise the same code with no additional coverage of the changed branch. - **Package or release metadata impact:** none. - **Security, privacy, process, or containment review:** the change only makes an unanswered producer state visible. No new file, network, process, or credential surface. ## Author readiness Human owner: @YunzhouLi-hub - [ ] 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. ## Before merge - [ ] This PR addresses a concrete problem or an agreed enhancement. - [ ] Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff. - [ ] The PR has one focused outcome and the title follows `type(scope): outcome`. - [ ] Related issue is linked, or the reason for not linking one is stated above. - [ ] Tests cover changed observable behavior and meaningful failure paths. - [ ] Owning docs, contracts, and generated metadata are updated where needed. - [ ] User-visible CLI/MCP changes include representative output. - [ ] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. --- ### Follow-up: review-requested test repairs (commit `504f896fb`) baron's CHANGES_REQUESTED and greptile-apps' three inline findings are addressed: 1. **Restored the parameterized `captureFrames` regression** for malformed child frame IDs (`7` and `undefined`) that the Electron test rewrite had removed: a malformed child ID must reach `unavailable_sections: ["frames"]` as `invalid_protocol_value` with `count: 1`, must **not** reach `policy_filtered_sections`, and `conditions` must contain `attach_limited`. 2. **Pinned the malformed child frame subtree test** with `resources: []` on the child, so it no longer passes when the `childFrames` ledger breaks; the exact `{ section: "resources", reason: "invalid_protocol_value", count: null }` entry is asserted. 3. **Removed the unused `admittedRecords` import** from `src/browser/CdpPageCaptureWorkers.ts`. Local results on this head: `tsc --noEmit` clean; 293 tests across the 25 `src/browser/*.test.ts` files; `tests/evaluation/moduleBoundaries.test.ts` 113; `npm run check:fast` 2/2; `npm run verify:test-discovery` 1322 files once; `npx oxfmt --check src/browser/` clean. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-10-31 01:10:39 +00:00
Sign in to join this conversation.
No milestone
No project
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#5946
No description provided.