diff --git a/docs/electron-observation.md b/docs/electron-observation.md index 3413564c09..24eb051627 100644 --- a/docs/electron-observation.md +++ b/docs/electron-observation.md @@ -134,13 +134,30 @@ Cleanup uncertainty does not authorize signaling unrelated processes. Main-process IPC recording keeps original-function removal for `on` and `once` registrations and records a fired `once` callback once. Native Node.js owns -removal order and traversal, including listeners registered by removal observers; +`once` registration, firing and callable dispatch as well as removal order and +traversal, including listeners registered by removal observers; the hook translates only its own recording wrappers at the removal boundary. Wrapper metadata uses weak keys and does not retain removed registrations. Wrapper metadata operations, private collection methods and traversal constructors are captured before target startup; later replacement of their global bindings does not change listener registration or removal. +Native runtimes differ in whether `once` consults callback `.call` or `.apply`. +The hook observes actual callback entry without imposing another runtime's +property reads or argument-list representation. Application methods selected by +native dispatch keep their original receiver and argument-list object; opaque +methods produce a `custom-call` or `custom-apply` observation gap when callback +execution cannot be established. + +If native wrapper creation or registration-method lookup could expose private +instrumentation through an application getter, setter or Proxy, registration +stays native and unwrapped. The `once-metadata` observation gap identifies that +unobserved registration attempt; it does not prove registration or delivery. The original callback, +metadata writes and native method receivers are preserved, including when +registration fails. Later registrations resume normal observation. Non-callable +`call`/`apply` properties produce failed observation gaps when native dispatch reads +them; callback entry is not fabricated. + An `on` listener's application-defined `.apply` receives the original argument-list object unchanged. Borrowing the exposed method preserves its dynamic receiver. Because that method owns argument interpretation and may not diff --git a/docs/verification/electron-native-once-2026-10-16.json b/docs/verification/electron-native-once-2026-10-16.json new file mode 100644 index 0000000000..f2cd834ce9 --- /dev/null +++ b/docs/verification/electron-native-once-2026-10-16.json @@ -0,0 +1,1930 @@ +{ + "issue": 4593, + "base": "709b5cbdc15aa757f89c38ecd12e5a47710747a6", + "final_source_pins": { + "source": "4ebd0f60e860daa57a7033c6e77ea7f5f4b8ac97", + "code_inputs_clean": true, + "worktree_status": "", + "files": { + "scripts/electron-active-hook.cjs": "c18dd3a3fb374d75d0fe545ac425e86d177c11753c10c188ba844e81e4857fa6", + "scripts/electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "tests/boundary/browser/electronActiveHook.test.ts": "0acff0ad34ef1e126dd10696e821316084509c1621898e4057a8ae488a97ea82", + "experiments/analysis-efficiency/electron-once-runtime.mjs": "f53295a2839f20ef708253280453a5e280b618531de388782876eb942462ae2f", + "experiments/analysis-efficiency/electron-once-runtimes.py": "b2100f0b4435788601ebc0dd286d0ca4724a1129c7c955cea0b24b4d4321c84f", + "experiments/analysis-efficiency/joplin-shell-boundary.mjs": "4cacf3a3accff4166f54119d1645eefd86099db0dd5982dfa34f2875a8bd1f47", + "dist/browser/PlaywrightElectronActiveProvider.js": "1a0efd2c365d48d5f7c533351e3ad1f230e1f76ed1a754ee49e488908f73dc1c", + "dist/browser/PlaywrightElectronActiveProjection.js": "9732f6422fff971b75a614225d4da69ca401552ce5a650308224ed897ce6f26c", + "dist/application/javascript/ElectronActiveObservationService.js": "438ad8c16239eb296ceef4ad3809377547bb4932c4c87df5d4ea3667c738bc6f" + } + }, + "inputs": { + "joplin_asar": { + "path": "/tmp/rea-4388-runtime-20261016/resources/app.asar", + "bytes": 233575014, + "sha256": "767df409b18effe60421fbefcca873de237c7e813eac744ecdeebbc5e825a33a" + }, + "generic_electron": { + "path": "/tmp/rea-4390-realapps-20261016/electron-44.7.0/electron", + "bytes": 228605256, + "sha256": "10a14d05c6ff4f94075cfb3eeb6ed6571be33ebcc08cbd675b5ce9ff84706564" + } + }, + "alternate_node_acquisition": { + "source": "https://nodejs.org/download/release/v24.21.0/SHASUMS256.txt", + "archive": "node-v24.21.0-linux-x64.tar.xz", + "bytes": 31890184, + "sha256": "fd8e59d5a511510f6a298afb548f18c7d2b1be404d8b4a27d94fbe49f56cb2d6", + "binary_sha256": "7fde7b8afa198da66257f42ee2001d874c7355631e6d1579a5fb5ef1f246df4c", + "initial_extraction_failure": "Python tarfile filter keyword unsupported; verified archive reused, no repeated download." + }, + "matrix": { + "scope": "Controlled canonical hook/minimal Electron module; actual embedded Node engine, not a real app natural bug reproduction. Same oracle/inputs, identical native controls in each pair.", + "engines": [ + { + "selected_binary": "/home/yann/.cache/rea-2459/node-v24.18.0-linux-x64/bin/node", + "binary_sha256": "41a74efb34cbde5c7632cdac0cf8bd1a14d0b8d73dc1e82755014d9a9ce70f5c", + "electron_run_as_node": false, + "node": "24.18.0", + "electron": null, + "cases": 39, + "baseline_disagreements": 4, + "candidate_disagreements": 0 + }, + { + "selected_binary": "/tmp/rea-4593-native-once-20261016-y_540lpi/node-v24.21.0-linux-x64/bin/node", + "binary_sha256": "7fde7b8afa198da66257f42ee2001d874c7355631e6d1579a5fb5ef1f246df4c", + "electron_run_as_node": false, + "node": "24.21.0", + "electron": null, + "cases": 39, + "baseline_disagreements": 16, + "candidate_disagreements": 0 + }, + { + "selected_binary": "/tmp/rea-4390-realapps-20261016/electron-44.7.0/electron", + "binary_sha256": "10a14d05c6ff4f94075cfb3eeb6ed6571be33ebcc08cbd675b5ce9ff84706564", + "electron_run_as_node": true, + "node": "24.21.0", + "electron": "44.7.0", + "cases": 39, + "baseline_disagreements": 16, + "candidate_disagreements": 0 + } + ], + "baseline_source_sha256": { + "electron-active-hook.cjs": "6e39dfe414813b28faca734ceeca20b23f46b271e5f1b8ede943d462aa8ba01c", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "electron-once-runtime.mjs": "f53295a2839f20ef708253280453a5e280b618531de388782876eb942462ae2f", + "electron-fixture": "744a22f060e04a588a124b361e5a58af4e4f7b1704250143d987a5d5e65df6ac" + }, + "candidate_source_sha256": { + "electron-active-hook.cjs": "c18dd3a3fb374d75d0fe545ac425e86d177c11753c10c188ba844e81e4857fa6", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "electron-once-runtime.mjs": "f53295a2839f20ef708253280453a5e280b618531de388782876eb942462ae2f", + "electron-fixture": "744a22f060e04a588a124b361e5a58af4e4f7b1704250143d987a5d5e65df6ac" + }, + "rows_file": "electron-native-once-2026-10-16.review.rows.jsonl", + "rows_count": 117, + "rows_sha256": "8b4e223cd251ceabd270aa888f81855375128c3dce3448c0aeac5723d4f8664f", + "baseline_resources": { + "log_sha256": "2efad8bd3db704aa7bc626d30fb09e39d3d0c692deeddd7663a8b117aae1f66f", + "wall_seconds": 1.425, + "payload_exit_code": 0, + "cpu_usec": 1195383, + "peak_cgroup_bytes": 38170624, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-2f8746ac60cd440d982935e8901a03e2.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "candidate_resources": { + "log_sha256": "d28540cbf8e48de3ab604b2b13e03b5cab03b0acd876ff5e7821b76ef343727a", + "wall_seconds": 1.311, + "payload_exit_code": 0, + "cpu_usec": 1126079, + "peak_cgroup_bytes": 36945920, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-8aa5a516d61946e894ff6ba9c8db8c29.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + "checks": { + "focused_hook75": { + "log_sha256": "7192c9016a0b195ec3a43b070ac1b8aba25f300f3f8cb7c68187f4da5300144f", + "wall_seconds": 11.771, + "payload_exit_code": 0, + "cpu_usec": 11434640, + "peak_cgroup_bytes": 322015232, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-7c4592b58e5e45e2b18a849d93c188ca.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + }, + "command": "npm run test:focused -- tests/boundary/browser/electronActiveHook.test.ts" + }, + "node24_21_hook75": { + "log_sha256": "9eedc48f3083aeb977484aa380f2dbac392e208425e88957ca20ace7b121f7ce", + "wall_seconds": 10.783, + "payload_exit_code": 0, + "cpu_usec": 10421972, + "peak_cgroup_bytes": 284741632, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-81bb56f7d82c42af877e926613a1a24e.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + }, + "command": "Explicit Node24.21 binary: node node_modules/vitest/vitest.mjs run --project boundary tests/boundary/browser/electronActiveHook.test.ts" + }, + "static": { + "log_sha256": "caf4a4578a62a9bce60de51d3c23942fe8140bcd04e3ef3c0ccd6e78831f9e07", + "wall_seconds": 118.946, + "payload_exit_code": 0, + "cpu_usec": 117752622, + "peak_cgroup_bytes": 4282826752, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-8b50227dd214474b9e5f9a4a12a78c71.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "docs": { + "log_sha256": "26ed1585cb71e744b9a3d2b82c929596151f5b70a12a6c03567f22125b5da064", + "wall_seconds": 10.424, + "payload_exit_code": 0, + "cpu_usec": 9573676, + "peak_cgroup_bytes": 491094016, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-431fa65be8324104a4a38f7edd5f53d5.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + "shared_contracts": { + "source": "c0b52b5408fa97013798e6ecee885ccac08e7356", + "result": "13pass; consumer sources unchanged by later CJS/oracle/fixture cleanup", + "receipt": { + "log_sha256": "bb7b7a804af2c1c4c6c0b49a5101700efe1ea209b2b05996d4894192327bf5a5", + "wall_seconds": 24.626, + "payload_exit_code": 0, + "cpu_usec": 24128679, + "peak_cgroup_bytes": 1315684352, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-5c90dc12aeea48b1896ee076eee9b36f.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + "real_application": { + "receipt": { + "log_sha256": "c5bbf7b1acf2d13d285ed36376e81a90534152ed587430f773e04d8bfe601f3a", + "wall_seconds": 18.353, + "payload_exit_code": 1, + "cpu_usec": 17098599, + "peak_cgroup_bytes": 1387556864, + "complete_family_observation_verified": false, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-b0eff6ec82054593b2b73ed7188c6936.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "summary": { + "profile": "/tmp/rea-4593-native-once-20261016-y_540lpi/trials/joplin-review-gaps-xvfb/profiles/joplin-shell-9S4XHt", + "runtime": "/home/yann/yann/rea-electron-native-once-4593-20261016", + "staged_hook_sha256": { + "electron-active-hook.cjs": "c18dd3a3fb374d75d0fe545ac425e86d177c11753c10c188ba844e81e4857fa6", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c" + }, + "elapsed_ms": 17322.284704, + "launch_transport": "controlled-argv-shim", + "probe": { + "before_shell_count": 0, + "note": "1. Welcome to Joplin!", + "attachment": { + "src": "joplin-content://note-viewer//home/yann/.config/joplin-desktop/resources//4e46be127ed6496ab52a183e3ef7a2ef.png?t=1792189852545", + "alt": "", + "width": 1075, + "height": 666 + }, + "revealed": "Reveal file in folder", + "image_visible": true, + "shell": [ + { + "sequence": 6161, + "correlation_id": "capture:4083186:6161", + "event": "showItemInFolder", + "phase": "blocked", + "channel": null, + "direction": null, + "sender": null, + "receiver": null, + "frame": null, + "target": null, + "argument_shapes": ["string"], + "result_shape": null, + "process_type": "browser", + "source": "electron-active-hook", + "capture_method": "api-wrapper", + "artifact_path": null, + "artifact_sha256": null, + "error": true, + "kind": "shell-attempt" + } + ], + "page_errors": [] + }, + "provider_ok": false, + "error": { + "tag": "BrowserObservationError", + "reason": "cleanup_failed" + }, + "coverage": { + "status": "partial_attach", + "observed_event_families": [ + "app-lifecycle", + "ipc", + "navigation", + "process-lifecycle", + "protocol", + "shell-attempt", + "web-contents-lifecycle", + "window-lifecycle" + ], + "unavailable_event_families": [ + "download", + "error", + "native-addon", + "permission", + "popup-attempt", + "preload", + "preload-configuration", + "renderer-ipc", + "updater" + ], + "observed_roles": ["browser", "main", "web_contents", "window"], + "pre_capture_activity": "unavailable" + }, + "retention": { + "budget_bytes": 16777216, + "estimated_retained_bytes": 12209775, + "event_serialized_byte_upper_bound": 2914581, + "retained": 6191, + "dropped": 0, + "dropped_event_families": [], + "dropped_event_roles": [], + "observed_ipc": 2096, + "dropped_ipc": 0, + "observed_runtime": 4095, + "dropped_runtime": 0 + }, + "actions": [ + { + "step_id": "settle-after-reveal", + "kind": "wait", + "window_index": 0, + "target": "window:0", + "elapsed_ms": 116, + "status": "completed", + "error": null + } + ], + "deadline_triggered": false, + "workflow_status": "partial-or-failed" + }, + "scope": "Unchanged Joplin shipped welcome PNG/reveal through actual menu and bridge; staged source hashes checked. Explicit test argv shim; overall provider cleanup failed. No synthetic app IPC channels.", + "baseline_reference": "PR4562 postmerge709b5cbd receipt /tmp/rea-4562-postmerge-identity.json; operation passed, cleanup failed, family observation unverified. Not an equivalent completed-task performance baseline." + }, + "initial_frozen_cohort": { + "source_pins": { + "source": "c0b52b5408fa97013798e6ecee885ccac08e7356", + "source_clean": true, + "files": { + "scripts/electron-active-hook.cjs": "b0a7d4a05ac3602cd8c00b3288b5e88845cef4d26ebb0fe538d01e4d57fde911", + "scripts/electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "tests/boundary/browser/electronActiveHook.test.ts": "f5392807d7099d39494c75be11462f1fb5f11d9f461996f34b18874bb3722d4f", + "experiments/analysis-efficiency/electron-once-runtime.mjs": "bf7889af81e9aed50e05699fa5dd68b4823b7983bc0b513aa45f3aefe35a3969", + "experiments/analysis-efficiency/electron-once-runtimes.py": "b2100f0b4435788601ebc0dd286d0ca4724a1129c7c955cea0b24b4d4321c84f", + "experiments/analysis-efficiency/joplin-shell-boundary.mjs": "4cacf3a3accff4166f54119d1645eefd86099db0dd5982dfa34f2875a8bd1f47", + "dist/browser/PlaywrightElectronActiveProvider.js": "1a0efd2c365d48d5f7c533351e3ad1f230e1f76ed1a754ee49e488908f73dc1c", + "dist/browser/PlaywrightElectronActiveProjection.js": "9732f6422fff971b75a614225d4da69ca401552ce5a650308224ed897ce6f26c", + "dist/application/javascript/ElectronActiveObservationService.js": "438ad8c16239eb296ceef4ad3809377547bb4932c4c87df5d4ea3667c738bc6f" + } + }, + "matrix": { + "scope": "Controlled canonical hook/minimal Electron module; actual embedded Node engine, not a real app natural bug reproduction. Same oracle/inputs, identical native controls in each pair.", + "engines": [ + { + "selected_binary": "/home/yann/.cache/rea-2459/node-v24.18.0-linux-x64/bin/node", + "binary_sha256": "41a74efb34cbde5c7632cdac0cf8bd1a14d0b8d73dc1e82755014d9a9ce70f5c", + "electron_run_as_node": false, + "node": "24.18.0", + "electron": null, + "cases": 31, + "baseline_disagreements": 1, + "candidate_disagreements": 0 + }, + { + "selected_binary": "/tmp/rea-4593-native-once-20261016-y_540lpi/node-v24.21.0-linux-x64/bin/node", + "binary_sha256": "7fde7b8afa198da66257f42ee2001d874c7355631e6d1579a5fb5ef1f246df4c", + "electron_run_as_node": false, + "node": "24.21.0", + "electron": null, + "cases": 31, + "baseline_disagreements": 13, + "candidate_disagreements": 0 + }, + { + "selected_binary": "/tmp/rea-4390-realapps-20261016/electron-44.7.0/electron", + "binary_sha256": "10a14d05c6ff4f94075cfb3eeb6ed6571be33ebcc08cbd675b5ce9ff84706564", + "electron_run_as_node": true, + "node": "24.21.0", + "electron": "44.7.0", + "cases": 31, + "baseline_disagreements": 13, + "candidate_disagreements": 0 + } + ], + "baseline_source_sha256": { + "electron-active-hook.cjs": "6e39dfe414813b28faca734ceeca20b23f46b271e5f1b8ede943d462aa8ba01c", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "electron-once-runtime.mjs": "bf7889af81e9aed50e05699fa5dd68b4823b7983bc0b513aa45f3aefe35a3969", + "electron-fixture": "744a22f060e04a588a124b361e5a58af4e4f7b1704250143d987a5d5e65df6ac" + }, + "candidate_source_sha256": { + "electron-active-hook.cjs": "b0a7d4a05ac3602cd8c00b3288b5e88845cef4d26ebb0fe538d01e4d57fde911", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "electron-once-runtime.mjs": "bf7889af81e9aed50e05699fa5dd68b4823b7983bc0b513aa45f3aefe35a3969", + "electron-fixture": "744a22f060e04a588a124b361e5a58af4e4f7b1704250143d987a5d5e65df6ac" + }, + "baseline_resources": { + "log_sha256": "d776b2b2c53eeb46d9adfeb4bfd3fe0f49291543f1212400152caa15ad0ac001", + "wall_seconds": 0.895, + "payload_exit_code": 0, + "cpu_usec": 689020, + "peak_cgroup_bytes": 36290560, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-90576d97ccf34cf09d63c1a12baa2345.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "candidate_resources": { + "log_sha256": "e53cf56e2acf1282eb66b387e70b76c4b99d0aec04567e1854af5646ba8b69a0", + "wall_seconds": 0.904, + "payload_exit_code": 0, + "cpu_usec": 672328, + "peak_cgroup_bytes": 36241408, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-9a5cb7174725437690c1ab60386458ca.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "rows_slice": { + "start": 0, + "count": 93, + "sha256": "f85d08e21eb40e5a331efc11ce0088d2797c376b7cc8028ca493ebb501a37361" + } + }, + "checks": { + "pinned_hook75": { + "log_sha256": "6b61bfd7cc0653dffbcee3351d13cd1d3851f5c2445d07dad5b6c025d82371c0", + "wall_seconds": 5.837, + "payload_exit_code": 0, + "cpu_usec": 5567276, + "peak_cgroup_bytes": 274083840, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-455c51b768b04dc6b90159072d1fd0ee.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "node24_21_hook75": { + "log_sha256": "891ddc47207f3e55aa75f6a0619cea7683c1a24570daa71ba6151a66148b3961", + "wall_seconds": 5.815, + "payload_exit_code": 0, + "cpu_usec": 5603035, + "peak_cgroup_bytes": 278888448, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-b07c35f24b544074a6e2303d6feddd8a.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "shared_contracts13": { + "log_sha256": "bb7b7a804af2c1c4c6c0b49a5101700efe1ea209b2b05996d4894192327bf5a5", + "wall_seconds": 24.626, + "payload_exit_code": 0, + "cpu_usec": 24128679, + "peak_cgroup_bytes": 1315684352, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-5c90dc12aeea48b1896ee076eee9b36f.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "static": { + "log_sha256": "c5dd6a66f22f40a05eb65a0387191a06d30c5718601082ee0c7e056758696138", + "wall_seconds": 7.551, + "payload_exit_code": 0, + "cpu_usec": 7361716, + "peak_cgroup_bytes": 1046573056, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-08045280341044fd96b4316352d5b8c1.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + "real_application": { + "receipt": { + "log_sha256": "045f4e34ccf0d038f3e8f0b780c697e18875931bb7d8be3d449e726dffba5666", + "wall_seconds": 17.68, + "payload_exit_code": 1, + "cpu_usec": 16272793, + "peak_cgroup_bytes": 1395253248, + "complete_family_observation_verified": false, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-93a5268db7374b338976c7eca7e2ade4.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "summary": { + "profile": "/tmp/rea-4593-native-once-20261016-y_540lpi/trials/joplin-frozen/profiles/joplin-shell-7Kc9ed", + "runtime": "/home/yann/yann/rea-electron-native-once-4593-20261016", + "staged_hook_sha256": { + "electron-active-hook.cjs": "b0a7d4a05ac3602cd8c00b3288b5e88845cef4d26ebb0fe538d01e4d57fde911", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c" + }, + "elapsed_ms": 16327.466191000001, + "launch_transport": "controlled-argv-shim", + "probe": { + "before_shell_count": 0, + "note": "1. Welcome to Joplin!", + "attachment": { + "src": "joplin-content://note-viewer//home/yann/.config/joplin-desktop/resources//44b04cb55873407eb0a2311edadbd8f2.png?t=1792187016628", + "alt": "", + "width": 1075, + "height": 666 + }, + "revealed": "Reveal file in folder", + "image_visible": true, + "shell": [ + { + "sequence": 6191, + "correlation_id": "capture:4066281:6191", + "event": "showItemInFolder", + "phase": "blocked", + "channel": null, + "direction": null, + "sender": null, + "receiver": null, + "frame": null, + "target": null, + "argument_shapes": ["string"], + "result_shape": null, + "process_type": "browser", + "source": "electron-active-hook", + "capture_method": "api-wrapper", + "artifact_path": null, + "artifact_sha256": null, + "error": true, + "kind": "shell-attempt" + } + ], + "page_errors": [] + }, + "provider_ok": false, + "error": { + "tag": "BrowserObservationError", + "reason": "cleanup_failed" + }, + "coverage": { + "status": "partial_attach", + "observed_event_families": [ + "app-lifecycle", + "ipc", + "navigation", + "process-lifecycle", + "protocol", + "shell-attempt", + "web-contents-lifecycle", + "window-lifecycle" + ], + "unavailable_event_families": [ + "download", + "error", + "native-addon", + "permission", + "popup-attempt", + "preload", + "preload-configuration", + "renderer-ipc", + "updater" + ], + "observed_roles": ["browser", "main", "web_contents", "window"], + "pre_capture_activity": "unavailable" + }, + "retention": { + "budget_bytes": 16777216, + "estimated_retained_bytes": 12215743, + "event_serialized_byte_upper_bound": 2916005, + "retained": 6194, + "dropped": 0, + "dropped_event_families": [], + "dropped_event_roles": [], + "observed_ipc": 2097, + "dropped_ipc": 0, + "observed_runtime": 4097, + "dropped_runtime": 0 + }, + "actions": [ + { + "step_id": "settle-after-reveal", + "kind": "wait", + "window_index": 0, + "target": "window:0", + "elapsed_ms": 115, + "status": "completed", + "error": null + } + ], + "deadline_triggered": false, + "workflow_status": "partial-or-failed" + }, + "scope": "Unchanged Joplin shipped welcome PNG/reveal through actual menu and bridge; staged source hashes checked. Explicit test argv shim; overall provider cleanup failed. No synthetic app IPC channels.", + "baseline_reference": "PR4562 postmerge709b5cbd receipt /tmp/rea-4562-postmerge-identity.json; operation passed, cleanup failed, family observation unverified. Not an equivalent completed-task performance baseline." + } + }, + "cleanup_cohort": { + "source_pins": { + "source": "e60c4a1098321ed2a7f564ae35909a31d707694f", + "code_inputs_clean": true, + "worktree_status": "?? docs/verification/electron-native-once-2026-10-16.json\n?? docs/verification/electron-native-once-2026-10-16.md\n?? docs/verification/electron-native-once-2026-10-16.rows.jsonl", + "files": { + "scripts/electron-active-hook.cjs": "146e7e6b08e51a7a73cd0d5a5f3512ffdfa507ffaf4f70b49e3a3979f1582cc4", + "scripts/electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "tests/boundary/browser/electronActiveHook.test.ts": "f5392807d7099d39494c75be11462f1fb5f11d9f461996f34b18874bb3722d4f", + "experiments/analysis-efficiency/electron-once-runtime.mjs": "bf7889af81e9aed50e05699fa5dd68b4823b7983bc0b513aa45f3aefe35a3969", + "experiments/analysis-efficiency/electron-once-runtimes.py": "b2100f0b4435788601ebc0dd286d0ca4724a1129c7c955cea0b24b4d4321c84f", + "experiments/analysis-efficiency/joplin-shell-boundary.mjs": "4cacf3a3accff4166f54119d1645eefd86099db0dd5982dfa34f2875a8bd1f47", + "dist/browser/PlaywrightElectronActiveProvider.js": "1a0efd2c365d48d5f7c533351e3ad1f230e1f76ed1a754ee49e488908f73dc1c", + "dist/browser/PlaywrightElectronActiveProjection.js": "9732f6422fff971b75a614225d4da69ca401552ce5a650308224ed897ce6f26c", + "dist/application/javascript/ElectronActiveObservationService.js": "438ad8c16239eb296ceef4ad3809377547bb4932c4c87df5d4ea3667c738bc6f" + } + }, + "matrix_resources": { + "log_sha256": "75a9905dce7eee55ba90e138506235083c06ef07ac050b3ff2067fe07d96edb8", + "wall_seconds": 0.963, + "payload_exit_code": 0, + "cpu_usec": 734332, + "peak_cgroup_bytes": 39419904, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-c93b2523e1c740de9b81820e68fab5e6.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "checks": { + "pinned_hook75": { + "log_sha256": "a0a43219b9fbd4b54e00a5b23154bd33925201af11c8a594fa791c16544511fa", + "wall_seconds": 5.686, + "payload_exit_code": 0, + "cpu_usec": 5475278, + "peak_cgroup_bytes": 279912448, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-7cab769254a74ee59acfd21ad079b254.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "node24_21_hook75": { + "log_sha256": "4f3b4abf84566788d8be8370c9511c5cf2679ca8df61532c6f0dfe21bcfab5db", + "wall_seconds": 5.797, + "payload_exit_code": 0, + "cpu_usec": 5536906, + "peak_cgroup_bytes": 277929984, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-8101cfe97d434a8f80d13d1cbba070f1.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "static": { + "log_sha256": "3bbb3efd6b036676636ef29253ce52d8bc1e0a55bf3da9653f9760a35647f402", + "wall_seconds": 7.542, + "payload_exit_code": 0, + "cpu_usec": 7060331, + "peak_cgroup_bytes": 1043816448, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-6e4bb16253ac44d2bef40dc803a7b978.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + "real_application": { + "receipt": { + "log_sha256": "b5284e1ea70b88285141a2ae017f38416b33691ebbfec8e12bfc3b5a9f137208", + "wall_seconds": 18.616, + "payload_exit_code": 1, + "cpu_usec": 17391804, + "peak_cgroup_bytes": 1402408960, + "complete_family_observation_verified": false, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-86a605c8eb8243e7b7f136962ec6d7e5.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "summary": { + "profile": "/tmp/rea-4593-native-once-20261016-y_540lpi/trials/joplin-postcleanup/profiles/joplin-shell-JD5Fex", + "runtime": "/home/yann/yann/rea-electron-native-once-4593-20261016", + "staged_hook_sha256": { + "electron-active-hook.cjs": "146e7e6b08e51a7a73cd0d5a5f3512ffdfa507ffaf4f70b49e3a3979f1582cc4", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c" + }, + "elapsed_ms": 17389.075914, + "launch_transport": "controlled-argv-shim", + "probe": { + "before_shell_count": 0, + "note": "1. Welcome to Joplin!", + "attachment": { + "src": "joplin-content://note-viewer//home/yann/.config/joplin-desktop/resources//9ba35cca7415433cbb2030f6ef05736f.png?t=1792187978017", + "alt": "", + "width": 1075, + "height": 666 + }, + "revealed": "Reveal file in folder", + "image_visible": true, + "shell": [ + { + "sequence": 7215, + "correlation_id": "capture:4071155:7215", + "event": "showItemInFolder", + "phase": "blocked", + "channel": null, + "direction": null, + "sender": null, + "receiver": null, + "frame": null, + "target": null, + "argument_shapes": ["string"], + "result_shape": null, + "process_type": "browser", + "source": "electron-active-hook", + "capture_method": "api-wrapper", + "artifact_path": null, + "artifact_sha256": null, + "error": true, + "kind": "shell-attempt" + } + ], + "page_errors": [] + }, + "provider_ok": false, + "error": { + "tag": "BrowserObservationError", + "reason": "cleanup_failed" + }, + "coverage": { + "status": "partial_attach", + "observed_event_families": [ + "app-lifecycle", + "ipc", + "navigation", + "process-lifecycle", + "protocol", + "shell-attempt", + "web-contents-lifecycle", + "window-lifecycle" + ], + "unavailable_event_families": [ + "download", + "error", + "native-addon", + "permission", + "popup-attempt", + "preload", + "preload-configuration", + "renderer-ipc", + "updater" + ], + "observed_roles": ["browser", "main", "web_contents", "window"], + "pre_capture_activity": "unavailable" + }, + "retention": { + "budget_bytes": 16777216, + "estimated_retained_bytes": 14359880, + "event_serialized_byte_upper_bound": 3427720, + "retained": 7274, + "dropped": 0, + "dropped_event_families": [], + "dropped_event_roles": [], + "observed_ipc": 2457, + "dropped_ipc": 0, + "observed_runtime": 4817, + "dropped_runtime": 0 + }, + "actions": [ + { + "step_id": "settle-after-reveal", + "kind": "wait", + "window_index": 0, + "target": "window:0", + "elapsed_ms": 102, + "status": "completed", + "error": null + } + ], + "deadline_triggered": false, + "workflow_status": "partial-or-failed" + } + } + }, + "historical_attempts": [ + { + "label": "download-runtime", + "meaning": "failed helper extraction; archive checksum valid; no runtime test", + "receipt": { + "log_sha256": "5cb074921a0d33ac7a443b8e7973072d19ca4b80d232001a3cef4f8749b19e03", + "wall_seconds": 6.306, + "payload_exit_code": 1, + "cpu_usec": 536194, + "peak_cgroup_bytes": 53288960, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-f255d93c8b744720a7239a605c40c958.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "extract-runtime", + "meaning": "verified archive reused; isolated runtime extraction succeeds", + "receipt": { + "log_sha256": "8d62cb19d4bd36c9c1cebae48c43ad48fac8e620ea87c32ba5802cb7044a5b72", + "wall_seconds": 3.208, + "payload_exit_code": 0, + "cpu_usec": 2943320, + "peak_cgroup_bytes": 319168512, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-82e4413956e74c7381cd3c6e00889e78.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "baseline", + "meaning": "initial21cases; controlled producer, pinned0/newer9/embedded9 differences", + "receipt": { + "log_sha256": "16f9303f70023f84c216e014c005f63b6ace4308c7e5dfc1fb28cd2b0e468a9d", + "wall_seconds": 0.468, + "payload_exit_code": 0, + "cpu_usec": 246903, + "peak_cgroup_bytes": 36499456, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-8e170107c2434dcb9201473cef7d2e7b.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "candidate", + "meaning": "initial27candidate cases all agree; narrower than final31", + "receipt": { + "log_sha256": "3712a72eb3d8fe03ce1006a75e7981da89e90d11513b3d6c398884c47c1d6702", + "wall_seconds": 0.48, + "payload_exit_code": 0, + "cpu_usec": 245443, + "peak_cgroup_bytes": 37142528, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-bd3be0af4020432ea26c6bd566077e62.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "first-hook-suite", + "meaning": "candidate Array species regression:73pass1fail; fixed actual Arguments frame", + "receipt": { + "log_sha256": "0851f0676ea822a2f9e77a9460bf8a0cd2559c9842e729b94b30109cab0ad5e8", + "wall_seconds": 6.884, + "payload_exit_code": 1, + "cpu_usec": 6609012, + "peak_cgroup_bytes": 359071744, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-286f120b15f84487bf1a38f63c3213b2.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "hook-suite-arguments", + "meaning": "74hook cases pass after frame fix", + "receipt": { + "log_sha256": "cc33a986d5d9ea825387250e8488ed19ac87916cefd9be3bebe81db26488aede", + "wall_seconds": 7.227, + "payload_exit_code": 0, + "cpu_usec": 6958783, + "peak_cgroup_bytes": 350007296, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-83b7d1de0a3a4c84be5c2253862ca7c4.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "metadata-red", + "meaning": "29case candidate2differences/runtime, metadata setters/readonly receiver", + "receipt": { + "log_sha256": "82857181e9e98222e1c88fbd4e338ad458eb99124eced41d1601f9760968be60", + "wall_seconds": 0.786, + "payload_exit_code": 0, + "cpu_usec": 553338, + "peak_cgroup_bytes": 33021952, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-2462ebd367634f3dbf7febf54480db49.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "metadata-fixed", + "meaning": "29case candidate0differences/runtime", + "receipt": { + "log_sha256": "5595065ff2c57d9ec9e792f6fcc167ba8f8950f224cc7cd88aea592e9bafd7a8", + "wall_seconds": 0.691, + "payload_exit_code": 0, + "cpu_usec": 297566, + "peak_cgroup_bytes": 42532864, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-867285e4131442bc92ad883f7abfd0ca.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "on-getter-red", + "meaning": "30case candidate1difference/runtime; unknown getter delegated natively", + "receipt": { + "log_sha256": "ffc299d637ed74bd59f5de72b90654af668b07487fd455c9f8edb1a3d6493857", + "wall_seconds": 0.474, + "payload_exit_code": 0, + "cpu_usec": 275781, + "peak_cgroup_bytes": 35205120, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-be01865eee9e429c965f7e582bc5cae6.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "regression-red", + "meaning": "base709 pinned negative: false invocation when callback body never runs", + "receipt": { + "log_sha256": "df16294cd2672b76d5a7446a13090ff6e5bec1a01b86749719d8870ebe998d7d", + "wall_seconds": 1.597, + "payload_exit_code": 1, + "cpu_usec": 1400983, + "peak_cgroup_bytes": 217481216, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-515a84afc181411d9c4e8b5b83b12743.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "check", + "meaning": "failed lint: CJS oracle requires unsupported by repo rule; converted explicit ESM interop", + "receipt": { + "log_sha256": "95c5e629bb040e94207c761d2cacd04cdc0653d95502a0ca331b560c406847df", + "wall_seconds": 7.842, + "payload_exit_code": 1, + "cpu_usec": 7422670, + "peak_cgroup_bytes": 1819238400, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-cab90aa328344477bd4d9348f3435892.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "baseline-final30", + "meaning": "helper duplicated stage path; not accepted comparison data", + "receipt": { + "log_sha256": "96d7ba7d6855838f6492c2c451b4afcba86d6b3637afd477c01d8ccf774d35fe", + "wall_seconds": 0.268, + "payload_exit_code": 1, + "cpu_usec": 107342, + "peak_cgroup_bytes": 25133056, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-3db884621dd546d2bed1fe8e065f984c.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "baseline-final30-corrected", + "meaning": "valid30case baseline prior to added failure-state case", + "receipt": { + "log_sha256": "afd8ecc917828a57d9c8795c72cdd70771af8903c7923ea6f8948a660793aa18", + "wall_seconds": 0.494, + "payload_exit_code": 0, + "cpu_usec": 280290, + "peak_cgroup_bytes": 37175296, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-9c9ed60c3ea74be88843f8271a6dd67b.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "baseline31", + "meaning": "incomplete Electron ESM fixture resolution; not accepted three-engine result", + "receipt": { + "log_sha256": "21870ac1f98a66e6ae2f3551191b4cadfd0457defb0b7b5f000ba52c499deb54", + "wall_seconds": 1.812, + "payload_exit_code": 1, + "cpu_usec": 945943, + "peak_cgroup_bytes": 153464832, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-c42b29041a68494383e3f368cad9a117.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "candidate31", + "meaning": "incomplete Electron ESM fixture resolution; fixed explicit CommonJS identity", + "receipt": { + "log_sha256": "953bb61d20a9c4fb3991ba9fe70a1799c572c52a0cb7ff6bf75fee981a63b0f3", + "wall_seconds": 1.108, + "payload_exit_code": 1, + "cpu_usec": 692054, + "peak_cgroup_bytes": 35074048, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-2e2cb007a3cd40dba7cbcc6e4ecf182d.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "joplin-not-executed", + "meaning": "NOT_EXECUTED application: preparation syntax error left TMPDIR absent; Xvfb failed before launch", + "receipt": { + "log_sha256": "f567604cf30e2f3973b429a61411cd47b72bdc53856613adb267363890f27648", + "wall_seconds": 0.264, + "payload_exit_code": 1, + "cpu_usec": 36326, + "peak_cgroup_bytes": 7106560, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-1d27da6164454c97a4e51ec0115d079e.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "native-alias-red", + "meaning": "Own candidate lacked once-metadata gap when getter selected native on alias; regression failed before fix", + "receipt": { + "log_sha256": "30afb70e1f3bec1c46ae8cf1e7299606f1547c5b3742bdbab4a8b9b72248908a", + "wall_seconds": 1.59, + "payload_exit_code": 1, + "cpu_usec": 1367746, + "peak_cgroup_bytes": 211091456, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-27250ff8d4534d2ebc94e91edbf22a29.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "native-alias-green", + "meaning": "Once owner now retains its gap across unhooked native registration; regression passes", + "receipt": { + "log_sha256": "8d058adefb8b100cfc9d7eda5f29a14473c132ce32489a5fa9ed9895e2d276cb", + "wall_seconds": 1.483, + "payload_exit_code": 0, + "cpu_usec": 1307798, + "peak_cgroup_bytes": 204599296, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-59c3e4ccf8ff4778b2ee5d359c3f4bbf.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "review-gap-red", + "meaning": "Pinned regression catches missing non-callable dispatch gap.", + "receipt": { + "log_sha256": "7563128d918f000adccbd991d88f909be5ce2967f06ef93824714c1850a32c26", + "wall_seconds": 2.751, + "payload_exit_code": 1, + "cpu_usec": 2510546, + "peak_cgroup_bytes": 213495808, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-7fe6563edae74f908b4a90482d56d9fd.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "review-gap-node24-21-red", + "meaning": "Newer runtime regression catches registration-through-native-alias then throw with no gap.", + "receipt": { + "log_sha256": "cda0c1c2171df157e9c5f349c5f76a14bace3dc510520470b61018c1190563a4", + "wall_seconds": 2.84, + "payload_exit_code": 1, + "cpu_usec": 2625842, + "peak_cgroup_bytes": 217219072, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-2001c9020a924454ac7f3b3bf1639135.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "review-gap-pinned", + "meaning": "NOT_EXECUTED test:local rejects built boundary projects; corrected to test:focused.", + "receipt": { + "log_sha256": "4e57de0d683108e709418d69d3d12abd4b76fa82a9fe14207ffa1d108aa125a2", + "wall_seconds": 0.69, + "payload_exit_code": 1, + "cpu_usec": 451205, + "peak_cgroup_bytes": 44204032, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-c611888e704c475397d189aa19738300.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + { + "label": "review-display-launch-failed", + "meaning": "Actual Electron launch failed display initialization: provider launch environment omits XAUTHORITY. Preserved failed launch; fresh trial uses local Xvfb -nolisten tcp -ac, not a production change.", + "receipt": { + "log_sha256": "18025b01637cba31c4884fa067924ab19cbc9bf8763470691d8138cceb1930d2", + "wall_seconds": 4.701, + "payload_exit_code": 1, + "cpu_usec": 3693640, + "peak_cgroup_bytes": 549056512, + "complete_family_observation_verified": false, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-0454da0dfd9145459041580198f94969.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + } + ], + "limits": [ + "CPU/peak counters at payload exit with observer alive, not final scope counters. Cgroup peak includes file cache, not just RSS. False complete-family flag means unverified family measurement.", + "Serial frozen comparisons use1CPU/8GiB hard/6GiB early/no swap/192tasks. Early failed helper matrices briefly overlapped on the same CPU; they are not performance evidence.", + "Warm filesystem/runtime/build caches and fresh private Joplin configuration. No cold-system or warm-repeat speedup claim.", + "Billed tokens and agent context costs are unmeasured; no token benefit claim.", + "Standard launch#2974 and provider cleanup#4282 remain failed; raw-wrapper mutation#4513 remains unfixed.", + "Historical helper versions not all source-frozen; failure logs are preserved and not relabeled as final-source results.", + "Regenerable applications, Node binaries, profiles and multi-MB captures are excluded from Git." + ], + "pre_review_cohort": { + "final_source_pins": { + "source": "7f05f476c52498adba41d943ead1a86e7216ca76", + "code_inputs_clean": true, + "worktree_status": "?? docs/verification/electron-native-once-2026-10-16.json\n?? docs/verification/electron-native-once-2026-10-16.md\n?? docs/verification/electron-native-once-2026-10-16.rows.jsonl", + "files": { + "scripts/electron-active-hook.cjs": "ea47aad9f9f80aaf46d25a8e7689986613e7c6b83d1d3bcf1af010f077397418", + "scripts/electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "tests/boundary/browser/electronActiveHook.test.ts": "ea41a9e3cfb1f74a62080b9840ce8538d8d7e7281d25834387b5e0211c7583f1", + "experiments/analysis-efficiency/electron-once-runtime.mjs": "a7ea444819b51e0b261b025b28fe8e0a0c25bcd66c2203c62fb2aec8c1e02117", + "experiments/analysis-efficiency/electron-once-runtimes.py": "b2100f0b4435788601ebc0dd286d0ca4724a1129c7c955cea0b24b4d4321c84f", + "experiments/analysis-efficiency/joplin-shell-boundary.mjs": "4cacf3a3accff4166f54119d1645eefd86099db0dd5982dfa34f2875a8bd1f47", + "dist/browser/PlaywrightElectronActiveProvider.js": "1a0efd2c365d48d5f7c533351e3ad1f230e1f76ed1a754ee49e488908f73dc1c", + "dist/browser/PlaywrightElectronActiveProjection.js": "9732f6422fff971b75a614225d4da69ca401552ce5a650308224ed897ce6f26c", + "dist/application/javascript/ElectronActiveObservationService.js": "438ad8c16239eb296ceef4ad3809377547bb4932c4c87df5d4ea3667c738bc6f" + } + }, + "matrix": { + "scope": "Controlled canonical hook/minimal Electron module; actual embedded Node engine, not a real app natural bug reproduction. Same oracle/inputs, identical native controls in each pair.", + "engines": [ + { + "selected_binary": "/home/yann/.cache/rea-2459/node-v24.18.0-linux-x64/bin/node", + "binary_sha256": "41a74efb34cbde5c7632cdac0cf8bd1a14d0b8d73dc1e82755014d9a9ce70f5c", + "electron_run_as_node": false, + "node": "24.18.0", + "electron": null, + "cases": 32, + "baseline_disagreements": 1, + "candidate_disagreements": 0 + }, + { + "selected_binary": "/tmp/rea-4593-native-once-20261016-y_540lpi/node-v24.21.0-linux-x64/bin/node", + "binary_sha256": "7fde7b8afa198da66257f42ee2001d874c7355631e6d1579a5fb5ef1f246df4c", + "electron_run_as_node": false, + "node": "24.21.0", + "electron": null, + "cases": 32, + "baseline_disagreements": 13, + "candidate_disagreements": 0 + }, + { + "selected_binary": "/tmp/rea-4390-realapps-20261016/electron-44.7.0/electron", + "binary_sha256": "10a14d05c6ff4f94075cfb3eeb6ed6571be33ebcc08cbd675b5ce9ff84706564", + "electron_run_as_node": true, + "node": "24.21.0", + "electron": "44.7.0", + "cases": 32, + "baseline_disagreements": 13, + "candidate_disagreements": 0 + } + ], + "baseline_source_sha256": { + "electron-active-hook.cjs": "6e39dfe414813b28faca734ceeca20b23f46b271e5f1b8ede943d462aa8ba01c", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "electron-once-runtime.mjs": "a7ea444819b51e0b261b025b28fe8e0a0c25bcd66c2203c62fb2aec8c1e02117", + "electron-fixture": "744a22f060e04a588a124b361e5a58af4e4f7b1704250143d987a5d5e65df6ac" + }, + "candidate_source_sha256": { + "electron-active-hook.cjs": "ea47aad9f9f80aaf46d25a8e7689986613e7c6b83d1d3bcf1af010f077397418", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c", + "electron-once-runtime.mjs": "a7ea444819b51e0b261b025b28fe8e0a0c25bcd66c2203c62fb2aec8c1e02117", + "electron-fixture": "744a22f060e04a588a124b361e5a58af4e4f7b1704250143d987a5d5e65df6ac" + }, + "rows_file": "electron-native-once-2026-10-16.rows.jsonl", + "rows_count": 96, + "rows_sha256": "82c7092894d5f49b7864eef216ab07f130db447895c3905a9b09db37efe95f11", + "first93_rows_verified_identical_to_initial_cohort": true, + "baseline_resources": { + "log_sha256": "b71d3387cc7b807e25acb8eb986e686101dc55a89cdee5a3bde4bd634fe7322e", + "wall_seconds": 0.962, + "payload_exit_code": 0, + "cpu_usec": 735284, + "peak_cgroup_bytes": 36290560, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-9cc039a7f3ec4e1988938996b2ebf29f.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "candidate_resources": { + "log_sha256": "5f329338c07e5663cd7c72c07a7b40fbb79a1596b298b066a8d3d7da92cb04c1", + "wall_seconds": 0.891, + "payload_exit_code": 0, + "cpu_usec": 683474, + "peak_cgroup_bytes": 36401152, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-4f44b580349f4987b2507341298d16c3.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + "checks": { + "pinned_hook75": { + "log_sha256": "3474714f8ec6c3a31937481a35e0d6e6d9d2c8234f1f38163e20828281dad3ac", + "wall_seconds": 6.02, + "payload_exit_code": 0, + "cpu_usec": 5720548, + "peak_cgroup_bytes": 280649728, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-24c3cfa3395e4587b441729985bd4798.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "node24_21_hook75": { + "log_sha256": "ebd2e84927d5aa0acaf0ae4e805ba130cf8dd2c9d81542542649e1258b32fcfb", + "wall_seconds": 5.909, + "payload_exit_code": 0, + "cpu_usec": 5643565, + "peak_cgroup_bytes": 281411584, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-ec8d5e8c02114bfb8a36aaa0733596ce.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "static": { + "log_sha256": "e011b7cdd3970c40057c63b057766732f094d0e0c8b6f70159e553b9a4d0d5d9", + "wall_seconds": 95.645, + "payload_exit_code": 0, + "cpu_usec": 94833028, + "peak_cgroup_bytes": 4484653056, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-260bf0572cf743b6b18b1aa8a8c1b621.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "docs": { + "command": "npm run docs:check", + "log_sha256": "1189c48d371378f7470eec7c2addd3f6e095cba6cfbf22a7deb9d1713e1c0e08", + "wall_seconds": 13.796, + "payload_exit_code": 0, + "cpu_usec": 13426933, + "peak_cgroup_bytes": 516132864, + "complete_family_observation_verified": true, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-b1f4056f9bae4bbfaa04cd1e58e2890d.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + } + }, + "real_application": { + "receipt": { + "log_sha256": "e505879f87fac88abaf824ab8f5fb7a51e1c71e5a49d2461fa429d0ba45ec900", + "wall_seconds": 18.074, + "payload_exit_code": 1, + "cpu_usec": 17011774, + "peak_cgroup_bytes": 1422839808, + "complete_family_observation_verified": false, + "abort": null, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "scope": "rea-efficiency-453f90f1ed1a4105ba56515f94b2d1a3.scope", + "scope_poststate": "ActiveState=inactive\nSubState=dead", + "observer_sources_sha256": { + "resource-run.py": "7728862171415e7dee2c11af2ead2b9a54265fccaf82a7113956d36b29065e33", + "resource_payload.py": "6f089e645459eba80c5d73e39c21606c78173a44daf49fabc3b88c4631ce51c6" + } + }, + "summary": { + "profile": "/tmp/rea-4593-native-once-20261016-y_540lpi/trials/joplin-final32/profiles/joplin-shell-p2SQVa", + "runtime": "/home/yann/yann/rea-electron-native-once-4593-20261016", + "staged_hook_sha256": { + "electron-active-hook.cjs": "ea47aad9f9f80aaf46d25a8e7689986613e7c6b83d1d3bcf1af010f077397418", + "electron-active-hook-boundaries.cjs": "dae5ac52856a30566ec027cb15ddd46c2920c8defdec11512b6c1f189314d45c" + }, + "elapsed_ms": 17056.830471, + "launch_transport": "controlled-argv-shim", + "probe": { + "before_shell_count": 0, + "note": "1. Welcome to Joplin!", + "attachment": { + "src": "joplin-content://note-viewer//home/yann/.config/joplin-desktop/resources//3b19504020d34ef084f94e4632b69a6b.png?t=1792188662625", + "alt": "", + "width": 1075, + "height": 666 + }, + "revealed": "Reveal file in folder", + "image_visible": true, + "shell": [ + { + "sequence": 7188, + "correlation_id": "capture:4075547:7188", + "event": "showItemInFolder", + "phase": "blocked", + "channel": null, + "direction": null, + "sender": null, + "receiver": null, + "frame": null, + "target": null, + "argument_shapes": ["string"], + "result_shape": null, + "process_type": "browser", + "source": "electron-active-hook", + "capture_method": "api-wrapper", + "artifact_path": null, + "artifact_sha256": null, + "error": true, + "kind": "shell-attempt" + } + ], + "page_errors": [] + }, + "provider_ok": false, + "error": { + "tag": "BrowserObservationError", + "reason": "cleanup_failed" + }, + "coverage": { + "status": "partial_attach", + "observed_event_families": [ + "app-lifecycle", + "ipc", + "navigation", + "process-lifecycle", + "protocol", + "shell-attempt", + "web-contents-lifecycle", + "window-lifecycle" + ], + "unavailable_event_families": [ + "download", + "error", + "native-addon", + "permission", + "popup-attempt", + "preload", + "preload-configuration", + "renderer-ipc", + "updater" + ], + "observed_roles": ["browser", "main", "web_contents", "window"], + "pre_capture_activity": "unavailable" + }, + "retention": { + "budget_bytes": 16777216, + "estimated_retained_bytes": 14359880, + "event_serialized_byte_upper_bound": 3427720, + "retained": 7274, + "dropped": 0, + "dropped_event_families": [], + "dropped_event_roles": [], + "observed_ipc": 2457, + "dropped_ipc": 0, + "observed_runtime": 4817, + "dropped_runtime": 0 + }, + "actions": [ + { + "step_id": "settle-after-reveal", + "kind": "wait", + "window_index": 0, + "target": "window:0", + "elapsed_ms": 103, + "status": "completed", + "error": null + } + ], + "deadline_triggered": false, + "workflow_status": "partial-or-failed" + }, + "scope": "Unchanged Joplin shipped welcome PNG/reveal through actual menu and bridge; staged source hashes checked. Explicit test argv shim; overall provider cleanup failed. No synthetic app IPC channels.", + "baseline_reference": "PR4562 postmerge709b5cbd receipt /tmp/rea-4562-postmerge-identity.json; operation passed, cleanup failed, family observation unverified. Not an equivalent completed-task performance baseline." + } + }, + "review_followup": { + "source": "4ebd0f60e860daa57a7033c6e77ea7f5f4b8ac97", + "findings": [ + "https://github.com/morluto/rea/pull/4605#discussion_r4299895070", + "https://github.com/morluto/rea/pull/4605#discussion_r4299895076" + ], + "root_cause": "Success-only gap finalization and silent non-callable call/apply forwarding.", + "fix": "The once owner finalizes its missing gap in finally, after restoring scope; the callable metadata owner records failed non-callable dispatch reads without changing the returned value.", + "additional_cases": 7 + }, + "historical_ci": { + "head": "45473166e83f61e48c90732fb3f46ee8b4ad5cb7", + "run": 38974981554, + "failure": "Test shard1 binaryTargetAdmissionCancellation: retains the cleanup failure and its file owner when cancelled admission cannot close", + "scope": "Source-only attribution: binary admission test and producing process/application binary paths are unchanged by this Electron PR. No local reproduction or fix claimed.", + "job_log_sha256": "b903116753df0f481f32149ec26d25bb200a891649d46255e2f1d58bd97f3724" + } +} diff --git a/docs/verification/electron-native-once-2026-10-16.md b/docs/verification/electron-native-once-2026-10-16.md new file mode 100644 index 0000000000..df9fc8f391 --- /dev/null +++ b/docs/verification/electron-native-once-2026-10-16.md @@ -0,0 +1,142 @@ +# Native Electron once dispatch — 2026-10-16 + +#4593 was reported by review of #4562, but its source was already in main from +#4389. The initial report was explicitly source-only; subsequent paired controls +confirmed the bug. This change delegates `once` creation, firing and callable +selection to the actual runtime and observes only established callback entry. +CLI and MCP continue to share the same hook, event model, projection and retained +Evidence. No new tool, schema, execution authority or analysis cache is introduced. + +## Paired native controls + +The baseline is `709b5cbdc15aa757f89c38ecd12e5a47710747a6`. Final source is +`4ebd0f60e860daa57a7033c6e77ea7f5f4b8ac97`, including the two review-gap fixes below. Earlier source cohort +`c0b52b5408fa97013798e6ecee885ccac08e7356` contains the fix; the final cleanup +commit is `e60c4a1098321ed2a7f564ae35909a31d707694f`, which removes the obsolete fifth helper argument and +unreachable copied call/apply dispatch branches after inspecting every caller. +The pre-review gap-owner follow-up is `7f05f476c52498adba41d943ead1a86e7216ca76`. The adjacent JSON preserves +source hashes and separate measurement cohorts, including the initial 93-row prefix. +The final review JSONL contains 117 paired rows (39 inputs × 3 runtimes). The +earlier 96-row JSONL remains unchanged, including its initial 93-row prefix. Both +comparisons have identical native +control facts in each before/after pair. Regenerable binaries, apps, profiles +and multi-MB raw captures are excluded from Git. + +| Actual engine | Cases | Baseline behavioral differences | Fixed differences | +| ---------------------------------------------------------- | ----: | ------------------------------: | ----------------: | +| Node 24.18.0 (pinned) | 39 | 4 | 0 | +| Official Node 24.21.0 | 39 | 16 | 0 | +| Generic Electron 44.7.0 embedded Node 24.21.0, run as Node | 39 | 16 | 0 | + +The original 21-case reproduction found 0/9/9 differences respectively. The +pre-review 32-case cohort found 1/13/13. The final 39-case suite adds readonly +callback methods, emitter method invariants, native metadata writes, failure +recovery and non-callable callback methods. The extra pinned-runtime difference is registration +metadata ordering. On the newer runtimes, opaque callback methods can suppress +callbacks under the old hook although native dispatch executes them. The pinned +runtime also catches false invocation records when an opaque method legitimately +skips the callback. The added regression fails on the baseline for that false fact. + +These are **controlled producer cases with a minimal Electron module**, including +the actual embedded Node binary, not a real GUI application's natural callback +loss. Native traces, receiver checks, failures and remaining listeners are compared +exactly. Expected property reads are derived from each runtime rather than copied +from one Node implementation. The custom-apply guard still checks its original +Arguments representation when the runtime actually invokes that method. + +## Ownership and uncertainty + +Native once wrappers keep their public callback identity and descriptor attributes. +The registration receiver forwards methods/getters to the original emitter and +supports readonly method descriptors. A private callable receives an actual +Arguments frame, avoiding application Array species/iterators when recording. +Metadata recognition and admission share one bounded descriptor lookup. + +An application-selected opaque call/apply can bypass observation; a bounded +`custom-call`/`custom-apply` gap replaces invented invocation facts. Opaque native +metadata writes or registration lookups keep the exact original callback/native +operation and emit `once-metadata` gaps. The temporary unobserved scope is restored +even if registration throws. The 39-case suite checks this recovery, including a native alias that bypasses +patched `on`; the once owner retains the observation gap for that path. #4513 raw +recording-wrapper mutation remains explicitly unfixed. + +Review found two missing failure facts: a decorator can register through an +unhooked alias and then throw, and a runtime can read a non-callable call/apply +property before dispatch fails. Both new regressions fail on the pre-review +source. The once owner now finalizes its missing gap in `finally`, after restoring +the scope; the callable metadata owner records a failed gap while preserving the +exact non-callable value. Error identity and native callback behavior are retained. + +Two short-lived proxies are used for an observable once registration. Metadata +remains weakly retained, and existing event/serialization budgets remain in force. +The added registration cost was not isolated; no speed or token improvement is +claimed. The saved producer comparison is a correctness experiment, not a whole +application performance benchmark. Its runner reports differences instead of +exiting unsuccessfully for an expected bad baseline; the regression tests assert +that fixed behavior matches native behavior and observation claims are truthful. + +## Real application verification + +Unchanged Joplin Desktop 3.7.21 ASAR and explicit generic Electron 44.7.0 run the +shipped welcome note/1075×666 PNG → actual resource context menu → app bridge → +blocked reveal workflow. The image stays visible, page errors remain empty, +reveal events increase 0→1, and the shared retained capture contains the exact +event. Both staged hook files are hashed against the selected source before launch. +No synthetic application IPC channels or replacement app callbacks are added. + +The argv shim is an explicit test adapter for the still-failing standard startup +#2974. **Overall provider cleanup remains failed (#4282)** and the verifier exits +nonzero. External scope teardown is not provider cleanup. The first frozen real +pipeline takes 17.680 s; observed payload-exit CPU 16.272793 s and peak 1,395,253,248 B +have an extra descendant, so complete-family observation is **unverified**. The +cleanup cohort is recorded separately. The pre-review 32-case source repeats the real +operation successfully, but overall cleanup still fails: 18.074 s pipeline, observed +CPU 17.011774 s / peak 1,422,839,808 B; complete-family measurement remains unverified. No completed public CLI/MCP workflow, +real Windows/macOS run, natural app callback-loss reproduction or full check:pr +is claimed. + +The final review source repeats the same real operation: 18.353 s pipeline, +observed CPU 17.098599 s / peak 1,387,556,864 B; complete-family measurement remains +unverified and overall provider cleanup fails. An earlier trial failed to initialize +the display because the provider environment omits XAUTHORITY. That launch is +preserved separately; the fresh final trial uses local Xvfb with `-nolisten tcp -ac`, +not a production provider change. + +Frozen local validation: 75 hook cases on both Node versions; 5 projection + 8 MCP +cases on the unchanged shared contracts; static checks pass (final 118.946 s wall / 117.752622 s CPU / 4,282,826,752 B +cgroup peak, verified payload-exit family observation). The pinned final run uses +`test:focused`; an attempted `test:local` invocation was rejected before tests ran +and is recorded as not executed. See JSON for exact +commands/cohorts, failed candidate attempts, source pins and measured resources. +Failures include the Array-species frame, readonly receiver invariants, metadata +setter identity, on-getter ordering, a lint/interoperability correction and helper +preparation failures. They are not relabeled as results from the final source. + +All heavy work runs serially with CPU 10/quota 1, 8 GiB hard/6 GiB early/no swap/192 tasks. +Counters are captured at payload exit with the observer alive, not final whole-scope +counters; cgroup peak includes file cache. Each final Joplin run has a new private +configuration mount. Filesystem/runtime/build caches are warm; cold-system and +warm-repeat costs are unmeasured. Agent/billed tokens and public reply/context +costs are unmeasured. The broad internal error capture size is not an agent-token +measurement. All owned scopes are checked inactive/dead independently. + +## Reproduce the producer comparison + +Use the pinned project toolchain and explicitly provided alternate runtimes. +The alternate Node 24.21 archive is checked against [official checksums](https://nodejs.org/download/release/v24.21.0/SHASUMS256.txt); +its archive/binary hashes are recorded. No global toolchain is upgraded. + +```sh +python3 experiments/analysis-efficiency/electron-once-runtimes.py \ + --hook-root /absolute/checkout-to-measure \ + --node /absolute/pinned-node \ + --node /absolute/node24.21 \ + --electron /absolute/generic-electron44.7 \ + --output /absolute/owned-output +``` + +Run this under the recorded resource wrapper. For a baseline comparison, use a +clean checkout of 709b5cbd as hook-root while keeping the same current oracle/runner. +The runner retains full JSON and prints a compact summary. The real Joplin recipe +is in [the shell verifier record](electron-shell-sync-2026-10-16.md); select the +current runtime-root. That workflow must remain nonzero while cleanup fails. diff --git a/docs/verification/electron-native-once-2026-10-16.review.rows.jsonl b/docs/verification/electron-native-once-2026-10-16.review.rows.jsonl new file mode 100644 index 0000000000..0e525ddd56 --- /dev/null +++ b/docs/verification/electron-native-once-2026-10-16.review.rows.jsonl @@ -0,0 +1,117 @@ +{"runtime":0,"mode":"plain","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"plain","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"plain","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-opaque","arguments":0,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-call","error":false}]} +{"runtime":0,"mode":"call-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-opaque","arguments":1,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"apply-opaque","arguments":3,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"call-readonly","arguments":0,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-call","error":false}]} +{"runtime":0,"mode":"call-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-readonly","arguments":1,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"apply-readonly","arguments":3,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"call-getter","arguments":0,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-call","error":false}]} +{"runtime":0,"mode":"call-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-getter","arguments":1,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"apply-getter","arguments":3,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"call-throwing-getter","arguments":0,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-call","error":true}]} +{"runtime":0,"mode":"call-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-throwing-getter","arguments":1,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":true}]} +{"runtime":0,"mode":"apply-throwing-getter","arguments":3,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":true}]} +{"runtime":0,"mode":"call-non-callable","arguments":0,"native":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: this.listener.call is not a function","listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: listener.call is not a function","listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: this.listener.call is not a function","listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-call","error":true}]} +{"runtime":0,"mode":"call-non-callable","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-non-callable","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-non-callable","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-non-callable","arguments":1,"native":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: this.listener.apply is not a function","listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: listener.apply is not a function","listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: this.listener.apply is not a function","listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":true}]} +{"runtime":0,"mode":"apply-non-callable","arguments":3,"native":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: this.listener.apply is not a function","listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: listener.apply is not a function","listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: this.listener.apply is not a function","listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":true}]} +{"runtime":0,"mode":"inherited-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"candidate_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":0,"mode":"on-getter-listener-setter","arguments":0,"native":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"reads":1,"writes":[],"public_identity":true,"error":null},"candidate_hooked":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":0,"mode":"on-getter-native-alias","arguments":0,"native":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"candidate_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":0,"mode":"on-getter-native-alias-throws","arguments":0,"native":{"body_calls":1,"same_error":true,"public_identity":true,"listeners_after":0},"baseline_hooked":{"body_calls":1,"same_error":true,"public_identity":true,"listeners_after":0},"candidate_hooked":{"body_calls":1,"same_error":true,"public_identity":true,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":true}]} +{"runtime":0,"mode":"throwing-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"candidate_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":true},{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"readonly-emitter-methods","arguments":0,"native":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"candidate_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"plain","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"plain","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"plain","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-non-callable","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: listener.call is not a function","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-non-callable","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-non-callable","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-non-callable","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-non-callable","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: listener.apply is not a function","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-non-callable","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: listener.apply is not a function","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"inherited-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"candidate_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":1,"mode":"on-getter-listener-setter","arguments":0,"native":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"reads":1,"writes":[],"public_identity":true,"error":null},"candidate_hooked":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":1,"mode":"on-getter-native-alias","arguments":0,"native":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"candidate_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":1,"mode":"on-getter-native-alias-throws","arguments":0,"native":{"body_calls":1,"same_error":true,"public_identity":true,"listeners_after":0},"baseline_hooked":{"body_calls":1,"same_error":true,"public_identity":true,"listeners_after":0},"candidate_hooked":{"body_calls":1,"same_error":true,"public_identity":true,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":true}]} +{"runtime":1,"mode":"throwing-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"candidate_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":true},{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"readonly-emitter-methods","arguments":0,"native":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"candidate_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"plain","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"plain","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"plain","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-non-callable","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: listener.call is not a function","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-non-callable","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-non-callable","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-non-callable","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-non-callable","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: listener.apply is not a function","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-non-callable","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":[],"error":"TypeError: listener.apply is not a function","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"inherited-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"candidate_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":2,"mode":"on-getter-listener-setter","arguments":0,"native":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"reads":1,"writes":[],"public_identity":true,"error":null},"candidate_hooked":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":2,"mode":"on-getter-native-alias","arguments":0,"native":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"candidate_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":2,"mode":"on-getter-native-alias-throws","arguments":0,"native":{"body_calls":1,"same_error":true,"public_identity":true,"listeners_after":0},"baseline_hooked":{"body_calls":1,"same_error":true,"public_identity":true,"listeners_after":0},"candidate_hooked":{"body_calls":1,"same_error":true,"public_identity":true,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":true}]} +{"runtime":2,"mode":"throwing-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"candidate_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":true},{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"readonly-emitter-methods","arguments":0,"native":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"candidate_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} diff --git a/docs/verification/electron-native-once-2026-10-16.rows.jsonl b/docs/verification/electron-native-once-2026-10-16.rows.jsonl new file mode 100644 index 0000000000..a401448db4 --- /dev/null +++ b/docs/verification/electron-native-once-2026-10-16.rows.jsonl @@ -0,0 +1,96 @@ +{"runtime":0,"mode":"plain","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"plain","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"plain","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-opaque","arguments":0,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-call","error":false}]} +{"runtime":0,"mode":"call-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-opaque","arguments":1,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"apply-opaque","arguments":3,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"call-readonly","arguments":0,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-call","error":false}]} +{"runtime":0,"mode":"call-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-readonly","arguments":1,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"apply-readonly","arguments":3,"native":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"call-getter","arguments":0,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-call","error":false}]} +{"runtime":0,"mode":"call-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-getter","arguments":1,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"apply-getter","arguments":3,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":false}]} +{"runtime":0,"mode":"call-throwing-getter","arguments":0,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-call","error":true}]} +{"runtime":0,"mode":"call-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"call-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"apply-throwing-getter","arguments":1,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":true}]} +{"runtime":0,"mode":"apply-throwing-getter","arguments":3,"native":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"custom-apply","error":true}]} +{"runtime":0,"mode":"inherited-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"candidate_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":0,"mode":"on-getter-listener-setter","arguments":0,"native":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"reads":1,"writes":[],"public_identity":true,"error":null},"candidate_hooked":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":0,"mode":"throwing-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"candidate_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"readonly-emitter-methods","arguments":0,"native":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"candidate_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"plain","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"plain","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"plain","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"call-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"apply-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"inherited-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"candidate_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":1,"mode":"on-getter-listener-setter","arguments":0,"native":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"reads":1,"writes":[],"public_identity":true,"error":null},"candidate_hooked":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":1,"mode":"throwing-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"candidate_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":1,"mode":"readonly-emitter-methods","arguments":0,"native":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"candidate_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"plain","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"plain","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"plain","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-opaque","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-opaque","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-opaque","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-readonly","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-readonly","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-readonly","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call","opaque:call"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply","opaque:apply"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:call"],"error":"Error: getter:call","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"call-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-throwing-getter","arguments":0,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:0"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-throwing-getter","arguments":1,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:1"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"apply-throwing-getter","arguments":3,"native":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_hooked":{"body_calls":0,"correct_receiver":true,"trace":["get:apply"],"error":"Error: getter:apply","listeners_after":0},"candidate_hooked":{"body_calls":1,"correct_receiver":true,"trace":["body:3"],"error":null,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":true}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"inherited-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"candidate_hooked":{"body_calls":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":2,"mode":"on-getter-listener-setter","arguments":0,"native":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_hooked":{"body_calls":1,"reads":1,"writes":[],"public_identity":true,"error":null},"candidate_hooked":{"body_calls":1,"reads":1,"writes":[true],"public_identity":false,"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":2,"mode":"throwing-listener-setter","arguments":0,"native":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"candidate_hooked":{"body_calls":1,"writes":[true],"error":"Error: metadata-write","listeners_after":1},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":2,"mode":"readonly-emitter-methods","arguments":0,"native":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"candidate_hooked":{"body_calls":1,"seen":["on:true","removeListener:true"],"error":null},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"main-event-invocation","event":null,"error":false}]} +{"runtime":0,"mode":"on-getter-native-alias","arguments":0,"native":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"candidate_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":1,"mode":"on-getter-native-alias","arguments":0,"native":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"candidate_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} +{"runtime":2,"mode":"on-getter-native-alias","arguments":0,"native":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"candidate_hooked":{"body_calls":1,"reads":1,"listeners_after":0},"baseline_observation":[{"kind":"main-event-invocation","event":null,"error":false}],"candidate_observation":[{"kind":"ipc-observation-gap","event":"once-metadata","error":false}]} diff --git a/experiments/analysis-efficiency/electron-once-runtime.mjs b/experiments/analysis-efficiency/electron-once-runtime.mjs new file mode 100644 index 0000000000..903fbf7f8b --- /dev/null +++ b/experiments/analysis-efficiency/electron-once-runtime.mjs @@ -0,0 +1,335 @@ +// Controlled producer oracle, not real-application/provider evidence. Stage +// this file beside a minimal Electron module and the actual unmodified hook. +import { EventEmitter } from "node:events"; +import { createRequire } from "node:module"; +import { pathToFileURL } from "node:url"; + +if (process.argv[2]) await import(pathToFileURL(process.argv[2])); +// Match the hook's CommonJS module identity. Electron's ESM bare-module +// resolver can select its builtin even when run as Node with a staged fixture. +const { ipcMain } = createRequire(import.meta.url)("electron"); +if (globalThis.__reaElectronActiveSnapshot?.().hook_error !== false) + throw new Error("The canonical hook must be installed without errors"); + +const modes = [ + "plain", + "call-opaque", + "apply-opaque", + "call-readonly", + "apply-readonly", + "call-getter", + "apply-getter", + "call-throwing-getter", + "apply-throwing-getter", + "call-non-callable", + "apply-non-callable", +]; + +const execute = (emitter, channel, mode, argumentCount) => { + let bodyCalls = 0; + let correctReceiver = true; + const trace = []; + const listener = function listener() { + bodyCalls += 1; + correctReceiver &&= this === emitter; + trace.push(`body:${arguments.length}`); + }; + if (mode !== "plain") { + const method = mode.startsWith("call") ? "call" : "apply"; + const opaque = () => trace.push(`opaque:${method}`); + if (mode.includes("getter")) + Object.defineProperty(listener, method, { + get() { + trace.push(`get:${method}`); + if (mode.includes("throwing")) throw new Error(`getter:${method}`); + return opaque; + }, + }); + else if (mode.includes("readonly")) + Object.defineProperty(listener, method, { value: opaque }); + else listener[method] = mode.includes("non-callable") ? null : opaque; + } + emitter.once(channel, listener); + let error = null; + try { + emitter.emit( + channel, + ...Array.from({ length: argumentCount }, (_, i) => i), + ); + emitter.emit(channel, "must-not-run-twice"); + } catch (cause) { + error = String(cause); + } + return { + body_calls: bodyCalls, + correct_receiver: correctReceiver, + trace, + error, + listeners_after: emitter.listenerCount(channel), + }; +}; + +const rows = []; +for (const mode of modes) + for (const argumentCount of [0, 1, 3]) { + const channel = `${mode}:${argumentCount}`; + const native = execute(new EventEmitter(), channel, mode, argumentCount); + const hooked = execute(ipcMain, channel, mode, argumentCount); + const events = globalThis + .__reaElectronActiveSnapshot() + .events.filter((event) => event.channel === channel); + rows.push({ + mode, + argument_count: argumentCount, + native, + hooked, + semantic_match: JSON.stringify(native) === JSON.stringify(hooked), + observation: events.map(({ kind, event, error }) => ({ + kind, + event, + error, + })), + }); + } + +const additional = (mode, scenario) => { + const channel = `metadata:${mode}`; + const native = scenario(new EventEmitter(), channel); + const hooked = scenario(ipcMain, channel); + rows.push({ + mode, + argument_count: 0, + native, + hooked, + semantic_match: JSON.stringify(native) === JSON.stringify(hooked), + observation: globalThis + .__reaElectronActiveSnapshot() + .events.filter((event) => event.channel === channel) + .map(({ kind, event, error }) => ({ kind, event, error })), + }); +}; + +additional("inherited-listener-setter", (emitter, channel) => { + const original = Object.getOwnPropertyDescriptor( + Function.prototype, + "listener", + ); + const writes = []; + let bodyCalls = 0; + const listener = () => { + bodyCalls += 1; + }; + Object.defineProperty(Function.prototype, "listener", { + configurable: true, + set(value) { + writes.push(value === listener); + }, + }); + let error = null; + try { + emitter.once(channel, listener); + } catch (cause) { + error = String(cause); + } finally { + if (original) + Object.defineProperty(Function.prototype, "listener", original); + else delete Function.prototype.listener; + } + const publicIdentity = + emitter.rawListeners(channel)[0]?.listener === listener; + emitter.emit(channel); + return { + body_calls: bodyCalls, + writes, + public_identity: publicIdentity, + error, + }; +}); + +additional("on-getter-listener-setter", (emitter, channel) => { + const prototypeMetadata = Object.getOwnPropertyDescriptor( + Function.prototype, + "listener", + ); + const onMetadata = Object.getOwnPropertyDescriptor(emitter, "on"); + const on = emitter.on; + let reads = 0, + bodyCalls = 0, + error = null; + const writes = []; + const listener = () => { + bodyCalls += 1; + }; + Object.defineProperty(emitter, "on", { + configurable: true, + get() { + reads += 1; + Object.defineProperty(Function.prototype, "listener", { + configurable: true, + set(value) { + writes.push(value === listener); + }, + }); + return on; + }, + }); + try { + emitter.once(channel, listener); + } catch (cause) { + error = String(cause); + } finally { + if (prototypeMetadata) + Object.defineProperty(Function.prototype, "listener", prototypeMetadata); + else delete Function.prototype.listener; + if (onMetadata) Object.defineProperty(emitter, "on", onMetadata); + else delete emitter.on; + } + const publicIdentity = + emitter.rawListeners(channel)[0]?.listener === listener; + emitter.emit(channel); + return { + body_calls: bodyCalls, + reads, + writes, + public_identity: publicIdentity, + error, + }; +}); + +additional("on-getter-native-alias", (emitter, channel) => { + const original = Object.getOwnPropertyDescriptor(emitter, "on"); + let reads = 0, + bodyCalls = 0; + const listener = () => { + bodyCalls += 1; + }; + Object.defineProperty(emitter, "on", { + configurable: true, + get() { + reads += 1; + return EventEmitter.prototype.on; + }, + }); + try { + emitter.once(channel, listener); + } finally { + if (original) Object.defineProperty(emitter, "on", original); + else delete emitter.on; + } + emitter.emit(channel); + return { + body_calls: bodyCalls, + reads, + listeners_after: emitter.listenerCount(channel), + }; +}); + +additional("on-getter-native-alias-throws", (emitter, channel) => { + const original = Object.getOwnPropertyDescriptor(emitter, "on"); + const failure = new Error("registered-before-error"); + let bodyCalls = 0, + sameError = false; + const listener = () => { + bodyCalls += 1; + }; + Object.defineProperty(emitter, "on", { + configurable: true, + get() { + return function registerThenThrow(name, callback) { + EventEmitter.prototype.on.call(this, name, callback); + throw failure; + }; + }, + }); + try { + emitter.once(channel, listener); + } catch (cause) { + sameError = cause === failure; + } finally { + if (original) Object.defineProperty(emitter, "on", original); + else delete emitter.on; + } + const publicIdentity = + emitter.rawListeners(channel)[0]?.listener === listener; + emitter.emit(channel); + return { + body_calls: bodyCalls, + same_error: sameError, + public_identity: publicIdentity, + listeners_after: emitter.listenerCount(channel), + }; +}); + +additional("throwing-listener-setter", (emitter, channel) => { + const original = Object.getOwnPropertyDescriptor( + Function.prototype, + "listener", + ); + const writes = []; + let bodyCalls = 0, + error = null; + const listener = () => { + bodyCalls += 1; + }; + Object.defineProperty(Function.prototype, "listener", { + configurable: true, + set(value) { + writes.push(value === listener); + throw new Error("metadata-write"); + }, + }); + try { + emitter.once(channel, listener); + } catch (cause) { + error = String(cause); + } finally { + if (original) + Object.defineProperty(Function.prototype, "listener", original); + else delete Function.prototype.listener; + } + // A failed registration must not leave later registrations unobservable. + emitter.on(channel, listener); + emitter.emit(channel); + return { + body_calls: bodyCalls, + writes, + error, + listeners_after: emitter.listenerCount(channel), + }; +}); + +additional("readonly-emitter-methods", (emitter, channel) => { + const seen = []; + for (const key of ["on", "removeListener"]) { + const original = emitter[key]; + Object.defineProperty(emitter, key, { + value: function readonlyMethod(...args) { + seen.push(`${key}:${this === emitter}`); + return Reflect.apply(original, this, args); + }, + configurable: false, + writable: false, + }); + } + let bodyCalls = 0, + error = null; + const listener = () => { + bodyCalls += 1; + }; + try { + emitter.once(channel, listener); + emitter.emit(channel); + } catch (cause) { + error = String(cause); + } + return { body_calls: bodyCalls, seen, error }; +}); +console.log( + JSON.stringify({ + node: process.versions.node, + electron: process.versions.electron ?? null, + cases: rows.length, + disagreements: rows.filter((row) => !row.semantic_match).length, + rows, + }), +); diff --git a/experiments/analysis-efficiency/electron-once-runtimes.py b/experiments/analysis-efficiency/electron-once-runtimes.py new file mode 100644 index 0000000000..4beaa5deb8 --- /dev/null +++ b/experiments/analysis-efficiency/electron-once-runtimes.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +"""Serial native/hooked producer controls; not real-application evidence.""" + +import argparse +import hashlib +import json +import os +from pathlib import Path +import shutil +import subprocess +import tempfile + + +def sha256(path): + with path.open("rb") as stream: + return hashlib.file_digest(stream, "sha256").hexdigest() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--hook-root", type=Path, required=True) + parser.add_argument("--node", type=Path, action="append", required=True) + parser.add_argument("--electron", type=Path) + parser.add_argument("--output", type=Path, required=True) + arguments = parser.parse_args() + arguments.output.mkdir(parents=True, exist_ok=True) + packet = Path(tempfile.mkdtemp(prefix="native-once-", dir=arguments.output)) + stage = packet / "staged" + module = stage / "node_modules/electron" + module.mkdir(parents=True) + fixture = module / "index.js" + fixture.write_text( + 'const { EventEmitter } = require("node:events");\n' + "module.exports = { app: new EventEmitter(), ipcMain: new EventEmitter() };\n" + ) + sources = [ + arguments.hook_root / "scripts/electron-active-hook.cjs", + arguments.hook_root / "scripts/electron-active-hook-boundaries.cjs", + Path(__file__).with_name("electron-once-runtime.mjs"), + ] + pins = {path.name: sha256(path) for path in sources} + pins["electron-fixture"] = sha256(fixture) + for source in sources: + shutil.copyfile(source, stage / source.name) + engines = [(engine, False) for engine in arguments.node] + if arguments.electron is not None: + engines.append((arguments.electron, True)) + results = [] + for index, (engine, run_as_node) in enumerate(engines): + selected = engine.absolute() + environment = dict(os.environ) + if run_as_node: + environment["ELECTRON_RUN_AS_NODE"] = "1" + execution = subprocess.run( + [str(selected), str(stage / sources[-1].name), str(stage / sources[0].name)], + env=environment, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + timeout=15, + check=False, + ) + (packet / f"engine-{index}.stdout").write_bytes(execution.stdout) + (packet / f"engine-{index}.stderr").write_bytes(execution.stderr) + receipt = { + "selected_binary": str(engine), + "absolute_binary": str(selected), + "binary_sha256": sha256(selected), + "electron_run_as_node": run_as_node, + "exit_code": execution.returncode, + "stdout_sha256": hashlib.sha256(execution.stdout).hexdigest(), + "stderr_sha256": hashlib.sha256(execution.stderr).hexdigest(), + } + if execution.returncode == 0: + receipt["result"] = json.loads(execution.stdout) + results.append(receipt) + report = {"hook_root": str(arguments.hook_root), "source_sha256": pins, + "engines": results, "scope": __doc__} + (packet / "report.json").write_text(json.dumps(report, indent=2) + "\n") + if execution.returncode != 0: + raise RuntimeError(f"Engine failed; preserved receipt at {packet}") + print(json.dumps({"packet": str(packet), "engines": [ + {"node": row["result"]["node"], "electron": row["result"]["electron"], + "cases": row["result"]["cases"], + "disagreements": row["result"]["disagreements"]} for row in results + ]})) + + +if __name__ == "__main__": + main() diff --git a/experiments/analysis-efficiency/joplin-shell-boundary.mjs b/experiments/analysis-efficiency/joplin-shell-boundary.mjs index 8f38ebba8d..cfa5b684c0 100644 --- a/experiments/analysis-efficiency/joplin-shell-boundary.mjs +++ b/experiments/analysis-efficiency/joplin-shell-boundary.mjs @@ -2,8 +2,9 @@ // Unchanged Joplin ASAR and its shipped welcome note/attachment. The actual // resource context menu, bridge and shell call execute; menu automation is explicit. import assert from "node:assert/strict"; -import { mkdtemp, writeFile } from "node:fs/promises"; -import { join, resolve } from "node:path"; +import { createHash } from "node:crypto"; +import { mkdtemp, readFile, writeFile } from "node:fs/promises"; +import { dirname, join, resolve } from "node:path"; import { pathToFileURL } from "node:url"; import { parseArgs } from "node:util"; import { _electron } from "playwright-core"; @@ -39,6 +40,7 @@ const profile = await mkdtemp( let application; let child; let probe; +let stagedHookHashes; const started = performance.now(); const controller = new AbortController(); const deadline = setTimeout( @@ -46,7 +48,39 @@ const deadline = setTimeout( 45_000, ); +const verifyHookSources = async (stagedHook) => { + const hashes = {}; + for (const name of [ + "electron-active-hook.cjs", + "electron-active-hook-boundaries.cjs", + ]) { + const hash = (data) => createHash("sha256").update(data).digest("hex"); + const actualPath = + name === "electron-active-hook.cjs" + ? stagedHook + : join(dirname(stagedHook), name); + const [actual, expected] = await Promise.all([ + readFile(actualPath).then(hash), + readFile(join(runtime, "scripts", name)).then(hash), + ]); + assert.equal( + actual, + expected, + `The staged ${name} must match the selected runtime source`, + ); + hashes[name] = actual; + } + return hashes; +}; + const launch = async (options) => { + const stagedIndex = options.args.indexOf("-r"); + assert.notEqual( + stagedIndex, + -1, + "Expected the provider's staged require pair", + ); + stagedHookHashes = await verifyHookSources(options.args[stagedIndex + 1]); let launchOptions = options; if (values["argv-shim-transport"]) { // Explicit test adapter for #2974, not the public provider launch path. @@ -246,6 +280,7 @@ try { JSON.stringify({ profile, runtime, + staged_hook_sha256: stagedHookHashes, elapsed_ms: performance.now() - started, launch_transport: values["argv-shim-transport"] ? "controlled-argv-shim" diff --git a/scripts/electron-active-hook.cjs b/scripts/electron-active-hook.cjs index c8892594b0..6e535ee338 100644 --- a/scripts/electron-active-hook.cjs +++ b/scripts/electron-active-hook.cjs @@ -8,6 +8,7 @@ const arrayFrom = Array.from; const defineProperty = Object.defineProperty; const ownPropertyDescriptor = Object.getOwnPropertyDescriptor; const getPrototypeOf = Object.getPrototypeOf; +const nativeFunctionPrototype = getPrototypeOf(callFunction); const getProperty = Reflect.get; const setProperty = Reflect.set; const SetConstructor = Set; @@ -379,13 +380,7 @@ const recordInvocation = (kind, channel, event, args) => error: false, }); -const invokeObservedEventListener = ( - thisArg, - channel, - listener, - args, - nativeMethod, -) => { +const invokeObservedEventListener = (thisArg, channel, listener, args) => { // Recording slices an actual invocation frame, avoiding Array species; // callback dispatch keeps its native Array/Arguments representation. const recorded = recordInvocation( @@ -395,8 +390,6 @@ const invokeObservedEventListener = ( sliceArguments(args, 1), ); try { - if (nativeMethod === "call") return listener.call(thisArg); - if (nativeMethod === "apply") return listener.apply(thisArg, args); return applyFunction(listener, thisArg, args); } catch (cause) { if (recorded !== null) recorded.error = true; @@ -418,9 +411,9 @@ const invokeObservedEventListener = ( const hookListenerRemovalTargets = new WeakMap(); const MAX_LISTENER_CHAIN_HOPS = 16; -// Follow native property lookup without invoking application getters or Proxy -// traps. Undefined means the readable link is absent; null means unknown. -const listenerDataDescriptor = (listener) => { +// Parse native property lookup without invoking application getters or Proxy +// traps. Undefined means absent; null means the lookup is unknown. +const lookupPropertyDescriptor = (listener, key) => { let candidate = listener; for ( let hops = 0; @@ -428,17 +421,21 @@ const listenerDataDescriptor = (listener) => { hops += 1 ) { if (isProxy(candidate)) return null; - const descriptor = ownPropertyDescriptor(candidate, "listener"); - if (descriptor !== undefined) { - if (hasOwnProperty(descriptor, "value")) return descriptor; - // A setter-only property shadows ancestors with a known undefined read. - return descriptor.get === undefined ? undefined : null; - } + const descriptor = ownPropertyDescriptor(candidate, key); + if (descriptor !== undefined) return descriptor; candidate = getPrototypeOf(candidate); } return candidate === null ? undefined : null; }; +const listenerDataDescriptor = (listener) => { + const descriptor = lookupPropertyDescriptor(listener, "listener"); + if (descriptor === null || descriptor === undefined) return descriptor; + if (hasOwnProperty(descriptor, "value")) return descriptor; + // A setter-only property shadows ancestors with a known undefined read. + return descriptor.get === undefined ? undefined : null; +}; + // A decorator that wraps once's hook wrapper and names it through `.listener` // already records through that wrapper. Registering the decorator as is keeps // native self-removal working: the once wrapper removes itself by identity, and @@ -461,9 +458,67 @@ const classifyHookListenerWrapper = (listener) => { return typeof candidate === "function" ? "unknown" : "unowned"; }; +const createObservedOnceCallback = (target, channel, listener, receiver) => { + // A private callable target avoids Proxy get invariants on an app's + // non-configurable, read-only call/apply properties. It never escapes + // through the native once wrapper's public listener link. + const callback = new ProxyConstructor( + function observedOnceListener() { + return invokeObservedEventListener( + this === receiver ? target : this, + channel, + listener, + arguments, + ); + }, + { + get: (_callable, key) => { + let value; + try { + value = getProperty(listener, key, listener); + } catch (cause) { + if (key === "call" || key === "apply") + recordIpcObservationGap(channel, `custom-${key}`, true); + throw cause; + } + if (key !== "call" && key !== "apply") return value; + if (typeof value !== "function") { + recordIpcObservationGap(channel, `custom-${key}`, true); + return value; + } + if (value === callFunction || value === applyArguments) return value; + // A runtime that selects an application method must preserve that + // method's receiver and original argument-list object. Its body may + // bypass the callable Proxy, so retain a gap rather than an invocation. + return new ProxyConstructor(value, { + apply: (method, thisArg, args) => { + const gap = recordIpcObservationGap(channel, `custom-${key}`); + if (args[0] === receiver) args[0] = target; + try { + return applyFunction( + method, + thisArg === callback ? listener : thisArg, + args, + ); + } catch (cause) { + if (gap !== null) { + gap.error = true; + gap.phase = "failed"; + } + throw cause; + } + }, + }); + }, + }, + ); + return callback; +}; + const patchIpcMain = (ipcMain) => { if (ipcMain === null || ipcMain === undefined) return; const { handle, on, once, removeAllListeners } = ipcMain; + let unobservedOnceScope = null; if (typeof handle === "function") ipcMain.handle = function patchedIpcMainHandle(channel, listener) { if (typeof listener !== "function") @@ -492,6 +547,13 @@ const patchIpcMain = (ipcMain) => { if (typeof on !== "function") return; ipcMain.on = function patchedIpcMainOn(channel, listener) { if (typeof listener !== "function") return on.call(this, channel, listener); + if (unobservedOnceScope !== null) { + const scope = unobservedOnceScope; + const result = on.call(this, channel, listener); + recordIpcObservationGap(channel, "once-metadata"); + if (scope.channel === channel) scope.gapRecorded = true; + return result; + } const wrapperStatus = classifyHookListenerWrapper(listener); if (wrapperStatus !== "unowned") { const result = on.call(this, channel, listener); @@ -549,30 +611,81 @@ const patchIpcMain = (ipcMain) => { weakMapSet(hookListenerRemovalTargets, wrapped, listener); return on.call(this, channel, wrapped); }; - // Mirror EventEmitter#once and _onceWrap: resolve this.on at registration - // and target.removeListener at firing, so later decorators observe both. + // Native once owns firing, removal and callback dispatch. Node versions + // differ in whether they read callback.call/apply. Observe actual invocation + // through a private callable Proxy instead of copying either implementation. if (typeof once === "function") ipcMain.once = function patchedIpcMainOnce(channel, listener) { - if (typeof listener !== "function") + if ( + typeof listener !== "function" || + this === null || + (typeof this !== "object" && typeof this !== "function") + ) return once.call(this, channel, listener); const target = this; - let fired = false; - const wrapped = function wrappedOnceEventListener() { - if (fired) return undefined; - target.removeListener(channel, wrapped); - fired = true; - return invokeObservedEventListener( - target, - channel, - listener, - arguments, - arguments.length === 0 ? "call" : "apply", - ); - }; - wrapped.listener = listener; - weakMapSet(hookListenerRemovalTargets, wrapped, wrapped); - this.on(channel, wrapped); - return this; + const metadata = lookupPropertyDescriptor( + nativeFunctionPrototype, + "listener", + ); + const onMetadata = lookupPropertyDescriptor(target, "on"); + if ( + metadata === null || + (metadata !== undefined && !hasOwnProperty(metadata, "value")) || + onMetadata === null || + (onMetadata !== undefined && !hasOwnProperty(onMetadata, "value")) + ) { + // Native wrapper creation can expose its callback through an inherited + // setter/Proxy, including one installed by an on getter. Pass the exact + // app callback; registrations in this synchronous scope stay unwrapped. + const previousScope = unobservedOnceScope; + const scope = { channel, gapRecorded: false }; + let failed = true; + unobservedOnceScope = scope; + try { + const result = applyFunction(once, target, [channel, listener]); + failed = false; + return result; + } finally { + unobservedOnceScope = previousScope; + // An app decorator can register through an unhooked alias and then + // throw. Preserve a gap for either outcome, not proof of registration. + if (!scope.gapRecorded) + recordIpcObservationGap(channel, "once-metadata", failed); + } + } + const receiver = new ProxyConstructor( + { __proto__: null }, + { + get: (_target, key) => { + const value = getProperty(target, key, target); + if ( + (key !== "on" && key !== "removeListener") || + typeof value !== "function" + ) + return value; + return function forwardOnceOperation(...args) { + if (key === "on") { + const wrapped = args[1]; + defineProperty(wrapped, "listener", { + ...ownPropertyDescriptor(wrapped, "listener"), + value: listener, + }); + weakMapSet(hookListenerRemovalTargets, wrapped, wrapped); + } + return applyFunction(value, target, args); + }; + }, + set: (_target, key, value) => setProperty(target, key, value, target), + }, + ); + const callback = createObservedOnceCallback( + target, + channel, + listener, + receiver, + ); + const result = applyFunction(once, receiver, [channel, callback]); + return result === receiver ? target : result; }; if (typeof removeAllListeners !== "function") return; // Node owns its live-array traversal. A forwarding receiver translates only diff --git a/tests/boundary/browser/electronActiveHook.test.ts b/tests/boundary/browser/electronActiveHook.test.ts index 093169b20c..7547d6f0ca 100644 --- a/tests/boundary/browser/electronActiveHook.test.ts +++ b/tests/boundary/browser/electronActiveHook.test.ts @@ -940,6 +940,70 @@ process.stdout.write(JSON.stringify({ plain: scenario(new EventEmitter()), hooke expect(hooked).toEqual(plain); }); +it("matches native once dispatch and retains only established invocations", async () => { + const root = await createTestTempDirectory("rea-electron-hook-native-once-"); + temporary.push(root); + await writeElectronFixture(root); + const script = join(root, "electron-once-runtime.mjs"); + await copyFile( + fileURLToPath( + new URL( + "../../../experiments/analysis-efficiency/electron-once-runtime.mjs", + import.meta.url, + ), + ), + script, + ); + const execution = await runNode(script, root); + expect(execution.code, execution.stderr).toBe(0); + const result = JSON.parse(execution.stdout) as { + cases: number; + disagreements: number; + rows: readonly { + mode: string; + native: Record; + hooked: Record & { body_calls: number }; + observation: readonly { kind: string; event: string | null }[]; + }[]; + }; + expect(result.cases).toBe(39); + expect(result.disagreements).toBe(0); + for (const row of result.rows) { + expect(row.hooked, row.mode).toEqual(row.native); + const invocations = row.observation.filter( + (event) => event.kind === "main-event-invocation", + ); + if ( + row.mode === "inherited-listener-setter" || + row.mode === "on-getter-listener-setter" || + row.mode.startsWith("on-getter-native-alias") + ) { + expect(invocations).toEqual([]); + expect(row.observation).toEqual([ + { + kind: "ipc-observation-gap", + event: "once-metadata", + error: row.mode === "on-getter-native-alias-throws", + }, + ]); + } else { + expect(invocations.length, row.mode).toBe(row.hooked.body_calls); + if (row.hooked.body_calls === 0) + expect( + row.observation.some((event) => event.kind === "ipc-observation-gap"), + row.mode, + ).toBe(true); + if (row.mode.includes("non-callable") && row.hooked.body_calls === 0) + expect(row.observation, row.mode).toEqual([ + expect.objectContaining({ + kind: "ipc-observation-gap", + error: true, + }), + ]); + } + } +}); + it.each(["single-on", "multiple-on", "empty-once", "event-once"])( "preserves native callable method reads during %s dispatch", async (mode) => { @@ -985,16 +1049,11 @@ console.log(JSON.stringify({ plain: scenario(new EventEmitter()), hooked: scenar plain: Record; hooked: Record; }; - expect(plain).toEqual({ - calls: mode === "multiple-on" ? ["first", "second"] : [], - reads: - mode === "multiple-on" - ? [] - : [mode === "empty-once" ? "call" : "apply"], - failure: - mode === "multiple-on" ? null : "application invocation metadata", - remaining: mode === "multiple-on" ? 2 : mode === "single-on" ? 1 : 0, - }); + // The native dependency owns whether it consults call/apply. Compare the + // complete trace rather than requiring one pinned Node implementation. + expect(plain.remaining).toBe( + mode === "multiple-on" ? 2 : mode === "single-on" ? 1 : 0, + ); expect(hooked).toEqual(plain); }, ); @@ -1094,7 +1153,9 @@ console.log(JSON.stringify({ plain: scenario(new EventEmitter()), hooked: scenar }; expect(plain).toEqual({ calls: 1, - argumentObject: true, + // Newer runtimes bypass custom apply entirely. If native calls it, the + // callback's guard still requires its exact Arguments representation. + argumentObject: expect.any(Boolean), correctReceiver: true, failure: null, remaining: 0,