mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 06:45:22 +00:00
Open
opened 2026-10-31 01:11:53 +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#6103
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/4163
Author: @kangyishuai
Created: 10/15/2026
Status: 🔄 Open
Base:
main← Head:feat/4069-ui-state-transition-view📝 Commits (10+)
8ead9e6feat(analysis-view): page retained browser scenario steps and text2155fa2fix(analysis-view): order empty scenario receipt windowsa9b3c8cMerge origin/main into feat/4069-ui-state-transition-view32dc60fchore(adb): keep main's AdbProvider formatting92fe95eMerge origin/main into feat/4069-ui-state-transition-viewd24c2fefix(browser-scenario): reject captures that contradict their selection or start stepb4463fdfix(browser-scenario): keep step completeness equal to its artifacts0cde897fix(browser-scenario): keep capture accounting equal to its steps and events0d50bfefix(browser-scenario): back transaction omissions with per-kind drops1982ecffix(browser-scenario): accept metadata-budget transaction omissions📊 Changes
46 files changed (+6288 additions, -476 deletions)
View changed files
📝
.agents/skills/reverse-engineer-anything/references/runtime-observation.md(+5 -0)📝
docs/browser-scenario-contract.md(+92 -9)📝
docs/mcp-contracts.md(+6 -0)➕
scripts/lib/browser-scenario-view-e2e.mjs(+317 -0)📝
scripts/verify-real-browser.mjs(+4 -0)📝
src/application/analysisView/AnalysisViewService.test.ts(+57 -1)📝
src/application/analysisView/AnalysisViewService.ts(+8 -1)📝
src/application/environment/environmentScenario.test.ts(+12 -11)📝
src/browser/BrowserScenarioPartialObservation.ts(+2 -10)📝
src/browser/PlaywrightBrowserScenarioProvider.ts(+15 -33)➕
src/browser/PlaywrightScenarioEvents.stepAttribution.test.ts(+153 -0)📝
src/browser/PlaywrightScenarioEvents.test.ts(+100 -9)📝
src/browser/PlaywrightScenarioEvents.ts(+8 -9)📝
src/browser/assets/ScenarioScriptCapture.ts(+3 -13)📝
src/browser/assets/ScriptCaptureAdapters.test.ts(+11 -8)📝
src/browser/network/PlaywrightScenarioNetwork.ts(+6 -9)📝
src/cli/analysisViewCommands.ts(+1 -1)📝
src/contracts/analysisViewToolContracts.ts(+2 -2)📝
src/contracts/browserToolContracts.ts(+6 -5)📝
src/domain/analysisView/analysisView.ts(+27 -3)...and 26 more files
📄 Description
Summary
Refs #4069 (RFC: evidence-backed UI state/transition observation primitives). Related: #39 (browser tracker) and draft #4107. #4107 derives one transition from two passive
inspect_web_pagerecords plus a caller-declared external action. This PR projects the steps of one REA-controlledcapture_browser_scenariorun. The two sources differ, and neither introduces a shared "UI state" owner. A shared vocabulary is left for the maintainer discussion in #4069.capture_browser_scenarioalready records a post-action capture for every declared step. Agents still could not read a completed capture step by step:inspect_analysis_viewrejected it as an unsupported parent.compare_web_capturescompares two runs, not consecutive steps within one run.Problem and expected behavior
An external agent reconstructing an application's behavior needs, for each declared step:
It needs this without re-reading the whole capture or re-running the browser.
inspect_analysis_viewreturnedParent Evidence operation "capture_browser_scenario" does not support analysis views(source-derived fromunsupportedParentinsrc/domain/analysisView/analysisView.tson main). An oversized capture could only be exported.{kind: "summary"}{kind: "browser-scenario", collection: "steps", offset, limit}{kind: "browser-scenario", collection: "text", step_index, artifact: "accessibility" | "dom", offset, limit}Change and scope
A new
capture_browser_scenarioparent forinspect_analysis_viewandinspect-analysis-view.without_retained_requestcounts retained transactions whose request event was dropped or never observed.changefrom the previous step's capture, the events received in the step's sequence window, and the network transactions whose retained request event was made at that step, with their own coverage. A transaction without a retained request counts toward no step; an unknown names such transactions. When network was not observed, the count isnullwithnot_requestedcoverage, never0. Every page also carriesenabled_event_familiesandreceived_outside_step_windows.Single owners:
compare_web_capturescomparison owner.browserScenarioDiffEvidencenow exports per-step artifact observation, andbrowserScenarioDiffexports pair classification. Run comparison output is unchanged; see the evidence below.enabledScenarioEventFamilies. The Playwright producer and the view both call it, with no behavior change.The view fails closed on inconsistent recorded data:
step_idand action;step_indexand stay disjoint;scenariofields (start origin, action count, secret references, network content, event families, limits); and each step's artifacts, which followafter_each_stepon every step andat_endon the final one. The producer and the views share one domain owner for the scenario projection and for the per-step artifact selection.Capture schema invariants, added from review.
browserScenarioCaptureSchemanow rejects:scenario_start/goto_startstep whose receipt window starts at event sequence 1, now a shared constant that the producer uses;actionwhen the action did not complete. This is how the producer derives it. The comparison owner's completeness downgrade could no longer be reached, so it now depends only on the action outcome, and the text view reads recorded artifact states directly;events), or that omitseventsdespite connect mode, dropped events, a retained unfinished request, unavailable network content, or a popup while a gap family is selected;network_transaction_rangethat does not match the network events dropped formax-network-transactions(a reason only network kinds may carry), or per-transaction omissions that do not correlate withby_kindin both directions: each omitted kind and budget reason is dropped there, no kind is omitted by more transactions than its drops, and every budget drop of a network kind names its transaction;by_kindrow counting fewer drops than its listed reasons and naming transaction records imply. Becauseby_kindkeeps one count per kind across its reasons, refused-transaction drops are bounded rather than counted, and the omitted range may not exceed that bound. Exact per-reason counts would need a producer format change, which is left for a separate PR;header_valuesand the phase's body selection, or content kept or dropped with no content facet selected;requestevent for one transaction;max_events, or more admitted transactions thanmax_network_transactions.Step-completeness derivation, the popup gap families and the unavailable-content rule now each have one domain owner that the producer uses. Event rules live in
browserScenarioCaptureEvents.tsand the capture fields inbrowserScenarioCaptureFields.ts. The comparison owner's per-step event sections could no longer be reached, so they now reduce to one capture-wide event coverage rule.Omission accounting keeps the producer's admission rule: a popup page refused by an event budget remains an omitted
popup-openedrecord whenever any family is selected, because popup discovery runs for every selected family. The producer's final parse,compare_web_capturesand these views share this schema, so all three reject such inline captures. Producer output already satisfied these rules; see Validation.Inline capture validation boundary. Views and comparisons reject inline captures that:
They do not try to prove that any inline Evidence could have come from the recorder. These remaining recorder guarantees are left for a separate hardening PR:
compare_web_capturesgets them too;by_kind, which would replace the current bounds on refused-transaction drops but is a producer format change;Further findings that only hand-built captures can trigger will be answered with this boundary rather than with new rules here. Findings that affect producer output, view results for producer Evidence, or regressions will still be fixed.
Intentionally not included:
detail: "summary"delivery forcapture_browser_scenario, planned as a separate PR because it changes a producer tool's input.Alternatives rejected:
compare_web_captures: inline-only inputs, a reduced compact schema, and observed/external-service labelling of a derivation.Contract and boundary impact
src/domain/browserScenarioSteps.ts;browserScenarioDiffEvidence.tsandbrowserScenarioDiff.ts;src/domain/analysisView/browserScenarioView*.ts.inspect_analysis_viewandinspect-analysis-view. The tool count stays at 207. Measured byte and token deltas are under Validation.PlaywrightScenarioEventsnow calls the shared family rule. Views accept the current capture schema only.compare_web_capturesnow also rejects inline captures that contradict these capture rules; the producer never wrote such captures. Thecompare_web_capturescontract example now records a consistent launch-mode capture with the producer'sgoto_startstart step.rea.analysis-viewwith confidencederived. It inherits the parent'scontrolled-replayauthority under the existing view rule and links the parent.controlled-replayauthority, so exported bundlescenariosmanifests will list view records with operationinspect_analysis_view. Maintainer input is welcome.Expected effects:
Evidence and regression coverage
src/domain/analysisView/browserScenarioView.test.ts, 13 cases:null, not0;src/domain/browserScenarioDiff.test.ts: a new characterization case pins every incomparable branch with full objects (states, captured-side digest, exact reason).src/application/analysisView/AnalysisViewService.test.ts: authority, links, parameters, and a single subject limitation.tests/boundary/mcp/analysisViewMcp.test.ts: retained parent, Ajv validation against the advertised input and output schemas, and the public error projection.tests/boundary/cli/analysisViewCli.test.ts: portable parent through the compiled CLI.scripts/lib/browser-scenario-view-e2e.mjs: wired intoverify:browser.src/domain/browserScenarioCapture.test.ts: every capture rule, including omission accounting, the popup-discovery case and each event-gap cause. Mutation checks removed each rule branch one at a time, and each removal failed a test.src/browser/PlaywrightScenarioEvents.test.ts: the producer's budget-refused popup page and network metadata over its budget both parse under the schema.src/domain/analysisView/browserScenarioView.test.ts: exact-issue rejection of unselected-family events, of a foreign or failed step 0, of a ledger that contradicts retained text, and of capture accounting that contradicts its steps or omissions.browserScenarioDiff.test.ts,browserCli.test.ts,tests/fixtures/webScriptCapture.ts,ScriptCaptureAdapters.test.tsandwebScriptExport.test.tsnow record producer-shaped captures. Each test keeps its property; for example, differing comparison anchors now come from unrelated events instead of unaccounted sequence gaps.origin/main's comparison implementation in a temporary worktree. The serialized step results were identical, so the shared comparison refactor did not change these outputs.For evidence-bearing changes:
Real step row (Chrome 155, self-owned fixture, trimmed)
Validation performed
All results are on macOS arm64 with Node 24.14.0.
The current head
848847efemerges main524159759(82 new commits). The only conflict was theinspect_analysis_viewdescription, from main's Rust dependency view (#5815). The merge keeps main's text and adds only this PR's browser scenario additions. Main's scenario-producer change only stops passing the already-absoluteexecutable_paththroughresolve(). Main's new optionalresource_rootview field is not set by these views. On this head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on the 42 source test files outsidesrc/application/environment/(692 tests).environmentExport.test.tsfailed (heap-headroom and snapshot-change checks). In another run, 1 test in main'senvironmentBundleWrite.test.tsfailed.524159759worktree, the same file set failed the same way in two runs.npm run test:focusedpassed on 187 boundary, acceptance, contract, catalog, environment and scenario-cleanup files: 1,692 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserfailed before reaching the scenario checks, at main's passive-observation check ("Page-scoped CDP disconnect was not reported as target_terminated", after main's5891bfb30). It fails the same way on a clean main524159759worktree.scenarioViews) passed when run directly: 7 steps, accessibility text reassembled, steps view 14,713 bytes.The previous merge head
29d6cb932merged main4bfdadb7d. The only conflict was theinspect_analysis_viewdescription, from main's Frida session-status summaries (#5661). The merge keeps main's text and adds only this PR's browser scenario additions. Main's other new commits do not touch the browser scenario producer, capture schema, views or scenario fixtures. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 52 source test files (757 tests).npm run test:focusedpassed on 177 boundary, acceptance, contract, catalog, environment and scenario-cleanup files: 1,658 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous merge head
e76981a41merged main17f581ff7. The only conflict was theinspect_analysis_viewdescription, from main's retained GDB and objdump summaries (#5614). The merge keeps main's text and adds only this PR's browser scenario additions. Main's other new commits do not touch the browser scenario producer, capture schema, views or scenario fixtures. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 52 source test files (756 tests).npm run test:focusedpassed on 173 boundary, acceptance, contract, catalog, environment and scenario-cleanup files: 1,632 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous merge head
91cb1b197merged main7d6f90485. The only conflict was theinspect_analysis_viewdescription, from main's model artifact view (#5603). The merge keeps main's text, includinginspect_model_artifact, and adds only this PR's browser scenario additions. Main's other new commits do not touch the browser scenario producer, capture schema, views or scenario fixtures. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 52 source test files (756 tests).npm run test:focusedpassed on 170 boundary, acceptance, contract, catalog, environment and scenario-cleanup files: 1,614 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous merge head
4e25db1b0merged mainc2858d2aa. The only conflicts were theinspect_analysis_viewandinspect-analysis-viewdescriptions, from main's Go build metadata view (#5524). The merge keeps main's text and adds only this PR's browser scenario additions. Main's scenario timer bound (#3515) and session-test cleanup merged cleanly and do not change the capture shape. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 52 source test files (756 tests).npm run test:focusedpassed on 167 boundary, acceptance, contract, catalog, environment and scenario-cleanup files: 1,632 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous head
28af2811dfixed a step-attribution error found in review. It affects real producer output. Step rows used to count a transaction under the step thatscenarioNetworkTransactionsassigned it. When the request event was not retained, that function falls back to the step of the first retained event. The recorder can drop a request overmax_event_allocation_bytesand still keep its response from a later step, and connect mode can attach while a request is in flight.scenarioNetworkTransactionsnow reportsrequest_retained, and step rows count only transactions with a retained request. The summary addswithout_retained_request, and an unknown names those transactions. Comparisons keep their attribution, and fingerprints do not read the new field.PlaywrightScenarioEvents.stepAttribution.test.tsdrives the real recorder until it drops a step-1 request and keeps its step-3 response, then projects the capture through the summary and step views. With every transaction attributed to a step again, the test fails.On that head:
npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 51 source test files (738 tests).npm run test:focusedpassed on 167 boundary, acceptance, contract, catalog, environment and scenario-cleanup files: 1,617 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews. The steps view is 14,747 bytes, unchanged.The previous merge head
43c13190amerged maincf5194f68(41 new commits). The only textual conflict was theinspect_analysis_viewdescription, from main's IL2CPP native-method linking change. The merge keeps main's text and adds only this PR's browser scenario additions. Two main changes touch the scenario producer and merged cleanly:599fdac02waits for late navigation to stop before releasing attached browser sessions.0e83d92c5changesexecutable_pathvalidation.Neither changes the capture's steps, events, completeness or cleanup values, which this PR's schema and views read. On that head:
npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 50 source test files (737 tests), including main's updated scenario session, browser and provider tests.npm run test:focusedpassed on 167 boundary, acceptance, contract, catalog, environment and scenario-cleanup files: 1,617 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true. That includesscenarioViews, the failure scenario, and cleanup recorded asterminated-owned-processin launch mode anddisconnected-externalin connect mode.The previous merge head
d82100dc4merged main21e0c580e. The only conflict was theinspect_analysis_viewdescription, from main's IL2CPP change (#5326). The merge keeps main's text and adds only this PR's browser scenario additions. Main's other new commits do not touch the browser scenario producer, capture schema, views or scenario fixtures. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 49 source test files (698 tests).npm run test:focusedpassed on 164 boundary, acceptance, contract, catalog and environment files: 1,528 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous merge head
aac8f3136merged main1417bf943. Main's native function matching view (#5390) added its summary result schema at the same place as this PR's. The merge keeps both in the summary union keyed onparent_operation. Main's other new commits do not touch the browser scenario producer, capture schema, views or scenario fixtures. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 49 source test files (692 tests).npm run test:focusedpassed on 164 boundary, acceptance, contract, catalog and environment files: 1,493 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous merge head
c1fcb5c5fmerged main2538214e2. Main's native inventory view (#5378) changed how summaries are typed: each parent operation now has its own summary result schema, and the summaries form a union keyed onparent_operation. This PR's summary now follows that pattern withbrowserScenarioSummaryViewResultSchema, replacing the earlier single summary schema whose body could be any of several shapes. The tool description, the CLI description and the generic unsupported-parent message are main's text plus only this PR's browser scenario additions. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 49 source test files (692 tests).npm run test:focusedpassed on 163 boundary, acceptance, contract, catalog and environment files: 1,492 passed, 48 skipped. This includes the analysis-view MCP output-schema validation.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous merge head
bddd1eaaemerged main0134732fc. Main's protobuf capture view (#5031) conflicted in two places:UnsignedAnalysisView: main now derives this type fromAnalysisViewResultinstead of listing each kind, so the browser-scenario result needs no separate entry.Main's other new commits (#5350, #5355, #5356) merged without conflicts and do not change the browser scenario producer, capture schema or scenario fixtures. Main also added a dependency, so I reran
npm ci. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 48 source test files (687 tests).npm run test:focusedpassed on 161 boundary, acceptance, contract, catalog and environment files: 1,464 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous merge head
05a17923amerged main3fca2e0ca. Main's #5319 adds anenvironment-stateview that also readscapture_browser_scenarioparents. The merge keeps both sides:api-surface,environment-manifest,environment-state) still go to main's projectors first, and this PR's projector servessummaryandbrowser-scenario. This PR's refusal for any other view kind now names all four supported views.docs/mcp-contracts.mdplaces main's environment-state paragraph right after the environment-manifest paragraph it refers to, followed by this PR's paragraph.environmentScenario.test.tskeeps this PR's summary-succeeds check, with the four-view message.header_valuesselected. The fixture now records content-event headers as captured when header values are selected (an empty list, since the fixture records no header names), as this PR's capture schema requires.On that head:
npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 46 source test files (679 tests), including main'senvironmentStateView, environment andscenarioCaptureRecordstests.npm run test:focusedpassed on 160 boundary, acceptance, contract, catalog and environment files: 1,460 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous merge head
ae827b13fmerged mainf93a0335a. Main's #5293 adds anevidence-filesource toinspect_analysis_viewand new service tests. Two conflicts came from it:capture_browser_scenariotext;AnalysisViewService.test.ts, which now keeps both this PR's browser-scenario authority test and main'sinspectAnalysisViewWithFilestests.For the summary, steps and text views of the fixture capture, an
evidence-filesource gives the samenormalized_result,controlled-replayauthority and parent link as the same Evidence passed inline. I checked this with a local script, not a committed test. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 43 source test files (632 tests), including main's new evidence-file andscenarioCaptureRecordstests.npm run test:focusedpassed on 158 boundary, acceptance, contract, catalog and environment files: 1,448 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.85 andverified: true, includingscenarioViews.The previous merge head
150d147ecmerged main5fa4defcb. The only conflict was theinspect_analysis_viewdescription, where main's Godot PCK change (#3634) rewrote the inventory text. The merge keeps main's text and adds only this PR'scapture_browser_scenarioparent and view sentences. #3634 does not touch the browser scenario producer, capture schema, views or fixtures. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 42 source test files (616 tests).npm run test:focusedpassed on 158 boundary, acceptance, contract, catalog and environment files: 1,447 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.80 andverified: true, includingscenarioViews.The previous merge head
d499af870merged main833136507. Main's newil2cpp-metadataview (#3807) conflicted with this PR's browser-scenario views in the analysis-view request and result unions, parent operations, summaries, unsigned view types and the tool description. The merge keeps both view kinds. The generic unsupported-parent message names both IL2CPP metadata and browser scenario captures. The tool description is main's text plus only this PR's additions. #3807 does not touch the browser scenario producer, capture schema or fixtures. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 41 source test files (605 tests), including main's environment,scenarioCaptureRecordsand IL2CPP view tests.npm run test:focusedpassed on 158 boundary, acceptance, contract, catalog and environment files: 1,447 passed, 48 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.80 andverified: true, includingscenarioViews.The previous merge head
2cae99f53merged mainbf1eeee94. Main's #5182 builds environment manifests fromcapture_browser_scenarioparents, so one parent kind now has two view paths:environment-manifestviews still go to main's projector first. This PR's projector servessummaryandbrowser-scenarioviews for the same parents, and its refusal for any other view kind now names all three supported views.tests/fixtures/browserScenarioCapture.tsbuilt captures the recorder cannot emit, which this PR's capture schema rejects. I made it match the recorder without changing its transactions or record content:wait_for_timeoutand receives every event;environmentScenario.test.tsusedsummaryas its unsupported example. It now expectssummaryto succeed on the same Evidence, and checks that an unsupported view names the supported ones.On that head:
npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 40 source test files (595 tests), including main's environment andscenarioCaptureRecordstests.npm run test:focusedran 327 boundary, acceptance, contract and environment files: 3,529 passed, 122 skipped, 2 failed. The failures arejavascriptRuntimeObservation("includes targets outside the old caller root filter") andfilesystemObservationRaceCli("keeps a stable symlink observation complete"). Both fail the same way on a clean mainbf1eeee94worktree on this macOS machine, and this PR does not touch those areas.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.80 andverified: true, includingscenarioViews.The previous head
757bbdfc3fixed a paging cost found in review. Every page used to rerun the declaration checks and the page-shared limitations and unknowns over the whole capture; these results now join the sealed-parent cache. A new test pages one sealed result and checks that another Evidence ID over the same frozen result is checked on its own. With the Evidence ID binding removed, that test fails. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 29 capture, view, producer, network, scenario-service, observation and Evidence test files (477 tests).npm run test:focusedpassed on 64 boundary, acceptance and contract files: 526 passed, 5 skipped.npm run verify:browserpassed with Google Chrome 155.0.8059.80 andverified: true, includingscenarioViews; the steps view is 14,713 bytes, unchanged.projectAnalysisView, two runs each on macOS arm64. Output is unchanged, so view bytes and tokens are unchanged. MCP end-to-end time was not re-measured.The cold first page, which parses and projects the capture, is unchanged (8–9 ms, 42–52 ms and 180–190 ms). A summary request still tallies every step once per request.
The previous merge head
aa689d960merged mainb4938aed5. Main's newdesktop-applicationview (#5207) conflicted with this PR's browser-scenario views in theinspect_analysis_viewtool description and theinspect-analysis-viewCLI command description. The merge keeps both view kinds, so each description is main's text plus this PR's additions. None of the main commits since the previous merge touched the browser scenario producer or capture schema. On that head:npm run check:fastpassed (typecheck and lint).npm run test:localpassed on 29 capture, view, producer, network, scenario-service, observation and Evidence test files (476 tests).npm run test:focusedpassed on 64 boundary, acceptance and contract files: 526 passed, 5 skipped.npm run docs:checkpassed.npm run verify:browserpassed with Google Chrome 155.0.8059.80 andverified: true, includingscenarioViews.The previous merge head
2fa0ba9e8merged mainfdaffe21c. There, main'senvironment-manifestview (#4954) conflicted in the tool description,docs/mcp-contracts.mdandtests/boundary/cli/analysisViewCli.test.ts, and the merge kept both view kinds and all three CLI tests. The same checks passed on that head: 476 unit tests, 464 boundary tests (5 skipped),docs:checkandverify:browser.The previous merge head
6ae23996emerged mainbec88b9d7. Its only conflict was inscripts/verify-real-browser.mjs, where both sides added a verifier import, and the merge kept both.verify:browserpassed there too, including main'surlUserInfocheck.The previous head
bf85798c4added only a change to the views, which now merge the capture's own limitations with the envelope's. I validated it withnpm run check:fast, the capture, view and producer unit tests (277), the analysis-view MCP/CLI boundary and output-schema tests (35), and the real-Chrome scenario-view e2e.On
688f33b2a, which merges maind9d085a15and includes the earlier review fixes:npm run checkpassed, with lint at 0 errors.npm run docs:check,npm run verify:test-discovery,npm run jscpd(3.28%) andnpm run scan:todospassed.npm run test:localpassed on 16 capture, view and producer test files (280 tests).npm run test:focusedpassed on 46 boundary, acceptance and contract files: 482 passed, and 2 tests inserverLifecycleMcp.test.tswere skipped as unrelated. On the previous head,1dd14fe0b, one run hit 30-second timeouts in 5 unrelated files while the machine's load average was about 10. Those 5 files and then the full set passed when rerun, and the full set passed in one run on this head.npm run verify:browserpassed with Google Chrome 155.0.8059.80 andverified: true, includingscenarioViewsand popup coverage.PlaywrightScenarioEventsrecorder and network collector, driven by fake Playwright objects, across all 256 family subsets, with and without network content, 8 budget settings (including network metadata budgets), and launch and connect ownership. Capture completeness was computed with the provider's own rule. All 8192 captures were accepted by the schema. Themax-listener-ownersreason was not exercised.consoleselected,max_events: 1and awindow.openpopup completes, with two omittedpopup-openedrecords. Before the popup adjustment, the stricter rule rejected this producer output.Earlier results on the first PR commit, rebased onto main
9d6651e5b:npm run checkpassed, with lint at 0 errors.npm run docs:checkpassed.npm run verify:test-discoverypassed.npm run jscpdpassed (3.18%).npm run scan:todospassed.npm run test:localpassed on 19 domain, service and producer test files (291 tests), includingsrc/domain/analysisView/*,src/application/analysisView/*,src/domain/browserScenario*.test.ts,src/domain/evidence.test.tsandsrc/browser/PlaywrightScenario*.test.ts.npm run test:focusedpassed on 17 files (194 tests): the analysis-view MCP and CLI boundaries plustoolSchemaValidity,contractPresentation,toolInputAdmission,compactInputSchemaMcp,outputSchemaProfile,serverIdentity,cliToolCoverage,jsonInputStatus,cliStartupImports,productCatalog,documentationFacts,targetContentProvenance,toolEffects,toolInputReferencesandtupleSchemaParity.npm run verify:browserpassed with Google Chrome 155.0.8059.40 andverified: true. That includes the newscenarioViewscheck: a self-owned fixture with known transitions, run through stdio MCP and the compiled CLI on the same Evidence with identical view output. It also confirms paged accessibility and DOM text reassemble to the producer SHA-256, and that per-window plus outside-window event counts equal the retained total.Representative task measurement: one stdio MCP server process, 3 runs, 20 click actions with screenshot, DOM, accessibility and URL captured after each step.
capture_browser_scenario(21 steps)The capture call is unchanged by this PR. Capture time and RSS cover the MCP server process only; Chromium processes are not included. Token counts are
tokenxestimates of the returned text, not billed model usage.Catalog effect, comparing main
9d6651e5bwith the first PR commit (not re-measured after the merge and the review fix):Compatibility, safety, and release
environment-manifestview (#5182), which parses the same schema. Main's hand-built fixture intests/fixtures/browserScenarioCapture.tswas one of them, and this PR updates it to match what the recorder emits (details under Validation).src/domain/browser*andsrc/browser/**files.managedMemberViewprecedent. An entry is reused only for the same Evidence ID, which authenticates the parameters and limitations those checks read. Failed checks are not cached. Later pages therefore do only page-sized work.Author readiness
Human owner: @kangyishuai
Before merge
type(scope): outcome.🤖 Generated with Claude Code
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.