From e9c2f0cb4a22bdf36bdf3eebc29257b040e6e492 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 14:40:55 -0400 Subject: [PATCH 01/18] Record durable CDP admission and discovery predictions before qualification --- .../notebook/2026-10-31-durable-cdp-authority.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md new file mode 100644 index 0000000..6823585 --- /dev/null +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md @@ -0,0 +1,14 @@ +# Durable CDP authority and restart retention + +## DCA1 · prediction · 2026-10-31 14:40 +Hypothesis: a single holder preserving the observed CDP document marker and owning the existing durable admission lock can prevent blind redispatch across CLI and holder restart without relaxing native evidence validation. +Test: installed browser cdp CLI against an independent loopback ingress ledger; interrupt client and holder before admission, after prepared intent, after durable start, and after fixture effect; reopen authority and repeat the same token, then a new token. Challenge changed requests, missing/failed guard, stale document, foreign producer, absent readback, and disabled typing. +Predicts: prepared-only recovery is known not_sent; started or acknowledged activation remains unknown and completion unverified, blocks new tokens, and repeat tokens never add ingress. CLI restart reconnects only to the original live holder; holder loss never adopts or launches a browser. Native evidence continues rejecting browser bindings. +Against: any repeat adds ingress, any changed target is activated, an uncertain operation becomes completed from an ack or DOM appearance, a live holder is recovered by another owner, or a missing guard permits activation. +Refs: docs/plans/light-profile-20261030.md; results/cdp-dom-click-20261031/; reference anchors ev-cd1396cf9a543a0da0cb6fed, ev-cd2d3b7de9e879914b7b949f, ev-0860862fcd5501a1b90e9be5, ev-15d2df3506a0b868b3b39c3b in output/repo-learning/linux-consolidation/library. + +## DCA2 · prediction · 2026-10-31 14:40 +Hypothesis: discovery can make the owned headless CDP route findable without implying that CUA-free package metadata or general browser completion is already delivered. +Test: installed tools, doctor, schema browser cdp and the version-matched guide with no CUA/browser-use importable; inspect actual command requirements and refusal receipts. +Predicts: discovery names CDP setup and guard requirements, typed/native-button scope, unverified completion and disabled typing; describes the existing full dependency metadata separately from the future light install. +Against: a cold agent is directed to CUA/X11 for the CDP route, an unavailable light install is recommended as shipped, or discovery advertises typing/completion unsupported by the executable. From cad7508f8f4375735c0651c5e0aa5929f3b57700 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 14:49:46 -0400 Subject: [PATCH 02/18] Add guarded durable CDP holder and read-only restart recovery --- .github/workflows/cdp-observation.yml | 4 +- README.md | 5 +- .../2026-10-31-durable-cdp-authority.md | 4 + jevdual/docs/owned-cdp.md | 97 ++++ jevdual/python/jevdual/agent_cli.py | 45 +- jevdual/python/jevdual/arbiter.py | 12 +- jevdual/python/jevdual/browser_authority.py | 327 +++++++++++++ jevdual/python/jevdual/browser_cli.py | 206 ++++++++ jevdual/python/jevdual/browser_guard.py | 100 ++++ jevdual/python/jevdual/browser_holder.py | 446 ++++++++++++++++++ .../jevdual/effectors/cdp/operations.py | 20 +- jevdual/tests/test_browser_cdp_cli.py | 167 +++++++ .../tests/test_browser_durable_authority.py | 320 +++++++++++++ jevdual/tests/test_browser_guard.py | 34 ++ jevdual/tests/test_browser_holder.py | 380 +++++++++++++++ jevdual/tests/test_browser_restart_cli.py | 282 +++++++++++ 16 files changed, 2439 insertions(+), 10 deletions(-) create mode 100644 jevdual/docs/owned-cdp.md create mode 100644 jevdual/python/jevdual/browser_authority.py create mode 100644 jevdual/python/jevdual/browser_cli.py create mode 100644 jevdual/python/jevdual/browser_guard.py create mode 100644 jevdual/python/jevdual/browser_holder.py create mode 100644 jevdual/tests/test_browser_cdp_cli.py create mode 100644 jevdual/tests/test_browser_durable_authority.py create mode 100644 jevdual/tests/test_browser_guard.py create mode 100644 jevdual/tests/test_browser_holder.py create mode 100644 jevdual/tests/test_browser_restart_cli.py diff --git a/.github/workflows/cdp-observation.yml b/.github/workflows/cdp-observation.yml index ddd7ba8..21cab8c 100644 --- a/.github/workflows/cdp-observation.yml +++ b/.github/workflows/cdp-observation.yml @@ -22,14 +22,14 @@ jobs: - name: Install only the browser qualification dependencies run: | uv venv --python 3.12 "$RUNNER_TEMP/cdp-env" - uv pip install --python "$RUNNER_TEMP/cdp-env/bin/python" --only-binary=:all: pytest==8.4.2 psutil==7.2.2 websockets==15.0.1 + uv pip install --python "$RUNNER_TEMP/cdp-env/bin/python" --only-binary=:all: pytest==8.4.2 psutil==7.2.2 websockets==15.0.1 'packaging>=25,<27' uv pip install --python "$RUNNER_TEMP/cdp-env/bin/python" --no-deps "$RUNNER_TEMP"/cdp-wheel/*.whl - name: Qualify real Chrome outside the checkout without CUA or browser-use run: | test -x "$FOOTWORK_CHROME_EXECUTABLE" "$FOOTWORK_CHROME_EXECUTABLE" --version mkdir "$RUNNER_TEMP/cdp-tests" - cp jevdual/tests/test_cdp_effector.py jevdual/tests/test_cdp_transport_deadline.py jevdual/tests/test_cdp_launch_custody.py jevdual/tests/test_cdp_click.py jevdual/tests/test_cdp_click_contract.py "$RUNNER_TEMP/cdp-tests/" + cp jevdual/tests/test_cdp_effector.py jevdual/tests/test_cdp_transport_deadline.py jevdual/tests/test_cdp_launch_custody.py jevdual/tests/test_cdp_click.py jevdual/tests/test_cdp_click_contract.py jevdual/tests/test_browser_durable_authority.py jevdual/tests/test_browser_holder.py jevdual/tests/test_browser_guard.py jevdual/tests/test_browser_cdp_cli.py jevdual/tests/test_browser_restart_cli.py "$RUNNER_TEMP/cdp-tests/" cd "$RUNNER_TEMP/cdp-tests" unset PYTHONPATH "$RUNNER_TEMP/cdp-env/bin/python" -c "import importlib.util; assert importlib.util.find_spec('cua_driver') is None; assert importlib.util.find_spec('browser_use') is None" diff --git a/README.md b/README.md index 9e1b59d..975405e 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,9 @@ For a read-only lookup, a straightforward browser test or an API with its own au your existing tools may already cover the job. Durability is route-specific: native CLI sessions opt in with `--authority`; the scoped MCP service -has its own journal. The dedicated browser CLI does not inherit native durable replay. See +has its own journal. The legacy dedicated browser CLI does not inherit native durable replay. An explicit +[owned headless CDP preview](jevdual/docs/owned-cdp.md) now adds durable admission and restart +retention for a bounded button route; typing and general browser completion remain unavailable. See [**why Footwork, and where it fits**](jevdual/docs/why-footwork.md) for examples and exact boundaries. ## Start here @@ -52,6 +54,7 @@ footwork doctor # see this machine's prerequisites | What you want to do | Start with | | --- | --- | | Read pages and operate a dedicated browser | [CLI quickstart](jevdual/docs/quickstart.md#open-a-browser-session) | +| Qualify guarded headless browser actions and restart recovery | [Owned CDP preview](jevdual/docs/owned-cdp.md) | | Work in a native app | [macOS operator example](#drive-it) or [Linux X11 guide](jevdual/docs/linux-support.md) | | Give an agent one scoped browser-to-document job | [MCP installation](jevdual/docs/capability-packaging.md) and [agent-host recipe](jevdual/docs/installed-agent-host.md) | | Review OCR, inspect a target or explore the simulator | [Bundled tool families](jevdual/docs/unified-cli.md#auxiliary-families) | diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md index 6823585..44af7bb 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md @@ -12,3 +12,7 @@ Hypothesis: discovery can make the owned headless CDP route findable without imp Test: installed tools, doctor, schema browser cdp and the version-matched guide with no CUA/browser-use importable; inspect actual command requirements and refusal receipts. Predicts: discovery names CDP setup and guard requirements, typed/native-button scope, unverified completion and disabled typing; describes the existing full dependency metadata separately from the future light install. Against: a cold agent is directed to CUA/X11 for the CDP route, an unavailable light install is recommended as shipped, or discovery advertises typing/completion unsupported by the executable. + +## DCAU1 · update · 2026-10-31 14:49 +Observed: the first real CLI lost-client-ack test delivered exactly one fixture ingress and retained unknown, but recover failed because the CLI caught OSError/ValueError while the holder identity checker raises RuntimeError. The catch boundary was corrected; the three focused discovery/lost-client/missing-guard CLI checks then passed. Four existing unrelated-cwd discovery checks initially failed because the source test used a relative PYTHONPATH; rerunning with the absolute candidate source root passed all 47 focused guard/discovery/authorization checks. These are harness/integration failures, not evidence of browser completion. +Next: finish exact installed-wheel tests, independent review and VM qualification before resolving DCA1/DCA2. General completion readers, pipe custody and the light metadata split remain open. diff --git a/jevdual/docs/owned-cdp.md b/jevdual/docs/owned-cdp.md new file mode 100644 index 0000000..a6706db --- /dev/null +++ b/jevdual/docs/owned-cdp.md @@ -0,0 +1,97 @@ +# An owned browser, with a memory for uncertain actions + +The headless CDP lane lets an agent observe a page and activate a narrowly supported button without +starting a desktop session. It needs Chrome, a configured judgment provider and durable storage. +It does not need CUA, X11, a window manager or AT-SPI at runtime. + +The useful part is what happens when the connection disappears. Footwork records an operation before +it can activate the button. The next CLI process can retrieve that operation by its original token. +It will not click again to find out whether the first click worked. + +This is an explicit preview route, `footwork browser cdp`. The older `footwork browser start/look/do` +commands keep their existing CUA behavior. The package still declares its full dependencies; the +CUA-free **install** is a later packaging change. A manually assembled qualification environment is +not yet the supported light installer. + +## The loop + +After installing Footwork, configure Jev through `TYPESAFE_API_KEY`, then use a fresh, short absolute +session path. Keep the authority database on durable storage. Sessions that share a database also +share its unresolved-operation gate. + +```sh +footwork doctor +footwork schema browser cdp start +footwork browser cdp guide # this installed version's contract + +footwork browser cdp start 'Commit the fixture once' \ + --session /tmp/fw-example \ + --authority /absolute/durable/browser-authority.db \ + --url http://127.0.0.1:8000/fixture + +footwork browser cdp look --session /tmp/fw-example +footwork browser cdp click --session /tmp/fw-example \ + --ref REF_FROM_LOOK --token fixture-commit-1 +footwork browser cdp status --session /tmp/fw-example --token fixture-commit-1 +footwork browser cdp stop --session /tmp/fw-example +``` + +Choose the opaque ref returned by `look`. Repeating the exact ref and token retrieves the retained +operation; changing the request under that token conflicts. A new observation cannot clear an +uncertain operation. If the holder disappears, use `recover --session DIR` to inspect the journal. +Recovery does not start Chrome, adopt a tab or reconstruct a target from its URL. + +Only directly named, plain main-document `button[type=button]` controls are eligible. The activation +route is `dom_event_native_button`; it is not a pointer sequence or trusted input. Typing remains +disabled because the focus race is unresolved. There is no navigation RPC; loading the initial URL +is explicit setup and can itself have website effects outside the guarded click protocol. + +## Read the operation, then decide + +| Retained evidence | What Footwork reports | +| --- | --- | +| Prepared intent, interrupted before durable start | `not_sent` after read-only recovery | +| Qualified refusal before activation | `not_sent` | +| Activation acknowledged by Chrome | `unknown`, phase `sent`, completion `unverified` | +| Start committed, reply unavailable | `unknown`, completion `unverified`; do not retry | + +An acknowledgement tells you that activation was invoked. It does not establish the website's +business effect. This tranche has no qualified browser completion reader, so an acknowledged or +ambiguous activation blocks further mutations in that authority database. The lane is useful for +qualifying durable execution; it is not yet a general multi-step browser agent. A future reader must +bind independent application evidence to the admitted operation and arguments. A success banner or +matching current DOM cannot do that by itself. + +Do not switch databases or invent a new token to work around an unknown. Keep the original operation +and resolve the real application state before continuing outside this preview lane. + +## Bring a judgment adapter + +The default judgment provider is Jev. For a different provider, `--guard-command FILE` accepts a JSON +argv array whose first entry is an absolute executable path. This is trusted policy code chosen by +the operator, not a sandbox or a built-in approval stub. The executable receives one JSON object on +stdin and must return one bounded JSON object on stdout within the deadline. + +The request names `footwork.browser.guard.request`, version `1`, and includes `digest`, `task`, +`targets`, `url`, `title` and the complete browser `binding`. The response must contain exactly: + +```json +{"producer":"footwork.browser.guard","version":1,"digest":"THE_REQUEST_DIGEST","probabilities":[0.8]} +``` + +The probability is the provider's destructive-action judgment, not an allow flag. The existing +Authorizer applies its keyword checks and destructive threshold. Missing, malformed, failed or +high-risk judgment refuses before admission. There is no `--no-judge` or destructive-grant bypass +in this preview route. + +## Custody and cleanup + +One holder owns the Chrome handle, CDP connection, exact document refs and authority lock. Clients +use a private Unix socket and check the holder's process incarnation and kernel peer identity. +That protects cooperative session routing; it does not isolate Footwork from arbitrary code running +as the same user. Chrome still exposes its owned loopback CDP endpoint. Process-owned pipe transport +remains future custody hardening. + +`stop` closes the original owned process handles and reports bounded cleanup separately from action +outcome. Holder death may leave Chrome descendants alive. Recovery never guesses which PIDs to kill, +and a cleanup acknowledgement never settles an uncertain business effect. diff --git a/jevdual/python/jevdual/agent_cli.py b/jevdual/python/jevdual/agent_cli.py index 4fad014..134cb1c 100644 --- a/jevdual/python/jevdual/agent_cli.py +++ b/jevdual/python/jevdual/agent_cli.py @@ -48,6 +48,7 @@ class RoutingError(ValueError): def catalog() -> dict: + from .browser_cli import discovery from .tool_catalog import catalog as auxiliary desktop_route = { @@ -67,7 +68,11 @@ def catalog() -> dict: "commands": list(LEGACY), "agent_commands": ["tools", "catalog", "schema", "doctor", "invoke", "capability", "mcp", "tool"], "surfaces": { - "browser": {"commands": ["start", *sorted(SESSION)], "route": "dedicated Chrome / CUA DevTools"}, + "browser": { + "commands": ["start", *sorted(SESSION), "cdp"], + "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", + "cdp": discovery(), + }, "desktop": {"commands": list(LEGACY), "route": desktop_route}, }, "capability": { @@ -89,6 +94,7 @@ def _help() -> None: "Agent discovery: tools (or catalog), schema [COMMAND ...], doctor\n" "JSON input: invoke --input FILE (or - for stdin), request {command,args}\n" "Browser: browser start TASK --url URL --session DIR; browser look/do/read/done/status ...\n" + "Owned headless browser: browser cdp {start,look,click,status,recover,stop,guide}; typing disabled\n" "Desktop: desktop start TASK --app APP --session DIR; desktop look/do/read/done/status ...\n" "Scoped MCP: capability {config,server,report,doctor}; mcp --scope FILE --journal FILE\n" "Auxiliary tools: tool FAMILY COMMAND ... (or FAMILY COMMAND ...)\n" @@ -189,6 +195,9 @@ def _schema(args: list[str]) -> dict: "data": "decoded JSON output when available", }, } + cdp_schema = len(args) >= 2 and args[:2] == ["browser", "cdp"] + if cdp_schema: + args = args[1:] if args[0] in ("browser", "desktop"): if len(args) == 1: return catalog()["surfaces"][args[0]] @@ -210,7 +219,11 @@ def _schema(args: list[str]) -> dict: result = command_schema(family_args[0], family_args[1]) return {"command": family_args, "invocation": ["footwork", *family_args], **result} return family - if args and args[0] in ("doctor", "capability", "mcp"): + if cdp_schema: + from .browser_cli import build_parser + + selected = args[1:] + elif args and args[0] in ("doctor", "capability", "mcp"): from .capability.cli import build_parser selected = ( @@ -272,6 +285,30 @@ def _doctor(args: list[str]) -> int: result["acceleration"] = acceleration_status() result["host_prerequisites"] = probe() result["tool_families"] = auxiliary() + import importlib.util + import os + + from .browser_cli import discovery + from .browser_driver import chrome_executable + + cdp = discovery() + try: + chrome_executable() + chrome_present = True + except RuntimeError: + chrome_present = False + cdp["prerequisite_presence"] = { + "chrome": chrome_present, + "psutil": importlib.util.find_spec("psutil") is not None, + "websockets": importlib.util.find_spec("websockets") is not None, + "jev_environment_configured": bool(os.environ.get("TYPESAFE_API_KEY")), + "judgment_adapter": "explicit per-session configuration; not checked by offline doctor", + } + cdp["runtime_qualification"] = "not_checked" + result["browser_profiles"] = {"cdp": cdp, "legacy": { + "profile": "full-desktop", "requires": ["CUA", "X11/AT-SPI on Linux"], + }} + result["profile_note"] = "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately." result["effect_verification"] = "not_asserted" _emit(result) return code @@ -300,6 +337,10 @@ def _dispatch(args: list[str], legacy: Callable[[list[str]], int], json_mode: bo if json_mode and routed and routed[0] == "server": raise RoutingError("MCP server owns stdout; run without --json to preserve its protocol") return capability(routed) + if command == "browser" and rest and rest[0] == "cdp": + from .browser_cli import main as cdp + + return cdp(rest[1:]) if command in ("browser", "desktop"): routed = _surface_args(command, rest) return legacy(routed) if routed else 0 diff --git a/jevdual/python/jevdual/arbiter.py b/jevdual/python/jevdual/arbiter.py index e8566a4..3f892a4 100644 --- a/jevdual/python/jevdual/arbiter.py +++ b/jevdual/python/jevdual/arbiter.py @@ -20,12 +20,14 @@ from collections.abc import Callable from dataclasses import dataclass, field, fields from pathlib import Path -from typing import Any +from typing import TYPE_CHECKING, Any from jevdual.effects import Effect, diff from jevdual.menu import Menu -from jevdual.policy import Decision, StepContext -from jevdual.s1 import Verdict + +if TYPE_CHECKING: + from jevdual.policy import Decision, StepContext + from jevdual.s1 import Verdict DEFAULT_POLICY_PATH = Path(__file__).with_name("arbiter.toml") @@ -160,7 +162,7 @@ def match_destructive_keyword(text: str, keywords: tuple[str, ...]) -> str | Non return None -OnDone = Callable[[Decision, Menu, StepContext, Any], Verdict] +OnDone = Callable[["Decision", Menu, "StepContext", Any], "Verdict"] @dataclass @@ -220,6 +222,8 @@ def _acted_recently(self, url: str, target: int | None, step: int, window: int) def _rule(self, name: str, kind: str, reason: str) -> Verdict: self.stats[name] += 1 + from jevdual.s1 import Verdict + return Verdict(kind, f"{name}: {reason}") # type: ignore[arg-type] # ---- the ruling ------------------------------------------------------------ diff --git a/jevdual/python/jevdual/browser_authority.py b/jevdual/python/jevdual/browser_authority.py new file mode 100644 index 0000000..6afa5f2 --- /dev/null +++ b/jevdual/python/jevdual/browser_authority.py @@ -0,0 +1,327 @@ +"""Durable custody for the bounded owned-CDP native-button route. + +This is a cooperative runtime protocol, not authentication of caller-supplied +evidence. The owned holder runs the guard and calls this journal before input. +An activation acknowledgement establishes no application postcondition. Neither +it nor a changed DOM can resolve an admitted operation as completed. +""" + +from __future__ import annotations + +import hashlib +import json +import math +import re +import time +from dataclasses import asdict +from typing import Any + +from jevdual.capability.journal import JournalError, Operation +from jevdual.session_operations import SessionOperations, _digest + +PROTOCOL = "footwork.browser.cdp" +VERSION = 1 +ROUTE = "dom_event_native_button" +MAX_RECORD_BYTES = 1_048_576 +_BINDING = frozenset({ + "boot", "pid", "start", "browser_context", "target", "cdp_session", "frame", "loader", + "backend_node", "execution_context", "document_token", "fingerprint", +}) +_NO_SEND = frozenset({ + "stale_ref", "target_changed", "document_changed", "browser_route_unqualified", + "browser_mutation_unqualified", "document_unavailable", "browser_validation_unavailable", + "browser_connection_closed", "button_changed", "button_disabled", "button_hidden", + "button_validation_unavailable", +}) + + +class BrowserEvidenceError(JournalError): + """Unsupported browser records cannot confer authority or settle custody.""" + + code = "browser_evidence_invalid" + + +def canonical(value: Any) -> str: + try: + body = json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) + except (ValueError, TypeError) as exc: + raise BrowserEvidenceError("browser evidence must be finite JSON") from exc + if len(body.encode()) > MAX_RECORD_BYTES: + raise BrowserEvidenceError("browser evidence exceeds retention bound") + return body + + +def _text(value: Any, name: str, *, empty: bool = False) -> None: + if not isinstance(value, str) or (not value and not empty) or len(value) > 8192: + raise BrowserEvidenceError(f"invalid browser {name}") + + +def validate_binding(binding: Any) -> dict[str, Any]: + """Validate browser v1 identity independently of native window identity.""" + if not isinstance(binding, dict) or set(binding) != _BINDING: + raise BrowserEvidenceError("unsupported browser binding") + canonical(binding) + for key in _BINDING - {"pid", "backend_node", "execution_context"}: + _text(binding[key], key, empty=key == "browser_context") + for key in ("pid", "backend_node", "execution_context"): + if type(binding[key]) is not int or binding[key] <= 0: + raise BrowserEvidenceError(f"invalid browser {key}") + try: + incarnation = float(binding["start"]) + fingerprint = json.loads(binding["fingerprint"]) + except (ValueError, TypeError) as exc: + raise BrowserEvidenceError("invalid browser incarnation or fingerprint") from exc + if not math.isfinite(incarnation) or incarnation <= 0 or repr(incarnation) != binding["start"]: + raise BrowserEvidenceError("invalid browser incarnation") + if not isinstance(fingerprint, dict) or set(fingerprint) != {"tag", "attrs", "text", "ancestors"}: + raise BrowserEvidenceError("unsupported button fingerprint") + if (fingerprint["tag"] != "button" or not isinstance(fingerprint["attrs"], list) + or not isinstance(fingerprint["text"], str) or not isinstance(fingerprint["ancestors"], list)): + raise BrowserEvidenceError("invalid button fingerprint") + canonical(fingerprint) + return binding + + +def browser_resource(binding: dict[str, Any]) -> str: + validate_binding(binding) + return "browser:" + canonical({ + key: binding[key] for key in ("boot", "pid", "start", "browser_context", "target") + }) + + +def _request(request: Any) -> None: + if not isinstance(request, dict) or set(request) != {"ref", "route"} or request["route"] != ROUTE: + raise BrowserEvidenceError("unsupported browser request") + _text(request["ref"], "ref") + + +def guard_digest(session_id: str, request: dict[str, Any], binding: dict[str, Any]) -> str: + return hashlib.sha256(canonical({"session": session_id, "request": request, "binding": binding}).encode()).hexdigest() + + +def _guard(guard: Any, session_id: str, request: dict[str, Any], binding: dict[str, Any]) -> None: + if (not isinstance(guard, dict) or set(guard) != {"producer", "version", "decision", "digest"} + or guard["producer"] != "footwork.browser.guard" or type(guard["version"]) is not int + or guard["version"] != VERSION or guard["decision"] != "allow" + or not isinstance(guard["digest"], str) or not re.fullmatch("[0-9a-f]{64}", guard["digest"]) + or guard["digest"] != guard_digest(session_id, request, binding)): + raise BrowserEvidenceError("browser admission requires its bound configured guard decision") + + +def _outcome(reply: Any) -> tuple[str, str, str]: + if (not isinstance(reply, dict) or set(reply) != {"status", "dispatched", "route", "code"} + or reply["status"] not in ("ok", "refused", None) + or (reply["dispatched"] is not None and type(reply["dispatched"]) is not bool) + or reply["route"] not in (ROUTE, None) + or (reply["code"] is not None and not isinstance(reply["code"], str))): + raise BrowserEvidenceError("unsupported browser runtime reply") + if (reply["status"] == "refused" and reply["dispatched"] is False + and reply["code"] in _NO_SEND): + return "not_sent", "refused", "qualified_gate" + if (reply["status"] == "ok" and reply["dispatched"] is True + and reply["route"] == ROUTE and reply["code"] is None): + return "sent", "unverifiable", "activation_ack" + return "ambiguous", "unverifiable", "unknown" + + +def operation_record(op: Operation) -> dict[str, Any]: + """Expose custody without turning activation or replay into completion.""" + return {**asdict(op), "completion": "unverified", "retryable": False} + + +class BrowserAuthority(SessionOperations): + """Reuse the shared authority domain; keep browser evidence a separate protocol.""" + + def _admission(self, op: Operation) -> dict[str, Any]: + row = self._db.execute( + "SELECT projection FROM operator_admissions WHERE operation=?", (op.id,) + ).fetchone() + try: + projection = json.loads(row[0]) if row else None + if (not isinstance(projection, dict) + or set(projection) != {"protocol", "version", "binding", "guard"} + or projection["protocol"] != PROTOCOL or type(projection["version"]) is not int + or projection["version"] != VERSION): + raise BrowserEvidenceError("not a browser authority admission") + _request(op.args) + binding = validate_binding(projection["binding"]) + _guard(projection["guard"], op.task, op.args, binding) + if (op.resource != browser_resource(binding) or op.observation != op.args["ref"] + or op.target != str(binding["backend_node"]) or op.move != "click" + or op.request_digest != _digest(op.task, op.args)): + raise BrowserEvidenceError("browser identity differs from admission") + return projection + except (ValueError, TypeError, KeyError) as exc: + raise BrowserEvidenceError("invalid retained browser admission") from exc + + def _is_browser(self, op: Operation) -> bool: + # The resource namespace selects validation; malformed browser admissions must + # fail closed rather than falling through to a native validator. + return op.resource.startswith("browser:") + + def admit_click(self, *, session_id: str, token: str, request: dict[str, Any], + binding: dict[str, Any], guard: dict[str, Any]) -> Operation: + _text(session_id, "session") + _text(token, "client token") + _request(request) + prior = self.by_request(session_id, token, request) + if prior is not None: + self._admission(prior) + return prior + validate_binding(binding) + _guard(guard, session_id, request, binding) + return super().admit( + session_id=session_id, token=token, request=request, resource=browser_resource(binding), + observation=request["ref"], target=str(binding["backend_node"]), move="click", + authorization_basis="configured_browser_guard", + projection={"protocol": PROTOCOL, "version": VERSION, "binding": binding, "guard": guard}, + ) + + def start(self, op_id: str) -> Operation: + op = self._owned(op_id) + if self._is_browser(op): + self._admission(op) + return super().start(op_id) + + def mark_unknown(self, op_id: str) -> Operation: + """Retain interruption without pretending that the effector returned a reply.""" + op = self._owned(op_id) + if not self._is_browser(op): + raise BrowserEvidenceError("not a browser authority operation") + if op.state != "dispatching": + return op + if op.execution_stage != "started": + raise BrowserEvidenceError("unknown input requires a started admission") + try: + record = self._retained_execution(op) + except (BrowserEvidenceError, ValueError, TypeError, KeyError): + record = None + if record is not None: + return self.finish_from_execution(op.id) + # No returned receipt exists. This writes uncertainty only and deliberately + # bypasses browser finalization, which requires a valid returned record. + return super().finish( + op.id, dispatched=None, effect="unverifiable", phase="ambiguous", + evidence={"protocol": PROTOCOL, "version": VERSION, "completion": "unverified"}, + error="browser execution outcome unavailable; do not retry", + ) + + def finish(self, op_id: str, *, dispatched: bool | None, effect: str, evidence: dict[str, Any], + error: str | None = None, delivered: bool | None = None, + phase: str | None = None) -> Operation: + op = self._owned(op_id) + if self._is_browser(op): + # Generic native finalization must not confer browser no-send or effect proof. + if effect in {"confirmed", "partial"} or delivered is True: + raise BrowserEvidenceError("browser activation cannot establish application completion") + record = self._retained_execution(op) + if dispatched is False and (record is None or record["phase"] != "not_sent"): + raise BrowserEvidenceError("browser no-send requires its retained qualified gate") + if record is not None and any( + value != record[key] for key, value in + (("dispatched", dispatched), ("effect", effect), ("phase", phase), ("error", error)) + ): + raise BrowserEvidenceError("browser finalization differs from its retained runtime reply") + return super().finish(op_id, dispatched=dispatched, effect=effect, evidence=evidence, + error=error, delivered=delivered, phase=phase) + + def _validate_record(self, record: Any, op: Operation) -> dict[str, Any]: + admission = self._admission(op) + expected = { + "protocol": PROTOCOL, "schema_version": VERSION, "kind": "browser_execution", + "operation_id": op.id, "session_id": op.task, "request_digest": op.request_digest, + "resource": op.resource, "observation": op.observation, "target": op.target, "move": op.move, + "binding": admission["binding"], "guard": admission["guard"], "custody": "returned", + "producer": {"name": PROTOCOL, "version": VERSION}, + } + keys = {*expected, "interval", "reply", "dispatched", "phase", "effect", "basis", "projection", "error"} + if not isinstance(record, dict) or set(record) != keys: + raise BrowserEvidenceError("unsupported browser execution record") + canonical(record) + if (any(record[key] != value for key, value in expected.items()) + or type(record["schema_version"]) is not int + or type(record["producer"].get("version")) is not int): + raise BrowserEvidenceError("browser execution belongs to another attempt") + interval = record["interval"] + if (not isinstance(interval, dict) or set(interval) != {"start", "end"} + or any(type(v) not in (float, int) or not math.isfinite(v) for v in interval.values()) + or not op.created <= interval["start"] <= interval["end"] <= time.time()): + raise BrowserEvidenceError("invalid browser execution interval") + phase, effect, basis = _outcome(record["reply"]) + dispatched = False if phase == "not_sent" else True if phase == "sent" else None + if (record["phase"] != phase or record["effect"] != effect or record["basis"] != basis + or type(record["dispatched"]) is not type(dispatched) or record["dispatched"] != dispatched + or record["projection"] != admission or record["error"] is not None): + raise BrowserEvidenceError("browser execution contradicts its qualified outcome") + return record + + def record_execution(self, op_id: str, capsule: dict[str, Any]) -> None: + op = self._owned(op_id) + if not self._is_browser(op): + return super().record_execution(op_id, capsule) + if op.state != "dispatching" or op.execution_stage != "started": + raise BrowserEvidenceError("browser receipt requires a started owned attempt") + self._validate_record(capsule, op) + body = canonical(capsule) + digest = hashlib.sha256(body.encode()).hexdigest() + with self._tx() as db: + prior = db.execute( + "SELECT body,digest FROM operator_execution_receipts WHERE operation=?", (op.id,) + ).fetchone() + if prior is not None: + if (prior["body"], prior["digest"]) != (body, digest): + raise BrowserEvidenceError("browser execution receipt is immutable") + return + db.execute("INSERT INTO operator_execution_receipts VALUES (?,?,?,?)", + (op.id, body, digest, time.time())) + self._event(db, op.id, "browser_execution_retained", {"protocol": PROTOCOL, "version": VERSION}) + + def _retained_execution(self, op: Operation) -> dict[str, Any] | None: + if not self._is_browser(op): + return super()._retained_execution(op) + self._admission(op) + row = self._db.execute( + "SELECT * FROM operator_execution_receipts WHERE operation=?", (op.id,) + ).fetchone() + if row is None: + return None + if hashlib.sha256(row["body"].encode()).hexdigest() != row["digest"]: + raise BrowserEvidenceError("browser execution receipt integrity failed") + record = self._validate_record(json.loads(row["body"]), op) + if record["interval"]["end"] > row["recorded"]: + raise BrowserEvidenceError("browser execution receipt predates capture") + return record + + def record_reply(self, op_id: str, reply: dict[str, Any]) -> Operation: + op = self._owned(op_id) + admission = self._admission(op) + phase, effect, basis = _outcome(reply) + now = time.time() + record = { + "protocol": PROTOCOL, "schema_version": VERSION, "kind": "browser_execution", + "operation_id": op.id, "session_id": op.task, "request_digest": op.request_digest, + "resource": op.resource, "observation": op.observation, "target": op.target, "move": op.move, + "binding": admission["binding"], "guard": admission["guard"], "custody": "returned", + "producer": {"name": PROTOCOL, "version": VERSION}, + "interval": {"start": op.updated, "end": now}, "reply": reply, + "dispatched": False if phase == "not_sent" else True if phase == "sent" else None, + "phase": phase, "effect": effect, "basis": basis, "projection": admission, "error": None, + } + self.record_execution(op_id, record) + return self.finish_from_execution(op_id) + + def _reconcile_execution(self, op_id: str) -> Operation: + op = self._owned(op_id) + if not self._is_browser(op): + return super()._reconcile_execution(op_id) + try: + return super()._reconcile_execution(op_id) + except (BrowserEvidenceError, ValueError, TypeError, KeyError): + # A missing, foreign or tampered retained result never releases custody. + return op + + def reconcile(self, op_id: str) -> Operation: + op = self._owned(op_id) + if not self._is_browser(op): + return super().reconcile(op_id) + return self._reconcile_execution(op_id) diff --git a/jevdual/python/jevdual/browser_cli.py b/jevdual/python/jevdual/browser_cli.py new file mode 100644 index 0000000..6d1160a --- /dev/null +++ b/jevdual/python/jevdual/browser_cli.py @@ -0,0 +1,206 @@ +"""Explicit owned CDP CLI. Restart retrieves state; it never recreates input authority.""" + +from __future__ import annotations + +import argparse +import asyncio +import json +import os +import subprocess +import sys +import time +import uuid +from pathlib import Path + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(prog="footwork browser cdp", description=__doc__) + commands = parser.add_subparsers(dest="command", required=True) + start = commands.add_parser("start", help="launch a new owned headless browser and durable holder") + start.add_argument("task") + start.add_argument("--session", type=Path, required=True, help="fresh private directory; short absolute path") + start.add_argument("--authority", type=Path, required=True, help="absolute durable authority database") + start.add_argument("--url", required=True, help="initial page only; no navigation RPC") + start.add_argument("--chrome", help="Chrome executable; otherwise use normal Chrome discovery") + start.add_argument("--guard-command", type=Path, help="JSON argv file for a trusted judgment adapter; default Jev") + for command in ("look", "click", "status", "recover", "stop"): + selected = commands.add_parser(command) + selected.add_argument("--session", type=Path, required=True) + if command == "click": + selected.add_argument("--ref", required=True, help="opaque ref from the last look; never reselected by label") + selected.add_argument("--token", required=True, help="stable token for this intended activation") + if command in ("status", "recover"): + selected.add_argument("--token", help="inspect a retained operation by its original token") + commands.add_parser("guide", help="installed, version-matched CDP loop and limitations") + return parser + + +def discovery() -> dict: + return { + "profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", + "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], + "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], + "desktop_required": False, "cua_required": False, "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", + } + + +def guide() -> dict: + from importlib.metadata import PackageNotFoundError, version + + try: + installed = version("jevdual") + except PackageNotFoundError: + installed = "source-checkout" + return {"package_version": installed, **discovery(), "loop": [ + "start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", + "look --session DIR; choose the exact opaque ref returned by this holder", + "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", + "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", + "recover --session DIR after holder loss: read-only recovery; no browser is launched", + "stop --session DIR; retain the authority database and all unresolved operations", + ], "guard_adapter": { + "configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", + "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", + "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", + "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses", + }, "limits": [ + "An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", + "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", + "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", + "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", + "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", + "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol.", + ]} + + +def _config(path: Path) -> dict: + from .browser_holder import CONFIG_FILE + + if not path.is_absolute() or path.is_symlink() or path.stat().st_mode & 0o077: + raise ValueError("session must be an absolute private directory") + config_path = path / CONFIG_FILE + if config_path.is_symlink() or config_path.stat().st_mode & 0o077: + raise ValueError("session config must be private") + if config_path.stat().st_size > 65536: + raise ValueError("session config too large") + config = json.loads(config_path.read_text()) + if config.get("version") != 1 or not Path(config["authority"]).is_absolute(): + raise ValueError("unsupported session config") + return config + + +def _start(args) -> dict: + from urllib.parse import urlsplit + + from .browser_driver import chrome_executable + from .browser_holder import CONFIG_FILE, HOLDER_FILE + + if not args.session.is_absolute() or not args.authority.is_absolute(): + raise ValueError("session and authority paths must be absolute") + if len(os.fsencode(args.session / "holder.sock")) > 100: + raise ValueError("session path exceeds Unix socket bound; choose a shorter path") + if urlsplit(args.url).scheme not in ("http", "https"): + raise ValueError("initial URL must use http or https") + command = None + if args.guard_command: + if args.guard_command.stat().st_size > 65536: + raise ValueError("guard argv file too large") + command = json.loads(args.guard_command.read_text()) + if (not isinstance(command, list) or not command or len(command) > 32 + or any(not isinstance(x, str) or not x for x in command) + or not os.path.isabs(command[0])): + raise ValueError("guard argv needs an absolute executable and string arguments") + chrome = args.chrome or chrome_executable() + args.session.mkdir(mode=0o700, parents=True, exist_ok=False) + config = {"version": 1, "session_id": "cdp_" + uuid.uuid4().hex, "task": args.task, + "chrome": chrome, "initial_url": args.url, "authority": str(args.authority), "guard_command": command} + with (args.session / CONFIG_FILE).open("x") as stream: + os.chmod(stream.name, 0o600) + json.dump(config, stream, allow_nan=False) + process = subprocess.Popen([sys.executable, "-m", "jevdual.browser_holder", "--session", str(args.session)], + stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + start_new_session=True) + deadline = time.monotonic() + 40 + while time.monotonic() < deadline: + if process.poll() is not None: + raise ValueError("holder failed before readiness; no browser authority was established") + if (args.session / HOLDER_FILE).exists(): + result = asyncio.run(_remote(args.session, "status")) + if result.get("ok"): + return {"ok": True, "session_id": config["session_id"], "profile": discovery(), "holder": result} + time.sleep(0.05) + process.terminate() # direct child, never a PID read from metadata + try: + process.wait(timeout=10) + except subprocess.TimeoutExpired: + process.kill() + process.wait(timeout=3) + raise ValueError("holder readiness timed out; inspect retained authority before another start") + + +async def _remote(session: Path, method: str, **fields) -> dict: + from .browser_holder import request + + return await request(session, method, **fields) + + +def main(argv: list[str] | None = None) -> int: + from .capability.journal import JournalError + + args = build_parser().parse_args(argv) + try: + if args.command == "guide": + result = guide() + elif args.command == "start": + result = _start(args) + else: + config = _config(args.session) + if args.command in ("status", "recover"): + try: + result = asyncio.run(_remote(args.session, "status")) + if not result.get("ok"): + raise OSError("holder unavailable") + except (OSError, ValueError, RuntimeError, TimeoutError): + from .browser_authority import BrowserAuthority, operation_record + + with BrowserAuthority(Path(config["authority"])) as authority: + ops = [authority.reconcile(op.id) for op in authority.status(config["session_id"])] + result = {"ok": True, "holder": "unavailable; no relaunch attempted", + "session_id": config["session_id"], "operations": [operation_record(op) for op in ops]} + if args.token: + result["operations"] = [op for op in result["operations"] if op["client_token"] == args.token] + else: + fields = {"token": args.token, "ref": args.ref} if args.command == "click" else {} + try: + result = asyncio.run(_remote(args.session, args.command, **fields)) + except (OSError, ValueError, RuntimeError, TimeoutError): + if args.command != "click": + raise + # A missing holder cannot renew mutation authority. Token replay is a + # read-only journal lookup, including after holder or browser death. + from .browser_authority import ROUTE, BrowserAuthority, operation_record + + with BrowserAuthority(Path(config["authority"])) as authority: + prior = authority.by_request(config["session_id"], args.token, + {"ref": args.ref, "route": ROUTE}) + if prior is None: + raise ValueError("no retained operation; holder unavailable") from None + result = {"ok": True, "replayed": True, "holder": "unavailable", + "operation": operation_record(authority.reconcile(prior.id))} + print(json.dumps(result, ensure_ascii=False, allow_nan=False)) + return 0 if result.get("ok", True) else 3 + except (OSError, ValueError, RuntimeError, TimeoutError, JournalError) as exc: + # Never echo untrusted guard/page content or exception payloads. + print(json.dumps({"ok": False, "code": getattr(exc, "code", "browser_session_unavailable"), + "message": "request refused; inspect retained authority; no automatic retry", + "error_type": type(exc).__name__})) + return 3 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/jevdual/python/jevdual/browser_guard.py b/jevdual/python/jevdual/browser_guard.py new file mode 100644 index 0000000..eb6d7f6 --- /dev/null +++ b/jevdual/python/jevdual/browser_guard.py @@ -0,0 +1,100 @@ +"""Configured browser judgment behind the existing keyword/destructive boundary. + +An external adapter is trusted policy code, not a security sandbox. It supplies +probabilities; it cannot disable the code-owned keyword gate or change thresholds. +No adapter is bundled that approves actions. Missing judgment always refuses. +""" + +from __future__ import annotations + +import asyncio +import json +import os + + +class GuardRefused(ValueError): + def __init__(self, code: str, message: str): + self.code = code + super().__init__(message) + + +async def _adapter(command: list[str], payload: dict) -> list[float]: + if (not isinstance(command, list) or not command + or any(not isinstance(x, str) or not x for x in command) + or not os.path.isabs(command[0])): + raise GuardRefused("guard_unavailable", "guard adapter needs an absolute executable path") + process = await asyncio.create_subprocess_exec( + *command, stdin=asyncio.subprocess.PIPE, stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.DEVNULL, limit=65537, + ) + try: + process.stdin.write(json.dumps(payload, allow_nan=False).encode() + b"\n") + await process.stdin.drain() + process.stdin.close() + try: + raw = await process.stdout.readexactly(65537) + except asyncio.IncompleteReadError as exc: + raw = exc.partial + if len(raw) > 65536: + raise ValueError("oversize guard reply") + if await process.wait() != 0: + raise ValueError("guard failed") + reply = json.loads(raw) + if (not isinstance(reply, dict) + or set(reply) != {"producer", "version", "digest", "probabilities"} + or reply["producer"] != "footwork.browser.guard" + or type(reply["version"]) is not int or reply["version"] != 1 + or reply["digest"] != payload["digest"]): + raise ValueError("unbound guard reply") + return reply["probabilities"] + finally: + if process.returncode is None: + process.kill() + await process.wait() + + +async def authorize(config: dict, binding: dict, snapshot: dict, ref: str, request_digest: str) -> dict: + from jevdual.arbiter import ArbiterPolicy + from jevdual.authorize import Authorizer, NativeAction + from jevdual.menu import Menu + from jevdual.native import NativeMenu + + row = next((row for row in snapshot.get("refs", []) if row.get("ref") == ref), None) + if row is None: + raise GuardRefused("stale_ref", "the guard has no matching observed target") + page = snapshot.get("page") or {} + page_text = " ".join(str(item.get("name", "")) for item in snapshot.get("content_refs", []))[:300] + menu = Menu(str(page.get("url", "")), str(page.get("title", "")), page_text, (), {}) + nm = NativeMenu(menu, {}, "cdp", binding["pid"], 0, "Chrome", True, False, False) + command = config.get("guard_command") + + async def judge(task, targets, *, url, title): + if command is not None: + return await _adapter(command, { + "producer": "footwork.browser.guard.request", "version": 1, + "digest": request_digest, "task": task, "targets": targets, "url": url, "title": title, + "binding": binding, + }) + # Explicit environment configuration only; do not load unrelated key files. + if not os.environ.get("TYPESAFE_API_KEY"): + raise GuardRefused("guard_unavailable", "configure Jev or an explicit judgment adapter") + from typesafe_sdk import AsyncTypeSafeClient + + from jevdual.verify import Verifier + + async with AsyncTypeSafeClient() as client: + return await Verifier(client).judge_destructive(task, targets, url=url, title=title) + + authorizer = Authorizer(policy=ArbiterPolicy.from_toml(), judge=judge) + action = NativeAction("click", str(row.get("name", "")), "s2", + context=f"{menu.title} {menu.page_text}") + try: + reason = await asyncio.wait_for(authorizer.check(nm, action, task=config["task"]), timeout=15) + except Exception as exc: + raise GuardRefused("guard_unavailable", "configured judgment failed; nothing dispatched") from exc + if reason: + raise GuardRefused("guard_refused", "configured guard paused this activation; nothing dispatched") + # Authorizer records every successful judge result. A keyword-only path is not authorization. + if not authorizer.judgments or "error" in authorizer.judgments[-1]: + raise GuardRefused("guard_unavailable", "no qualified judgment; nothing dispatched") + return {"producer": "footwork.browser.guard", "version": 1, "decision": "allow", "digest": request_digest} diff --git a/jevdual/python/jevdual/browser_holder.py b/jevdual/python/jevdual/browser_holder.py new file mode 100644 index 0000000..5c685d8 --- /dev/null +++ b/jevdual/python/jevdual/browser_holder.py @@ -0,0 +1,446 @@ +"""Bounded local custody for the owned browser and its durable operation journal. + +Only this process holds the browser handle, CDP connection, current refs and journal lock. Clients +can reconnect to this holder; they cannot adopt a browser or restart an uncertain activation. The +private Unix socket and peer UID identify a local session transport, not an authorization grant or +a security boundary against arbitrary code running as the same user. Guard admission is mandatory. +""" + +from __future__ import annotations + +import argparse +import asyncio +import contextlib +import fcntl +import json +import os +import secrets +import signal +import socket +import stat +import struct +from pathlib import Path +from typing import Any +from urllib.parse import urlsplit + +from .effectors.base import BrowserReply +from .effectors.cdp import launch +from .effectors.cdp.click import ROUTE +from .effectors.cdp.operations import CdpBrowserOperations, RefBinding +from .platform_identity import boot_identity + +CONFIG_FILE = "browser.json" +HOLDER_FILE = "holder.json" +SOCKET_FILE = "holder.sock" +MAX_REQUEST = 64 * 1024 +MAX_RESPONSE = 1024 * 1024 +REQUEST_TIMEOUT = 30.0 +METHODS = frozenset({"look", "click", "status", "stop"}) + + +class HolderRefused(RuntimeError): + def __init__(self, code: str, message: str): + self.code = code + super().__init__(message) + + +def _error(code: str, message: str) -> dict[str, Any]: + return {"ok": False, "code": code, "message": message, "dispatched": False} + + +def _private_directory(directory: Path) -> None: + row = directory.lstat() + if not stat.S_ISDIR(row.st_mode) or row.st_uid != os.getuid() or row.st_mode & 0o077: + raise HolderRefused("browser_session_unavailable", "the browser session must be an owned private directory") + # sockaddr_un has a smaller bound on macOS than Linux. Refuse before launch, not after Chrome + # has started; no alternate shared socket or stale-socket removal is attempted. + if len(os.fsencode(directory / SOCKET_FILE)) > 100: + raise HolderRefused("browser_session_unavailable", "the browser session path is too long for its Unix socket") + + +def _read_private(path: Path, *, limit: int = MAX_REQUEST) -> dict[str, Any]: + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + with os.fdopen(fd, "rb") as stream: + row = os.fstat(stream.fileno()) + if not stat.S_ISREG(row.st_mode) or row.st_uid != os.getuid() or row.st_mode & 0o077: + raise HolderRefused("browser_session_unavailable", "browser session files must be owned private regular files") + raw = stream.read(limit + 1) + if len(raw) > limit: + raise HolderRefused("browser_request_invalid", "browser session metadata exceeds its read bound") + value = json.loads(raw) + if not isinstance(value, dict): + raise HolderRefused("browser_request_invalid", "browser session metadata must be an object") + return value + + +def _write_private(path: Path, value: dict[str, Any]) -> None: + temporary = path.with_name(f".{path.name}-{secrets.token_hex(8)}") + try: + with os.fdopen(os.open(temporary, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600), "w") as stream: + json.dump(value, stream, separators=(",", ":")) + stream.flush() + os.fsync(stream.fileno()) + os.replace(temporary, path) + finally: + with contextlib.suppress(FileNotFoundError): + temporary.unlink() + + +def process_identity(pid: int) -> dict[str, Any]: + import psutil + + process = psutil.Process(pid) + if process.status() == psutil.STATUS_ZOMBIE: + raise HolderRefused("browser_holder_unavailable", "the browser holder has exited") + return {"boot": boot_identity(), "pid": pid, "start": repr(process.create_time())} + + +def _config(directory: Path) -> dict[str, Any]: + _private_directory(directory) + config = _read_private(directory / CONFIG_FILE) + if (config.get("version") != 1 or type(config.get("version")) is not int + or not isinstance(config.get("session_id"), str) or not 1 <= len(config["session_id"]) <= 128 + or not isinstance(config.get("task"), str) or not 1 <= len(config["task"]) <= 16384 + or not isinstance(config.get("chrome"), str) or not Path(config["chrome"]).is_absolute() + or not isinstance(config.get("authority"), str) or not Path(config["authority"]).is_absolute() + or not isinstance(config.get("initial_url"), str)): + raise HolderRefused("browser_request_invalid", "invalid browser holder configuration") + parsed = urlsplit(config["initial_url"]) + if parsed.scheme not in {"http", "https"} or not parsed.hostname or parsed.username or parsed.password: + raise HolderRefused("browser_request_invalid", "initial browser URL requires HTTP(S) without credentials") + command = config.get("guard_command") + if command is not None and (not isinstance(command, list) or not command + or not all(isinstance(arg, str) and arg for arg in command)): + raise HolderRefused("browser_request_invalid", "guard_command must be a nonempty argument list or null") + return config + + +def _peer_credentials(writer: asyncio.StreamWriter) -> tuple[int, int]: + peer = writer.get_extra_info("socket") + if peer is None: + raise HolderRefused("browser_peer_unavailable", "the browser socket peer could not be identified") + if hasattr(socket, "SO_PEERCRED"): + pid, uid, _ = struct.unpack("3i", peer.getsockopt(socket.SOL_SOCKET, socket.SO_PEERCRED, 12)) + return pid, uid + # Darwin LOCAL_PEERCRED gives xucred: uint version, uid_t uid, short ngroups, gid_t groups[16]. + if os.uname().sysname == "Darwin": + credentials = peer.getsockopt(0, 1, 128) + version, uid = struct.unpack_from("=II", credentials) + if version == 0: + pid = struct.unpack("=i", peer.getsockopt(0, 2, 4))[0] + return pid, uid + raise HolderRefused("browser_peer_unavailable", "peer UID checking is unavailable on this platform") + + +def _reply(reply: BrowserReply) -> dict[str, Any]: + return {"status": reply.status, "dispatched": reply.dispatched, "route": reply.route, + "code": reply.refusal.code if reply.refusal else None} + + +def _binding(chrome: launch.OwnedChrome, binding: RefBinding) -> dict[str, Any]: + if binding.button is None: + raise HolderRefused("browser_mutation_unqualified", "the observed control is outside the native-button subset") + return {"boot": boot_identity(), "pid": chrome.pid, "start": repr(chrome.incarnation), + "browser_context": binding.context_id, "target": binding.target_id, + "cdp_session": binding.session_id, "frame": binding.frame_id, "loader": binding.loader_id, + "backend_node": binding.backend_node_id, "execution_context": binding.execution_context_id, + "document_token": binding.document_token, "fingerprint": binding.button.fingerprint_json} + + +class BrowserHolder: + """One serial command stream. Dependency parameters also let unit tests prove the send boundary.""" + + def __init__(self, config: dict[str, Any], authority, chrome, operations, tab: str, authorize): + self.config = config + self.authority = authority + self.chrome = chrome + self.operations = operations + self.tab = tab + self.authorize = authorize + self.snapshot: dict[str, Any] | None = None + self.lock = asyncio.Lock() + self.stopping = asyncio.Event() + self.closed = False + self.nonce = secrets.token_hex(32) + + def _result(self, **payload) -> dict[str, Any]: + return {"ok": True, "session_id": self.config["session_id"], **payload} + + def _operation(self, operation, *, replayed: bool = False) -> dict[str, Any]: + from .browser_authority import operation_record + + return self._result(operation=operation_record(operation), replayed=replayed) + + async def handle(self, request: dict[str, Any]) -> dict[str, Any]: + from .capability.journal import Busy, JournalError, TokenConflict + + try: + if not isinstance(request, dict) or request.get("nonce") != self.nonce: + raise HolderRefused("browser_session_mismatch", "browser session authentication failed") + if request.get("session_id") != self.config["session_id"]: + raise HolderRefused("browser_session_mismatch", "the requested browser session does not match") + method = request.get("method") + if not isinstance(method, str) or method not in METHODS: + raise HolderRefused("browser_method_unavailable", "only look, click, status and stop are available") + expected = {"nonce", "session_id", "method"} | ({"token", "ref"} if method == "click" else set()) + if set(request) != expected: + raise HolderRefused("browser_request_invalid", "unexpected or missing browser request fields") + async with self.lock: + if self.closed: + raise HolderRefused("browser_holder_unavailable", "the browser holder is stopping") + if method == "look": + reply = await self.operations.snapshot(target_id=self.operations.browser_id, tab_id=self.tab) + if reply.refused: + return _error(reply.refusal.code or "browser_observation_unavailable", reply.text) + self.snapshot = dict(reply.payload) + return self._result(snapshot=self.snapshot) + if method == "click": + return await self._click(request) + if method == "status": + from .browser_authority import operation_record + + return self._result(operations=[operation_record(self.authority.reconcile(op.id)) for op in + self.authority.status(self.config["session_id"])]) + cleanup = await self.close() + self.stopping.set() + return self._result(cleanup=cleanup) + except HolderRefused as exc: + return _error(exc.code, str(exc)) + except TokenConflict as exc: + return _error("client_token_conflict", str(exc)) + except Busy as exc: + return _error("browser_operation_unresolved", str(exc)) + except JournalError: + return _error("browser_authority_unavailable", "browser authority could not admit this request") + + async def _click(self, request: dict[str, Any]) -> dict[str, Any]: + from .browser_authority import guard_digest + + token, ref = request["token"], request["ref"] + if (not isinstance(token, str) or not 1 <= len(token) <= 256 + or not isinstance(ref, str) or not 1 <= len(ref) <= 256): + raise HolderRefused("browser_request_invalid", "click requires bounded ref and client token strings") + canonical = {"ref": ref, "route": ROUTE} + prior = self.authority.by_request(self.config["session_id"], token, canonical) + if prior is not None: + return self._operation(prior, replayed=True) + self.authority.assert_available() + if self.snapshot is None: + raise HolderRefused("browser_observation_required", "observe this browser before proposing an activation") + admitted = None + + async def admission(binding: RefBinding) -> None: + nonlocal admitted + record = _binding(self.chrome, binding) + digest = guard_digest(self.config["session_id"], canonical, record) + try: + guard = await self.authorize(self.config, record, self.snapshot, ref, digest) + except asyncio.CancelledError: + raise + except Exception as exc: + raise HolderRefused(getattr(exc, "code", "browser_guard_unavailable"), + "the configured guard did not authorize this activation") from exc + admitted = self.authority.admit_click(session_id=self.config["session_id"], token=token, + request=canonical, binding=record, guard=guard) + admitted = self.authority.start(admitted.id) + + try: + reply = await self.operations.click(target_id=self.operations.browser_id, tab_id=self.tab, + ref=ref, input_route="dom_event", admission=admission) + if admitted is None: + return _error(reply.refusal.code if reply.refusal else "browser_not_admitted", reply.text) + operation = self.authority.record_reply(admitted.id, _reply(reply)) + return self._operation(operation) + except BaseException as exc: + if admitted is None: + raise + # No post-admission exception is a no-send certificate. Even cancellation retains + # uncertainty. Reconciliation inspects only retained execution evidence, never the DOM. + operation = self.authority.mark_unknown(admitted.id) + if isinstance(exc, asyncio.CancelledError): + raise + return self._operation(operation) + + async def close(self) -> dict[str, Any]: + if self.closed: + return {"status": "already_stopped"} + self.closed = True + try: + await self.operations.close() + finally: + try: + await asyncio.to_thread(launch.stop, self.chrome) + except Exception: # noqa: BLE001 - cleanup failure must remain explicitly unverified + return {"status": "unverified", "code": "browser_cleanup_unverified"} + return {"status": "bounded_owned_processes_stopped", "complete_tree_inventory": False} + + async def serve(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None: + try: + if _peer_credentials(writer)[1] != os.getuid(): + raise HolderRefused("browser_peer_mismatch", "the browser socket peer has a different UID") + try: + raw = await asyncio.wait_for(reader.readuntil(b"\n"), 5.0) + except (asyncio.LimitOverrunError, asyncio.IncompleteReadError, TimeoutError) as exc: + raise HolderRefused("browser_request_invalid", "the browser request exceeded its size or time bound") from exc + if len(raw) > MAX_REQUEST: + raise HolderRefused("browser_request_invalid", "the browser request exceeds 64 KiB") + try: + value = json.loads(raw) + except (UnicodeDecodeError, json.JSONDecodeError) as exc: + raise HolderRefused("browser_request_invalid", "the browser request is not JSON") from exc + result = await asyncio.wait_for(self.handle(value), REQUEST_TIMEOUT) + except HolderRefused as exc: + result = _error(exc.code, str(exc)) + except TimeoutError: + # The operation may have been admitted. Do not issue a generic not-sent certificate. + result = {"ok": False, "code": "browser_response_unknown", "dispatched": None, "retryable": False} + except Exception: # noqa: BLE001 - an unclassified holder loss is never a no-send certificate + result = {"ok": False, "code": "browser_response_unknown", "dispatched": None, "retryable": False} + try: + encoded = json.dumps(result, separators=(",", ":")).encode() + b"\n" + if len(encoded) > MAX_RESPONSE: + encoded = b'{"ok":false,"code":"browser_response_too_large","dispatched":null}\n' + writer.write(encoded) + await asyncio.wait_for(writer.drain(), 5.0) + except (OSError, TimeoutError): + pass # a lost client response never redispatches or settles its operation + finally: + writer.close() + with contextlib.suppress(OSError): + await writer.wait_closed() + + +async def request(directory: Path, method: str, **fields: Any) -> dict[str, Any]: + """Call an already live holder. No implicit launch, adoption, retry or stale-file cleanup.""" + directory = Path(directory).absolute() + _private_directory(directory) + config = _config(directory) + descriptor = _read_private(directory / HOLDER_FILE) + expected = {"version", "boot", "pid", "start", "nonce", "session_id", "socket"} + if (set(descriptor) != expected or type(descriptor.get("version")) is not int or descriptor.get("version") != 1 + or descriptor.get("session_id") != config["session_id"] + or type(descriptor.get("pid")) is not int or descriptor["pid"] <= 0 + or not isinstance(descriptor.get("nonce"), str) or len(descriptor["nonce"]) != 64 + or descriptor.get("socket") != str(directory / SOCKET_FILE)): + raise HolderRefused("browser_holder_unavailable", "invalid browser holder identity record") + try: + current = process_identity(descriptor["pid"]) + except Exception as exc: + raise HolderRefused("browser_holder_unavailable", "the original browser holder is unavailable") from exc + if any(descriptor[key] != current[key] for key in ("boot", "pid", "start")): + raise HolderRefused("browser_holder_unavailable", "the browser holder process identity changed") + if method not in METHODS or set(fields) != ({"token", "ref"} if method == "click" else set()): + raise HolderRefused("browser_request_invalid", "unsupported browser method or request fields") + raw = json.dumps({"nonce": descriptor["nonce"], "session_id": config["session_id"], + "method": method, **fields}, separators=(",", ":")).encode() + b"\n" + if len(raw) > MAX_REQUEST: + raise HolderRefused("browser_request_invalid", "the browser request exceeds 64 KiB") + try: + reader, writer = await asyncio.wait_for(asyncio.open_unix_connection(descriptor["socket"], + limit=MAX_RESPONSE), 5.0) + except (OSError, TimeoutError) as exc: + raise HolderRefused("browser_holder_unavailable", "the original browser holder socket is unavailable") from exc + try: + # Verify the connected peer too: a replaced socket cannot borrow the descriptor's identity. + peer_pid, peer_uid = _peer_credentials(writer) + if peer_uid != os.getuid() or peer_pid != descriptor["pid"]: + raise HolderRefused("browser_peer_mismatch", "the browser holder socket belongs to another process") + current = process_identity(peer_pid) + if any(descriptor[key] != current[key] for key in ("boot", "pid", "start")): + raise HolderRefused("browser_holder_unavailable", "the connected browser holder changed incarnation") + writer.write(raw) + await asyncio.wait_for(writer.drain(), 5.0) + response = await asyncio.wait_for(reader.readuntil(b"\n"), REQUEST_TIMEOUT + 2) + if len(response) > MAX_RESPONSE: + raise ValueError("response too large") + value = json.loads(response) + if not isinstance(value, dict): + raise TypeError("response is not an object") + return value + except (OSError, TimeoutError, ValueError, TypeError, asyncio.IncompleteReadError, asyncio.LimitOverrunError): + return {"ok": False, "code": "browser_response_unknown", "dispatched": None, "retryable": False} + finally: + writer.close() + with contextlib.suppress(OSError): + await writer.wait_closed() + + +async def run(directory: Path) -> None: + from .browser_authority import BrowserAuthority + from .browser_guard import authorize + + directory = Path(directory).absolute() + config = _config(directory) + if (directory / HOLDER_FILE).exists() or (directory / SOCKET_FILE).exists(): + raise HolderRefused("browser_holder_exists", "a holder record already exists; no implicit restart is allowed") + fd = os.open(directory / "holder.lock", os.O_WRONLY | os.O_CREAT | os.O_NOFOLLOW, 0o600) + chrome = holder = operations = None + try: + fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + with BrowserAuthority(Path(config["authority"])) as authority: + # Acquiring the sole journal owner must precede launching a second custodial process. + authority.assert_available() + chrome = await asyncio.to_thread(launch.launch, config["chrome"], + directory / f"profile-{secrets.token_hex(8)}") + operations = await CdpBrowserOperations.connect(chrome) + bound = await operations.bind(pid=chrome.pid, window_id=0) + if bound.refused: + raise HolderRefused("browser_binding_unavailable", "the owned browser could not be bound") + tab = bound.payload["tabs"][0]["tab_id"] + cdp_session, _ = await operations._session(operations.browser_id, tab) + await operations.conn.send("Page.enable", session_id=cdp_session) + loaded = operations.conn.listen("Page.loadEventFired", session_id=cdp_session) + try: + navigation = await operations.conn.send("Page.navigate", {"url": config["initial_url"]}, + session_id=cdp_session) + if navigation.get("errorText"): + raise HolderRefused("browser_navigation_failed", "the initial browser URL could not be loaded") + await asyncio.wait_for(loaded.get(), 15.0) + finally: + operations.conn.unlisten(loaded) + holder = BrowserHolder(config, authority, chrome, operations, tab, authorize) + server = await asyncio.start_unix_server(holder.serve, path=str(directory / SOCKET_FILE), + limit=MAX_REQUEST) + os.chmod(directory / SOCKET_FILE, 0o600) + descriptor = {"version": 1, **process_identity(os.getpid()), "nonce": holder.nonce, + "session_id": config["session_id"], "socket": str(directory / SOCKET_FILE)} + _write_private(directory / HOLDER_FILE, descriptor) + loop = asyncio.get_running_loop() + for sig in (signal.SIGTERM, signal.SIGINT): + loop.add_signal_handler(sig, holder.stopping.set) + try: + async with server: + await holder.stopping.wait() + finally: + server.close() + await server.wait_closed() + # Serialize shutdown with a pending admission/activation. Signals never create a + # second cleanup path racing the original operation. + async with holder.lock: + await holder.close() + finally: + if holder is None: + if operations is not None: + await operations.close() + if chrome is not None: + with contextlib.suppress(Exception): + await asyncio.to_thread(launch.stop, chrome) + os.close(fd) + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--session", type=Path, required=True) + args = parser.parse_args(argv) + try: + asyncio.run(run(args.session)) + except Exception as exc: # noqa: BLE001 - startup emits a bounded sanitized diagnostic + # Startup is before mutation admission; never print configuration or guard output. + print(json.dumps(_error(getattr(exc, "code", "browser_holder_unavailable"), + "the browser holder could not start"))) + return 2 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/jevdual/python/jevdual/effectors/cdp/operations.py b/jevdual/python/jevdual/effectors/cdp/operations.py index 46bf25a..99c1744 100644 --- a/jevdual/python/jevdual/effectors/cdp/operations.py +++ b/jevdual/python/jevdual/effectors/cdp/operations.py @@ -11,6 +11,7 @@ import asyncio import logging import secrets +from collections.abc import Awaitable, Callable from dataclasses import dataclass from types import MappingProxyType from typing import Any @@ -223,7 +224,10 @@ async def _unqualified(self, operation: str, **ref: Any) -> BrowserReply: f"{operation} through Footwork's own browser effector is not qualified yet; nothing was sent", ) - async def click(self, *, target_id: str, tab_id: str | None, ref: str, input_route: str) -> BrowserReply: + async def click( + self, *, target_id: str, tab_id: str | None, ref: str, input_route: str, + admission: Callable[[RefBinding], Awaitable[None]] | None = None, + ) -> BrowserReply: async with self._ownership: if self._click_unknown: return _refused("browser_delivery_unknown", "an earlier activation is unresolved; no further click was sent") @@ -247,6 +251,20 @@ async def click(self, *, target_id: str, tab_id: str | None, ref: str, input_rou except (CdpError, CdpClosed, CdpUnknownOutcome): return _refused("browser_validation_unavailable", "read-only target validation failed; no activation was sent") + # A durable owner may authorize and commit admission after read-only resolution, but + # before ref consumption or any possible activation. A refusal must release only the + # read handle; it never enters the activation path. + if admission is not None: + try: + await admission(binding) + except BaseException: + try: + await self.conn.send("Runtime.releaseObject", {"objectId": obj}, + session_id=binding.session_id, timeout=0.2) + except BaseException as exc: # noqa: BLE001 - preserve the original refusal/cancellation + log.debug("CDP refused-read handle release unavailable (%s)", type(exc).__name__) + raise + # Admission is connection-local. No fresh observation can reset ambiguity, and the # current observation is consumed before anything that might activate a control. self._refs.clear() diff --git a/jevdual/tests/test_browser_cdp_cli.py b/jevdual/tests/test_browser_cdp_cli.py new file mode 100644 index 0000000..a7dbbb8 --- /dev/null +++ b/jevdual/tests/test_browser_cdp_cli.py @@ -0,0 +1,167 @@ +"""Installed subprocess entrypoint, independent ingress, and lost client acknowledgement.""" + +from __future__ import annotations + +import json +import os +import shlex +import subprocess +import sys +import tempfile +import threading +import time +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path + +import pytest + + +def command(*args): + configured = os.environ.get("FOOTWORK_EXECUTABLE") + return [*(shlex.split(configured) if configured else [sys.executable, "-m", "jevdual.cli"]), + "--json", *args] + + +def cli(*args, success=True): + result = subprocess.run(command(*args), capture_output=True, text=True, timeout=55, check=False) + envelope = json.loads(result.stdout) + assert envelope["exit_code"] == result.returncode, result.stderr + if success: + assert result.returncode == 0, envelope + return envelope["data"] + + +def test_cdp_discovery_and_disabled_typing(): + tools = cli("tools") + assert tools["surfaces"]["browser"]["cdp"]["cua_required"] is False + assert tools["surfaces"]["browser"]["cdp"]["typing"].startswith("disabled") + doctor = cli("doctor") + assert doctor["browser_profiles"]["cdp"]["runtime_qualification"] == "not_checked" + assert doctor["browser_profiles"]["cdp"]["desktop_required"] is False + schema = cli("schema", "browser", "cdp", "click") + assert {a["name"] for a in schema["arguments"]} >= {"session", "ref", "token"} + guide = cli("browser", "cdp", "guide") + assert "metadata" in guide["install"] + assert guide["completion"].startswith("unverified") + refused = subprocess.run(command("browser", "cdp", "type", "--help"), capture_output=True, text=True, check=False) + assert refused.returncode != 0 + + +@pytest.fixture +def page(): + records = [] + arrived = threading.Event() + + class Handler(BaseHTTPRequestHandler): + def do_GET(self): + self.send_response(200) + self.send_header("Content-Type", "text/html") + self.end_headers() + self.wfile.write(b'''Durable fixture + +''') + + def do_POST(self): + records.append(self.rfile.read(int(self.headers["Content-Length"])).decode()) + arrived.set() + self.send_response(200) + self.end_headers() + self.wfile.write(b"retained independently") + + def log_message(self, *_): + pass + + server = ThreadingHTTPServer(("127.0.0.1", 0), Handler) + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + yield f"http://127.0.0.1:{server.server_port}/", records, arrived + server.shutdown() + server.server_close() + thread.join(timeout=2) + + +@pytest.fixture +def workspace(): + # Unix socket paths have a small platform limit; use a deliberately short test path. + with tempfile.TemporaryDirectory(prefix="fw-cdp-", dir="/tmp") as directory: + yield Path(directory) + + +def guard_file(root): + adapter = root / "guard.py" + adapter.write_text('''import json,sys +r=json.load(sys.stdin) +print(json.dumps({'producer':'footwork.browser.guard','version':1,'digest':r['digest'],'probabilities':[0.01]})) +''') + config = root / "guard-argv.json" + config.write_text(json.dumps([sys.executable, str(adapter)])) + return config + + +def start(root, url, *, guard=True): + args = ["browser", "cdp", "start", "Commit the fixture once", "--session", str(root / "session"), + "--authority", str(root / "authority.db"), "--url", url] + if guard: + args += ["--guard-command", str(guard_file(root))] + return cli(*args) + + +def refs(root): + snapshot = cli("browser", "cdp", "look", "--session", str(root / "session"))["snapshot"] + return {row["name"]: row["ref"] for row in snapshot["refs"]} + + +@pytest.mark.browser +def test_installed_cli_lost_client_ack_replays_without_redispatch(workspace, page): + root, (url, records, arrived) = workspace, page + start(root, url) + session = str(root / "session") + try: + selected = refs(root)["Commit fixture"] + invocation = ("browser", "cdp", "click", "--session", session, "--ref", selected, "--token", "intent-1") + client = subprocess.Popen(command(*invocation), stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + assert arrived.wait(15), client.communicate(timeout=5) + # The fixture effect exists while its handler is still executing and before CDP's reply. + assert client.poll() is None, "probe failed to intercept the acknowledgement window" + client.kill() + client.communicate(timeout=5) + finally: + if client.poll() is None: + client.kill() + client.communicate(timeout=5) + time.sleep(1.5) + retained = cli("browser", "cdp", "status", "--session", session, "--token", "intent-1")["operations"][0] + assert retained["state"] == "unknown" and retained["completion"] == "unverified" + replay = cli(*invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == retained["id"] + assert records == ["intended"] + conflict = cli(*invocation[:-1], "intent-2", success=False) + assert conflict["ok"] is False + assert records == ["intended"] + cli("browser", "cdp", "stop", "--session", session) + time.sleep(0.3) + recovered = cli("browser", "cdp", "recover", "--session", session, "--token", "intent-1") + assert recovered["operations"][0]["state"] == "unknown" + assert records == ["intended"] + after_stop = cli(*invocation) + assert after_stop["replayed"] is True and after_stop["operation"]["id"] == retained["id"] + finally: + cli("browser", "cdp", "stop", "--session", session, success=False) + + +@pytest.mark.browser +def test_missing_guard_refuses_before_admission(workspace, page, monkeypatch): + root, (url, records, _) = workspace, page + monkeypatch.delenv("TYPESAFE_API_KEY", raising=False) + start(root, url, guard=False) + session = str(root / "session") + try: + selected = refs(root)["Commit fixture"] + result = cli("browser", "cdp", "click", "--session", session, "--ref", selected, + "--token", "missing-guard", success=False) + assert result["ok"] is False and result["dispatched"] is False + assert cli("browser", "cdp", "status", "--session", session)["operations"] == [] + assert records == [] + finally: + cli("browser", "cdp", "stop", "--session", session, success=False) diff --git a/jevdual/tests/test_browser_durable_authority.py b/jevdual/tests/test_browser_durable_authority.py new file mode 100644 index 0000000..9d661fc --- /dev/null +++ b/jevdual/tests/test_browser_durable_authority.py @@ -0,0 +1,320 @@ +"""Owned-browser admission, no-replay recovery and separate execution evidence.""" + +from __future__ import annotations + +import copy +import hashlib +import json + +import pytest +from jevdual.browser_authority import ( + PROTOCOL, + ROUTE, + BrowserAuthority, + BrowserEvidenceError, + browser_resource, + canonical, + guard_digest, + operation_record, + validate_binding, +) +from jevdual.capability.journal import Busy, JournalError, TokenConflict +from jevdual.operator_evidence import EvidenceError +from jevdual.operator_evidence import validate_binding as native_binding +from jevdual.session_operations import SessionOperations + +BINDING = { + "boot": "boot", "pid": 77, "start": "1.25", "browser_context": "", + "target": "page", "cdp_session": "session", "frame": "main", "loader": "document", + "backend_node": 11, "execution_context": 3, "document_token": "private-marker", + "fingerprint": json.dumps({"tag": "button", "attrs": [["type", "button"]], + "text": "Send", "ancestors": []}), +} +REQUEST = {"ref": "observation:button", "route": ROUTE} +ACK = {"status": "ok", "dispatched": True, "route": ROUTE, "code": None} +NO_SEND = {"status": "refused", "dispatched": False, "route": None, "code": "button_changed"} +UNKNOWN = {"status": "refused", "dispatched": None, "route": ROUTE, "code": "browser_delivery_unknown"} + + +def guard(binding=None, request=None, session="one"): + return {"producer": "footwork.browser.guard", "version": 1, "decision": "allow", + "digest": guard_digest(session, request or REQUEST, binding or BINDING)} + + +def admit(store, *, session="one", token="token", binding=None, request=None, decision=None): + binding, request = binding or copy.deepcopy(BINDING), request or dict(REQUEST) + return store.admit_click(session_id=session, token=token, request=request, binding=binding, + guard=decision or guard(binding, request, session)) + + +@pytest.mark.parametrize("change", [ + {"pid": True}, {"backend_node": 0}, {"execution_context": -1}, {"start": "nan"}, + {"start": "1.250"}, {"target": ""}, {"document_token": ""}, {"loader": ""}, + {"fingerprint": "{}"}, {"window_id": 12}, +]) +def test_binding_rejects_incomplete_or_foreign_identity(change): + with pytest.raises(BrowserEvidenceError): + validate_binding({**BINDING, **change}) + + +def test_browser_and_native_bindings_remain_separate(): + validate_binding(BINDING) + assert browser_resource(BINDING).startswith("browser:") + with pytest.raises(EvidenceError): + native_binding(BINDING) + with pytest.raises(BrowserEvidenceError): + validate_binding({"boot": "boot", "pid": 77, "start": "1.25", "window_id": 8}) + + +@pytest.mark.parametrize("change", [ + {"decision": "deny"}, {"version": True}, {"version": 2}, {"digest": "0" * 64}, + {"producer": "caller"}, {"extra": "assertion"}, +]) +def test_missing_or_changed_guard_never_admits(tmp_path, change): + with BrowserAuthority(tmp_path / "authority.db") as store: + with pytest.raises(BrowserEvidenceError): + admit(store, decision={**guard(), **change}) + assert store.status() == [] + + +def test_guard_digest_binds_session_request_and_exact_subject(tmp_path): + with BrowserAuthority(tmp_path / "authority.db") as store: + with pytest.raises(BrowserEvidenceError): + admit(store, binding={**BINDING, "loader": "reloaded"}, decision=guard()) + with pytest.raises(BrowserEvidenceError): + admit(store, session="other", decision=guard()) + with pytest.raises(BrowserEvidenceError): + admit(store, request={**REQUEST, "ref": "other"}, decision=guard()) + assert store.status() == [] + + +@pytest.mark.parametrize("decision", [None, {}]) +def test_absent_guard_never_admits(tmp_path, decision): + with BrowserAuthority(tmp_path / "authority.db") as store: + with pytest.raises(BrowserEvidenceError): + store.admit_click(session_id="one", token="token", request=REQUEST, + binding=BINDING, guard=decision) + assert store.status() == [] + + +@pytest.mark.parametrize("request_value", [ + {"ref": "button", "route": "trusted"}, {"ref": "button", "route": ROUTE, "text": "password"}, + {"ref": "", "route": ROUTE}, {"ref": "button", "route": "type"}, +]) +def test_request_does_not_enable_typing_or_other_routes(tmp_path, request_value): + with BrowserAuthority(tmp_path / "authority.db") as store: + with pytest.raises(BrowserEvidenceError): + admit(store, request=request_value) + assert store.status() == [] + + +def test_same_token_returns_original_before_reobservation_or_new_guard(tmp_path): + with BrowserAuthority(tmp_path / "authority.db") as store: + op = admit(store) + # Deliberately invalid live identity/guard prove that replay does not reacquire a target. + assert store.admit_click(session_id="one", token="token", request=REQUEST, + binding={}, guard={}).id == op.id + with pytest.raises(TokenConflict): + admit(store, request={**REQUEST, "ref": "another"}) + with pytest.raises(Busy): + admit(store, token="another") + + +@pytest.mark.parametrize("started", [False, True]) +def test_restart_distinguishes_prepared_from_admitted_input(tmp_path, started): + path = tmp_path / "authority.db" + with BrowserAuthority(path) as store: + op = admit(store) + if started: + store.start(op.id) + with BrowserAuthority(path) as store: + recovered = store.by_request("one", "token", REQUEST) + assert recovered.id == op.id + assert recovered.state == ("unknown" if started else "final") + assert recovered.disposition == ("unknown" if started else "not_sent") + assert store.reconcile(op.id).disposition == recovered.disposition + if started: + with pytest.raises(Busy): + admit(store, token="new") + + +@pytest.mark.parametrize(("reply", "phase", "disposition"), [ + (ACK, "sent", "unknown"), (NO_SEND, "not_sent", "not_sent"), + (UNKNOWN, "ambiguous", "unknown"), + ({**NO_SEND, "code": "generic_failure"}, "ambiguous", "unknown"), + ({**ACK, "dispatched": False}, "ambiguous", "unknown"), +]) +def test_acknowledgement_never_claims_application_completion(tmp_path, reply, phase, disposition): + path = tmp_path / "authority.db" + with BrowserAuthority(path) as store: + op = admit(store) + store.start(op.id) + result = store.record_reply(op.id, reply) + assert result.phase == phase + assert result.disposition == disposition + report = operation_record(result) + assert report["completion"] == "unverified" + assert report["retryable"] is False + record = result.evidence["execution_receipt"] + assert record["producer"] == {"name": PROTOCOL, "version": 1} + assert record["binding"] == BINDING + assert record["effect"] not in {"confirmed", "partial"} + assert record["request_digest"] == result.request_digest + with BrowserAuthority(path) as store: + assert store.reconcile(op.id).disposition == disposition + assert store.by_request("one", "token", REQUEST).id == op.id + + +@pytest.mark.parametrize("reply", [NO_SEND, ACK, UNKNOWN]) +def test_retained_result_survives_death_before_finalization(tmp_path, monkeypatch, reply): + path = tmp_path / "authority.db" + with BrowserAuthority(path) as store: + op = admit(store) + store.start(op.id) + + def die(*args, **kwargs): + raise RuntimeError("death after receipt commit") + + monkeypatch.setattr(store, "finish_from_execution", die) + with pytest.raises(RuntimeError): + store.record_reply(op.id, reply) + with BrowserAuthority(path) as store: + recovered = store.reconcile(op.id) + assert recovered.disposition == ("not_sent" if reply == NO_SEND else "unknown") + assert recovered.phase == ("not_sent" if reply == NO_SEND else "sent" if reply == ACK else "ambiguous") + assert store.reconcile(op.id) == recovered + + +def test_arbitrary_finish_cannot_assert_no_send_or_completion(tmp_path): + with BrowserAuthority(tmp_path / "authority.db") as store: + op = admit(store) + store.start(op.id) + for dispatched, effect, phase in [(False, "refused", "not_sent"), (True, "confirmed", "sent")]: + with pytest.raises(BrowserEvidenceError): + store.finish(op.id, dispatched=dispatched, effect=effect, phase=phase, evidence={}) + assert store.get(op.id).state == "dispatching" + + +@pytest.mark.parametrize("failure", ["digest", "binding", "producer", "effect", "guard", "request"]) +def test_tampered_browser_evidence_never_releases_custody(tmp_path, monkeypatch, failure): + path = tmp_path / "authority.db" + with BrowserAuthority(path) as store: + op = admit(store) + store.start(op.id) + monkeypatch.setattr(store, "finish_from_execution", lambda _: None) + store.record_reply(op.id, NO_SEND) + row = store._db.execute("SELECT body,digest FROM operator_execution_receipts").fetchone() + record = json.loads(row["body"]) + if failure == "binding": + record["binding"]["loader"] = "wrong" + elif failure == "producer": + record["producer"]["name"] = "footwork.native" + elif failure == "effect": + record["effect"] = "confirmed" + elif failure == "guard": + record["guard"]["digest"] = "0" * 64 + elif failure == "request": + record["request_digest"] = "0" * 64 + body = canonical(record) + digest = "invalid" if failure == "digest" else hashlib.sha256(body.encode()).hexdigest() + store._db.execute("UPDATE operator_execution_receipts SET body=?,digest=?", (body, digest)) + with BrowserAuthority(path) as store: + assert store.reconcile(op.id).state == "unknown" + with pytest.raises(Busy): + admit(store, token="new") + + +def test_runtime_evidence_is_immutable(tmp_path, monkeypatch): + with BrowserAuthority(tmp_path / "authority.db") as store: + op = admit(store) + store.start(op.id) + monkeypatch.setattr(store, "finish_from_execution", lambda _: None) + store.record_reply(op.id, ACK) + with pytest.raises(BrowserEvidenceError, match="immutable"): + store.record_reply(op.id, NO_SEND) + + +def test_browser_unknown_blocks_native_and_native_unknown_blocks_browser(tmp_path): + path = tmp_path / "authority.db" + with BrowserAuthority(path) as store: + op = admit(store) + store.start(op.id) + store.record_reply(op.id, UNKNOWN) + with SessionOperations(path) as store: + assert store.status()[0].id == op.id + with pytest.raises(Busy): + store.admit(session_id="native", token="native", request={"words": ["click", "Delete"]}, + resource="native:fixture", observation="obs", target="button", move="click", + authorization_basis="policy", projection={}) + other = tmp_path / "native.db" + with SessionOperations(other) as store: + native = store.admit(session_id="native", token="native", request={"words": ["click", "Delete"]}, + resource="native:fixture", observation="obs", target="button", move="click", + authorization_basis="policy", projection={}) + store.start(native.id) + with BrowserAuthority(other) as store: + assert store.status()[0].id == native.id + assert store.reconcile(native.id).state == "unknown" + with pytest.raises(Busy): + admit(store) + + +def test_manual_resolution_remains_unsupported(tmp_path): + with BrowserAuthority(tmp_path / "authority.db") as store, pytest.raises(JournalError): + store.resolve("operation", disposition="applied", evidence={"dom": "looks good"}) + + +def test_interruption_records_unknown_without_fabricating_returned_evidence(tmp_path): + with BrowserAuthority(tmp_path / "authority.db") as store: + op = admit(store) + with pytest.raises(BrowserEvidenceError): + store.mark_unknown(op.id) + store.start(op.id) + unknown = store.mark_unknown(op.id) + assert unknown.state == "unknown" + assert unknown.phase == "ambiguous" + assert "execution_receipt" not in unknown.evidence + assert store.mark_unknown(op.id) == unknown + with pytest.raises(Busy): + admit(store, token="new") + + +@pytest.mark.parametrize("reply", [NO_SEND, ACK]) +def test_interruption_prefers_a_retained_returned_record(tmp_path, monkeypatch, reply): + with BrowserAuthority(tmp_path / "authority.db") as store: + op = admit(store) + store.start(op.id) + finish = store.finish_from_execution + monkeypatch.setattr(store, "finish_from_execution", lambda _: None) + store.record_reply(op.id, reply) + monkeypatch.setattr(store, "finish_from_execution", finish) + result = store.mark_unknown(op.id) + assert result.disposition == ("not_sent" if reply == NO_SEND else "unknown") + assert result.evidence["execution_receipt"]["reply"] == reply + + +def test_native_retained_receipt_keeps_its_native_validator_in_browser_store(tmp_path): + import time + + from jevdual.operator_evidence import execution_record + from jevdual.session_operations import native_resource + + binding = {"boot": "native-boot", "pid": 77, "start": "native-start", "window_id": 12} + path = tmp_path / "authority.db" + with BrowserAuthority(path) as store: + op = store.admit(session_id="native", token="native", request={"words": ["click", "Delete"]}, + resource=native_resource(binding), observation="obs", target="button", move="click", + authorization_basis="policy", projection={"binding": binding}) + op = store.start(op.id) + now = time.time() + record = execution_record( + op, binding=binding, started_at=now, ended_at=now, + producer_evidence={"name": "footwork.native", "version": 1, + "delivery_basis": "sdk_delivery_count", "delivered_count": 1}, + dispatched=True, effect="confirmed", phase="sent", projection={"binding": binding}, + ) + store.record_execution(op.id, record) + with BrowserAuthority(path) as store: + result = store.reconcile(op.id) + assert result.disposition == "applied" + assert result.evidence["execution_receipt"] == record diff --git a/jevdual/tests/test_browser_guard.py b/jevdual/tests/test_browser_guard.py new file mode 100644 index 0000000..c5f989b --- /dev/null +++ b/jevdual/tests/test_browser_guard.py @@ -0,0 +1,34 @@ +"""The browser adapter supplies judgment, never a keyword/threshold bypass.""" + +import asyncio +import sys + +import pytest +from jevdual.browser_guard import GuardRefused, authorize + + +def call(tmp_path, *, label="Commit fixture", probability=0.01, malformed=False, failing=False): + adapter = tmp_path / "guard.py" + digest_expression = "str(0)" if malformed else "r['digest']" + adapter.write_text( + "import json,sys\nr=json.load(sys.stdin)\n" + + ("raise SystemExit(1)\n" if failing else + f"print(json.dumps({{'producer':'footwork.browser.guard','version':1,'digest':" + f"{digest_expression},'probabilities':[{probability!r}]}}))\n") + ) + config = {"session_id": "s", "task": "Commit once", "guard_command": [sys.executable, str(adapter)]} + snapshot = {"page": {"title": "Fixture", "url": "http://127.0.0.1/"}, + "refs": [{"ref": "opaque", "name": label}]} + return asyncio.run(authorize(config, {"pid": 1}, snapshot, "opaque", "a" * 64)) + + +def test_configured_guard_binding(tmp_path): + assert call(tmp_path) == {"producer": "footwork.browser.guard", "version": 1, + "decision": "allow", "digest": "a" * 64} + + +@pytest.mark.parametrize("kwargs", [{"probability": 0.99}, {"malformed": True}, {"failing": True}, + {"probability": "invalid"}, {"label": "Delete account"}]) +def test_guard_failure_never_allows(tmp_path, kwargs): + with pytest.raises(GuardRefused): + call(tmp_path, **kwargs) diff --git a/jevdual/tests/test_browser_holder.py b/jevdual/tests/test_browser_holder.py new file mode 100644 index 0000000..742f540 --- /dev/null +++ b/jevdual/tests/test_browser_holder.py @@ -0,0 +1,380 @@ +"""The holder retains admission across client loss; transport convenience never grants replay.""" + +from __future__ import annotations + +import asyncio +import json +import os +import tempfile +from pathlib import Path +from types import MappingProxyType, SimpleNamespace + +import psutil +import pytest +from jevdual import browser_holder as broker +from jevdual.browser_authority import BrowserAuthority, guard_digest +from jevdual.browser_guard import GuardRefused +from jevdual.effectors.base import BrowserReply +from jevdual.effectors.cdp.click import ACTIVATE, ROUTE, ButtonTarget +from jevdual.effectors.cdp.operations import CdpBrowserOperations, RefBinding + +FINGERPRINT = json.dumps({"tag": "button", "attrs": [["type", "button"]], + "text": "Commit fixture", "ancestors": []}, separators=(",", ":")) + + +class Connection: + def __init__(self): + self.sent = [] + self.activations = 0 + self.failure = None + self.on_activation = None + self.activated = asyncio.Event() + self.release = None + + async def send(self, method, params=None, **kwargs): + self.sent.append((method, params)) + if method == "Target.getTargets": + return {"targetInfos": [{"type": "page", "targetId": "tab", "browserContextId": "ctx"}]} + if method == "Page.getFrameTree": + return {"frameTree": {"frame": {"id": "frame", "loaderId": "loader"}}} + if method == "DOM.describeNode": + return {"node": {"backendNodeId": 10}} + if method == "DOM.resolveNode": + return {"object": {"objectId": "exact-object"}} + if method == "Runtime.callFunctionOn" and params["functionDeclaration"] == ACTIVATE: + if self.on_activation: + self.on_activation() + self.activations += 1 + self.activated.set() + if self.release is not None: + await self.release.wait() + if self.failure: + raise self.failure + return {"result": {"value": {"status": "invoked"}}} + return {} + + async def close(self): + pass + + +def make_holder(tmp_path): + authority = BrowserAuthority(tmp_path / "authority.db") + chrome = SimpleNamespace(pid=os.getpid(), incarnation=psutil.Process().create_time(), alive=lambda: True) + connection = Connection() + operations = CdpBrowserOperations(chrome, connection) + operations._contexts["tab"] = "ctx" + operations._sessions["tab"] = "session" + binding = RefBinding(chrome.incarnation, "ctx", "tab", "session", "frame", "loader", 10, 99, + ButtonTarget(FINGERPRINT), "document-token") + + async def snapshot(**kwargs): + operations._refs = {"snap:1": binding} + return BrowserReply("ok", "", False, MappingProxyType({ + "snapshot_id": "snap", "refs": [{"ref": "snap:1", "name": "Commit fixture", "role": "button"}], + "page": {"url": "https://fixture.invalid/", "title": "Fixture"}, + })) + + operations.snapshot = snapshot + calls = [] + + async def authorize(config, record, snapshot, ref, digest): + calls.append((record, ref, digest)) + assert connection.activations == 0 + assert digest == guard_digest(config["session_id"], {"ref": ref, "route": ROUTE}, record) + return {"producer": "footwork.browser.guard", "version": 1, "decision": "allow", "digest": digest} + + config = {"version": 1, "session_id": "test-session", "task": "Commit the fixture once", + "chrome": "/fixture/chrome", "initial_url": "https://fixture.invalid/", + "authority": str(tmp_path / "authority.db"), "guard_command": None} + holder = broker.BrowserHolder(config, authority, chrome, operations, "tab", authorize) + return holder, authority, connection, calls + + +@pytest.fixture +def runtime(tmp_path): + holder, authority, connection, calls = make_holder(tmp_path) + yield holder, authority, connection, calls + authority.close() + + +async def call(holder, method, **fields): + return await holder.handle({"nonce": holder.nonce, "session_id": holder.config["session_id"], + "method": method, **fields}) + + +def test_admission_and_started_stage_are_committed_before_possible_activation(runtime): + holder, authority, connection, guards = runtime + + def boundary(): + op = authority.status()[0] + assert op.state == "dispatching" and op.execution_stage == "started" + assert op.client_token == "once" + assert not holder.operations._refs + + connection.on_activation = boundary + + async def run(): + assert (await call(holder, "look"))["ok"] + result = await call(holder, "click", token="once", ref="snap:1") + assert result["operation"]["state"] == "unknown" + assert result["operation"]["phase"] == "sent" + assert result["operation"]["completion"] == "unverified" + assert len(guards) == connection.activations == 1 + + asyncio.run(run()) + + +def test_replay_returns_retained_operation_before_observation_or_guard(runtime): + holder, _, connection, guards = runtime + + async def run(): + await call(holder, "look") + first = await call(holder, "click", token="once", ref="snap:1") + holder.snapshot = None + holder.operations._refs.clear() + again = await call(holder, "click", token="once", ref="snap:1") + assert again["replayed"] + assert again["operation"]["id"] == first["operation"]["id"] + assert len(guards) == connection.activations == 1 + changed = await call(holder, "click", token="once", ref="another-ref") + assert changed["code"] == "client_token_conflict" + new = await call(holder, "click", token="another-token", ref="snap:1") + assert new["code"] == "browser_operation_unresolved" + assert len(guards) == connection.activations == 1 + + asyncio.run(run()) + + +def test_guard_refusal_retains_refs_and_never_admits_or_activates(runtime): + holder, authority, connection, _ = runtime + + async def refuse(*args): + raise GuardRefused("guard_unavailable", "fixture judgment missing") + + holder.authorize = refuse + + async def run(): + await call(holder, "look") + response = await call(holder, "click", token="once", ref="snap:1") + assert response["code"] == "guard_unavailable" and response["dispatched"] is False + assert authority.status() == [] and connection.activations == 0 + assert "snap:1" in holder.operations._refs + assert not holder.operations._click_unknown + assert connection.sent[-1][0] == "Runtime.releaseObject" + + asyncio.run(run()) + + +@pytest.mark.parametrize("failure", [RuntimeError("lost reply"), asyncio.CancelledError()]) +def test_post_admission_failure_and_cancellation_retain_unknown(runtime, failure): + holder, authority, connection, _ = runtime + connection.failure = failure + + async def run(): + await call(holder, "look") + if isinstance(failure, asyncio.CancelledError): + with pytest.raises(asyncio.CancelledError): + await call(holder, "click", token="once", ref="snap:1") + else: + result = await call(holder, "click", token="once", ref="snap:1") + assert result["operation"]["state"] == "unknown" + op = authority.status()[0] + assert op.state == "unknown" and op.disposition == "unknown" + assert op.execution_stage == "started" + assert (await call(holder, "click", token="once", ref="snap:1"))["replayed"] + assert connection.activations == 1 + + asyncio.run(run()) + + +@pytest.mark.parametrize("extra", [{"nonce": "wrong"}, {"session_id": "another-session"}, + {"method": "type"}, {"method": "navigate"}, {"url": "https://x.invalid"}]) +def test_wrong_session_and_unbounded_methods_never_touch_browser(runtime, extra): + holder, authority, connection, _ = runtime + + async def run(): + request = {"nonce": holder.nonce, "session_id": holder.config["session_id"], "method": "look", **extra} + result = await holder.handle(request) + assert not result["ok"] and result["dispatched"] is False + assert not connection.sent and not authority.status() + + asyncio.run(run()) + + +def test_close_uses_only_original_handle_and_does_not_settle_unknown(runtime, monkeypatch): + holder, authority, _, _ = runtime + stopped = [] + monkeypatch.setattr(broker.launch, "stop", stopped.append) + + async def run(): + await call(holder, "look") + await call(holder, "click", token="once", ref="snap:1") + result = await call(holder, "stop") + assert result["cleanup"]["status"] == "bounded_owned_processes_stopped" + assert result["cleanup"]["complete_tree_inventory"] is False + assert stopped == [holder.chrome] + assert authority.status()[0].state == "unknown" + assert not (await call(holder, "look"))["ok"] + + asyncio.run(run()) + + +def test_cleanup_failure_is_reported_without_claiming_all_processes_stopped(runtime, monkeypatch): + holder, _, _, _ = runtime + + def fail(chrome): + raise RuntimeError("inventory unavailable") + + monkeypatch.setattr(broker.launch, "stop", fail) + result = asyncio.run(call(holder, "stop")) + assert result["cleanup"] == {"status": "unverified", "code": "browser_cleanup_unverified"} + + +def test_private_files_and_descriptor_incarnation_are_checked_before_connect(runtime, monkeypatch): + holder, _, _, _ = runtime + + async def forbidden(*args, **kwargs): + pytest.fail("must not connect to a stale or foreign holder") + + monkeypatch.setattr(asyncio, "open_unix_connection", forbidden) + with tempfile.TemporaryDirectory(prefix="fwh-") as raw: + directory = Path(raw) + broker._write_private(directory / broker.CONFIG_FILE, holder.config) + identity = broker.process_identity(os.getpid()) + descriptor = {"version": 1, **identity, "nonce": holder.nonce, + "session_id": holder.config["session_id"], "socket": str(directory / broker.SOCKET_FILE)} + descriptor["start"] = "0.0" + broker._write_private(directory / broker.HOLDER_FILE, descriptor) + with pytest.raises(broker.HolderRefused, match="identity changed"): + asyncio.run(broker.request(directory, "status")) + (directory / broker.HOLDER_FILE).chmod(0o644) + with pytest.raises(broker.HolderRefused, match="private regular"): + asyncio.run(broker.request(directory, "status")) + + +def test_lost_socket_response_then_repeat_token_has_one_activation(runtime): + holder, _, connection, guards = runtime + + async def run(directory): + socket_path = directory / broker.SOCKET_FILE + server = await asyncio.start_unix_server(holder.serve, path=str(socket_path), limit=broker.MAX_REQUEST) + socket_path.chmod(0o600) + broker._write_private(directory / broker.CONFIG_FILE, holder.config) + broker._write_private(directory / broker.HOLDER_FILE, { + "version": 1, **broker.process_identity(os.getpid()), "nonce": holder.nonce, + "session_id": holder.config["session_id"], "socket": str(socket_path), + }) + try: + assert (await broker.request(directory, "look"))["ok"] + connection.release = asyncio.Event() + _reader, writer = await asyncio.open_unix_connection(str(socket_path)) + writer.write(json.dumps({"nonce": holder.nonce, "session_id": holder.config["session_id"], + "method": "click", "token": "once", "ref": "snap:1"}).encode() + b"\n") + await writer.drain() + await asyncio.wait_for(connection.activated.wait(), 2) + writer.close() # lose the response after activation; the holder still owns the attempt + await writer.wait_closed() + connection.release.set() + # A serial status request is a barrier after the earlier connection is admitted. + for _ in range(50): + result = await broker.request(directory, "status") + if result["operations"]: + break + await asyncio.sleep(0.01) + assert result["operations"][0]["state"] == "unknown" + repeated = await broker.request(directory, "click", token="once", ref="snap:1") + assert repeated["replayed"] + assert connection.activations == len(guards) == 1 + finally: + server.close() + await server.wait_closed() + + with tempfile.TemporaryDirectory(prefix="fwh-") as raw: + asyncio.run(run(Path(raw))) + + +def test_oversize_request_refuses_without_browser_or_journal_activity(runtime): + holder, authority, connection, _ = runtime + + async def run(directory): + server = await asyncio.start_unix_server(holder.serve, path=str(directory / "s"), limit=broker.MAX_REQUEST) + try: + reader, writer = await asyncio.open_unix_connection(str(directory / "s")) + writer.write(b"x" * (broker.MAX_REQUEST + 1) + b"\n") + await writer.drain() + result = json.loads(await reader.readline()) + assert result["code"] == "browser_request_invalid" and result["dispatched"] is False + assert not connection.sent and not authority.status() + writer.close() + await writer.wait_closed() + finally: + server.close() + await server.wait_closed() + + with tempfile.TemporaryDirectory(prefix="fwh-") as raw: + asyncio.run(run(Path(raw))) + + +def test_rpc_deadline_after_admission_retains_unknown_without_retry(runtime, monkeypatch): + holder, authority, connection, _ = runtime + monkeypatch.setattr(broker, "REQUEST_TIMEOUT", 0.05) + + async def run(directory): + server = await asyncio.start_unix_server(holder.serve, path=str(directory / "s"), limit=broker.MAX_REQUEST) + try: + await call(holder, "look") + connection.release = asyncio.Event() + reader, writer = await asyncio.open_unix_connection(str(directory / "s")) + writer.write(json.dumps({"nonce": holder.nonce, "session_id": holder.config["session_id"], + "method": "click", "token": "once", "ref": "snap:1"}).encode() + b"\n") + await writer.drain() + result = json.loads(await reader.readline()) + assert result["code"] == "browser_response_unknown" and result["dispatched"] is None + assert authority.status()[0].state == "unknown" + assert (await call(holder, "click", token="once", ref="snap:1"))["replayed"] + assert connection.activations == 1 + writer.close() + await writer.wait_closed() + finally: + server.close() + await server.wait_closed() + + with tempfile.TemporaryDirectory(prefix="fwh-") as raw: + asyncio.run(run(Path(raw))) + + +def test_foreign_socket_peer_is_refused_before_request_read(runtime, monkeypatch): + holder, authority, connection, _ = runtime + monkeypatch.setattr(broker, "_peer_credentials", lambda writer: (os.getpid(), os.getuid() + 1)) + + async def run(directory): + server = await asyncio.start_unix_server(holder.serve, path=str(directory / "s"), limit=broker.MAX_REQUEST) + try: + reader, writer = await asyncio.open_unix_connection(str(directory / "s")) + result = json.loads(await reader.readline()) + assert result["code"] == "browser_peer_mismatch" and result["dispatched"] is False + assert not connection.sent and not authority.status() + writer.close() + await writer.wait_closed() + finally: + server.close() + await server.wait_closed() + + with tempfile.TemporaryDirectory(prefix="fwh-") as raw: + asyncio.run(run(Path(raw))) + + +def test_stale_holder_record_refuses_start_without_launch_or_cleanup(runtime, monkeypatch): + holder, _, _, _ = runtime + launched = [] + monkeypatch.setattr(broker.launch, "launch", lambda *a, **k: launched.append(a)) + monkeypatch.setattr(broker.launch, "stop", lambda *a: pytest.fail("stale metadata gives no cleanup authority")) + with tempfile.TemporaryDirectory(prefix="fwh-") as raw: + directory = Path(raw) + broker._write_private(directory / broker.CONFIG_FILE, holder.config) + broker._write_private(directory / broker.HOLDER_FILE, {"pid": 99999999}) + original = (directory / broker.HOLDER_FILE).read_bytes() + with pytest.raises(broker.HolderRefused, match="no implicit restart"): + asyncio.run(broker.run(directory)) + assert not launched + assert (directory / broker.HOLDER_FILE).read_bytes() == original diff --git a/jevdual/tests/test_browser_restart_cli.py b/jevdual/tests/test_browser_restart_cli.py new file mode 100644 index 0000000..02869af --- /dev/null +++ b/jevdual/tests/test_browser_restart_cli.py @@ -0,0 +1,282 @@ +"""Real CLI recovery after abrupt holder death at committed journal boundaries. + +Only holder startup is a test shim: it wraps the real journal methods and exits +the process after their transactions commit. Look/click/status/recover and offline +replay use the actual subprocess entrypoint. This is test-owned fault injection, +not a product fault flag or evidence of graceful product cleanup. +""" + +from __future__ import annotations + +import json +import os +import shlex +import subprocess +import sys +import tempfile +import threading +import time +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path + +import psutil +import pytest + +_SHIM = r""" +import asyncio,json,os,sys,time +from pathlib import Path +from urllib.parse import urljoin +from urllib.request import urlopen +from jevdual.browser_authority import BrowserAuthority +from jevdual.browser_holder import run + +directory,boundary=Path(sys.argv[1]),sys.argv[2] +method={'prepared':'admit_click','started':'start','retained':'record_execution'}[boundary] +original=getattr(BrowserAuthority,method) +def interrupted(self,*args,**kwargs): + result=original(self,*args,**kwargs) + operation_id=result.id if method=='admit_click' else args[0] + ingress_before_exit=None + if boundary=='retained': + # Test-only barrier: the independent effect must predate holder death. + # This read-only fixture endpoint is never consulted by product recovery. + config=json.loads((directory/'browser.json').read_text()) + deadline=time.monotonic()+10 + while time.monotonic()Restart boundary +''') + + def do_POST(self): + records.append(self.rfile.read(int(self.headers["Content-Length"])).decode()) + arrived.set() + self.send_response(200) + self.end_headers() + self.wfile.write(b"independently retained") + + def log_message(self, *_): + pass + + server = ThreadingHTTPServer(("127.0.0.1", 0), Handler) + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + try: + yield f"http://127.0.0.1:{server.server_port}/", records, arrived + finally: + server.shutdown() + server.server_close() + thread.join(timeout=2) + + +def _private_json(path, value): + with path.open("x") as stream: + os.chmod(path, 0o600) + json.dump(value, stream) + + +def _setup(root, url, boundary): + from jevdual.browser_driver import chrome_executable + + session = root / "session" + session.mkdir(mode=0o700) + adapter = root / "guard.py" + adapter.write_text("import json,sys\nr=json.load(sys.stdin)\n" + "print(json.dumps({'producer':'footwork.browser.guard','version':1," + "'digest':r['digest'],'probabilities':[0.01]}))\n") + _private_json(session / "browser.json", { + "version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", + "chrome": chrome_executable(), "initial_url": url, "authority": str(root / "authority.db"), + "guard_command": [sys.executable, str(adapter)], + }) + process = subprocess.Popen([sys.executable, "-c", _SHIM, str(session), boundary], cwd=root, + env=_environment(), stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, text=True, start_new_session=True) + identities = {process.pid: psutil.Process(process.pid).create_time()} + try: + deadline = time.monotonic() + 25 + while not (session / "holder.json").exists(): + _inventory(process, identities) + if process.poll() is not None: + pytest.fail(f"test holder failed before readiness: {process.communicate(timeout=2)}") + assert time.monotonic() < deadline, "test holder readiness timed out" + time.sleep(0.03) + _inventory(process, identities) + except BaseException: + _test_cleanup(process, identities) + raise + return session, process, identities + + +@pytest.mark.browser +@pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) +def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. + _test_cleanup(holder, identities) + fresh_session = root / "next" + blocked = _cli(root, "start", "Try a new intent", "--session", str(fresh_session), + "--authority", str(root / "authority.db"), "--url", url, success=False) + assert blocked["ok"] is False + assert not list(fresh_session.glob("profile-*")) + assert not (fresh_session / "holder.json").exists() + assert records == (["intended"] if boundary == "retained" else []) + finally: + _test_cleanup(holder, identities) From 5c9866d5a9de992b921f334ed1e996a34c1924fa Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 14:53:48 -0400 Subject: [PATCH 03/18] Predict exceptional holder startup cleanup before probing it --- jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md index 44af7bb..db4029c 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md @@ -16,3 +16,9 @@ Against: a cold agent is directed to CUA/X11 for the CDP route, an unavailable l ## DCAU1 · update · 2026-10-31 14:49 Observed: the first real CLI lost-client-ack test delivered exactly one fixture ingress and retained unknown, but recover failed because the CLI caught OSError/ValueError while the holder identity checker raises RuntimeError. The catch boundary was corrected; the three focused discovery/lost-client/missing-guard CLI checks then passed. Four existing unrelated-cwd discovery checks initially failed because the source test used a relative PYTHONPATH; rerunning with the absolute candidate source root passed all 47 focused guard/discovery/authorization checks. These are harness/integration failures, not evidence of browser completion. Next: finish exact installed-wheel tests, independent review and VM qualification before resolving DCA1/DCA2. General completion readers, pipe custody and the light metadata split remain open. + +## DCA3 · prediction · 2026-10-31 14:56 +Hypothesis: a readiness RPC exception after spawning the owned holder bypasses the CLI startup timeout cleanup and leaves the new helper running. +Test: a bounded process-handle test raises from the first readiness RPC after the holder descriptor appears; assert termination and wait of the actual newly created child handle. Also check the CDP schema returns its full executable command path. +Predicts: current startup raises without closing the handle; wrapping all failed startup exits in owned-handle cleanup closes it without inspecting or signaling any metadata PID. The schema can include its browser prefix without changing legacy routing. +Against: cleanup already runs on the exceptional exit, or the fix stops a successfully established holder or a foreign process. From b8b21f22fcf38e3b33f83d5de11f52794770d67a Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 14:54:52 -0400 Subject: [PATCH 04/18] Record startup signal custody prediction before lifecycle fault test --- .../docs/notebook/2026-10-31-durable-cdp-authority.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md index db4029c..152904a 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md @@ -22,3 +22,13 @@ Hypothesis: a readiness RPC exception after spawning the owned holder bypasses t Test: a bounded process-handle test raises from the first readiness RPC after the holder descriptor appears; assert termination and wait of the actual newly created child handle. Also check the CDP schema returns its full executable command path. Predicts: current startup raises without closing the handle; wrapping all failed startup exits in owned-handle cleanup closes it without inspecting or signaling any metadata PID. The schema can include its browser prefix without changing legacy routing. Against: cleanup already runs on the exceptional exit, or the fix stops a successfully established holder or a foreign process. + +## DCAU2 · update · 2026-10-31 14:54 +Observed: DCA3's first probe hit the Unix socket path guard before spawning because pytest's temporary path was too long; that cell did not test cleanup. The schema cell independently reproduced the missing browser command prefix. DCA3's heading time was a transcription error: the clock returned 14:53 when it was committed; Git ordering remains authoritative. +Next: shorten the test path and rerun the cleanup probe before its fix. Include the reviewer's related pre-readiness signal boundary below. + +## DCA4 · prediction · 2026-10-31 14:54 +Hypothesis: holder startup installs signal handlers too late, so terminating it while the Chrome launch thread is returning can bypass owned-handle cleanup even if the CLI waits for the holder. +Test: real subprocess startup shim delays return of the actual launched Chrome handle; send SIGTERM after independent identity capture but before holder readiness. Also exercise configured startup cancellation after the handle is acquired. +Predicts: installing a stop latch before launch and retaining acquisition of the launch-thread result allows the holder to stop the original Chrome handle and exit; a forced-kill fallback remains explicitly cleanup-unverified. +Against: graceful startup termination leaves live captured Chrome processes, loses the returned handle, or signals a process based only on metadata. From 3484b03b2c6c639f4d896317fc765d2267a6fe98 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 15:01:33 -0400 Subject: [PATCH 05/18] Retain owned Chrome cleanup through interrupted holder startup --- .github/workflows/cdp-observation.yml | 2 +- .../2026-10-31-durable-cdp-authority.md | 7 + jevdual/python/jevdual/agent_cli.py | 2 +- jevdual/python/jevdual/browser_cli.py | 44 ++- jevdual/python/jevdual/browser_holder.py | 135 ++++++-- jevdual/tests/test_browser_startup_cli.py | 81 +++++ .../tests/test_browser_startup_lifecycle.py | 296 ++++++++++++++++++ 7 files changed, 524 insertions(+), 43 deletions(-) create mode 100644 jevdual/tests/test_browser_startup_cli.py create mode 100644 jevdual/tests/test_browser_startup_lifecycle.py diff --git a/.github/workflows/cdp-observation.yml b/.github/workflows/cdp-observation.yml index 21cab8c..651bfa4 100644 --- a/.github/workflows/cdp-observation.yml +++ b/.github/workflows/cdp-observation.yml @@ -29,7 +29,7 @@ jobs: test -x "$FOOTWORK_CHROME_EXECUTABLE" "$FOOTWORK_CHROME_EXECUTABLE" --version mkdir "$RUNNER_TEMP/cdp-tests" - cp jevdual/tests/test_cdp_effector.py jevdual/tests/test_cdp_transport_deadline.py jevdual/tests/test_cdp_launch_custody.py jevdual/tests/test_cdp_click.py jevdual/tests/test_cdp_click_contract.py jevdual/tests/test_browser_durable_authority.py jevdual/tests/test_browser_holder.py jevdual/tests/test_browser_guard.py jevdual/tests/test_browser_cdp_cli.py jevdual/tests/test_browser_restart_cli.py "$RUNNER_TEMP/cdp-tests/" + cp jevdual/tests/test_cdp_effector.py jevdual/tests/test_cdp_transport_deadline.py jevdual/tests/test_cdp_launch_custody.py jevdual/tests/test_cdp_click.py jevdual/tests/test_cdp_click_contract.py jevdual/tests/test_browser_durable_authority.py jevdual/tests/test_browser_holder.py jevdual/tests/test_browser_guard.py jevdual/tests/test_browser_cdp_cli.py jevdual/tests/test_browser_restart_cli.py jevdual/tests/test_browser_startup_cli.py jevdual/tests/test_browser_startup_lifecycle.py "$RUNNER_TEMP/cdp-tests/" cd "$RUNNER_TEMP/cdp-tests" unset PYTHONPATH "$RUNNER_TEMP/cdp-env/bin/python" -c "import importlib.util; assert importlib.util.find_spec('cua_driver') is None; assert importlib.util.find_spec('browser_use') is None" diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md index 152904a..f3b71cd 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md @@ -32,3 +32,10 @@ Hypothesis: holder startup installs signal handlers too late, so terminating it Test: real subprocess startup shim delays return of the actual launched Chrome handle; send SIGTERM after independent identity capture but before holder readiness. Also exercise configured startup cancellation after the handle is acquired. Predicts: installing a stop latch before launch and retaining acquisition of the launch-thread result allows the holder to stop the original Chrome handle and exit; a forced-kill fallback remains explicitly cleanup-unverified. Against: graceful startup termination leaves live captured Chrome processes, loses the returned handle, or signals a process based only on metadata. + +## DCAU3 · update · 2026-10-31 15:01 +Resolves: DCA3 = held; DCA4 = held +Observed: after shortening the probe path, both the exceptional-startup handle test and schema-prefix test failed on the old implementation. The fixed CLI also preserves a successfully established holder. The old exact installed wheel e466146e failed the real launch/SIGTERM cell with holder_exit=-15 and needed test-only cleanup; the new source passed four real Chrome cells (TERM during launch/connect/navigation, INT during launch) plus launch-task cancellation/cleanup checks. Captured live-process absence is asserted before test cleanup; Linux orphan reaping remains test-supervisor behavior, not product evidence. +Changes: CLI failure exits close the actual direct child; holder handlers latch stop before launch, shield the launch-thread result, cancel only readiness tasks after retaining the Chrome handle, and never publish readiness after stop. Forced CLI termination carries browser_cleanup_unverified; startup cleanup exceptions propagate. +Next: rebuild the exact candidate, rerun installed checks and the VM fault cells, then resolve DCA1/DCA2 and close review. +Refs: tests/test_browser_startup_cli.py; tests/test_browser_startup_lifecycle.py; results/durable-cdp-authority-20261031/startup-signal-before.txt diff --git a/jevdual/python/jevdual/agent_cli.py b/jevdual/python/jevdual/agent_cli.py index 134cb1c..9dfed06 100644 --- a/jevdual/python/jevdual/agent_cli.py +++ b/jevdual/python/jevdual/agent_cli.py @@ -258,7 +258,7 @@ def _schema(args: list[str]) -> dict: ) children = [a for a in parser._actions if isinstance(a, argparse._SubParsersAction)] return { - "command": args, + "command": ["browser", *args] if cdp_schema else args, "arguments": options, "subcommands": sorted(children[0].choices) if children else [], } diff --git a/jevdual/python/jevdual/browser_cli.py b/jevdual/python/jevdual/browser_cli.py index 6d1160a..cecb727 100644 --- a/jevdual/python/jevdual/browser_cli.py +++ b/jevdual/python/jevdual/browser_cli.py @@ -13,6 +13,10 @@ from pathlib import Path +class StartupCleanupUnverified(RuntimeError): + code = "browser_cleanup_unverified" + + def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(prog="footwork browser cdp", description=__doc__) commands = parser.add_subparsers(dest="command", required=True) @@ -125,22 +129,32 @@ def _start(args) -> dict: process = subprocess.Popen([sys.executable, "-m", "jevdual.browser_holder", "--session", str(args.session)], stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, start_new_session=True) - deadline = time.monotonic() + 40 - while time.monotonic() < deadline: - if process.poll() is not None: - raise ValueError("holder failed before readiness; no browser authority was established") - if (args.session / HOLDER_FILE).exists(): - result = asyncio.run(_remote(args.session, "status")) - if result.get("ok"): - return {"ok": True, "session_id": config["session_id"], "profile": discovery(), "holder": result} - time.sleep(0.05) - process.terminate() # direct child, never a PID read from metadata + ready = False try: - process.wait(timeout=10) - except subprocess.TimeoutExpired: - process.kill() - process.wait(timeout=3) - raise ValueError("holder readiness timed out; inspect retained authority before another start") + deadline = time.monotonic() + 40 + while time.monotonic() < deadline: + if process.poll() is not None: + raise ValueError("holder failed before readiness; no browser authority was established") + if (args.session / HOLDER_FILE).exists(): + result = asyncio.run(_remote(args.session, "status")) + if result.get("ok"): + ready = True + return {"ok": True, "session_id": config["session_id"], "profile": discovery(), "holder": result} + time.sleep(0.05) + raise ValueError("holder readiness timed out; inspect retained authority before another start") + finally: + if not ready and process.poll() is None: + # Only the direct child created above grants this shutdown authority. Its startup + # signal latch must retain the launch-thread handle before cleaning up Chrome. + process.terminate() + try: + process.wait(timeout=30) + except subprocess.TimeoutExpired: + process.kill() + process.wait(timeout=3) + # Forced termination cannot attest Chrome descendant cleanup. + raise StartupCleanupUnverified("holder forced to exit; browser cleanup unverified") from None + async def _remote(session: Path, method: str, **fields) -> dict: diff --git a/jevdual/python/jevdual/browser_holder.py b/jevdual/python/jevdual/browser_holder.py index 5c685d8..fa0827e 100644 --- a/jevdual/python/jevdual/browser_holder.py +++ b/jevdual/python/jevdual/browser_holder.py @@ -19,6 +19,7 @@ import socket import stat import struct +from collections.abc import Awaitable, Callable from pathlib import Path from typing import Any from urllib.parse import urlsplit @@ -365,24 +366,87 @@ async def request(directory: Path, method: str, **fields: Any) -> dict[str, Any] await writer.wait_closed() +class _StartupStopped(Exception): + """The stop latch interrupted readiness, before a holder was published.""" + + +async def _retain_launch(task: asyncio.Task, stopping: asyncio.Event): + """A launch thread cannot be cancelled. Retain its eventual handle before propagating cancel. + + ``launch`` has its own bounded readiness and failed-launch cleanup. Cancelling ``to_thread`` + would discard the only returned cleanup authority while Chrome continues running in the thread. + """ + cancelled = False + while not task.done(): + try: + await asyncio.shield(task) + except asyncio.CancelledError: + cancelled = True + stopping.set() + return task.result(), cancelled + + +async def _during_startup(stopping: asyncio.Event, action: Callable[[], Awaitable[Any]]) -> Any: + """Interrupt only readiness work after the browser handle is already retained by ``run``.""" + if stopping.is_set(): + raise _StartupStopped + work = asyncio.create_task(action()) + stopped = asyncio.create_task(stopping.wait()) + try: + await asyncio.wait((work, stopped), return_when=asyncio.FIRST_COMPLETED) + if stopping.is_set(): + raise _StartupStopped + return work.result() + finally: + for task in (work, stopped): + if not task.done(): + task.cancel() + await asyncio.gather(work, stopped, return_exceptions=True) + + async def run(directory: Path) -> None: from .browser_authority import BrowserAuthority from .browser_guard import authorize - directory = Path(directory).absolute() - config = _config(directory) - if (directory / HOLDER_FILE).exists() or (directory / SOCKET_FILE).exists(): - raise HolderRefused("browser_holder_exists", "a holder record already exists; no implicit restart is allowed") - fd = os.open(directory / "holder.lock", os.O_WRONLY | os.O_CREAT | os.O_NOFOLLOW, 0o600) - chrome = holder = operations = None + stopping = asyncio.Event() + loop = asyncio.get_running_loop() + previous_handlers = {} + fd = chrome = holder = operations = server = authority = None try: + # Signals latch shutdown from the beginning, including while the launch thread owns a + # browser handle which has not yet returned to this coroutine. They never cancel that thread. + for sig in (signal.SIGTERM, signal.SIGINT): + previous_handlers[sig] = signal.getsignal(sig) + loop.add_signal_handler(sig, stopping.set) + await asyncio.sleep(0) + if stopping.is_set(): + return + directory = Path(directory).absolute() + config = _config(directory) + if (directory / HOLDER_FILE).exists() or (directory / SOCKET_FILE).exists(): + raise HolderRefused("browser_holder_exists", "a holder record already exists; no implicit restart is allowed") + fd = os.open(directory / "holder.lock", os.O_WRONLY | os.O_CREAT | os.O_NOFOLLOW, 0o600) fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) - with BrowserAuthority(Path(config["authority"])) as authority: - # Acquiring the sole journal owner must precede launching a second custodial process. - authority.assert_available() - chrome = await asyncio.to_thread(launch.launch, config["chrome"], - directory / f"profile-{secrets.token_hex(8)}") + # The sole journal owner must be acquired before creating a custodial process. + authority = BrowserAuthority(Path(config["authority"])) + authority.assert_available() + await asyncio.sleep(0) + if stopping.is_set(): + return + acquisition = asyncio.create_task(asyncio.to_thread(launch.launch, config["chrome"], + directory / f"profile-{secrets.token_hex(8)}")) + chrome, cancelled = await _retain_launch(acquisition, stopping) + if cancelled: + raise asyncio.CancelledError + if stopping.is_set(): + return + + async def connect_owned() -> None: + nonlocal operations + # Retain the acquired connection before returning from a cancellable readiness task. operations = await CdpBrowserOperations.connect(chrome) + + async def initialize() -> str: bound = await operations.bind(pid=chrome.pid, window_id=0) if bound.refused: raise HolderRefused("browser_binding_unavailable", "the owned browser could not be bound") @@ -398,34 +462,53 @@ async def run(directory: Path) -> None: await asyncio.wait_for(loaded.get(), 15.0) finally: operations.conn.unlisten(loaded) + return tab + + try: + await _during_startup(stopping, connect_owned) + tab = await _during_startup(stopping, initialize) holder = BrowserHolder(config, authority, chrome, operations, tab, authorize) + holder.stopping = stopping server = await asyncio.start_unix_server(holder.serve, path=str(directory / SOCKET_FILE), limit=MAX_REQUEST) os.chmod(directory / SOCKET_FILE, 0o600) + # Let an already-delivered stop callback run before publishing readiness. No await is + # allowed between this latch check and writing the descriptor. + await asyncio.sleep(0) + if stopping.is_set(): + return descriptor = {"version": 1, **process_identity(os.getpid()), "nonce": holder.nonce, "session_id": config["session_id"], "socket": str(directory / SOCKET_FILE)} _write_private(directory / HOLDER_FILE, descriptor) - loop = asyncio.get_running_loop() - for sig in (signal.SIGTERM, signal.SIGINT): - loop.add_signal_handler(sig, holder.stopping.set) - try: - async with server: - await holder.stopping.wait() - finally: + async with server: + await stopping.wait() + except _StartupStopped: + pass + finally: + try: + if server is not None: server.close() await server.wait_closed() + if holder is not None: # Serialize shutdown with a pending admission/activation. Signals never create a # second cleanup path racing the original operation. async with holder.lock: await holder.close() - finally: - if holder is None: - if operations is not None: - await operations.close() - if chrome is not None: - with contextlib.suppress(Exception): - await asyncio.to_thread(launch.stop, chrome) - os.close(fd) + else: + try: + if operations is not None: + await operations.close() + finally: + if chrome is not None: + await asyncio.to_thread(launch.stop, chrome) + finally: + if authority is not None: + authority.close() + if fd is not None: + os.close(fd) + for sig, previous in previous_handlers.items(): + loop.remove_signal_handler(sig) + signal.signal(sig, previous) def main(argv: list[str] | None = None) -> int: diff --git a/jevdual/tests/test_browser_startup_cli.py b/jevdual/tests/test_browser_startup_cli.py new file mode 100644 index 0000000..38e95e7 --- /dev/null +++ b/jevdual/tests/test_browser_startup_cli.py @@ -0,0 +1,81 @@ +"""CLI startup owns its direct child even when readiness probing raises.""" + +import argparse +import tempfile +from pathlib import Path + +import pytest +from jevdual import browser_cli + + +@pytest.fixture +def short_root(): + with tempfile.TemporaryDirectory(prefix="fw-start-", dir="/tmp") as directory: + yield Path(directory) + + +def test_start_closes_actual_child_on_readiness_exception(short_root, monkeypatch): + tmp_path = short_root + session = tmp_path / "s" + + class Child: + terminated = waited = False + + def poll(self): + return None if not self.waited else 0 + + def terminate(self): + self.terminated = True + + def wait(self, timeout): + self.waited = True + return 0 + + child = Child() + + def spawn(*args, **kwargs): + (session / "holder.json").touch() + return child + + async def unavailable(*args, **kwargs): + raise RuntimeError("readiness RPC unavailable") + + monkeypatch.setattr(browser_cli.subprocess, "Popen", spawn) + monkeypatch.setattr(browser_cli, "_remote", unavailable) + # No actual browser process or network operation is created by this test. + args = argparse.Namespace(task="Observe", session=session, authority=tmp_path / "authority.db", + url="http://127.0.0.1/", chrome="/unused/chrome", guard_command=None) + with pytest.raises(RuntimeError): + browser_cli._start(args) + assert child.terminated and child.waited + + +def test_cdp_schema_names_an_invocable_command(): + from jevdual.agent_cli import _schema + + schema = _schema(["browser", "cdp", "click"]) + assert schema["command"] == ["browser", "cdp", "click"] + + +def test_successful_start_does_not_stop_established_holder(short_root, monkeypatch): + class Child: + def poll(self): + return None + + def terminate(self): + pytest.fail("successful holder must remain owned by its session") + + session = short_root / "s" + + def spawn(*args, **kwargs): + (session / "holder.json").touch() + return Child() + + async def ready(*args, **kwargs): + return {"ok": True, "operations": []} + + monkeypatch.setattr(browser_cli.subprocess, "Popen", spawn) + monkeypatch.setattr(browser_cli, "_remote", ready) + args = argparse.Namespace(task="Observe", session=session, authority=short_root / "authority.db", + url="http://127.0.0.1/", chrome="/unused/chrome", guard_command=None) + assert browser_cli._start(args)["ok"] is True diff --git a/jevdual/tests/test_browser_startup_lifecycle.py b/jevdual/tests/test_browser_startup_lifecycle.py new file mode 100644 index 0000000..79791e6 --- /dev/null +++ b/jevdual/tests/test_browser_startup_lifecycle.py @@ -0,0 +1,296 @@ +"""Signals before holder readiness retain real launch custody until bounded owned cleanup. + +The real-browser cells run under a dedicated test supervisor. On Linux that supervisor is a child +subreaper solely to collect test-owned orphan zombies after assertions. Product cleanup is assessed +first from live process identities; test reaping is recorded separately and is not product evidence. +No production fault flags or test-only cleanup behavior are added to the holder. +""" + +from __future__ import annotations + +import asyncio +import json +import os +import signal +import subprocess +import sys +import tempfile +import threading +from pathlib import Path +from types import SimpleNamespace + +import psutil +import pytest +from jevdual import browser_holder as broker + +_SHIM = r''' +import asyncio,json,os,sys,time +from pathlib import Path +import psutil +from jevdual import browser_holder as broker +from jevdual.effectors.cdp import operations + +directory,phase=Path(sys.argv[1]),sys.argv[2] +def mark(chrome): + root=psutil.Process(chrome.pid) + identities={str(root.pid):root.create_time()} + for child in root.children(recursive=True): + try: identities[str(child.pid)]=child.create_time() + except psutil.NoSuchProcess: pass + with (directory/'startup-boundary.json').open('w') as stream: + json.dump({'phase':phase,'pid':chrome.pid,'start':chrome.incarnation,'captured':identities},stream) + stream.flush() + os.fsync(stream.fileno()) + +original_launch=broker.launch.launch +def launch(*args,**kwargs): + chrome=original_launch(*args,**kwargs) + if phase=='launch': + mark(chrome) + time.sleep(1.5) # handle exists in the real worker thread, not yet in run() + return chrome +broker.launch.launch=launch +if phase=='connect': + original_verify=operations.verify_endpoint + async def verify(conn,chrome): + await original_verify(conn,chrome) + mark(chrome) + await asyncio.sleep(60) # cancellable verification with a real acquired connection + operations.verify_endpoint=verify +elif phase=='navigate': + original_connect=operations.CdpBrowserOperations.connect.__func__ + async def connect(cls,chrome): + ops=await original_connect(cls,chrome) + original_send=ops.conn.send + async def send(method,*args,**kwargs): + result=await original_send(method,*args,**kwargs) + if method=='Page.navigate': + mark(chrome) + await asyncio.sleep(60) # cancellable initial navigation, before holder readiness + return result + ops.conn.send=send + return ops + operations.CdpBrowserOperations.connect=classmethod(connect) +asyncio.run(broker.run(directory)) +''' + +_SUPERVISOR = r''' +import ctypes,json,os,signal,subprocess,sys,time +from pathlib import Path +import psutil + +directory,phase,signal_number=Path(sys.argv[1]),sys.argv[2],int(sys.argv[3]) +subreaper=False +if sys.platform=='linux': + if ctypes.CDLL(None,use_errno=True).prctl(36,1,0,0,0): + raise OSError(ctypes.get_errno(),'test subreaper unavailable') + subreaper=True +process=subprocess.Popen([sys.executable,str(directory/'child.py'),str(directory/'session'),phase], + stdin=subprocess.DEVNULL,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True) +identities={process.pid:psutil.Process(process.pid).create_time()} +def inventory(): + # Only descendants of this dedicated test supervisor confer test cleanup custody. + for child in psutil.Process().children(recursive=True): + try: identities[child.pid]=child.create_time() + except psutil.NoSuchProcess: pass +def live(): + result=[] + for pid,start in identities.items(): + try: + child=psutil.Process(pid) + if child.create_time()==start and child.status()!=psutil.STATUS_ZOMBIE: + result.append(pid) + except psutil.NoSuchProcess: pass + return result +report={'phase':phase,'test_subreaper':subreaper} +failed=False +try: + deadline=time.monotonic()+25 + marker=directory/'session'/'startup-boundary.json' + while not marker.exists(): + inventory() + if process.poll() is not None: + raise AssertionError('holder exited before startup boundary: '+str(process.communicate(timeout=2))) + if time.monotonic()>deadline: raise AssertionError('startup boundary timeout') + time.sleep(.02) + observed=json.loads(marker.read_text()) + inventory() + assert identities.get(observed['pid'])==observed['start'],'marker did not name an owned live descendant' + assert not (directory/'session'/'holder.json').exists(),'holder was published before test boundary' + process.send_signal(signal_number) # actual child handle, never a PID-file signal + report['holder_exit']=process.wait(timeout=25) + assert report['holder_exit']==0,str(process.communicate(timeout=2)) + deadline=time.monotonic()+5 + while live() and time.monotonic()= 2 + assert result["test_subreaper"] is (sys.platform == "linux") + finally: + if supervisor.poll() is None: + # Only a failed test harness reaches this fallback. Capture descendants while its + # actual Popen identity is still known; never acquire cleanup authority from marker data. + owned = psutil.Process(supervisor.pid) + descendants = [(child, child.create_time()) for child in owned.children(recursive=True)] + for child, start in reversed(descendants): + try: + if child.create_time() == start: + child.kill() + except psutil.NoSuchProcess: + pass + supervisor.kill() + supervisor.wait(timeout=5) + + +def _unit_configuration(directory): + config = {"version": 1, "session_id": "startup-unit", "task": "Observe the fixture", + "chrome": "/fixture/chrome", "initial_url": "http://127.0.0.1:1/", + "authority": str(directory / "authority.db"), "guard_command": None} + broker._write_private(directory / broker.CONFIG_FILE, config) + + +def test_task_cancellation_during_launch_waits_for_actual_handle_then_cleans_it(monkeypatch): + entered, release = threading.Event(), threading.Event() + chrome = SimpleNamespace(pid=123, incarnation=1.0) + stopped = [] + + def launch(*args, **kwargs): + entered.set() + assert release.wait(3) + return chrome + + monkeypatch.setattr(broker.launch, "launch", launch) + monkeypatch.setattr(broker.launch, "stop", stopped.append) + + async def run(directory): + previous = {sig: signal.getsignal(sig) for sig in (signal.SIGTERM, signal.SIGINT)} + task = asyncio.create_task(broker.run(directory)) + try: + assert await asyncio.to_thread(entered.wait, 2) + task.cancel() + await asyncio.sleep(0) + assert not task.done() and stopped == [] + release.set() + with pytest.raises(asyncio.CancelledError): + await task + assert stopped == [chrome] + assert not (directory / broker.HOLDER_FILE).exists() + assert {sig: signal.getsignal(sig) for sig in previous} == previous + finally: + release.set() + + with tempfile.TemporaryDirectory(prefix="fw-start-unit-", dir="/tmp") as raw: + directory = Path(raw) + _unit_configuration(directory) + asyncio.run(run(directory)) + + +def test_readiness_failure_still_attempts_cleanup_and_reports_cleanup_uncertainty(monkeypatch): + chrome = SimpleNamespace(pid=123, incarnation=1.0) + stopped = [] + monkeypatch.setattr(broker.launch, "launch", lambda *a, **k: chrome) + + async def unavailable(*args): + raise RuntimeError("readiness unavailable") + + def cleanup(handle): + stopped.append(handle) + raise broker.launch.CleanupUnverified("test inventory unavailable") + + monkeypatch.setattr(broker.CdpBrowserOperations, "connect", unavailable) + monkeypatch.setattr(broker.launch, "stop", cleanup) + with tempfile.TemporaryDirectory(prefix="fw-start-unit-", dir="/tmp") as raw: + directory = Path(raw) + _unit_configuration(directory) + with pytest.raises(broker.launch.CleanupUnverified, match="inventory unavailable"): + asyncio.run(broker.run(directory)) + assert stopped == [chrome] + assert not (directory / broker.HOLDER_FILE).exists() From bee7a96854ec1f0d9304f405793a001abd9f1914 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 15:07:31 -0400 Subject: [PATCH 06/18] Predict post-admission retention failure classification sensitivity --- jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md index f3b71cd..878faf2 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md @@ -39,3 +39,9 @@ Observed: after shortening the probe path, both the exceptional-startup handle t Changes: CLI failure exits close the actual direct child; holder handlers latch stop before launch, shield the launch-thread result, cancel only readiness tasks after retaining the Chrome handle, and never publish readiness after stop. Forced CLI termination carries browser_cleanup_unverified; startup cleanup exceptions propagate. Next: rebuild the exact candidate, rerun installed checks and the VM fault cells, then resolve DCA1/DCA2 and close review. Refs: tests/test_browser_startup_cli.py; tests/test_browser_startup_lifecycle.py; results/durable-cdp-authority-20261031/startup-signal-before.txt + +## DCA5 · prediction · 2026-10-31 15:07 +Hypothesis: if post-admission result retention and its unknown fallback both raise JournalError, the holder's outer pre-admission error handler can misreport dispatched=false after activation. +Test: an explicit retention-failure sensitivity control injects JournalError after one activation and again from mark_unknown; inspect the public RPC envelope, original durable row and a second-token attempt. This is injected protocol failure, not a reproduced storage incident; ordinary SQLite I/O exceptions already reach the unknown envelope. +Predicts: current code returns an incorrect no-send envelope; a narrow post-admission fallback returns dispatched=null, retryable=false and retention-unverified, leaves the persisted started row blocked, and never adds activation. Cancellation still propagates after retaining the best available uncertainty. +Against: the old code already preserves unknown, the fix claims durable retention despite its failure, the second token activates, or cancellation is swallowed. From e4df2c6b04644c332c8a636c556ae2fee0822d28 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 15:08:23 -0400 Subject: [PATCH 07/18] Keep delivery uncertain when post-admission retention also fails --- .../2026-10-31-durable-cdp-authority.md | 6 ++++ jevdual/python/jevdual/browser_holder.py | 11 +++++-- jevdual/tests/test_browser_holder.py | 33 +++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md index 878faf2..181de57 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md @@ -45,3 +45,9 @@ Hypothesis: if post-admission result retention and its unknown fallback both rai Test: an explicit retention-failure sensitivity control injects JournalError after one activation and again from mark_unknown; inspect the public RPC envelope, original durable row and a second-token attempt. This is injected protocol failure, not a reproduced storage incident; ordinary SQLite I/O exceptions already reach the unknown envelope. Predicts: current code returns an incorrect no-send envelope; a narrow post-admission fallback returns dispatched=null, retryable=false and retention-unverified, leaves the persisted started row blocked, and never adds activation. Cancellation still propagates after retaining the best available uncertainty. Against: the old code already preserves unknown, the fix claims durable retention despite its failure, the second token activates, or cancellation is swallowed. + +## DCAU4 · update · 2026-10-31 15:08 +Resolves: DCA5 = held +Observed: both injected controls failed before the fix: post-activation retention failure returned dispatched=false, and a second retention failure replaced CancelledError with a false no-send reply. A narrow fallback now reports browser_retention_unverified with dispatched=null and retryable=false, preserves cancellation, leaves started custody blocked, and prevents a second activation. This is a sensitivity control, not a reproduced disk-full incident. +Next: freeze the final runtime, repeat exact installed checks and VM qualification, then close the package without claiming a browser completion reader or light installer. +Refs: tests/test_browser_holder.py::test_post_admission_retention_failure_never_certifies_no_send; results/durable-cdp-authority-20261031/retention-before.txt diff --git a/jevdual/python/jevdual/browser_holder.py b/jevdual/python/jevdual/browser_holder.py index fa0827e..b179375 100644 --- a/jevdual/python/jevdual/browser_holder.py +++ b/jevdual/python/jevdual/browser_holder.py @@ -257,10 +257,17 @@ async def admission(binding: RefBinding) -> None: raise # No post-admission exception is a no-send certificate. Even cancellation retains # uncertainty. Reconciliation inspects only retained execution evidence, never the DOM. - operation = self.authority.mark_unknown(admitted.id) + try: + operation = self.authority.mark_unknown(admitted.id) + result = self._operation(operation) + except Exception: # noqa: BLE001 - any retention loss after admission is uncertain + # Retention failure is not evidence of non-delivery. Never let it reach the + # outer pre-admission JournalError handler, or claim that unknown was persisted. + result = {"ok": False, "code": "browser_retention_unverified", "dispatched": None, + "retryable": False, "operation_id": admitted.id, "completion": "unverified"} if isinstance(exc, asyncio.CancelledError): raise - return self._operation(operation) + return result async def close(self) -> dict[str, Any]: if self.closed: diff --git a/jevdual/tests/test_browser_holder.py b/jevdual/tests/test_browser_holder.py index 742f540..0161355 100644 --- a/jevdual/tests/test_browser_holder.py +++ b/jevdual/tests/test_browser_holder.py @@ -187,6 +187,39 @@ async def run(): asyncio.run(run()) +@pytest.mark.parametrize("cancel", [False, True]) +def test_post_admission_retention_failure_never_certifies_no_send(runtime, monkeypatch, cancel): + """Sensitivity control: injected protocol-retention failure, not a real disk incident.""" + from jevdual.capability.journal import JournalError + + holder, authority, connection, _ = runtime + + def unavailable(*args, **kwargs): + raise JournalError("injected retention failure") + + monkeypatch.setattr(authority, "record_reply", unavailable) + monkeypatch.setattr(authority, "mark_unknown", unavailable) + if cancel: + connection.failure = asyncio.CancelledError() + + async def run(): + await call(holder, "look") + if cancel: + with pytest.raises(asyncio.CancelledError): + await call(holder, "click", token="once", ref="snap:1") + else: + result = await call(holder, "click", token="once", ref="snap:1") + assert result["dispatched"] is None and result["retryable"] is False + assert result["code"] == "browser_retention_unverified" + original = authority.status()[0] + assert original.state == "dispatching" and original.execution_stage == "started" + blocked = await call(holder, "click", token="second", ref="snap:1") + assert blocked["code"] == "browser_operation_unresolved" + assert connection.activations == 1 + + asyncio.run(run()) + + @pytest.mark.parametrize("extra", [{"nonce": "wrong"}, {"session_id": "another-session"}, {"method": "type"}, {"method": "navigate"}, {"url": "https://x.invalid"}]) def test_wrong_session_and_unbounded_methods_never_touch_browser(runtime, extra): From 85db809abeef88e932bb22baadeed0b32a1a9ba5 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 18:54:34 +0000 Subject: [PATCH 08/18] docs: predict exact installed durable CDP authority and receipt observation (cherry picked from commit e381800f9764c2de7ae3cd26f4275be8b380b55c) --- .../docs/notebook/2026-10-31-durable-cdp-vm.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md new file mode 100644 index 0000000..f99ad37 --- /dev/null +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md @@ -0,0 +1,15 @@ +# Installed Linux durable CDP authority qualification + +Notebook times use America/Detroit; receipts retain UTC. Parent owns runtime implementation/review/PR/merge. This branch contains notebook/results only. + +## DCVM1 · prediction · 2026-10-31 14:54 +Hypothesis: exact installed candidate cad7508f8f4375735c0651c5e0aa5929f3b57700 preserves a stable token across real public CLI/holder interruption without redispatch, while keeping acknowledgement/lost acknowledgement unknown and completion unverified, guarding admission and retaining native/browser separation. +Test: isolate the pushed candidate; require its deterministic pure wheel to have211 entries and SHA256 e466146e5ba77e68470eea7cca86d7beb84d42c3dfe3a7ac7e15ca06a6530660. Install --no-deps into a new minimal consumer with binary pytest8.4.2, psutil7.2.2, websockets15.0.1 and packaging26.3. Assert CUA/browser-use absent and installed package bytes match. Copy all ten supplied test modules unchanged outside checkout, unset PYTHONPATH, set FOOTWORK_EXECUTABLE to the installed script and use the matching consumer Python. One full batch is expected to collect190 tests, no checkout conftest, registered browser marker, unchanged real Chromium/default sandbox flags and current actual4CPU/16GiB limits. Keep all original failures and use the candidate's stronger barrier/doctor assertions. The stock test-only holder shim exits86 after committed prepared/start/retained boundaries; real public commands and independent ingress must establish0/0/1, with retained /count barrier1 before death and no imported heavy backends. Real client SIGKILL after onclick ingress must leave one effect through repeated token/recovery. Capture doctor/tools/schema/guide output and all negatives without enabling typing, completion oracle or metadata split. A600-second wrapper watchdog bounds the full batch; stock command timeouts are unchanged. +Predicts: all190 tests pass without skips; same-token replay never adds ingress, changed/new tokens cannot bypass unknown custody, prepared is known not_sent while started/retained remain unknown/unverified, and real discovery states scope honestly. No live owned residue remains after bounded fixture/product cleanup. +Against: any failed/skipped case, duplicate/sentinel ingress, completed-from-ack claim, reopened unknown authority, missing guard admission, native/browser validator confusion, wrong artifact/source/import origin or live owned residue. +Refs: candidate cad7508f8f4375735c0651c5e0aa5929f3b57700; results/durable-cdp-vm-20261031/; tests/test_browser_restart_cli.py; tests/test_browser_cdp_cli.py; previous VM evidence9aa195b + +## DCVMOBS1 · exploratory · 2026-10-31 14:54 +Question: can test-only receipt observation preserve real public subprocess outputs and ephemeral committed boundary metadata without changing copied tests or installed product behavior? +Test: a pytest-only collector passively records actual public CLI/test-shim Popen creation, numeric waits/communicate outputs and test helper return values. Snapshot known session JSON/boundary files before TemporaryDirectory deletion, hashing/redacting holder nonces; inspect fixture records before teardown. Never rewrite command arguments/replies, journal transactions, return values or product faults. Treat collector errors as a qualification gap. The outer dedicated subreaper records all surviving/zombie descendants after pytest before reaping only owned adopted children; capture any signal intervention and never present wrapper reaping as product cleanup. No credential/environment dump, provider call, broad install, new VM/cloud resources, candidate edit, PR or merge. Archive exact harness hashes before measurement; publish only codex/durable-cdp-vm-evidence. +Refs: results/durable-cdp-vm-20261031/harness/; candidate's unchanged ten test modules; prior subreaper distinction From bdb1d254583d8a55d937510396df1975f642d63c Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 18:56:30 +0000 Subject: [PATCH 09/18] test: freeze installed durable CLI runner and passive boundary receipts (cherry picked from commit 605d2574e08c4544b23bf4f64087be9baa00502d) --- .../harness/pytest_main.py | 11 + .../harness/receipt_plugin.py | 201 +++++++++++++++++ .../harness/run_candidate.py | 209 ++++++++++++++++++ 3 files changed, 421 insertions(+) create mode 100644 jevdual/results/durable-cdp-vm-20261031/harness/pytest_main.py create mode 100644 jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin.py create mode 100644 jevdual/results/durable-cdp-vm-20261031/harness/run_candidate.py diff --git a/jevdual/results/durable-cdp-vm-20261031/harness/pytest_main.py b/jevdual/results/durable-cdp-vm-20261031/harness/pytest_main.py new file mode 100644 index 0000000..2087c4d --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/harness/pytest_main.py @@ -0,0 +1,11 @@ +"""Load a path-pinned passive receipt collector, without PYTHONPATH or checkout conftest.""" +import importlib.util +import sys +from pathlib import Path + +import pytest + +spec = importlib.util.spec_from_file_location('vm_receipt_observer', Path(__file__).with_name('receipt_plugin.py')) +plugin = importlib.util.module_from_spec(spec) +spec.loader.exec_module(plugin) +raise SystemExit(pytest.main(sys.argv[1:], plugins=[plugin])) diff --git a/jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin.py b/jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin.py new file mode 100644 index 0000000..42a3d92 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin.py @@ -0,0 +1,201 @@ +"""Test-only passive receipts; never change a subprocess command/result or product state.""" +import functools +import hashlib +import json +import os +import subprocess +import threading +import time +from pathlib import Path + +import pytest + +ROOT = Path('/workspace/scratch/footwork-durable-cdp-cad7508') +CURRENT = None +LOCK = threading.Lock() +COUNTER = 0 + + +def digest(value): + return hashlib.sha256(value).hexdigest() + + +def clean(value): + if isinstance(value, dict): + return {k: {'redacted_nonce_sha256': digest(str(v).encode())} if k == 'nonce' else clean(v) + for k, v in value.items()} + if isinstance(value, (list, tuple)): + return [clean(v) for v in value] + if isinstance(value, bytes): + return value.decode(errors='replace') + if isinstance(value, Path): + return str(value) + return value + + +def emit(kind, **fields): + with LOCK, (ROOT / 'observer.jsonl').open('a') as stream: + stream.write(json.dumps(clean({'kind': kind, 'monotonic': time.monotonic(), + 'nodeid': CURRENT, **fields})) + '\n') + + +def observer_error(stage, error): + with LOCK, (ROOT / 'observer-errors.jsonl').open('a') as stream: + stream.write(json.dumps({'stage': stage, 'nodeid': CURRENT, + 'type': type(error).__name__, 'message': str(error)}) + '\n') + + +def output(value): + if value is None: + return None + raw = value if isinstance(value, bytes) else value.encode() + text = raw.decode(errors='replace') + try: + parsed = json.loads(text) + except ValueError: + parsed = None + return {'sha256': digest(raw), 'bytes': len(raw), + 'json': clean(parsed), 'text': json.dumps(clean(parsed)) if parsed is not None else text} + + +def selected(argv): + if not isinstance(argv, (tuple, list)): + return None + if str(argv[0]) == os.environ.get('FOOTWORK_EXECUTABLE'): + return 'public_cli' + if '-c' in argv and any('test-boundary.json' in str(x) and 'os._exit(86)' in str(x) for x in argv): + return 'test_only_holder_shim' + return None + + +def arguments(argv): + values = list(map(str, argv)) + if '-c' in values: + index = values.index('-c') + 1 + values[index] = {'test_script_sha256': digest(values[index].encode()), 'characters': len(values[index])} + return values + + +def pytest_configure(config): + global ORIGINAL_INIT, ORIGINAL_WAIT, ORIGINAL_COMMUNICATE + ORIGINAL_INIT = subprocess.Popen.__init__ + ORIGINAL_WAIT = subprocess.Popen.wait + ORIGINAL_COMMUNICATE = subprocess.Popen.communicate + + def initialize(self, args, *positional, **kwargs): + global COUNTER + ORIGINAL_INIT(self, args, *positional, **kwargs) + kind = selected(args) + if kind: + with LOCK: + COUNTER += 1 + number = COUNTER + self._vm_receipt = {'process_number': number, 'process_kind': kind, 'owner_nodeid': CURRENT, + 'pid': self.pid, 'argv': arguments(args), 'cwd': str(kwargs.get('cwd') or os.getcwd())} + emit('spawn', **self._vm_receipt) + + def wait(self, *args, **kwargs): + result = ORIGINAL_WAIT(self, *args, **kwargs) + record = getattr(self, '_vm_receipt', None) + if record: + emit('wait', **record, returncode=result, signal=-result if result < 0 else None) + return result + + def communicate(self, *args, **kwargs): + result = ORIGINAL_COMMUNICATE(self, *args, **kwargs) + record = getattr(self, '_vm_receipt', None) + if record: + emit('communicate', **record, returncode=self.returncode, + signal=-self.returncode if self.returncode is not None and self.returncode < 0 else None, + stdout=output(result[0]), stderr=output(result[1])) + return result + + subprocess.Popen.__init__ = initialize + subprocess.Popen.wait = wait + subprocess.Popen.communicate = communicate + + +def snapshots(root, stage): + root = Path(root) + files = [] + for directory in [root, root / 'session', root / 'next']: + for name in ['browser.json', 'holder.json', 'test-boundary.json', 'holder.stderr.log', 'holder.stdout.log']: + path = directory / name + try: + raw = path.read_bytes() + info = path.stat() + except FileNotFoundError: + continue + item = {'path': str(path), 'sha256': digest(raw), 'mtime_ns': info.st_mtime_ns, + 'mode': oct(info.st_mode & 0o777)} + try: + item['json'] = clean(json.loads(raw)) + except ValueError: + item['text'] = raw.decode(errors='replace') + files.append(item) + if files: + emit('session_snapshot', stage=stage, root=root, files=files) + + +def wrap_helper(module, name): + original = getattr(module, name, None) + if original is None or getattr(original, '_vm_observed', False): + return + + @functools.wraps(original) + def observed(*args, **kwargs): + root = None + if module.__name__ == 'test_browser_restart_cli' and args: + root = args[0] + elif '--session' in args: + root = Path(args[args.index('--session') + 1]).parent + if root is not None: + snapshots(root, 'before_' + name) + try: + result = original(*args, **kwargs) + if name in ('_cli', 'cli'): + emit('helper_return', helper=name, arguments=list(map(str, args)), result=result) + return result + finally: + if root is not None: + snapshots(root, 'after_' + name) + + observed._vm_observed = True + setattr(module, name, observed) + + +def pytest_runtest_setup(item): + global CURRENT + CURRENT = item.nodeid + if item.module.__name__ in ('test_browser_restart_cli', 'test_browser_cdp_cli'): + for name in ('_cli', 'cli', '_setup', '_test_cleanup'): + wrap_helper(item.module, name) + + +def fixture_records(item): + for name in ('ingress', 'page'): + fixture = item.funcargs.get(name) + if not isinstance(fixture, tuple) or len(fixture) < 2: + continue + records = fixture[1]() if callable(fixture[1]) else fixture[1] + if isinstance(records, list): + emit('independent_fixture_records', fixture=name, url=fixture[0], records=list(records)) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_runtest_makereport(item, call): + outcome = yield + report = outcome.get_result() + emit('pytest_report', phase=report.when, outcome=report.outcome, + duration=report.duration, longrepr=str(report.longrepr) if report.failed else None) + if report.when == 'call': + try: + fixture_records(item) + except Exception as error: # noqa: BLE001 - preserve collector gaps separately from product results + observer_error('fixture_records', error) + + +def pytest_unconfigure(config): + subprocess.Popen.__init__ = ORIGINAL_INIT + subprocess.Popen.wait = ORIGINAL_WAIT + subprocess.Popen.communicate = ORIGINAL_COMMUNICATE diff --git a/jevdual/results/durable-cdp-vm-20261031/harness/run_candidate.py b/jevdual/results/durable-cdp-vm-20261031/harness/run_candidate.py new file mode 100644 index 0000000..4d518ed --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/harness/run_candidate.py @@ -0,0 +1,209 @@ +"""Run unchanged installed-wheel candidate tests; never import checkout product code.""" +import ctypes +import hashlib +import importlib.metadata +import importlib.util +import json +import os +import platform +import resource +import shutil +import signal +import subprocess +import sys +import time +import zipfile +from datetime import UTC, datetime +from pathlib import Path + +import psutil + +SOURCE = Path('/workspace/footwork-durable-cdp-cad7508') +ROOT = Path('/workspace/scratch/footwork-durable-cdp-cad7508') +BASE = 'cad7508f8f4375735c0651c5e0aa5929f3b57700' +CHROME = '/usr/lib/chromium/chromium' +TESTS = ['test_cdp_effector.py', 'test_cdp_transport_deadline.py', 'test_cdp_launch_custody.py', 'test_cdp_click.py', 'test_cdp_click_contract.py', 'test_browser_durable_authority.py', 'test_browser_holder.py', 'test_browser_guard.py', 'test_browser_cdp_cli.py', 'test_browser_restart_cli.py'] + + +def sha(path): + return hashlib.file_digest(path.open('rb'), 'sha256').hexdigest() + + +def read(path): + try: + return Path(path).read_text().strip() + except OSError as error: + return {'unavailable': type(error).__name__} + + +def save(name, data): + (ROOT / name).write_text(json.dumps(data, indent=2) + '\n') + + +def identity(process): + return {'pid': process.pid, 'start': process.create_time(), 'parent': process.ppid(), + 'name': process.name(), 'status': process.status(), + 'session': os.getsid(process.pid), 'group': os.getpgid(process.pid)} + + +def descendants(): + rows = [] + for process in psutil.Process().children(recursive=True): + try: + rows.append(identity(process)) + except psutil.NoSuchProcess: + pass + return rows + + +def pinned_signal(row, sig): + fd = None + try: + process = psutil.Process(row['pid']) + if process.create_time() != row['start']: + return 'identity_changed' + fd = os.pidfd_open(process.pid) + if process.create_time() != row['start']: + return 'identity_changed' + signal.pidfd_send_signal(fd, sig) + return 'sent' + except (ProcessLookupError, psutil.NoSuchProcess): + return 'exited' + except (OSError, psutil.Error) as error: + return type(error).__name__ + finally: + if fd is not None: + os.close(fd) + + +def main(): + assert sys.prefix == str(ROOT / 'consumer') + assert not importlib.util.find_spec('cua_driver') + assert not importlib.util.find_spec('browser_use') + import jevdual + from jevdual.effectors.cdp import operations + + wheel = next((ROOT / 'wheel').glob('*.whl')) + package_root = Path(jevdual.__file__).parent.parent + assert package_root.is_relative_to(ROOT / 'consumer') + verified = [] + with zipfile.ZipFile(wheel) as archive: + for name in archive.namelist(): + if name.startswith('jevdual/'): + installed = package_root / name + assert installed.read_bytes() == archive.read(name), name + verified.append(name) + for helper in ('receipt_plugin.py', 'pytest_main.py'): + shutil.copyfile(Path(__file__).with_name(helper), ROOT / helper) + testdir = ROOT / 'tests' + testdir.mkdir(mode=0o700) + hashes = {} + for name in TESTS: + original = SOURCE / 'jevdual/tests' / name + copied = testdir / name + shutil.copyfile(original, copied) + assert copied.read_bytes() == original.read_bytes() + hashes[name] = sha(copied) + libc = ctypes.CDLL(None, use_errno=True) + assert libc.prctl(36, 1, 0, 0, 0) == 0, ctypes.get_errno() # task-only child subreaper + state = ctypes.c_int() + assert libc.prctl(37, ctypes.byref(state), 0, 0, 0) == 0 and state.value == 1 + metadata = { + 'utc_started': datetime.now(UTC).isoformat(), 'baseline_source': BASE, + 'measurement_commit': subprocess.check_output(['git', '-C', str(SOURCE), 'rev-parse', 'HEAD'], text=True).strip(), + 'evidence_commit': subprocess.check_output(['git', '-C', '/workspace/footwork-durable-cdp-vm-evidence', 'rev-parse', 'HEAD'], text=True).strip(), + 'harness_sha256': sha(Path(__file__)), 'wheel': {'name': wheel.name, 'sha256': sha(wheel)}, + 'test_sha256': hashes, 'verified_installed_package_files': len(verified), + 'origins': {'jevdual': jevdual.__file__, 'operations': operations.__file__, + 'python': sys.executable, 'prefix': sys.prefix, 'sys_path': sys.path}, + 'packages': {d.metadata['Name']: d.version for d in importlib.metadata.distributions()}, + 'optional_backends': {'cua_driver': False, 'browser_use': False}, + 'python': sys.version, 'os_release': read('/etc/os-release'), + 'kernel': {'system': platform.system(), 'release': platform.release(), 'machine': platform.machine()}, + 'chrome': {'executable': CHROME, 'sha256': sha(Path(CHROME)), + 'version': subprocess.check_output([CHROME, '--version'], text=True).strip(), + 'sandbox_override': False}, + 'cgroup_membership': read('/proc/self/cgroup'), + 'cgroup': {n: read('/sys/fs/cgroup/' + n) for n in + ['cpu.max', 'cpuset.cpus.effective', 'memory.max', 'memory.swap.max', 'pids.max', + 'memory.events', 'pids.events']}, + 'affinity': sorted(os.sched_getaffinity(0)), 'uid': os.getuid(), + 'rlimits': {n: resource.getrlimit(getattr(resource, n)) for n in + ['RLIMIT_CORE', 'RLIMIT_NPROC', 'RLIMIT_NOFILE', 'RLIMIT_AS']}, + 'kernel_policy': {p: read(p) for p in ['/proc/sys/kernel/unprivileged_userns_clone', + '/proc/sys/user/max_user_namespaces', '/proc/sys/kernel/core_pattern']}, + 'pid1': psutil.Process(1).name(), 'test_wrapper_subreaper': True, + 'watchdog_seconds': 600, 'cleanup_grace_seconds': 3, + 'scope': 'explicit durable CDP CLI and holder; typing/completion oracle/light metadata split remain off', + } + save('environment.json', metadata) + env = dict(os.environ) + env.pop('PYTHONPATH', None) + env.pop('TYPESAFE_API_KEY', None) # fixture guards only; no provider-backed calls + env['FOOTWORK_EXECUTABLE'] = str(ROOT / 'consumer/bin/footwork') + env.update(FOOTWORK_CHROME_EXECUTABLE=CHROME, JEVDUAL_PURE_PY='1', PYTEST_DISABLE_PLUGIN_AUTOLOAD='1') + command = [sys.executable, '-I', str(ROOT / 'pytest_main.py'), '-q', '-rA', '-o', 'markers=browser: launches a real owned browser', '--confcutdir=' + str(testdir), + '--basetemp=' + str(ROOT / 'pytest-tmp'), '--junitxml=' + str(ROOT / 'junit.xml'), str(testdir)] + save('command.json', {'argv': command, 'cwd': str(testdir), 'PYTHONPATH': 'unset', + 'FOOTWORK_CHROME_EXECUTABLE': CHROME, 'JEVDUAL_PURE_PY': '1', + 'PYTEST_DISABLE_PLUGIN_AUTOLOAD': '1', 'FOOTWORK_EXECUTABLE': env['FOOTWORK_EXECUTABLE'], 'provider_key_forwarded': False}) + save('pre-owned-processes.json', descendants()) + with (ROOT / 'pytest.stdout.txt').open('w') as out, (ROOT / 'pytest.stderr.txt').open('w') as err: + process = subprocess.Popen(command, cwd=testdir, env=env, stdout=out, stderr=err, start_new_session=True) + observed = {} + deadline = time.monotonic() + 600 + while process.poll() is None and time.monotonic() < deadline: + for row in descendants(): + observed[(row['pid'], row['start'])] = row + time.sleep(.05) + timed_out = process.poll() is None + if timed_out: + process.terminate() # sole direct-child Popen identity; watchdog only + try: + process.wait(timeout=3) + except subprocess.TimeoutExpired: + process.kill() + code = process.wait(timeout=3) + pre_cleanup = descendants() + save('owned-process-history.json', list(observed.values())) + save('post-pytest-before-wrapper-reaping.json', pre_cleanup) + signals, waits = [], [] + + def reap(): + while True: + try: + pid, status = os.waitpid(-1, os.WNOHANG) + except ChildProcessError: + break + if pid == 0: + break + waits.append({'pid': pid, 'raw_wait_status': status, + 'returncode': os.waitstatus_to_exitcode(status)}) + + for sig in (signal.SIGTERM, signal.SIGKILL): + for row in descendants(): + if row['status'] != psutil.STATUS_ZOMBIE: + signals.append({**row, 'signal': sig.value, 'delivery': pinned_signal(row, sig)}) + deadline = time.monotonic() + 3 + while descendants() and time.monotonic() < deadline: + reap() + time.sleep(.02) + reap() + if not descendants(): + break + final = descendants() + save('cleanup.json', {'pytest_returncode': code, 'pytest_timeout': timed_out, + 'pre_wrapper_cleanup': pre_cleanup, 'signals': signals, + 'adopted_waits': waits, 'final_owned_descendants': final, + 'utc_finished': datetime.now(UTC).isoformat(), + 'limits': 'bounded known descendants; no atomic inventory/daemon-escape/global no-zombie claim'}) + observer_gap = (ROOT / 'observer-errors.jsonl').exists() and (ROOT / 'observer-errors.jsonl').stat().st_size > 0 + wrapper_code = 1 if timed_out or final or observer_gap else (code if code >= 0 else 128 - code) + receipt = json.loads((ROOT / 'cleanup.json').read_text()) + receipt.update(observer_gap=observer_gap, wrapper_returncode=wrapper_code) + save('cleanup.json', receipt) + return wrapper_code + + +if __name__ == '__main__': + raise SystemExit(main()) From 6bb6c24c3a83cc605e7227b3e4af3b2a0200c450 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 18:58:56 +0000 Subject: [PATCH 10/18] docs: retain first-run collector failures before isolated observer correction (cherry picked from commit 186009efc58b306b9016a10f4a16cdd3afd48167) --- jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md index f99ad37..dd0c884 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md @@ -13,3 +13,16 @@ Refs: candidate cad7508f8f4375735c0651c5e0aa5929f3b57700; results/durable-cdp-vm Question: can test-only receipt observation preserve real public subprocess outputs and ephemeral committed boundary metadata without changing copied tests or installed product behavior? Test: a pytest-only collector passively records actual public CLI/test-shim Popen creation, numeric waits/communicate outputs and test helper return values. Snapshot known session JSON/boundary files before TemporaryDirectory deletion, hashing/redacting holder nonces; inspect fixture records before teardown. Never rewrite command arguments/replies, journal transactions, return values or product faults. Treat collector errors as a qualification gap. The outer dedicated subreaper records all surviving/zombie descendants after pytest before reaping only owned adopted children; capture any signal intervention and never present wrapper reaping as product cleanup. No credential/environment dump, provider call, broad install, new VM/cloud resources, candidate edit, PR or merge. Archive exact harness hashes before measurement; publish only codex/durable-cdp-vm-evidence. Refs: results/durable-cdp-vm-20261031/harness/; candidate's unchanged ten test modules; prior subreaper distinction + +## DCVMU1 · update · 2026-10-31 14:58 +Resolves: DCVM1 = inconclusive +Observed: exact cad7508 wheel211/e466146e matched; the unchanged190-case installed batch finished187 passed/3 failed in29.31seconds. All three restart cells failed because the test-only receipt wrapper incorrectly treated _test_cleanup's first Popen argument as a directory, raising Path(Popen) before fixture cleanup. This is my collector defect, not a product regression or a clean qualification. Core recovery/replay and independent fixture0/0/1 assertions were reached before cleanup failure; fresh-start unknown-domain assertions in started/retained were not reached. Real client-kill/lost-ack and discovery tests passed. The outer wrapper truthfully recorded182 zombies plus36 live descendants after pytest, used36 pinned SIGTERM deliveries and reaped all adopted children to zero final owned descendants. Numeric pytest/wrapper exits1 remain failures. The handled-observer-gap flag isFalse because the uncaught helper exception instead surfaced as failed pytest calls; it cannot establish that observation was passive. +Next: retain the entire first run and errors, repair only collector helper dispatch for the next exact candidate, and do not rerun unchanged cells. Parent review independently found holder/CLI startup custody gaps and is sending a new SHA/wheel; do not probe or patch the old product runtime. +Refs: results/durable-cdp-vm-20261031/cad7508-first/; collector commit605d257; tests/test_browser_restart_cli.py; parent startup-custody handoff + +## DCVMOBS2 · prediction · 2026-10-31 14:58 +Hypothesis: restricting directory snapshots to the _cli/_setup helpers whose first argument is actually a path, and keeping snapshot failures outside the original helper's execution, prevents receipt collection from bypassing or corrupting test fixture cleanup. +Test: prepare a new versioned collector without touching the measured first collector/source/tests/artifact. _test_cleanup must receive its original Popen/identity arguments directly; metadata capture must not raise into it. Record snapshot errors separately as a qualification gap. Test the corrected collector only with the next parent-supplied exact candidate batch; no old-case rerun or product change is needed now. +Predicts: original fixture cleanup runs, per-cell CLI/boundary/ingress receipts remain available, and no Path(Popen) failure occurs. Any collector error still blocks a clean evidence claim. +Against: a helper gets rewritten arguments/results, collector exceptions bypass fixture cleanup, boundary receipts disappear, or the next batch still has observer-caused errors. +Refs: results/durable-cdp-vm-20261031/harness/receipt_plugin_v2.py; first frozen collector605d257 From 0925719256ce1606ed0b40df6dfa2360596a6eaf Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 19:02:38 +0000 Subject: [PATCH 11/18] test: retain first durable candidate failures, restart receipts and wrapper cleanup (cherry picked from commit d4a312aad65d0033bfe5638c44a4da072cb034c0) --- .../notebook/2026-10-31-durable-cdp-vm.md | 5 + .../cad7508-first/build.json | 1 + .../cells/client-lost-ack/events.jsonl | 79 + .../cells/client-lost-ack/receipt.json | 953 ++++ .../cells/missing-guard/events.jsonl | 43 + .../cells/missing-guard/receipt.json | 235 + .../cad7508-first/cells/prepared/events.jsonl | 63 + .../cad7508-first/cells/prepared/receipt.json | 452 ++ .../cad7508-first/cells/retained/events.jsonl | 63 + .../cad7508-first/cells/retained/receipt.json | 894 ++++ .../cad7508-first/cells/started/events.jsonl | 63 + .../cad7508-first/cells/started/receipt.json | 432 ++ .../cad7508-first/cleanup.json | 3383 ++++++++++++ .../cad7508-first/collector-provenance.json | 10 + .../cad7508-first/command.json | 22 + .../cad7508-first/discovery/doctor.json | 502 ++ .../cad7508-first/discovery/guide.json | 89 + .../cad7508-first/discovery/schema.json | 93 + .../cad7508-first/discovery/tools.json | 335 ++ .../cad7508-first/environment.json | 113 + .../cad7508-first/inspected-summary.json | 88 + .../cad7508-first/junit.xml | 476 ++ .../cad7508-first/observer.jsonl | 925 ++++ .../cad7508-first/owned-process-history.json | 4601 +++++++++++++++++ .../post-pytest-before-wrapper-reaping.json | 1964 +++++++ .../cad7508-first/post-run-check.json | 9 + .../cad7508-first/pre-owned-processes.json | 1 + .../cad7508-first/pytest.stderr.txt | 0 .../cad7508-first/pytest.stdout.txt | 691 +++ .../cad7508-first/report.md | 47 + .../cad7508-first/runner.stderr.txt | 0 .../cad7508-first/runner.stdout.txt | 0 .../harness/receipt_plugin_v2.py | 208 + .../notebook-check.txt | 110 + .../durable-cdp-vm-20261031/redaction.txt | 1 + .../results/durable-cdp-vm-20261031/report.md | 5 + 36 files changed, 16956 insertions(+) create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/build.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/client-lost-ack/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/client-lost-ack/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/missing-guard/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/missing-guard/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/prepared/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/prepared/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/retained/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/retained/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/started/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/started/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/cleanup.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/collector-provenance.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/command.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/doctor.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/guide.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/schema.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/tools.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/environment.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/inspected-summary.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/junit.xml create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/observer.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/owned-process-history.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/post-pytest-before-wrapper-reaping.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/post-run-check.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/pre-owned-processes.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/pytest.stderr.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/pytest.stdout.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/report.md create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/runner.stderr.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/cad7508-first/runner.stdout.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin_v2.py create mode 100644 jevdual/results/durable-cdp-vm-20261031/notebook-check.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/redaction.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/report.md diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md index dd0c884..495b9db 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md @@ -26,3 +26,8 @@ Test: prepare a new versioned collector without touching the measured first coll Predicts: original fixture cleanup runs, per-cell CLI/boundary/ingress receipts remain available, and no Path(Popen) failure occurs. Any collector error still blocks a clean evidence claim. Against: a helper gets rewritten arguments/results, collector exceptions bypass fixture cleanup, boundary receipts disappear, or the next batch still has observer-caused errors. Refs: results/durable-cdp-vm-20261031/harness/receipt_plugin_v2.py; first frozen collector605d257 + +## DCVMU2 · update · 2026-10-31 15:01 +Observed: all three restart markers are retained with heavy_imports empty, holder exit86, matching operation IDs and independent ingress0/0/1; retained marker proves independent /count1 before holder exit. Recovery/status phases are final/not_sent/not_sent, unknown/unknown/ambiguous and unknown/unknown/sent respectively; all retain unverified completion. Real client SIGKILL lost-ack, missing guard and actual discovery cases passed. The3 restart cases remain failed because collector cleanup interception prevented the original cleanup, including later fresh-start assertions in started/retained. More precisely than DCVMU1's wording,36 wrapper SIGTERM attempts produced35 actual pidfd deliveries plus one already-exited result, and202 adopted waits; these counts are not additive to the earlier182zombie/36live snapshot because parents may reap during termination. Final owned descendants are empty. The versioned v2 collector is prepared but untested pending the replacement candidate. +Next: publish first evidence on codex/durable-cdp-vm-evidence and preserve it unchanged. Wait for the parent's exact startup-fixed SHA/wheel/recipe before further runtime tests or fault probes; do not patch candidate source. +Refs: results/durable-cdp-vm-20261031/cad7508-first/report.md; results/durable-cdp-vm-20261031/cad7508-first/cleanup.json; results/durable-cdp-vm-20261031/cad7508-first/cells/ diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/build.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/build.json new file mode 100644 index 0000000..11f1d6f --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/build.json @@ -0,0 +1 @@ +{"wheel": "/workspace/scratch/footwork-durable-cdp-cad7508/wheel/jevdual-0.0.1-py3-none-any.whl", "files": 211, "sha256": "e466146e5ba77e68470eea7cca86d7beb84d42c3dfe3a7ac7e15ca06a6530660", "verified": true} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/client-lost-ack/events.jsonl b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/client-lost-ack/events.jsonl new file mode 100644 index 0000000..39dcb91 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/client-lost-ack/events.jsonl @@ -0,0 +1,79 @@ +{"kind": "pytest_report", "monotonic": 6557.381436533, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "phase": "setup", "outcome": "passed", "duration": 0.0027743219998228597, "longrepr": null} +{"kind": "spawn", "monotonic": 6557.382147927, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6558.06751731, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6558.067615546, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6558.067747662, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "560d28c1bac7f57cfb0dd3c68a76b4620bdcfcfa61e33e90bd2ff68c455b24ea", "bytes": 1202, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "operations": []}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_74a654f1b3e640d2b5ea052282189291\", \"profile\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}, \"holder\": {\"ok\": true, \"session_id\": \"cdp_74a654f1b3e640d2b5ea052282189291\", \"operations\": []}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6558.06782087, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6558.067880419, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "result": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "operations": []}}} +{"kind": "session_snapshot", "monotonic": 6558.068305549, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-g2e_lzz_", "files": [{"path": "/tmp/fw-cdp-g2e_lzz_/session/browser.json", "sha256": "7775f016f8fa6425e059def01f88affaeeecb0a3b62e01322a6d4311b34ee153", "mtime_ns": 1793472991824295048, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:33757/", "authority": "/tmp/fw-cdp-g2e_lzz_/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-cdp-g2e_lzz_/guard.py"]}}, {"path": "/tmp/fw-cdp-g2e_lzz_/session/holder.json", "sha256": "e7afc125d7a17878b4dcca7e09c2a4d33ff84cc4593b984c5a9138a802c5046c", "mtime_ns": 1793472992369812438, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7218, "start": "1793472991.46", "nonce": {"redacted_nonce_sha256": "aa1651c649dc2e043f1f3829b3ef6289bd011580c91cc71d0b6abe8060b258e5"}, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "socket": "/tmp/fw-cdp-g2e_lzz_/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6558.068511644, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-g2e_lzz_", "files": [{"path": "/tmp/fw-cdp-g2e_lzz_/session/browser.json", "sha256": "7775f016f8fa6425e059def01f88affaeeecb0a3b62e01322a6d4311b34ee153", "mtime_ns": 1793472991824295048, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:33757/", "authority": "/tmp/fw-cdp-g2e_lzz_/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-cdp-g2e_lzz_/guard.py"]}}, {"path": "/tmp/fw-cdp-g2e_lzz_/session/holder.json", "sha256": "e7afc125d7a17878b4dcca7e09c2a4d33ff84cc4593b984c5a9138a802c5046c", "mtime_ns": 1793472992369812438, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7218, "start": "1793472991.46", "nonce": {"redacted_nonce_sha256": "aa1651c649dc2e043f1f3829b3ef6289bd011580c91cc71d0b6abe8060b258e5"}, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "socket": "/tmp/fw-cdp-g2e_lzz_/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6558.069031354, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6558.194336843, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6558.194430942, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6558.19457104, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "885fd32898ab16ed9d61a71156a6598292f1a35a2618f040401472bc134bad85", "bytes": 954, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:33757/", "title": "Durable fixture"}, "snapshot": {"id": "fdf7f80a4f48", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "fdf7f80a4f48:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "fdf7f80a4f48:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "DEFBC106547B3D2415B90717222D54AF", "loader_id": "6998FC5820B14CF02CEBE5B366490349"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_74a654f1b3e640d2b5ea052282189291\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:33757/\", \"title\": \"Durable fixture\"}, \"snapshot\": {\"id\": \"fdf7f80a4f48\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"fdf7f80a4f48:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}, {\"ref\": \"fdf7f80a4f48:2\", \"role\": \"button\", \"name\": \"Sentinel\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"DEFBC106547B3D2415B90717222D54AF\", \"loader_id\": \"6998FC5820B14CF02CEBE5B366490349\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6558.194664338, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6558.194844495, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "result": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:33757/", "title": "Durable fixture"}, "snapshot": {"id": "fdf7f80a4f48", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "fdf7f80a4f48:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "fdf7f80a4f48:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "DEFBC106547B3D2415B90717222D54AF", "loader_id": "6998FC5820B14CF02CEBE5B366490349"}}}} +{"kind": "session_snapshot", "monotonic": 6558.195075758, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-g2e_lzz_", "files": [{"path": "/tmp/fw-cdp-g2e_lzz_/session/browser.json", "sha256": "7775f016f8fa6425e059def01f88affaeeecb0a3b62e01322a6d4311b34ee153", "mtime_ns": 1793472991824295048, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:33757/", "authority": "/tmp/fw-cdp-g2e_lzz_/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-cdp-g2e_lzz_/guard.py"]}}, {"path": "/tmp/fw-cdp-g2e_lzz_/session/holder.json", "sha256": "e7afc125d7a17878b4dcca7e09c2a4d33ff84cc4593b984c5a9138a802c5046c", "mtime_ns": 1793472992369812438, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7218, "start": "1793472991.46", "nonce": {"redacted_nonce_sha256": "aa1651c649dc2e043f1f3829b3ef6289bd011580c91cc71d0b6abe8060b258e5"}, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "socket": "/tmp/fw-cdp-g2e_lzz_/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6558.196276097, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7334, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--ref", "fdf7f80a4f48:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6558.35635145, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7334, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--ref", "fdf7f80a4f48:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": -9, "signal": 9} +{"kind": "wait", "monotonic": 6558.356459901, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7334, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--ref", "fdf7f80a4f48:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": -9, "signal": 9} +{"kind": "communicate", "monotonic": 6558.356568692, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7334, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--ref", "fdf7f80a4f48:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": -9, "signal": 9, "stdout": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "session_snapshot", "monotonic": 6559.857387749, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-g2e_lzz_", "files": [{"path": "/tmp/fw-cdp-g2e_lzz_/session/browser.json", "sha256": "7775f016f8fa6425e059def01f88affaeeecb0a3b62e01322a6d4311b34ee153", "mtime_ns": 1793472991824295048, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:33757/", "authority": "/tmp/fw-cdp-g2e_lzz_/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-cdp-g2e_lzz_/guard.py"]}}, {"path": "/tmp/fw-cdp-g2e_lzz_/session/holder.json", "sha256": "e7afc125d7a17878b4dcca7e09c2a4d33ff84cc4593b984c5a9138a802c5046c", "mtime_ns": 1793472992369812438, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7218, "start": "1793472991.46", "nonce": {"redacted_nonce_sha256": "aa1651c649dc2e043f1f3829b3ef6289bd011580c91cc71d0b6abe8060b258e5"}, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "socket": "/tmp/fw-cdp-g2e_lzz_/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6559.857944504, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7336, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6559.942188075, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7336, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6559.942330236, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7336, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6559.942586246, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7336, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "98ba7a9b47b87bfdf6068efeb08210b18d9dd60c0111e7fe5a61c14e343f1859", "bytes": 5145, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "operations": [{"id": "op_4936d669a0f2", "task": "cdp_74a654f1b3e640d2b5ea052282189291", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5A8B439207B903F1F9ADBFA971621937\",\"pid\":7220,\"start\":\"1793472991.54\",\"target\":\"DEFBC106547B3D2415B90717222D54AF\"}", "observation": "fdf7f80a4f48:1", "target": "7", "move": "click", "args": {"ref": "fdf7f80a4f48:1", "route": "dom_event_native_button"}, "request_digest": "39fe834470320c66e1834022e430797491f789f69a877f94b73870876da1be1a", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "5A8B439207B903F1F9ADBFA971621937", "cdp_session": "1161E0E0A932CBD8C4C541B5DA007B9E", "document_token": "5d3fc295ce059853e0843884ec8eb915", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'});let t=Date.now()+1200;while(Date.now())\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n _test_cleanup(holder, identities)\n fresh_session = root / \"next\"\n blocked = _cli(root, \"start\", \"Try a new intent\", \"--session\", str(fresh_session),\n \"--authority\", str(root / \"authority.db\"), \"--url\", url, success=False)\n assert blocked[\"ok\"] is False\n assert not list(fresh_session.glob(\"profile-*\"))\n assert not (fresh_session / \"holder.json\").exists()\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n finally:\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:282: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c47f8b0>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError"} +{"kind": "independent_fixture_records", "monotonic": 6564.023023012, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", "fixture": "ingress", "url": "http://127.0.0.1:37135/", "records": []} +{"kind": "pytest_report", "monotonic": 6564.256557686, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", "phase": "teardown", "outcome": "passed", "duration": 0.23298249599974952, "longrepr": null} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/prepared/receipt.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/prepared/receipt.json new file mode 100644 index 0000000..8541fc6 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/prepared/receipt.json @@ -0,0 +1,452 @@ +{ + "nodeids": [ + "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]" + ], + "boundary_metadata": [ + { + "path": "/tmp/fw-crash-y14l68mj/session/test-boundary.json", + "sha256": "07001da3d5919101322b3a6e8b4f3d2a7bd54c79dea491cb0cb3f03445dd0c75", + "mtime_ns": 1793472997927134458, + "mode": "0o600", + "json": { + "boundary": "prepared", + "operation_id": "op_da3d2908bf86", + "ingress_before_exit": null, + "heavy_imports": [] + } + } + ], + "independent_fixture_records": [ + { + "kind": "independent_fixture_records", + "monotonic": 6564.023023012, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", + "fixture": "ingress", + "url": "http://127.0.0.1:37135/", + "records": [] + } + ], + "public_helper_receipts": [ + { + "kind": "helper_return", + "monotonic": 6563.424517489, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-y14l68mj", + "look", + "--session", + "/tmp/fw-crash-y14l68mj/session" + ], + "result": { + "ok": true, + "session_id": "restart-fixture", + "snapshot": { + "status": "ok", + "page": { + "url": "http://127.0.0.1:37135/", + "title": "Restart boundary" + }, + "snapshot": { + "id": "4edd77755d2f", + "complete": false, + "omitted": { + "css_hidden": 0, + "offscreen": 0, + "no_layout": 0, + "unknown": 0, + "budget": 0, + "child_frames": 0, + "custom_controls_unobserved": 1 + } + }, + "refs": [ + { + "ref": "4edd77755d2f:1", + "role": "button", + "name": "Commit fixture", + "actions": [ + "click" + ], + "states": { + "focusable": true + }, + "visibility": "in_viewport" + } + ], + "content_refs": [], + "document": { + "frame_id": "D4294979896AD096DB714F621D75CD76", + "loader_id": "95798E2634A2A5B3999FEA0D176200E3" + } + } + } + }, + { + "kind": "helper_return", + "monotonic": 6563.58371196, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-y14l68mj", + "click", + "--session", + "/tmp/fw-crash-y14l68mj/session", + "--ref", + "4edd77755d2f:1", + "--token", + "intent-1" + ], + "result": { + "ok": false, + "code": "browser_response_unknown", + "dispatched": null, + "retryable": false + } + }, + { + "kind": "helper_return", + "monotonic": 6563.664124078, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-y14l68mj", + "recover", + "--session", + "/tmp/fw-crash-y14l68mj/session", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "holder": "unavailable; no relaunch attempted", + "session_id": "restart-fixture", + "operations": [ + { + "id": "op_da3d2908bf86", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"AA47E56A96E32815C7CF55BC257D83C9\",\"pid\":7484,\"start\":\"1793472996.94\",\"target\":\"D4294979896AD096DB714F621D75CD76\"}", + "observation": "4edd77755d2f:1", + "target": "7", + "move": "click", + "args": { + "ref": "4edd77755d2f:1", + "route": "dom_event_native_button" + }, + "request_digest": "0cba9124823c065988911d1c383b15664381e5b7fd0411345a891308b47301c1", + "client_token": "intent-1", + "state": "final", + "disposition": "not_sent", + "phase": "not_sent", + "evidence": { + "prepared_only": true, + "protocol": 1 + }, + "error": null, + "resolved_by": "recovery", + "history": [ + { + "t": 1793472997.926826, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793472998.013787, + "kind": "recovered_unknown" + }, + { + "t": 1793472998.014018, + "kind": "resolve", + "by": "prepared_protocol", + "disposition": "not_sent" + } + ], + "created": 1793472997.9266243, + "updated": 1793472998.0139844, + "recovery": null, + "execution_stage": "prepared", + "completion": "unverified", + "retryable": false + } + ] + } + }, + { + "kind": "helper_return", + "monotonic": 6563.74050482, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-y14l68mj", + "status", + "--session", + "/tmp/fw-crash-y14l68mj/session", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "holder": "unavailable; no relaunch attempted", + "session_id": "restart-fixture", + "operations": [ + { + "id": "op_da3d2908bf86", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"AA47E56A96E32815C7CF55BC257D83C9\",\"pid\":7484,\"start\":\"1793472996.94\",\"target\":\"D4294979896AD096DB714F621D75CD76\"}", + "observation": "4edd77755d2f:1", + "target": "7", + "move": "click", + "args": { + "ref": "4edd77755d2f:1", + "route": "dom_event_native_button" + }, + "request_digest": "0cba9124823c065988911d1c383b15664381e5b7fd0411345a891308b47301c1", + "client_token": "intent-1", + "state": "final", + "disposition": "not_sent", + "phase": "not_sent", + "evidence": { + "prepared_only": true, + "protocol": 1 + }, + "error": null, + "resolved_by": "recovery", + "history": [ + { + "t": 1793472997.926826, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793472998.013787, + "kind": "recovered_unknown" + }, + { + "t": 1793472998.014018, + "kind": "resolve", + "by": "prepared_protocol", + "disposition": "not_sent" + } + ], + "created": 1793472997.9266243, + "updated": 1793472998.0139844, + "recovery": null, + "execution_stage": "prepared", + "completion": "unverified", + "retryable": false + } + ] + } + }, + { + "kind": "helper_return", + "monotonic": 6563.821926561, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-y14l68mj", + "click", + "--session", + "/tmp/fw-crash-y14l68mj/session", + "--ref", + "4edd77755d2f:1", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "replayed": true, + "holder": "unavailable", + "operation": { + "id": "op_da3d2908bf86", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"AA47E56A96E32815C7CF55BC257D83C9\",\"pid\":7484,\"start\":\"1793472996.94\",\"target\":\"D4294979896AD096DB714F621D75CD76\"}", + "observation": "4edd77755d2f:1", + "target": "7", + "move": "click", + "args": { + "ref": "4edd77755d2f:1", + "route": "dom_event_native_button" + }, + "request_digest": "0cba9124823c065988911d1c383b15664381e5b7fd0411345a891308b47301c1", + "client_token": "intent-1", + "state": "final", + "disposition": "not_sent", + "phase": "not_sent", + "evidence": { + "prepared_only": true, + "protocol": 1 + }, + "error": null, + "resolved_by": "recovery", + "history": [ + { + "t": 1793472997.926826, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793472998.013787, + "kind": "recovered_unknown" + }, + { + "t": 1793472998.014018, + "kind": "resolve", + "by": "prepared_protocol", + "disposition": "not_sent" + } + ], + "created": 1793472997.9266243, + "updated": 1793472998.0139844, + "recovery": null, + "execution_stage": "prepared", + "completion": "unverified", + "retryable": false + } + } + }, + { + "kind": "helper_return", + "monotonic": 6563.903077393, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-y14l68mj", + "click", + "--session", + "/tmp/fw-crash-y14l68mj/session", + "--ref", + "4edd77755d2f:1", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "replayed": true, + "holder": "unavailable", + "operation": { + "id": "op_da3d2908bf86", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"AA47E56A96E32815C7CF55BC257D83C9\",\"pid\":7484,\"start\":\"1793472996.94\",\"target\":\"D4294979896AD096DB714F621D75CD76\"}", + "observation": "4edd77755d2f:1", + "target": "7", + "move": "click", + "args": { + "ref": "4edd77755d2f:1", + "route": "dom_event_native_button" + }, + "request_digest": "0cba9124823c065988911d1c383b15664381e5b7fd0411345a891308b47301c1", + "client_token": "intent-1", + "state": "final", + "disposition": "not_sent", + "phase": "not_sent", + "evidence": { + "prepared_only": true, + "protocol": 1 + }, + "error": null, + "resolved_by": "recovery", + "history": [ + { + "t": 1793472997.926826, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793472998.013787, + "kind": "recovered_unknown" + }, + { + "t": 1793472998.014018, + "kind": "resolve", + "by": "prepared_protocol", + "disposition": "not_sent" + } + ], + "created": 1793472997.9266243, + "updated": 1793472998.0139844, + "recovery": null, + "execution_stage": "prepared", + "completion": "unverified", + "retryable": false + } + } + }, + { + "kind": "helper_return", + "monotonic": 6563.988471881, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-y14l68mj", + "click", + "--session", + "/tmp/fw-crash-y14l68mj/session", + "--ref", + "4edd77755d2f:1", + "--token", + "intent-2" + ], + "result": { + "ok": false, + "code": "browser_session_unavailable", + "message": "request refused; inspect retained authority; no automatic retry", + "error_type": "ValueError" + } + } + ], + "observed_numeric_exits": [ + { + "kind": "public_cli", + "pid": 7596, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7597, + "returncode": 3, + "signal": null + }, + { + "kind": "test_only_holder_shim", + "pid": 7482, + "returncode": 86, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7599, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7600, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7601, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7602, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7603, + "returncode": 3, + "signal": null + } + ] +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/retained/events.jsonl b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/retained/events.jsonl new file mode 100644 index 0000000..a102dc7 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/retained/events.jsonl @@ -0,0 +1,63 @@ +{"kind": "pytest_report", "monotonic": 6565.655686129, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "phase": "setup", "outcome": "passed", "duration": 0.0006132389999038423, "longrepr": null} +{"kind": "spawn", "monotonic": 6565.656719931, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 37, "process_kind": "test_only_holder_shim", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7748, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "-c", {"test_script_sha256": "2bc2b9b43581e039c0a135d7b912ca485301be56f7dcf026911f94cceb440c1e", "characters": 1742}, "/tmp/fw-crash-7dr_6o74/session", "retained"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "session_snapshot", "monotonic": 6566.076653416, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__setup", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6566.076995423, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6566.077836309, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.206070595, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.206170834, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.206341917, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "8937079d56ee97b7f80afb1dc3dde6b671fe7c9896a2bdc4c32e0399eaa96ef8", "bytes": 787, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "restart-fixture", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:46123/", "title": "Restart boundary"}, "snapshot": {"id": "0983b856c340", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "0983b856c340:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "C0027B55C62C76CA1DFA440ECE19F069", "loader_id": "A96D07F9D985D29BBB04496E29D8B547"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"restart-fixture\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:46123/\", \"title\": \"Restart boundary\"}, \"snapshot\": {\"id\": \"0983b856c340\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"0983b856c340:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader_id\": \"A96D07F9D985D29BBB04496E29D8B547\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.206418601, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.206479641, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "result": {"ok": true, "session_id": "restart-fixture", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:46123/", "title": "Restart boundary"}, "snapshot": {"id": "0983b856c340", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "0983b856c340:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "C0027B55C62C76CA1DFA440ECE19F069", "loader_id": "A96D07F9D985D29BBB04496E29D8B547"}}}} +{"kind": "session_snapshot", "monotonic": 6566.206697975, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6566.208491914, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6566.209364387, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.386758024, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "wait", "monotonic": 6566.386859344, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "communicate", "monotonic": 6566.387049316, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null, "stdout": {"sha256": "607553ea9eecc8f11f1b890e7f1676dbace803e50f334dd6149e0e52c4290761", "bytes": 239, "json": {"schema_version": "1", "exit_code": 3, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": false, "code": "browser_response_unknown", "dispatched": null, "retryable": false}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 3, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": false, \"code\": \"browser_response_unknown\", \"dispatched\": null, \"retryable\": false}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.387111438, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "helper_return", "monotonic": 6566.387169123, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "result": {"ok": false, "code": "browser_response_unknown", "dispatched": null, "retryable": false}} +{"kind": "session_snapshot", "monotonic": 6566.387709745, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "wait", "monotonic": 6566.387817364, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 37, "process_kind": "test_only_holder_shim", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7748, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "-c", {"test_script_sha256": "2bc2b9b43581e039c0a135d7b912ca485301be56f7dcf026911f94cceb440c1e", "characters": 1742}, "/tmp/fw-crash-7dr_6o74/session", "retained"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 86, "signal": null} +{"kind": "session_snapshot", "monotonic": 6566.388089277, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.388748805, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.500277364, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.500393597, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.500659421, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "fb2f6d95878a8b553c7cea16379c57b52c767f26e409fc8e935f9ae1ae97d605", "bytes": 5156, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"holder\": \"unavailable; no relaunch attempted\", \"session_id\": \"restart-fixture\", \"operations\": [{\"id\": \"op_89933f38bf72\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"observation\": \"0983b856c340:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"0983b856c340:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"sent\", \"evidence\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"execution_receipt\": {\"basis\": \"activation_ack\", \"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"custody\": \"returned\", \"dispatched\": true, \"effect\": \"unverifiable\", \"error\": null, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"interval\": {\"end\": 1793473000.7103014, \"start\": 1793473000.70342}, \"kind\": \"browser_execution\", \"move\": \"click\", \"observation\": \"0983b856c340:1\", \"operation_id\": \"op_89933f38bf72\", \"phase\": \"sent\", \"producer\": {\"name\": \"footwork.browser.cdp\", \"version\": 1}, \"projection\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"reply\": {\"code\": null, \"dispatched\": true, \"route\": \"dom_event_native_button\", \"status\": \"ok\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"schema_version\": 1, \"session_id\": \"restart-fixture\", \"target\": \"7\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"prior_uncertainty\": {\"error\": \"process ended during dispatch\", \"phase\": \"ambiguous\"}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"error\": null, \"resolved_by\": null, \"history\": [{\"t\": 1793473000.703113, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793473000.7034364, \"kind\": \"dispatch_started\"}, {\"t\": 1793473000.7107244, \"kind\": \"browser_execution_retained\", \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, {\"t\": 1793473000.8473587, \"kind\": \"recovered_unknown\"}, {\"t\": 1793473000.848666, \"kind\": \"execution_reconciled\", \"disposition\": \"unknown\", \"phase\": \"sent\"}], \"created\": 1793473000.7029896, \"updated\": 1793473000.8486094, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.500797405, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.500898846, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "result": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}} +{"kind": "session_snapshot", "monotonic": 6566.501173463, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6566.501398857, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.502082595, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.604897004, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.605001128, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.605355874, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "fb2f6d95878a8b553c7cea16379c57b52c767f26e409fc8e935f9ae1ae97d605", "bytes": 5156, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"holder\": \"unavailable; no relaunch attempted\", \"session_id\": \"restart-fixture\", \"operations\": [{\"id\": \"op_89933f38bf72\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"observation\": \"0983b856c340:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"0983b856c340:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"sent\", \"evidence\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"execution_receipt\": {\"basis\": \"activation_ack\", \"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"custody\": \"returned\", \"dispatched\": true, \"effect\": \"unverifiable\", \"error\": null, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"interval\": {\"end\": 1793473000.7103014, \"start\": 1793473000.70342}, \"kind\": \"browser_execution\", \"move\": \"click\", \"observation\": \"0983b856c340:1\", \"operation_id\": \"op_89933f38bf72\", \"phase\": \"sent\", \"producer\": {\"name\": \"footwork.browser.cdp\", \"version\": 1}, \"projection\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"reply\": {\"code\": null, \"dispatched\": true, \"route\": \"dom_event_native_button\", \"status\": \"ok\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"schema_version\": 1, \"session_id\": \"restart-fixture\", \"target\": \"7\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"prior_uncertainty\": {\"error\": \"process ended during dispatch\", \"phase\": \"ambiguous\"}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"error\": null, \"resolved_by\": null, \"history\": [{\"t\": 1793473000.703113, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793473000.7034364, \"kind\": \"dispatch_started\"}, {\"t\": 1793473000.7107244, \"kind\": \"browser_execution_retained\", \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, {\"t\": 1793473000.8473587, \"kind\": \"recovered_unknown\"}, {\"t\": 1793473000.848666, \"kind\": \"execution_reconciled\", \"disposition\": \"unknown\", \"phase\": \"sent\"}], \"created\": 1793473000.7029896, \"updated\": 1793473000.8486094, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.605531294, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.605638884, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "result": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}} +{"kind": "session_snapshot", "monotonic": 6566.606072647, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6566.606499409, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.607055664, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.703710793, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.703835157, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.704162512, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "d1127041e5f52f539da58663fb0f7553c67b83a2be4177ff724692e9592e7f23", "bytes": 5115, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"replayed\": true, \"holder\": \"unavailable\", \"operation\": {\"id\": \"op_89933f38bf72\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"observation\": \"0983b856c340:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"0983b856c340:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"sent\", \"evidence\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"execution_receipt\": {\"basis\": \"activation_ack\", \"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"custody\": \"returned\", \"dispatched\": true, \"effect\": \"unverifiable\", \"error\": null, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"interval\": {\"end\": 1793473000.7103014, \"start\": 1793473000.70342}, \"kind\": \"browser_execution\", \"move\": \"click\", \"observation\": \"0983b856c340:1\", \"operation_id\": \"op_89933f38bf72\", \"phase\": \"sent\", \"producer\": {\"name\": \"footwork.browser.cdp\", \"version\": 1}, \"projection\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"reply\": {\"code\": null, \"dispatched\": true, \"route\": \"dom_event_native_button\", \"status\": \"ok\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"schema_version\": 1, \"session_id\": \"restart-fixture\", \"target\": \"7\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"prior_uncertainty\": {\"error\": \"process ended during dispatch\", \"phase\": \"ambiguous\"}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"error\": null, \"resolved_by\": null, \"history\": [{\"t\": 1793473000.703113, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793473000.7034364, \"kind\": \"dispatch_started\"}, {\"t\": 1793473000.7107244, \"kind\": \"browser_execution_retained\", \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, {\"t\": 1793473000.8473587, \"kind\": \"recovered_unknown\"}, {\"t\": 1793473000.848666, \"kind\": \"execution_reconciled\", \"disposition\": \"unknown\", \"phase\": \"sent\"}], \"created\": 1793473000.7029896, \"updated\": 1793473000.8486094, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.704654071, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.704755872, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "result": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}} +{"kind": "session_snapshot", "monotonic": 6566.70516595, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6566.705474206, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.70604356, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.788409255, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.788509524, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.788779233, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "d1127041e5f52f539da58663fb0f7553c67b83a2be4177ff724692e9592e7f23", "bytes": 5115, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"replayed\": true, \"holder\": \"unavailable\", \"operation\": {\"id\": \"op_89933f38bf72\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"observation\": \"0983b856c340:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"0983b856c340:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"sent\", \"evidence\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"execution_receipt\": {\"basis\": \"activation_ack\", \"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"custody\": \"returned\", \"dispatched\": true, \"effect\": \"unverifiable\", \"error\": null, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"interval\": {\"end\": 1793473000.7103014, \"start\": 1793473000.70342}, \"kind\": \"browser_execution\", \"move\": \"click\", \"observation\": \"0983b856c340:1\", \"operation_id\": \"op_89933f38bf72\", \"phase\": \"sent\", \"producer\": {\"name\": \"footwork.browser.cdp\", \"version\": 1}, \"projection\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"reply\": {\"code\": null, \"dispatched\": true, \"route\": \"dom_event_native_button\", \"status\": \"ok\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"schema_version\": 1, \"session_id\": \"restart-fixture\", \"target\": \"7\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"prior_uncertainty\": {\"error\": \"process ended during dispatch\", \"phase\": \"ambiguous\"}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"error\": null, \"resolved_by\": null, \"history\": [{\"t\": 1793473000.703113, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793473000.7034364, \"kind\": \"dispatch_started\"}, {\"t\": 1793473000.7107244, \"kind\": \"browser_execution_retained\", \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, {\"t\": 1793473000.8473587, \"kind\": \"recovered_unknown\"}, {\"t\": 1793473000.848666, \"kind\": \"execution_reconciled\", \"disposition\": \"unknown\", \"phase\": \"sent\"}], \"created\": 1793473000.7029896, \"updated\": 1793473000.8486094, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.788936797, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.789028613, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "result": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}} +{"kind": "session_snapshot", "monotonic": 6566.789327316, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6566.789554843, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.790170906, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.873084168, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "wait", "monotonic": 6566.873181622, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "communicate", "monotonic": 6566.873323493, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null, "stdout": {"sha256": "c573ecde228329a1555ee90b85ef07827458df065705be0e8ee1e3130f866b11", "bytes": 308, "json": {"schema_version": "1", "exit_code": 3, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": false, "code": "browser_session_unavailable", "message": "request refused; inspect retained authority; no automatic retry", "error_type": "ValueError"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 3, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": false, \"code\": \"browser_session_unavailable\", \"message\": \"request refused; inspect retained authority; no automatic retry\", \"error_type\": \"ValueError\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.873378174, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "helper_return", "monotonic": 6566.873442038, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "result": {"ok": false, "code": "browser_session_unavailable", "message": "request refused; inspect retained authority; no automatic retry", "error_type": "ValueError"}} +{"kind": "session_snapshot", "monotonic": 6566.873660052, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "pytest_report", "monotonic": 6566.917819894, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "phase": "call", "outcome": "failed", "duration": 1.2190761060001023, "longrepr": "boundary = 'retained'\ningress = ('http://127.0.0.1:46123/', ['intended'], )\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:273: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c17a0a0>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError\n\nDuring handling of the above exception, another exception occurred:\n\nboundary = 'retained'\ningress = ('http://127.0.0.1:46123/', ['intended'], )\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n _test_cleanup(holder, identities)\n fresh_session = root / \"next\"\n blocked = _cli(root, \"start\", \"Try a new intent\", \"--session\", str(fresh_session),\n \"--authority\", str(root / \"authority.db\"), \"--url\", url, success=False)\n assert blocked[\"ok\"] is False\n assert not list(fresh_session.glob(\"profile-*\"))\n assert not (fresh_session / \"holder.json\").exists()\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n finally:\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:282: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c17bf40>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError"} +{"kind": "independent_fixture_records", "monotonic": 6566.918017998, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "fixture": "ingress", "url": "http://127.0.0.1:46123/", "records": ["intended"]} +{"kind": "pytest_report", "monotonic": 6567.365683059, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "phase": "teardown", "outcome": "passed", "duration": 0.4469800659999237, "longrepr": null} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/retained/receipt.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/retained/receipt.json new file mode 100644 index 0000000..2d65cbf --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/retained/receipt.json @@ -0,0 +1,894 @@ +{ + "nodeids": [ + "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]" + ], + "boundary_metadata": [ + { + "path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", + "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", + "mtime_ns": 1793473000726794037, + "mode": "0o600", + "json": { + "boundary": "retained", + "operation_id": "op_89933f38bf72", + "ingress_before_exit": 1, + "heavy_imports": [] + } + } + ], + "independent_fixture_records": [ + { + "kind": "independent_fixture_records", + "monotonic": 6566.918017998, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", + "fixture": "ingress", + "url": "http://127.0.0.1:46123/", + "records": [ + "intended" + ] + } + ], + "public_helper_receipts": [ + { + "kind": "helper_return", + "monotonic": 6566.206479641, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-7dr_6o74", + "look", + "--session", + "/tmp/fw-crash-7dr_6o74/session" + ], + "result": { + "ok": true, + "session_id": "restart-fixture", + "snapshot": { + "status": "ok", + "page": { + "url": "http://127.0.0.1:46123/", + "title": "Restart boundary" + }, + "snapshot": { + "id": "0983b856c340", + "complete": false, + "omitted": { + "css_hidden": 0, + "offscreen": 0, + "no_layout": 0, + "unknown": 0, + "budget": 0, + "child_frames": 0, + "custom_controls_unobserved": 1 + } + }, + "refs": [ + { + "ref": "0983b856c340:1", + "role": "button", + "name": "Commit fixture", + "actions": [ + "click" + ], + "states": { + "focusable": true + }, + "visibility": "in_viewport" + } + ], + "content_refs": [], + "document": { + "frame_id": "C0027B55C62C76CA1DFA440ECE19F069", + "loader_id": "A96D07F9D985D29BBB04496E29D8B547" + } + } + } + }, + { + "kind": "helper_return", + "monotonic": 6566.387169123, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-7dr_6o74", + "click", + "--session", + "/tmp/fw-crash-7dr_6o74/session", + "--ref", + "0983b856c340:1", + "--token", + "intent-1" + ], + "result": { + "ok": false, + "code": "browser_response_unknown", + "dispatched": null, + "retryable": false + } + }, + { + "kind": "helper_return", + "monotonic": 6566.500898846, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-7dr_6o74", + "recover", + "--session", + "/tmp/fw-crash-7dr_6o74/session", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "holder": "unavailable; no relaunch attempted", + "session_id": "restart-fixture", + "operations": [ + { + "id": "op_89933f38bf72", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", + "observation": "0983b856c340:1", + "target": "7", + "move": "click", + "args": { + "ref": "0983b856c340:1", + "route": "dom_event_native_button" + }, + "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", + "client_token": "intent-1", + "state": "unknown", + "disposition": "unknown", + "phase": "sent", + "evidence": { + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "execution_receipt": { + "basis": "activation_ack", + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "custody": "returned", + "dispatched": true, + "effect": "unverifiable", + "error": null, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "interval": { + "end": 1793473000.7103014, + "start": 1793473000.70342 + }, + "kind": "browser_execution", + "move": "click", + "observation": "0983b856c340:1", + "operation_id": "op_89933f38bf72", + "phase": "sent", + "producer": { + "name": "footwork.browser.cdp", + "version": 1 + }, + "projection": { + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "protocol": "footwork.browser.cdp", + "version": 1 + }, + "protocol": "footwork.browser.cdp", + "reply": { + "code": null, + "dispatched": true, + "route": "dom_event_native_button", + "status": "ok" + }, + "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", + "schema_version": 1, + "session_id": "restart-fixture", + "target": "7" + }, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "prior_uncertainty": { + "error": "process ended during dispatch", + "phase": "ambiguous" + }, + "protocol": "footwork.browser.cdp", + "version": 1 + }, + "error": null, + "resolved_by": null, + "history": [ + { + "t": 1793473000.703113, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793473000.7034364, + "kind": "dispatch_started" + }, + { + "t": 1793473000.7107244, + "kind": "browser_execution_retained", + "protocol": "footwork.browser.cdp", + "version": 1 + }, + { + "t": 1793473000.8473587, + "kind": "recovered_unknown" + }, + { + "t": 1793473000.848666, + "kind": "execution_reconciled", + "disposition": "unknown", + "phase": "sent" + } + ], + "created": 1793473000.7029896, + "updated": 1793473000.8486094, + "recovery": null, + "execution_stage": "started", + "completion": "unverified", + "retryable": false + } + ] + } + }, + { + "kind": "helper_return", + "monotonic": 6566.605638884, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-7dr_6o74", + "status", + "--session", + "/tmp/fw-crash-7dr_6o74/session", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "holder": "unavailable; no relaunch attempted", + "session_id": "restart-fixture", + "operations": [ + { + "id": "op_89933f38bf72", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", + "observation": "0983b856c340:1", + "target": "7", + "move": "click", + "args": { + "ref": "0983b856c340:1", + "route": "dom_event_native_button" + }, + "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", + "client_token": "intent-1", + "state": "unknown", + "disposition": "unknown", + "phase": "sent", + "evidence": { + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "execution_receipt": { + "basis": "activation_ack", + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "custody": "returned", + "dispatched": true, + "effect": "unverifiable", + "error": null, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "interval": { + "end": 1793473000.7103014, + "start": 1793473000.70342 + }, + "kind": "browser_execution", + "move": "click", + "observation": "0983b856c340:1", + "operation_id": "op_89933f38bf72", + "phase": "sent", + "producer": { + "name": "footwork.browser.cdp", + "version": 1 + }, + "projection": { + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "protocol": "footwork.browser.cdp", + "version": 1 + }, + "protocol": "footwork.browser.cdp", + "reply": { + "code": null, + "dispatched": true, + "route": "dom_event_native_button", + "status": "ok" + }, + "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", + "schema_version": 1, + "session_id": "restart-fixture", + "target": "7" + }, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "prior_uncertainty": { + "error": "process ended during dispatch", + "phase": "ambiguous" + }, + "protocol": "footwork.browser.cdp", + "version": 1 + }, + "error": null, + "resolved_by": null, + "history": [ + { + "t": 1793473000.703113, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793473000.7034364, + "kind": "dispatch_started" + }, + { + "t": 1793473000.7107244, + "kind": "browser_execution_retained", + "protocol": "footwork.browser.cdp", + "version": 1 + }, + { + "t": 1793473000.8473587, + "kind": "recovered_unknown" + }, + { + "t": 1793473000.848666, + "kind": "execution_reconciled", + "disposition": "unknown", + "phase": "sent" + } + ], + "created": 1793473000.7029896, + "updated": 1793473000.8486094, + "recovery": null, + "execution_stage": "started", + "completion": "unverified", + "retryable": false + } + ] + } + }, + { + "kind": "helper_return", + "monotonic": 6566.704755872, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-7dr_6o74", + "click", + "--session", + "/tmp/fw-crash-7dr_6o74/session", + "--ref", + "0983b856c340:1", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "replayed": true, + "holder": "unavailable", + "operation": { + "id": "op_89933f38bf72", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", + "observation": "0983b856c340:1", + "target": "7", + "move": "click", + "args": { + "ref": "0983b856c340:1", + "route": "dom_event_native_button" + }, + "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", + "client_token": "intent-1", + "state": "unknown", + "disposition": "unknown", + "phase": "sent", + "evidence": { + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "execution_receipt": { + "basis": "activation_ack", + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "custody": "returned", + "dispatched": true, + "effect": "unverifiable", + "error": null, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "interval": { + "end": 1793473000.7103014, + "start": 1793473000.70342 + }, + "kind": "browser_execution", + "move": "click", + "observation": "0983b856c340:1", + "operation_id": "op_89933f38bf72", + "phase": "sent", + "producer": { + "name": "footwork.browser.cdp", + "version": 1 + }, + "projection": { + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "protocol": "footwork.browser.cdp", + "version": 1 + }, + "protocol": "footwork.browser.cdp", + "reply": { + "code": null, + "dispatched": true, + "route": "dom_event_native_button", + "status": "ok" + }, + "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", + "schema_version": 1, + "session_id": "restart-fixture", + "target": "7" + }, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "prior_uncertainty": { + "error": "process ended during dispatch", + "phase": "ambiguous" + }, + "protocol": "footwork.browser.cdp", + "version": 1 + }, + "error": null, + "resolved_by": null, + "history": [ + { + "t": 1793473000.703113, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793473000.7034364, + "kind": "dispatch_started" + }, + { + "t": 1793473000.7107244, + "kind": "browser_execution_retained", + "protocol": "footwork.browser.cdp", + "version": 1 + }, + { + "t": 1793473000.8473587, + "kind": "recovered_unknown" + }, + { + "t": 1793473000.848666, + "kind": "execution_reconciled", + "disposition": "unknown", + "phase": "sent" + } + ], + "created": 1793473000.7029896, + "updated": 1793473000.8486094, + "recovery": null, + "execution_stage": "started", + "completion": "unverified", + "retryable": false + } + } + }, + { + "kind": "helper_return", + "monotonic": 6566.789028613, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-7dr_6o74", + "click", + "--session", + "/tmp/fw-crash-7dr_6o74/session", + "--ref", + "0983b856c340:1", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "replayed": true, + "holder": "unavailable", + "operation": { + "id": "op_89933f38bf72", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", + "observation": "0983b856c340:1", + "target": "7", + "move": "click", + "args": { + "ref": "0983b856c340:1", + "route": "dom_event_native_button" + }, + "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", + "client_token": "intent-1", + "state": "unknown", + "disposition": "unknown", + "phase": "sent", + "evidence": { + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "execution_receipt": { + "basis": "activation_ack", + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "custody": "returned", + "dispatched": true, + "effect": "unverifiable", + "error": null, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "interval": { + "end": 1793473000.7103014, + "start": 1793473000.70342 + }, + "kind": "browser_execution", + "move": "click", + "observation": "0983b856c340:1", + "operation_id": "op_89933f38bf72", + "phase": "sent", + "producer": { + "name": "footwork.browser.cdp", + "version": 1 + }, + "projection": { + "binding": { + "backend_node": 7, + "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", + "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", + "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", + "document_token": "476b87135eff14cc753cf54ad86307c9", + "execution_context": 3, + "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", + "frame": "C0027B55C62C76CA1DFA440ECE19F069", + "loader": "A96D07F9D985D29BBB04496E29D8B547", + "pid": 7750, + "start": "1793472999.72", + "target": "C0027B55C62C76CA1DFA440ECE19F069" + }, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "protocol": "footwork.browser.cdp", + "version": 1 + }, + "protocol": "footwork.browser.cdp", + "reply": { + "code": null, + "dispatched": true, + "route": "dom_event_native_button", + "status": "ok" + }, + "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", + "schema_version": 1, + "session_id": "restart-fixture", + "target": "7" + }, + "guard": { + "decision": "allow", + "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", + "producer": "footwork.browser.guard", + "version": 1 + }, + "prior_uncertainty": { + "error": "process ended during dispatch", + "phase": "ambiguous" + }, + "protocol": "footwork.browser.cdp", + "version": 1 + }, + "error": null, + "resolved_by": null, + "history": [ + { + "t": 1793473000.703113, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793473000.7034364, + "kind": "dispatch_started" + }, + { + "t": 1793473000.7107244, + "kind": "browser_execution_retained", + "protocol": "footwork.browser.cdp", + "version": 1 + }, + { + "t": 1793473000.8473587, + "kind": "recovered_unknown" + }, + { + "t": 1793473000.848666, + "kind": "execution_reconciled", + "disposition": "unknown", + "phase": "sent" + } + ], + "created": 1793473000.7029896, + "updated": 1793473000.8486094, + "recovery": null, + "execution_stage": "started", + "completion": "unverified", + "retryable": false + } + } + }, + { + "kind": "helper_return", + "monotonic": 6566.873442038, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-7dr_6o74", + "click", + "--session", + "/tmp/fw-crash-7dr_6o74/session", + "--ref", + "0983b856c340:1", + "--token", + "intent-2" + ], + "result": { + "ok": false, + "code": "browser_session_unavailable", + "message": "request refused; inspect retained authority; no automatic retry", + "error_type": "ValueError" + } + } + ], + "observed_numeric_exits": [ + { + "kind": "public_cli", + "pid": 7860, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7861, + "returncode": 3, + "signal": null + }, + { + "kind": "test_only_holder_shim", + "pid": 7748, + "returncode": 86, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7866, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7872, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7873, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7895, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7896, + "returncode": 3, + "signal": null + } + ] +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/started/events.jsonl b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/started/events.jsonl new file mode 100644 index 0000000..aafba80 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/started/events.jsonl @@ -0,0 +1,63 @@ +{"kind": "pytest_report", "monotonic": 6564.257561289, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "phase": "setup", "outcome": "passed", "duration": 0.0006279060007727821, "longrepr": null} +{"kind": "spawn", "monotonic": 6564.258565097, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 29, "process_kind": "test_only_holder_shim", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7605, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "-c", {"test_script_sha256": "2bc2b9b43581e039c0a135d7b912ca485301be56f7dcf026911f94cceb440c1e", "characters": 1742}, "/tmp/fw-crash-lfmqsw5x/session", "started"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "session_snapshot", "monotonic": 6564.703525284, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__setup", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6564.70391379, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6564.707271467, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6564.828782257, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6564.828883637, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6564.829014231, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "b8e64e4b5f51d26baa1f0bbf7bd81ad903f09f173096a4b36f300d36810dbcde", "bytes": 787, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "restart-fixture", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:37761/", "title": "Restart boundary"}, "snapshot": {"id": "720ae8e1bddb", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "720ae8e1bddb:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "D7C29F287E4850DD12572CC8FF7D12B6", "loader_id": "FEFF3672F2EA2D73F51E225CCC976925"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"restart-fixture\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:37761/\", \"title\": \"Restart boundary\"}, \"snapshot\": {\"id\": \"720ae8e1bddb\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"720ae8e1bddb:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"D7C29F287E4850DD12572CC8FF7D12B6\", \"loader_id\": \"FEFF3672F2EA2D73F51E225CCC976925\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6564.829087149, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6564.829147879, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "result": {"ok": true, "session_id": "restart-fixture", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:37761/", "title": "Restart boundary"}, "snapshot": {"id": "720ae8e1bddb", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "720ae8e1bddb:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "D7C29F287E4850DD12572CC8FF7D12B6", "loader_id": "FEFF3672F2EA2D73F51E225CCC976925"}}}} +{"kind": "session_snapshot", "monotonic": 6564.829432181, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6564.830685208, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6564.831252038, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6564.977109784, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "wait", "monotonic": 6564.977231684, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "communicate", "monotonic": 6564.977336269, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null, "stdout": {"sha256": "607553ea9eecc8f11f1b890e7f1676dbace803e50f334dd6149e0e52c4290761", "bytes": 239, "json": {"schema_version": "1", "exit_code": 3, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": false, "code": "browser_response_unknown", "dispatched": null, "retryable": false}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 3, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": false, \"code\": \"browser_response_unknown\", \"dispatched\": null, \"retryable\": false}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6564.977400004, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "helper_return", "monotonic": 6564.977455887, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "result": {"ok": false, "code": "browser_response_unknown", "dispatched": null, "retryable": false}} +{"kind": "session_snapshot", "monotonic": 6564.977858123, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "wait", "monotonic": 6564.977968727, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 29, "process_kind": "test_only_holder_shim", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7605, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "-c", {"test_script_sha256": "2bc2b9b43581e039c0a135d7b912ca485301be56f7dcf026911f94cceb440c1e", "characters": 1742}, "/tmp/fw-crash-lfmqsw5x/session", "started"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 86, "signal": null} +{"kind": "session_snapshot", "monotonic": 6564.978181082, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6564.978860088, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.059654349, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6565.059754548, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6565.059905051, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "7ad0826decf2758e517ca5050361439c892bf5df96bfca999aa588c7d8f6eae0", "bytes": 1315, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"holder\": \"unavailable; no relaunch attempted\", \"session_id\": \"restart-fixture\", \"operations\": [{\"id\": \"op_20043ef2b6d0\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"5EB23C93CE04AEA7C57169EF540E8464\\\",\\\"pid\\\":7607,\\\"start\\\":\\\"1793472998.33\\\",\\\"target\\\":\\\"D7C29F287E4850DD12572CC8FF7D12B6\\\"}\", \"observation\": \"720ae8e1bddb:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"720ae8e1bddb:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"ambiguous\", \"evidence\": {}, \"error\": \"process ended during dispatch\", \"resolved_by\": null, \"history\": [{\"t\": 1793472999.3239045, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793472999.324241, \"kind\": \"dispatch_started\"}, {\"t\": 1793472999.4091787, \"kind\": \"recovered_unknown\"}], \"created\": 1793472999.3237054, \"updated\": 1793472999.409095, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.059983687, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6565.060260968, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "result": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}} +{"kind": "session_snapshot", "monotonic": 6565.060603776, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6565.060933565, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6565.061919917, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.141053967, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6565.141154867, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6565.141351048, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "7ad0826decf2758e517ca5050361439c892bf5df96bfca999aa588c7d8f6eae0", "bytes": 1315, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"holder\": \"unavailable; no relaunch attempted\", \"session_id\": \"restart-fixture\", \"operations\": [{\"id\": \"op_20043ef2b6d0\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"5EB23C93CE04AEA7C57169EF540E8464\\\",\\\"pid\\\":7607,\\\"start\\\":\\\"1793472998.33\\\",\\\"target\\\":\\\"D7C29F287E4850DD12572CC8FF7D12B6\\\"}\", \"observation\": \"720ae8e1bddb:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"720ae8e1bddb:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"ambiguous\", \"evidence\": {}, \"error\": \"process ended during dispatch\", \"resolved_by\": null, \"history\": [{\"t\": 1793472999.3239045, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793472999.324241, \"kind\": \"dispatch_started\"}, {\"t\": 1793472999.4091787, \"kind\": \"recovered_unknown\"}], \"created\": 1793472999.3237054, \"updated\": 1793472999.409095, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.141431297, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6565.141494781, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "result": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}} +{"kind": "session_snapshot", "monotonic": 6565.141731011, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6565.141928143, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6565.142549394, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.223768454, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6565.223861723, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6565.224037573, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "0c29c6f72f9815f8e5477a8d17e8e1ede0453242d7217e8c8ae2ca2377d30a64", "bytes": 1274, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"replayed\": true, \"holder\": \"unavailable\", \"operation\": {\"id\": \"op_20043ef2b6d0\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"5EB23C93CE04AEA7C57169EF540E8464\\\",\\\"pid\\\":7607,\\\"start\\\":\\\"1793472998.33\\\",\\\"target\\\":\\\"D7C29F287E4850DD12572CC8FF7D12B6\\\"}\", \"observation\": \"720ae8e1bddb:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"720ae8e1bddb:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"ambiguous\", \"evidence\": {}, \"error\": \"process ended during dispatch\", \"resolved_by\": null, \"history\": [{\"t\": 1793472999.3239045, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793472999.324241, \"kind\": \"dispatch_started\"}, {\"t\": 1793472999.4091787, \"kind\": \"recovered_unknown\"}], \"created\": 1793472999.3237054, \"updated\": 1793472999.409095, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.22414968, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6565.224257029, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "result": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}} +{"kind": "session_snapshot", "monotonic": 6565.224524815, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6565.224719394, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6565.225321867, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.309661492, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6565.309763704, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6565.309910041, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "0c29c6f72f9815f8e5477a8d17e8e1ede0453242d7217e8c8ae2ca2377d30a64", "bytes": 1274, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"replayed\": true, \"holder\": \"unavailable\", \"operation\": {\"id\": \"op_20043ef2b6d0\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"5EB23C93CE04AEA7C57169EF540E8464\\\",\\\"pid\\\":7607,\\\"start\\\":\\\"1793472998.33\\\",\\\"target\\\":\\\"D7C29F287E4850DD12572CC8FF7D12B6\\\"}\", \"observation\": \"720ae8e1bddb:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"720ae8e1bddb:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"ambiguous\", \"evidence\": {}, \"error\": \"process ended during dispatch\", \"resolved_by\": null, \"history\": [{\"t\": 1793472999.3239045, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793472999.324241, \"kind\": \"dispatch_started\"}, {\"t\": 1793472999.4091787, \"kind\": \"recovered_unknown\"}], \"created\": 1793472999.3237054, \"updated\": 1793472999.409095, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.309991091, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6565.310053734, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "result": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}} +{"kind": "session_snapshot", "monotonic": 6565.31032091, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6565.310518943, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6565.31111723, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.394250528, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "wait", "monotonic": 6565.394449883, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "communicate", "monotonic": 6565.394559496, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null, "stdout": {"sha256": "c573ecde228329a1555ee90b85ef07827458df065705be0e8ee1e3130f866b11", "bytes": 308, "json": {"schema_version": "1", "exit_code": 3, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": false, "code": "browser_session_unavailable", "message": "request refused; inspect retained authority; no automatic retry", "error_type": "ValueError"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 3, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": false, \"code\": \"browser_session_unavailable\", \"message\": \"request refused; inspect retained authority; no automatic retry\", \"error_type\": \"ValueError\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.394611513, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "helper_return", "monotonic": 6565.394666495, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "result": {"ok": false, "code": "browser_session_unavailable", "message": "request refused; inspect retained authority; no automatic retry", "error_type": "ValueError"}} +{"kind": "session_snapshot", "monotonic": 6565.3948792, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "pytest_report", "monotonic": 6565.430825819, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "phase": "call", "outcome": "failed", "duration": 1.1384708400000818, "longrepr": "boundary = 'started'\ningress = ('http://127.0.0.1:37761/', [], )\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:273: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c17a810>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError\n\nDuring handling of the above exception, another exception occurred:\n\nboundary = 'started'\ningress = ('http://127.0.0.1:37761/', [], )\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n _test_cleanup(holder, identities)\n fresh_session = root / \"next\"\n blocked = _cli(root, \"start\", \"Try a new intent\", \"--session\", str(fresh_session),\n \"--authority\", str(root / \"authority.db\"), \"--url\", url, success=False)\n assert blocked[\"ok\"] is False\n assert not list(fresh_session.glob(\"profile-*\"))\n assert not (fresh_session / \"holder.json\").exists()\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n finally:\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:282: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c17a420>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError"} +{"kind": "independent_fixture_records", "monotonic": 6565.43092112, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "fixture": "ingress", "url": "http://127.0.0.1:37761/", "records": []} +{"kind": "pytest_report", "monotonic": 6565.654689352, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "phase": "teardown", "outcome": "passed", "duration": 0.2231105969995042, "longrepr": null} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/started/receipt.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/started/receipt.json new file mode 100644 index 0000000..e3633f9 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cells/started/receipt.json @@ -0,0 +1,432 @@ +{ + "nodeids": [ + "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]" + ], + "boundary_metadata": [ + { + "path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", + "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", + "mtime_ns": 1793472999324478485, + "mode": "0o600", + "json": { + "boundary": "started", + "operation_id": "op_20043ef2b6d0", + "ingress_before_exit": null, + "heavy_imports": [] + } + } + ], + "independent_fixture_records": [ + { + "kind": "independent_fixture_records", + "monotonic": 6565.43092112, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", + "fixture": "ingress", + "url": "http://127.0.0.1:37761/", + "records": [] + } + ], + "public_helper_receipts": [ + { + "kind": "helper_return", + "monotonic": 6564.829147879, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-lfmqsw5x", + "look", + "--session", + "/tmp/fw-crash-lfmqsw5x/session" + ], + "result": { + "ok": true, + "session_id": "restart-fixture", + "snapshot": { + "status": "ok", + "page": { + "url": "http://127.0.0.1:37761/", + "title": "Restart boundary" + }, + "snapshot": { + "id": "720ae8e1bddb", + "complete": false, + "omitted": { + "css_hidden": 0, + "offscreen": 0, + "no_layout": 0, + "unknown": 0, + "budget": 0, + "child_frames": 0, + "custom_controls_unobserved": 1 + } + }, + "refs": [ + { + "ref": "720ae8e1bddb:1", + "role": "button", + "name": "Commit fixture", + "actions": [ + "click" + ], + "states": { + "focusable": true + }, + "visibility": "in_viewport" + } + ], + "content_refs": [], + "document": { + "frame_id": "D7C29F287E4850DD12572CC8FF7D12B6", + "loader_id": "FEFF3672F2EA2D73F51E225CCC976925" + } + } + } + }, + { + "kind": "helper_return", + "monotonic": 6564.977455887, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-lfmqsw5x", + "click", + "--session", + "/tmp/fw-crash-lfmqsw5x/session", + "--ref", + "720ae8e1bddb:1", + "--token", + "intent-1" + ], + "result": { + "ok": false, + "code": "browser_response_unknown", + "dispatched": null, + "retryable": false + } + }, + { + "kind": "helper_return", + "monotonic": 6565.060260968, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-lfmqsw5x", + "recover", + "--session", + "/tmp/fw-crash-lfmqsw5x/session", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "holder": "unavailable; no relaunch attempted", + "session_id": "restart-fixture", + "operations": [ + { + "id": "op_20043ef2b6d0", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", + "observation": "720ae8e1bddb:1", + "target": "7", + "move": "click", + "args": { + "ref": "720ae8e1bddb:1", + "route": "dom_event_native_button" + }, + "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", + "client_token": "intent-1", + "state": "unknown", + "disposition": "unknown", + "phase": "ambiguous", + "evidence": {}, + "error": "process ended during dispatch", + "resolved_by": null, + "history": [ + { + "t": 1793472999.3239045, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793472999.324241, + "kind": "dispatch_started" + }, + { + "t": 1793472999.4091787, + "kind": "recovered_unknown" + } + ], + "created": 1793472999.3237054, + "updated": 1793472999.409095, + "recovery": null, + "execution_stage": "started", + "completion": "unverified", + "retryable": false + } + ] + } + }, + { + "kind": "helper_return", + "monotonic": 6565.141494781, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-lfmqsw5x", + "status", + "--session", + "/tmp/fw-crash-lfmqsw5x/session", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "holder": "unavailable; no relaunch attempted", + "session_id": "restart-fixture", + "operations": [ + { + "id": "op_20043ef2b6d0", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", + "observation": "720ae8e1bddb:1", + "target": "7", + "move": "click", + "args": { + "ref": "720ae8e1bddb:1", + "route": "dom_event_native_button" + }, + "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", + "client_token": "intent-1", + "state": "unknown", + "disposition": "unknown", + "phase": "ambiguous", + "evidence": {}, + "error": "process ended during dispatch", + "resolved_by": null, + "history": [ + { + "t": 1793472999.3239045, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793472999.324241, + "kind": "dispatch_started" + }, + { + "t": 1793472999.4091787, + "kind": "recovered_unknown" + } + ], + "created": 1793472999.3237054, + "updated": 1793472999.409095, + "recovery": null, + "execution_stage": "started", + "completion": "unverified", + "retryable": false + } + ] + } + }, + { + "kind": "helper_return", + "monotonic": 6565.224257029, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-lfmqsw5x", + "click", + "--session", + "/tmp/fw-crash-lfmqsw5x/session", + "--ref", + "720ae8e1bddb:1", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "replayed": true, + "holder": "unavailable", + "operation": { + "id": "op_20043ef2b6d0", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", + "observation": "720ae8e1bddb:1", + "target": "7", + "move": "click", + "args": { + "ref": "720ae8e1bddb:1", + "route": "dom_event_native_button" + }, + "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", + "client_token": "intent-1", + "state": "unknown", + "disposition": "unknown", + "phase": "ambiguous", + "evidence": {}, + "error": "process ended during dispatch", + "resolved_by": null, + "history": [ + { + "t": 1793472999.3239045, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793472999.324241, + "kind": "dispatch_started" + }, + { + "t": 1793472999.4091787, + "kind": "recovered_unknown" + } + ], + "created": 1793472999.3237054, + "updated": 1793472999.409095, + "recovery": null, + "execution_stage": "started", + "completion": "unverified", + "retryable": false + } + } + }, + { + "kind": "helper_return", + "monotonic": 6565.310053734, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-lfmqsw5x", + "click", + "--session", + "/tmp/fw-crash-lfmqsw5x/session", + "--ref", + "720ae8e1bddb:1", + "--token", + "intent-1" + ], + "result": { + "ok": true, + "replayed": true, + "holder": "unavailable", + "operation": { + "id": "op_20043ef2b6d0", + "task": "restart-fixture", + "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", + "observation": "720ae8e1bddb:1", + "target": "7", + "move": "click", + "args": { + "ref": "720ae8e1bddb:1", + "route": "dom_event_native_button" + }, + "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", + "client_token": "intent-1", + "state": "unknown", + "disposition": "unknown", + "phase": "ambiguous", + "evidence": {}, + "error": "process ended during dispatch", + "resolved_by": null, + "history": [ + { + "t": 1793472999.3239045, + "kind": "intent", + "protocol": 1, + "authorization": "configured_browser_guard" + }, + { + "t": 1793472999.324241, + "kind": "dispatch_started" + }, + { + "t": 1793472999.4091787, + "kind": "recovered_unknown" + } + ], + "created": 1793472999.3237054, + "updated": 1793472999.409095, + "recovery": null, + "execution_stage": "started", + "completion": "unverified", + "retryable": false + } + } + }, + { + "kind": "helper_return", + "monotonic": 6565.394666495, + "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", + "helper": "_cli", + "arguments": [ + "/tmp/fw-crash-lfmqsw5x", + "click", + "--session", + "/tmp/fw-crash-lfmqsw5x/session", + "--ref", + "720ae8e1bddb:1", + "--token", + "intent-2" + ], + "result": { + "ok": false, + "code": "browser_session_unavailable", + "message": "request refused; inspect retained authority; no automatic retry", + "error_type": "ValueError" + } + } + ], + "observed_numeric_exits": [ + { + "kind": "public_cli", + "pid": 7717, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7719, + "returncode": 3, + "signal": null + }, + { + "kind": "test_only_holder_shim", + "pid": 7605, + "returncode": 86, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7721, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7722, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7723, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7724, + "returncode": 0, + "signal": null + }, + { + "kind": "public_cli", + "pid": 7746, + "returncode": 3, + "signal": null + } + ] +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cleanup.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cleanup.json new file mode 100644 index 0000000..405abb2 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/cleanup.json @@ -0,0 +1,3383 @@ +{ + "pytest_returncode": 1, + "pytest_timeout": false, + "pre_wrapper_cleanup": [ + { + "pid": 7218, + "start": 1793472991.46, + "parent": 7206, + "name": "python", + "status": "zombie", + "session": 7218, + "group": 7218 + }, + { + "pid": 7222, + "start": 1793472991.58, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7221, + "group": 7221 + }, + { + "pid": 7225, + "start": 1793472991.58, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7224, + "group": 7224 + }, + { + "pid": 7228, + "start": 1793472991.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7229, + "start": 1793472991.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7253, + "start": 1793472991.69, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7255, + "start": 1793472991.7, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7347, + "start": 1793472995.05, + "parent": 7206, + "name": "python", + "status": "zombie", + "session": 7347, + "group": 7347 + }, + { + "pid": 7351, + "start": 1793472995.16, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7350, + "group": 7350 + }, + { + "pid": 7354, + "start": 1793472995.16, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7353, + "group": 7353 + }, + { + "pid": 7357, + "start": 1793472995.16, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7358, + "start": 1793472995.16, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7380, + "start": 1793472995.21, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7382, + "start": 1793472995.22, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7484, + "start": 1793472996.94, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7486, + "start": 1793472996.97, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7485, + "group": 7485 + }, + { + "pid": 7490, + "start": 1793472996.97, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7489, + "group": 7489 + }, + { + "pid": 7607, + "start": 1793472998.33, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7609, + "start": 1793472998.36, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7608, + "group": 7608 + }, + { + "pid": 7613, + "start": 1793472998.37, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7611, + "group": 7611 + }, + { + "pid": 7750, + "start": 1793472999.72, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7752, + "start": 1793472999.76, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7751, + "group": 7751 + }, + { + "pid": 7756, + "start": 1793472999.76, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7755, + "group": 7755 + }, + { + "pid": 7899, + "start": 1793473001.4, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7898, + "group": 7898 + }, + { + "pid": 7903, + "start": 1793473001.4, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7902, + "group": 7902 + }, + { + "pid": 7905, + "start": 1793473001.4, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7897, + "group": 7897 + }, + { + "pid": 7929, + "start": 1793473001.45, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7897, + "group": 7897 + }, + { + "pid": 7931, + "start": 1793473001.46, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7897, + "group": 7897 + }, + { + "pid": 8013, + "start": 1793473001.82, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8012, + "group": 8012 + }, + { + "pid": 8017, + "start": 1793473001.83, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8016, + "group": 8016 + }, + { + "pid": 8018, + "start": 1793473001.83, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8011, + "group": 8011 + }, + { + "pid": 8042, + "start": 1793473001.87, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8011, + "group": 8011 + }, + { + "pid": 8044, + "start": 1793473001.88, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8011, + "group": 8011 + }, + { + "pid": 8156, + "start": 1793473002.25, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8155, + "group": 8155 + }, + { + "pid": 8160, + "start": 1793473002.25, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8159, + "group": 8159 + }, + { + "pid": 8161, + "start": 1793473002.25, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8154, + "group": 8154 + }, + { + "pid": 8185, + "start": 1793473002.3, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8154, + "group": 8154 + }, + { + "pid": 8193, + "start": 1793473002.31, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8154, + "group": 8154 + }, + { + "pid": 8278, + "start": 1793473002.68, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8277, + "group": 8277 + }, + { + "pid": 8281, + "start": 1793473002.68, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8280, + "group": 8280 + }, + { + "pid": 8284, + "start": 1793473002.68, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8285, + "start": 1793473002.68, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8309, + "start": 1793473002.73, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8311, + "start": 1793473002.74, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8396, + "start": 1793473003.08, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8395, + "group": 8395 + }, + { + "pid": 8400, + "start": 1793473003.09, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8399, + "group": 8399 + }, + { + "pid": 8401, + "start": 1793473003.09, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8394, + "group": 8394 + }, + { + "pid": 8427, + "start": 1793473003.13, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8394, + "group": 8394 + }, + { + "pid": 8429, + "start": 1793473003.14, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8394, + "group": 8394 + }, + { + "pid": 8511, + "start": 1793473003.48, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8510, + "group": 8510 + }, + { + "pid": 8515, + "start": 1793473003.48, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8513, + "group": 8513 + }, + { + "pid": 8516, + "start": 1793473003.48, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8509, + "group": 8509 + }, + { + "pid": 8541, + "start": 1793473003.52, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8509, + "group": 8509 + }, + { + "pid": 8627, + "start": 1793473003.84, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8509, + "group": 8509 + }, + { + "pid": 8636, + "start": 1793473003.9, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8635, + "group": 8635 + }, + { + "pid": 8640, + "start": 1793473003.9, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8638, + "group": 8638 + }, + { + "pid": 8642, + "start": 1793473003.9, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8666, + "start": 1793473003.94, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8674, + "start": 1793473003.95, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8746, + "start": 1793473004.3, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8745, + "group": 8745 + }, + { + "pid": 8750, + "start": 1793473004.3, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8749, + "group": 8749 + }, + { + "pid": 8751, + "start": 1793473004.3, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8744, + "group": 8744 + }, + { + "pid": 8776, + "start": 1793473004.35, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8744, + "group": 8744 + }, + { + "pid": 8784, + "start": 1793473004.36, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8744, + "group": 8744 + }, + { + "pid": 8867, + "start": 1793473004.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8866, + "group": 8866 + }, + { + "pid": 8871, + "start": 1793473004.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8870, + "group": 8870 + }, + { + "pid": 8873, + "start": 1793473004.71, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8865, + "group": 8865 + }, + { + "pid": 8898, + "start": 1793473004.76, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8865, + "group": 8865 + }, + { + "pid": 8907, + "start": 1793473004.77, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8865, + "group": 8865 + }, + { + "pid": 8987, + "start": 1793473005.1, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8986, + "group": 8986 + }, + { + "pid": 8991, + "start": 1793473005.1, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8990, + "group": 8990 + }, + { + "pid": 8992, + "start": 1793473005.1, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8985, + "group": 8985 + }, + { + "pid": 9018, + "start": 1793473005.15, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8985, + "group": 8985 + }, + { + "pid": 9020, + "start": 1793473005.16, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8985, + "group": 8985 + }, + { + "pid": 9098, + "start": 1793473005.52, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9097, + "group": 9097 + }, + { + "pid": 9101, + "start": 1793473005.52, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9100, + "group": 9100 + }, + { + "pid": 9104, + "start": 1793473005.52, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9096, + "group": 9096 + }, + { + "pid": 9129, + "start": 1793473005.58, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9096, + "group": 9096 + }, + { + "pid": 9131, + "start": 1793473005.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9096, + "group": 9096 + }, + { + "pid": 9216, + "start": 1793473005.93, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9215, + "group": 9215 + }, + { + "pid": 9220, + "start": 1793473005.93, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9219, + "group": 9219 + }, + { + "pid": 9221, + "start": 1793473005.93, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9214, + "group": 9214 + }, + { + "pid": 9246, + "start": 1793473005.98, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9214, + "group": 9214 + }, + { + "pid": 9248, + "start": 1793473005.99, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9214, + "group": 9214 + }, + { + "pid": 9336, + "start": 1793473006.34, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9335, + "group": 9335 + }, + { + "pid": 9339, + "start": 1793473006.34, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9338, + "group": 9338 + }, + { + "pid": 9342, + "start": 1793473006.34, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9367, + "start": 1793473006.39, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9376, + "start": 1793473006.39, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9452, + "start": 1793473006.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9451, + "group": 9451 + }, + { + "pid": 9456, + "start": 1793473006.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9455, + "group": 9455 + }, + { + "pid": 9458, + "start": 1793473006.71, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9450, + "group": 9450 + }, + { + "pid": 9482, + "start": 1793473006.75, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9450, + "group": 9450 + }, + { + "pid": 9484, + "start": 1793473006.76, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9450, + "group": 9450 + }, + { + "pid": 9569, + "start": 1793473007.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9568, + "group": 9568 + }, + { + "pid": 9573, + "start": 1793473007.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9572, + "group": 9572 + }, + { + "pid": 9574, + "start": 1793473007.12, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9567, + "group": 9567 + }, + { + "pid": 9598, + "start": 1793473007.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9567, + "group": 9567 + }, + { + "pid": 9600, + "start": 1793473007.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9567, + "group": 9567 + }, + { + "pid": 9692, + "start": 1793473007.54, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9691, + "group": 9691 + }, + { + "pid": 9696, + "start": 1793473007.54, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9695, + "group": 9695 + }, + { + "pid": 9697, + "start": 1793473007.55, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9690, + "group": 9690 + }, + { + "pid": 9721, + "start": 1793473007.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9690, + "group": 9690 + }, + { + "pid": 9730, + "start": 1793473007.6, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9690, + "group": 9690 + }, + { + "pid": 9815, + "start": 1793473007.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9814, + "group": 9814 + }, + { + "pid": 9819, + "start": 1793473007.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9817, + "group": 9817 + }, + { + "pid": 9821, + "start": 1793473007.95, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9810, + "group": 9810 + }, + { + "pid": 9845, + "start": 1793473008.0, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9810, + "group": 9810 + }, + { + "pid": 9854, + "start": 1793473008.01, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9810, + "group": 9810 + }, + { + "pid": 9930, + "start": 1793473008.36, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9929, + "group": 9929 + }, + { + "pid": 9934, + "start": 1793473008.37, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9933, + "group": 9933 + }, + { + "pid": 9935, + "start": 1793473008.37, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9928, + "group": 9928 + }, + { + "pid": 9959, + "start": 1793473008.42, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9928, + "group": 9928 + }, + { + "pid": 9961, + "start": 1793473008.42, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9928, + "group": 9928 + }, + { + "pid": 10046, + "start": 1793473008.75, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10045, + "group": 10045 + }, + { + "pid": 10050, + "start": 1793473008.75, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10048, + "group": 10048 + }, + { + "pid": 10052, + "start": 1793473008.75, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10077, + "start": 1793473008.81, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10079, + "start": 1793473008.82, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10165, + "start": 1793473009.23, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10164, + "group": 10164 + }, + { + "pid": 10169, + "start": 1793473009.23, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10168, + "group": 10168 + }, + { + "pid": 10170, + "start": 1793473009.23, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10196, + "start": 1793473009.29, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10198, + "start": 1793473009.3, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10281, + "start": 1793473009.67, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10280, + "group": 10280 + }, + { + "pid": 10285, + "start": 1793473009.67, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10284, + "group": 10284 + }, + { + "pid": 10287, + "start": 1793473009.67, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10279, + "group": 10279 + }, + { + "pid": 10310, + "start": 1793473009.72, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10279, + "group": 10279 + }, + { + "pid": 10319, + "start": 1793473009.73, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10279, + "group": 10279 + }, + { + "pid": 10402, + "start": 1793473010.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10401, + "group": 10401 + }, + { + "pid": 10406, + "start": 1793473010.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10405, + "group": 10405 + }, + { + "pid": 10407, + "start": 1793473010.12, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10408, + "start": 1793473010.13, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10433, + "start": 1793473010.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10435, + "start": 1793473010.18, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10523, + "start": 1793473010.55, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10522, + "group": 10522 + }, + { + "pid": 10527, + "start": 1793473010.55, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10525, + "group": 10525 + }, + { + "pid": 10528, + "start": 1793473010.55, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10521, + "group": 10521 + }, + { + "pid": 10554, + "start": 1793473010.6, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10521, + "group": 10521 + }, + { + "pid": 10562, + "start": 1793473010.6, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10521, + "group": 10521 + }, + { + "pid": 10649, + "start": 1793473011.0, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10648, + "group": 10648 + }, + { + "pid": 10653, + "start": 1793473011.0, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10651, + "group": 10651 + }, + { + "pid": 10654, + "start": 1793473011.0, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10647, + "group": 10647 + }, + { + "pid": 10678, + "start": 1793473011.07, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10647, + "group": 10647 + }, + { + "pid": 10686, + "start": 1793473011.07, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10647, + "group": 10647 + }, + { + "pid": 10764, + "start": 1793473011.44, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10763, + "group": 10763 + }, + { + "pid": 10768, + "start": 1793473011.44, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10767, + "group": 10767 + }, + { + "pid": 10769, + "start": 1793473011.44, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10762, + "group": 10762 + }, + { + "pid": 10793, + "start": 1793473011.49, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10762, + "group": 10762 + }, + { + "pid": 10802, + "start": 1793473011.5, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10762, + "group": 10762 + }, + { + "pid": 10898, + "start": 1793473011.92, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10897, + "group": 10897 + }, + { + "pid": 10902, + "start": 1793473011.92, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10901, + "group": 10901 + }, + { + "pid": 10904, + "start": 1793473011.92, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10896, + "group": 10896 + }, + { + "pid": 10929, + "start": 1793473011.96, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10896, + "group": 10896 + }, + { + "pid": 10938, + "start": 1793473011.97, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10896, + "group": 10896 + }, + { + "pid": 11016, + "start": 1793473012.35, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11015, + "group": 11015 + }, + { + "pid": 11020, + "start": 1793473012.35, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11019, + "group": 11019 + }, + { + "pid": 11021, + "start": 1793473012.35, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11046, + "start": 1793473012.4, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11048, + "start": 1793473012.4, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11139, + "start": 1793473012.78, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11138, + "group": 11138 + }, + { + "pid": 11143, + "start": 1793473012.78, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11142, + "group": 11142 + }, + { + "pid": 11144, + "start": 1793473012.78, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11137, + "group": 11137 + }, + { + "pid": 11169, + "start": 1793473012.83, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11137, + "group": 11137 + }, + { + "pid": 11177, + "start": 1793473012.83, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11137, + "group": 11137 + }, + { + "pid": 11258, + "start": 1793473013.19, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11257, + "group": 11257 + }, + { + "pid": 11260, + "start": 1793473013.19, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11259, + "group": 11259 + }, + { + "pid": 11264, + "start": 1793473013.19, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11256, + "group": 11256 + }, + { + "pid": 11288, + "start": 1793473013.24, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11256, + "group": 11256 + }, + { + "pid": 11290, + "start": 1793473013.24, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11256, + "group": 11256 + }, + { + "pid": 11379, + "start": 1793473013.62, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11378, + "group": 11378 + }, + { + "pid": 11383, + "start": 1793473013.62, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11381, + "group": 11381 + }, + { + "pid": 11384, + "start": 1793473013.62, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11409, + "start": 1793473013.67, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11418, + "start": 1793473013.68, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11495, + "start": 1793473014.13, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11494, + "group": 11494 + }, + { + "pid": 11499, + "start": 1793473014.13, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11497, + "group": 11497 + }, + { + "pid": 11500, + "start": 1793473014.13, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11493, + "group": 11493 + }, + { + "pid": 11524, + "start": 1793473014.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11493, + "group": 11493 + }, + { + "pid": 11526, + "start": 1793473014.18, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11493, + "group": 11493 + }, + { + "pid": 11608, + "start": 1793473014.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11607, + "group": 11607 + }, + { + "pid": 11612, + "start": 1793473014.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11610, + "group": 11610 + }, + { + "pid": 11614, + "start": 1793473014.96, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11606, + "group": 11606 + }, + { + "pid": 11637, + "start": 1793473015.02, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11606, + "group": 11606 + }, + { + "pid": 11639, + "start": 1793473015.02, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11606, + "group": 11606 + }, + { + "pid": 11729, + "start": 1793473015.94, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11728, + "group": 11728 + }, + { + "pid": 11733, + "start": 1793473015.94, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11732, + "group": 11732 + }, + { + "pid": 11734, + "start": 1793473015.94, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11727, + "group": 11727 + }, + { + "pid": 11760, + "start": 1793473016.01, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11727, + "group": 11727 + }, + { + "pid": 11762, + "start": 1793473016.01, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11727, + "group": 11727 + }, + { + "pid": 11832, + "start": 1793473016.3, + "parent": 7206, + "name": "python", + "status": "zombie", + "session": 11830, + "group": 11830 + }, + { + "pid": 7757, + "start": 1793472999.76, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7759, + "start": 1793472999.76, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7791, + "start": 1793472999.81, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7761, + "start": 1793472999.79, + "parent": 7759, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7808, + "start": 1793472999.85, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7823, + "start": 1793472999.9, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7832, + "start": 1793472999.93, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7833, + "start": 1793472999.94, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7783, + "start": 1793472999.8, + "parent": 7757, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7614, + "start": 1793472998.37, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7616, + "start": 1793472998.37, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7648, + "start": 1793472998.43, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7618, + "start": 1793472998.41, + "parent": 7616, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7665, + "start": 1793472998.49, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7679, + "start": 1793472998.54, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7688, + "start": 1793472998.56, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7689, + "start": 1793472998.56, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7639, + "start": 1793472998.42, + "parent": 7614, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7491, + "start": 1793472996.98, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7493, + "start": 1793472996.98, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7517, + "start": 1793472997.04, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7495, + "start": 1793472997.02, + "parent": 7493, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7540, + "start": 1793472997.08, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7555, + "start": 1793472997.13, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7564, + "start": 1793472997.15, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7566, + "start": 1793472997.16, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7515, + "start": 1793472997.03, + "parent": 7491, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + } + ], + "signals": [ + { + "pid": 7484, + "start": 1793472996.94, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7486, + "start": 1793472996.97, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7485, + "group": 7485, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7490, + "start": 1793472996.97, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7489, + "group": 7489, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7607, + "start": 1793472998.33, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7609, + "start": 1793472998.36, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7608, + "group": 7608, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7613, + "start": 1793472998.37, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7611, + "group": 7611, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7750, + "start": 1793472999.72, + "parent": 7206, + "name": "chromium", + "status": "running", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7752, + "start": 1793472999.76, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7751, + "group": 7751, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7756, + "start": 1793472999.76, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7755, + "group": 7755, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7757, + "start": 1793472999.76, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7759, + "start": 1793472999.76, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7791, + "start": 1793472999.81, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7761, + "start": 1793472999.79, + "parent": 7759, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7808, + "start": 1793472999.85, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7823, + "start": 1793472999.9, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7832, + "start": 1793472999.93, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7833, + "start": 1793472999.94, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7783, + "start": 1793472999.8, + "parent": 7757, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7614, + "start": 1793472998.37, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7616, + "start": 1793472998.37, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7648, + "start": 1793472998.43, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7618, + "start": 1793472998.41, + "parent": 7616, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7665, + "start": 1793472998.49, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7679, + "start": 1793472998.54, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7688, + "start": 1793472998.56, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7689, + "start": 1793472998.56, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7639, + "start": 1793472998.42, + "parent": 7614, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7491, + "start": 1793472996.98, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7493, + "start": 1793472996.98, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7517, + "start": 1793472997.04, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7495, + "start": 1793472997.02, + "parent": 7493, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7540, + "start": 1793472997.08, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7555, + "start": 1793472997.13, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7564, + "start": 1793472997.15, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "exited" + }, + { + "pid": 7566, + "start": 1793472997.16, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "sent" + }, + { + "pid": 7515, + "start": 1793472997.03, + "parent": 7491, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484, + "signal": 15, + "delivery": "sent" + } + ], + "adopted_waits": [ + { + "pid": 7222, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7225, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7218, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7253, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7228, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7229, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7255, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7351, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7354, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7347, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7380, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7357, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7358, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7382, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7486, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7490, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7609, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7613, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7752, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7756, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7750, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7899, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7903, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7929, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7905, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7931, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8013, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8017, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8042, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8018, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8044, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8156, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8160, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8185, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8161, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8193, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8278, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8281, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8309, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8284, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8285, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8311, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8396, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8400, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8427, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8401, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8429, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8511, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8515, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8541, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8516, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8627, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8636, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8640, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8666, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8642, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8674, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8746, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8750, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8776, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8751, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8784, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8867, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8871, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8898, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8873, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8907, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8987, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 8991, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9018, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 8992, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9020, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9098, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9101, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9129, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9104, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9131, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9216, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9220, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9246, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9221, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9248, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9336, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9339, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9367, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9342, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9376, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9452, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9456, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9482, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9458, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9484, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9569, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9573, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7484, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9598, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9574, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9600, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9692, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9696, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9721, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9697, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9730, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9815, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9819, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9845, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9821, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9854, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9930, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9934, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 9959, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9935, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 9961, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10046, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10050, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10077, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10079, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10052, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10165, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10169, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10196, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10170, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10198, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10281, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10285, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10310, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10287, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10319, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10402, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10406, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10433, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10407, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10408, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10435, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10523, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10527, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10554, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10528, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10562, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10649, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10653, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10678, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10654, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10686, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10764, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10768, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10793, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10769, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10802, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10898, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10902, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 10929, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10904, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 10938, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11016, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11020, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11046, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11021, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11048, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11139, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11143, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11169, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11144, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11177, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11258, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11260, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11288, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11264, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11290, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11379, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11383, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11409, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11384, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11418, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11495, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11499, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11524, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11500, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11526, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11608, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11612, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11637, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11614, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11639, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11729, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11733, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 11760, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11734, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11762, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 11832, + "raw_wait_status": 9, + "returncode": -9 + }, + { + "pid": 7783, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7639, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7515, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7757, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7759, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7791, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7491, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7493, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7517, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7607, + "raw_wait_status": 0, + "returncode": 0 + }, + { + "pid": 7614, + "raw_wait_status": 15, + "returncode": -15 + }, + { + "pid": 7648, + "raw_wait_status": 15, + "returncode": -15 + } + ], + "final_owned_descendants": [], + "utc_finished": "2026-10-31T18:57:00.518181+00:00", + "limits": "bounded known descendants; no atomic inventory/daemon-escape/global no-zombie claim", + "observer_gap": false, + "wrapper_returncode": 1 +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/collector-provenance.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/collector-provenance.json new file mode 100644 index 0000000..6a81066 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/collector-provenance.json @@ -0,0 +1,10 @@ +{ + "receipt_plugin.py": { + "sha256": "c81107688c79eccfdf7e4e5f0a26e3ccec1d1afb1ab493052c10b89a02d57b5a", + "source_commit": "605d257" + }, + "pytest_main.py": { + "sha256": "c23cefeb8fb2cf19f48946a23cd1cb66606953798057a99d3e5ba34d20ac5c27", + "source_commit": "605d257" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/command.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/command.json new file mode 100644 index 0000000..71450b9 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/command.json @@ -0,0 +1,22 @@ +{ + "argv": [ + "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", + "-I", + "/workspace/scratch/footwork-durable-cdp-cad7508/pytest_main.py", + "-q", + "-rA", + "-o", + "markers=browser: launches a real owned browser", + "--confcutdir=/workspace/scratch/footwork-durable-cdp-cad7508/tests", + "--basetemp=/workspace/scratch/footwork-durable-cdp-cad7508/pytest-tmp", + "--junitxml=/workspace/scratch/footwork-durable-cdp-cad7508/junit.xml", + "/workspace/scratch/footwork-durable-cdp-cad7508/tests" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", + "PYTHONPATH": "unset", + "FOOTWORK_CHROME_EXECUTABLE": "/usr/lib/chromium/chromium", + "JEVDUAL_PURE_PY": "1", + "PYTEST_DISABLE_PLUGIN_AUTOLOAD": "1", + "FOOTWORK_EXECUTABLE": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", + "provider_key_forwarded": false +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/doctor.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/doctor.json new file mode 100644 index 0000000..3f92fb7 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/doctor.json @@ -0,0 +1,502 @@ +{ + "kind": "communicate", + "monotonic": 6557.135113843, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 2, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 7212, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", + "--json", + "doctor" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "eef4b6b8904a4a348d4c36a4025633fa7affb9801cfd97a4c76b41d9f854399b", + "bytes": 12092, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "platform": "linux", + "supported": true, + "runtime": { + "python_version": "3.12.14", + "python_requirement": ">=3.11,<4.0", + "python_compatible": true, + "interpreter": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", + "architecture": "x86_64", + "distribution": { + "version": "0.0.1", + "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages" + }, + "loaded_modules": { + "jevdual": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/__init__.py", + "jevdual.capability.setup": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py" + } + }, + "dependencies": { + "browser-use": { + "version": null, + "requirement": "==0.13.14", + "compatible": false, + "location": null + }, + "typesafe-sdk": { + "version": null, + "requirement": "<1,>=0.7", + "compatible": false, + "location": null + }, + "orjson": { + "version": null, + "requirement": ">=3.10", + "compatible": false, + "location": null + }, + "psutil": { + "version": "7.2.2", + "requirement": "==7.2.2", + "compatible": true, + "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages" + }, + "websockets": { + "version": "15.0.1", + "requirement": "==15.0.1", + "compatible": true, + "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages" + }, + "mcp": { + "version": null, + "requirement": "==2.1.1", + "compatible": false, + "location": null + }, + "packaging": { + "version": "26.3", + "requirement": "<27,>=25", + "compatible": true, + "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages" + }, + "cua-driver": { + "version": null, + "requirement": "==0.38.0+footwork.d5373879.cleanup2", + "compatible": false, + "location": null + }, + "jeepney": { + "version": null, + "requirement": "==0.9.0", + "compatible": false, + "location": null + } + }, + "dependency_status": "blocked", + "permissions": { + "accessibility": "not_checked", + "screen_recording": "not_checked", + "session": { + "x11_display_present": false, + "dbus_session_present": false, + "wayland_display_present": false, + "connection": "not_checked" + }, + "requirements": [ + "An accessible X11 display and D-Bus desktop session.", + "AT-SPI accessibility access to the explicitly bound process and window.", + "Live observation and exact text readback before input; environment presence grants no access." + ] + }, + "scope": "not_checked", + "journal": "not_checked", + "warnings": [ + "Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified." + ], + "dependency_metadata": "installed distribution", + "limitation": "Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.", + "runtime_qualification": "not_checked", + "provider_account_required": false, + "rust_toolchain_required": false, + "blockers": [ + "dependency_missing", + "accessibility_not_checked", + "x11_display_not_configured", + "session_bus_not_configured" + ], + "prerequisite_status": "blocked", + "qualification": "Prerequisites only. Window identity, current state, effects and job completion require separate checks.", + "acceleration": { + "component": "jevdual._core", + "available": false, + "status": "disabled", + "backend": "pure-python", + "scope": "Optional Jev Rust hot paths; independent of the CUA native driver" + }, + "host_prerequisites": { + "schema_version": 1, + "platform": "linux", + "architecture": "x86_64", + "kernel": "6.18.57", + "libc": "glibc 2.41", + "distribution": { + "PRETTY_NAME": "Debian GNU/Linux 13 (trixie)", + "VERSION_ID": "13", + "ID": "debian" + }, + "python": { + "version": "3.12.14", + "pip_module": false, + "venv_module": true, + "ensurepip_module": true + }, + "resources": { + "memory": { + "total_bytes": 18882662400, + "available_bytes": 17950654464 + }, + "cgroup": { + "versions": [ + 2 + ], + "membership_readable": true, + "memory_limit_bytes": 17179869184, + "memory_remaining_bytes": 16183717888, + "cpu_quota_cores": 4.0, + "scope": "visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified", + "null_limit_meaning": "no finite limit observed, not proof of unlimited resources", + "pids_limit": null, + "pids_remaining_upper_bound": null, + "swap_limit_bytes": null, + "memory_and_swap_limit_bytes": null, + "task_swap_event_snapshots": [ + { + "path": ".", + "pids_limit": null, + "pids_current": 52, + "pids_events": { + "max": 0 + }, + "swap_limit_bytes": null, + "swap_current_bytes": 0, + "swap_events": { + "high": 0, + "max": 0, + "fail": 0 + }, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "memory_failcnt": null, + "memory_and_swap_failcnt": null + } + ], + "counter_scope": "bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown" + }, + "available_memory_upper_bound_bytes": 16183717888, + "cpu_count": 5, + "cpu_affinity_count": 5 + }, + "process_supervision": { + "pid1_comm": "tail", + "self_parent_pid": 7210, + "pid1_is_self": false, + "orphan_reaping": "not_checked", + "wait_ownership": "not_checked" + }, + "executables_present": { + "uv": true, + "pip": true, + "pip3": true, + "rustc": false, + "cargo": false, + "rustup": false, + "cc": true, + "clang": false, + "pkg-config": true, + "google-chrome": false, + "google-chrome-stable": false, + "chromium": true, + "chromium-browser": false, + "dbus-run-session": true, + "dbus-send": true, + "gdbus": true, + "Xvfb": false, + "node": true, + "ffmpeg": true, + "tesseract": true + }, + "session_indicators_present": { + "DISPLAY": false, + "WAYLAND_DISPLAY": false, + "DBUS_SESSION_BUS_ADDRESS": false, + "XDG_RUNTIME_DIR": false + }, + "prerequisite_candidates": { + "browser_executable": true, + "graphical_session_indicator": false, + "session_bus_indicator": false + }, + "runtime_qualification": "unverified", + "effect_verification": "not_asserted", + "limitations": [ + "Executable and environment presence do not establish connection, permissions, or driver support.", + "No browser, desktop, accessibility service, native CUA library, or provider was started or queried.", + "Resource values are a transient upper bound, not a reservation or build-capacity guarantee.", + "Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control." + ] + }, + "tool_families": [ + { + "name": "camera", + "commands": [ + "doctor", + "capture", + "status" + ], + "status": "available", + "prerequisites": [ + "ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment" + }, + { + "name": "inbox", + "commands": [ + "prepare", + "accept", + "status" + ], + "status": "available", + "prerequisites": [ + "explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment" + }, + { + "name": "workbench", + "commands": [ + "link", + "status", + "list" + ], + "status": "available", + "prerequisites": [], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes" + }, + { + "name": "workcell", + "commands": [ + "agent-bench", + "app-handoff", + "bench", + "bench-operator", + "bench-runner", + "body", + "body-network", + "controller", + "episode", + "image-guided", + "measurement", + "network-bench-operator", + "order-app", + "qualify-bench", + "qualify-network-body", + "qualify-network-workbench", + "qualify-order-handoff", + "qualify-workbench-crashes", + "qualify-workbench-health", + "qualify-workbench-recovery", + "qualify-workbench-restarts", + "record-network-workbench", + "score-agent-bench", + "score-network-body", + "score-network-workbench", + "score-operator", + "score-workbench-crashes", + "score-workbench-health", + "score-workbench-recovery", + "score-workbench-restarts" + ], + "status": "optional_dependencies_missing", + "prerequisites": [ + "mujoco==3.15.0", + "numpy", + "headless rendering libraries for image operations", + "qualification commands require owned fixture inputs" + ], + "missing": [ + "mujoco", + "numpy" + ], + "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell", + "command_prerequisites": { + "record-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-order-handoff": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-agent-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-operator": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ] + } + }, + { + "name": "browser-inspection", + "commands": [ + "summarize", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-experiments", + "commands": [ + "compare", + "coverage", + "publication-gate", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-transport", + "commands": [ + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + } + ], + "browser_profiles": { + "cdp": { + "profile": "owned-headless-cdp", + "entrypoint": "footwork browser cdp", + "commands": [ + "start", + "look", + "click", + "status", + "recover", + "stop", + "guide" + ], + "requirements": [ + "Chrome", + "psutil", + "websockets", + "configured Jev or judgment adapter", + "absolute durable authority" + ], + "desktop_required": false, + "cua_required": false, + "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", + "prerequisite_presence": { + "chrome": true, + "psutil": true, + "websockets": true, + "jev_environment_configured": false, + "judgment_adapter": "explicit per-session configuration; not checked by offline doctor" + }, + "runtime_qualification": "not_checked" + }, + "legacy": { + "profile": "full-desktop", + "requires": [ + "CUA", + "X11/AT-SPI on Linux" + ] + } + }, + "profile_note": "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.", + "effect_verification": "not_asserted" + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"platform\": \"linux\", \"supported\": true, \"runtime\": {\"python_version\": \"3.12.14\", \"python_requirement\": \">=3.11,<4.0\", \"python_compatible\": true, \"interpreter\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python\", \"architecture\": \"x86_64\", \"distribution\": {\"version\": \"0.0.1\", \"location\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages\"}, \"loaded_modules\": {\"jevdual\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/__init__.py\", \"jevdual.capability.setup\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py\"}}, \"dependencies\": {\"browser-use\": {\"version\": null, \"requirement\": \"==0.13.14\", \"compatible\": false, \"location\": null}, \"typesafe-sdk\": {\"version\": null, \"requirement\": \"<1,>=0.7\", \"compatible\": false, \"location\": null}, \"orjson\": {\"version\": null, \"requirement\": \">=3.10\", \"compatible\": false, \"location\": null}, \"psutil\": {\"version\": \"7.2.2\", \"requirement\": \"==7.2.2\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages\"}, \"websockets\": {\"version\": \"15.0.1\", \"requirement\": \"==15.0.1\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages\"}, \"mcp\": {\"version\": null, \"requirement\": \"==2.1.1\", \"compatible\": false, \"location\": null}, \"packaging\": {\"version\": \"26.3\", \"requirement\": \"<27,>=25\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages\"}, \"cua-driver\": {\"version\": null, \"requirement\": \"==0.38.0+footwork.d5373879.cleanup2\", \"compatible\": false, \"location\": null}, \"jeepney\": {\"version\": null, \"requirement\": \"==0.9.0\", \"compatible\": false, \"location\": null}}, \"dependency_status\": \"blocked\", \"permissions\": {\"accessibility\": \"not_checked\", \"screen_recording\": \"not_checked\", \"session\": {\"x11_display_present\": false, \"dbus_session_present\": false, \"wayland_display_present\": false, \"connection\": \"not_checked\"}, \"requirements\": [\"An accessible X11 display and D-Bus desktop session.\", \"AT-SPI accessibility access to the explicitly bound process and window.\", \"Live observation and exact text readback before input; environment presence grants no access.\"]}, \"scope\": \"not_checked\", \"journal\": \"not_checked\", \"warnings\": [\"Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified.\"], \"dependency_metadata\": \"installed distribution\", \"limitation\": \"Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.\", \"runtime_qualification\": \"not_checked\", \"provider_account_required\": false, \"rust_toolchain_required\": false, \"blockers\": [\"dependency_missing\", \"accessibility_not_checked\", \"x11_display_not_configured\", \"session_bus_not_configured\"], \"prerequisite_status\": \"blocked\", \"qualification\": \"Prerequisites only. Window identity, current state, effects and job completion require separate checks.\", \"acceleration\": {\"component\": \"jevdual._core\", \"available\": false, \"status\": \"disabled\", \"backend\": \"pure-python\", \"scope\": \"Optional Jev Rust hot paths; independent of the CUA native driver\"}, \"host_prerequisites\": {\"schema_version\": 1, \"platform\": \"linux\", \"architecture\": \"x86_64\", \"kernel\": \"6.18.57\", \"libc\": \"glibc 2.41\", \"distribution\": {\"PRETTY_NAME\": \"Debian GNU/Linux 13 (trixie)\", \"VERSION_ID\": \"13\", \"ID\": \"debian\"}, \"python\": {\"version\": \"3.12.14\", \"pip_module\": false, \"venv_module\": true, \"ensurepip_module\": true}, \"resources\": {\"memory\": {\"total_bytes\": 18882662400, \"available_bytes\": 17950654464}, \"cgroup\": {\"versions\": [2], \"membership_readable\": true, \"memory_limit_bytes\": 17179869184, \"memory_remaining_bytes\": 16183717888, \"cpu_quota_cores\": 4.0, \"scope\": \"visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified\", \"null_limit_meaning\": \"no finite limit observed, not proof of unlimited resources\", \"pids_limit\": null, \"pids_remaining_upper_bound\": null, \"swap_limit_bytes\": null, \"memory_and_swap_limit_bytes\": null, \"task_swap_event_snapshots\": [{\"path\": \".\", \"pids_limit\": null, \"pids_current\": 52, \"pids_events\": {\"max\": 0}, \"swap_limit_bytes\": null, \"swap_current_bytes\": 0, \"swap_events\": {\"high\": 0, \"max\": 0, \"fail\": 0}, \"memory_events\": {\"low\": 0, \"high\": 0, \"max\": 0, \"oom\": 0, \"oom_kill\": 0, \"oom_group_kill\": 0}, \"memory_failcnt\": null, \"memory_and_swap_failcnt\": null}], \"counter_scope\": \"bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown\"}, \"available_memory_upper_bound_bytes\": 16183717888, \"cpu_count\": 5, \"cpu_affinity_count\": 5}, \"process_supervision\": {\"pid1_comm\": \"tail\", \"self_parent_pid\": 7210, \"pid1_is_self\": false, \"orphan_reaping\": \"not_checked\", \"wait_ownership\": \"not_checked\"}, \"executables_present\": {\"uv\": true, \"pip\": true, \"pip3\": true, \"rustc\": false, \"cargo\": false, \"rustup\": false, \"cc\": true, \"clang\": false, \"pkg-config\": true, \"google-chrome\": false, \"google-chrome-stable\": false, \"chromium\": true, \"chromium-browser\": false, \"dbus-run-session\": true, \"dbus-send\": true, \"gdbus\": true, \"Xvfb\": false, \"node\": true, \"ffmpeg\": true, \"tesseract\": true}, \"session_indicators_present\": {\"DISPLAY\": false, \"WAYLAND_DISPLAY\": false, \"DBUS_SESSION_BUS_ADDRESS\": false, \"XDG_RUNTIME_DIR\": false}, \"prerequisite_candidates\": {\"browser_executable\": true, \"graphical_session_indicator\": false, \"session_bus_indicator\": false}, \"runtime_qualification\": \"unverified\", \"effect_verification\": \"not_asserted\", \"limitations\": [\"Executable and environment presence do not establish connection, permissions, or driver support.\", \"No browser, desktop, accessibility service, native CUA library, or provider was started or queried.\", \"Resource values are a transient upper bound, not a reservation or build-capacity guarantee.\", \"Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control.\"]}, \"tool_families\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"browser_profiles\": {\"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"prerequisite_presence\": {\"chrome\": true, \"psutil\": true, \"websockets\": true, \"jev_environment_configured\": false, \"judgment_adapter\": \"explicit per-session configuration; not checked by offline doctor\"}, \"runtime_qualification\": \"not_checked\"}, \"legacy\": {\"profile\": \"full-desktop\", \"requires\": [\"CUA\", \"X11/AT-SPI on Linux\"]}}, \"profile_note\": \"Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.\", \"effect_verification\": \"not_asserted\"}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/guide.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/guide.json new file mode 100644 index 0000000..85c0f5b --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/guide.json @@ -0,0 +1,89 @@ +{ + "kind": "communicate", + "monotonic": 6557.295945152, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 4, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 7214, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", + "--json", + "browser", + "cdp", + "guide" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "80c96660aef007556c2ec3c0eb530adb54b7f3aa985c13592e59e8f0fcaa4cf6", + "bytes": 2717, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "package_version": "0.0.1", + "profile": "owned-headless-cdp", + "entrypoint": "footwork browser cdp", + "commands": [ + "start", + "look", + "click", + "status", + "recover", + "stop", + "guide" + ], + "requirements": [ + "Chrome", + "psutil", + "websockets", + "configured Jev or judgment adapter", + "absolute durable authority" + ], + "desktop_required": false, + "cua_required": false, + "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", + "loop": [ + "start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", + "look --session DIR; choose the exact opaque ref returned by this holder", + "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", + "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", + "recover --session DIR after holder loss: read-only recovery; no browser is launched", + "stop --session DIR; retain the authority database and all unresolved operations" + ], + "guard_adapter": { + "configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", + "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", + "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", + "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses" + }, + "limits": [ + "An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", + "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", + "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", + "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", + "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", + "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol." + ] + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"package_version\": \"0.0.1\", \"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"loop\": [\"start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL\", \"look --session DIR; choose the exact opaque ref returned by this holder\", \"click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence\", \"status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record\", \"recover --session DIR after holder loss: read-only recovery; no browser is launched\", \"stop --session DIR; retain the authority database and all unresolved operations\"], \"guard_adapter\": {\"configuration\": \"--guard-command FILE containing JSON argv, absolute executable first; trusted policy code\", \"stdin\": \"footwork.browser.guard.request v1: digest, task, targets, url, title, binding\", \"stdout\": \"{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}\", \"semantics\": \"same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses\"}, \"limits\": [\"An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.\", \"This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.\", \"A new token cannot clear an unresolved admission, even across sessions sharing this authority database.\", \"No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.\", \"The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.\", \"Initial URL loading can itself have website effects; it is setup outside the guarded click protocol.\"]}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/schema.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/schema.json new file mode 100644 index 0000000..5fd4566 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/schema.json @@ -0,0 +1,93 @@ +{ + "kind": "communicate", + "monotonic": 6557.200765782, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 3, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 7213, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", + "--json", + "schema", + "browser", + "cdp", + "click" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "fc39375dd5ed7c43bb2bb15e23a9713ad9c8438328e198d387e0325cd5e594fa", + "bytes": 834, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "command": [ + "cdp", + "click" + ], + "arguments": [ + { + "name": "help", + "flags": [ + "-h", + "--help" + ], + "required": false, + "nargs": 0, + "choices": null, + "help": "show this help message and exit", + "default": "==SUPPRESS==" + }, + { + "name": "session", + "flags": [ + "--session" + ], + "required": true, + "nargs": null, + "choices": null, + "help": null, + "default": null + }, + { + "name": "ref", + "flags": [ + "--ref" + ], + "required": true, + "nargs": null, + "choices": null, + "help": "opaque ref from the last look; never reselected by label", + "default": null + }, + { + "name": "token", + "flags": [ + "--token" + ], + "required": true, + "nargs": null, + "choices": null, + "help": "stable token for this intended activation", + "default": null + } + ], + "subcommands": [] + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"command\": [\"cdp\", \"click\"], \"arguments\": [{\"name\": \"help\", \"flags\": [\"-h\", \"--help\"], \"required\": false, \"nargs\": 0, \"choices\": null, \"help\": \"show this help message and exit\", \"default\": \"==SUPPRESS==\"}, {\"name\": \"session\", \"flags\": [\"--session\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": null, \"default\": null}, {\"name\": \"ref\", \"flags\": [\"--ref\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"opaque ref from the last look; never reselected by label\", \"default\": null}, {\"name\": \"token\", \"flags\": [\"--token\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"stable token for this intended activation\", \"default\": null}], \"subcommands\": []}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/tools.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/tools.json new file mode 100644 index 0000000..b52395f --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/discovery/tools.json @@ -0,0 +1,335 @@ +{ + "kind": "communicate", + "monotonic": 6556.993472277, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 1, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 7211, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", + "--json", + "tools" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "09458eda566d93cb41bdedd11ced83077dcee7f7e0c0b284969858fcad58282f", + "bytes": 6642, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "schema_version": "1", + "entrypoint": "footwork", + "global_options": { + "--json": "Prefix before the command; preserves exit status and does not certify effects" + }, + "commands": [ + "run", + "menu", + "apps", + "start", + "look", + "inspect-target", + "visual-check", + "do", + "s1", + "done", + "read", + "check-file", + "check-artifact", + "grant", + "snapshot-file", + "status" + ], + "agent_commands": [ + "tools", + "catalog", + "schema", + "doctor", + "invoke", + "capability", + "mcp", + "tool" + ], + "surfaces": { + "browser": { + "commands": [ + "start", + "check-file", + "do", + "done", + "grant", + "inspect-target", + "look", + "read", + "s1", + "snapshot-file", + "status", + "visual-check", + "cdp" + ], + "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", + "cdp": { + "profile": "owned-headless-cdp", + "entrypoint": "footwork browser cdp", + "commands": [ + "start", + "look", + "click", + "status", + "recover", + "stop", + "guide" + ], + "requirements": [ + "Chrome", + "psutil", + "websockets", + "configured Jev or judgment adapter", + "absolute durable authority" + ], + "desktop_required": false, + "cua_required": false, + "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user" + } + }, + "desktop": { + "commands": [ + "run", + "menu", + "apps", + "start", + "look", + "inspect-target", + "visual-check", + "do", + "s1", + "done", + "read", + "check-file", + "check-artifact", + "grant", + "snapshot-file", + "status" + ], + "route": "native Linux X11/AT-SPI; live target binding required" + } + }, + "capability": { + "commands": [ + "doctor", + "config", + "server", + "report" + ], + "scope": "one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified" + }, + "tools": [ + { + "name": "camera", + "commands": [ + "doctor", + "capture", + "status" + ], + "status": "available", + "prerequisites": [ + "ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment" + }, + { + "name": "inbox", + "commands": [ + "prepare", + "accept", + "status" + ], + "status": "available", + "prerequisites": [ + "explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment" + }, + { + "name": "workbench", + "commands": [ + "link", + "status", + "list" + ], + "status": "available", + "prerequisites": [], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes" + }, + { + "name": "workcell", + "commands": [ + "agent-bench", + "app-handoff", + "bench", + "bench-operator", + "bench-runner", + "body", + "body-network", + "controller", + "episode", + "image-guided", + "measurement", + "network-bench-operator", + "order-app", + "qualify-bench", + "qualify-network-body", + "qualify-network-workbench", + "qualify-order-handoff", + "qualify-workbench-crashes", + "qualify-workbench-health", + "qualify-workbench-recovery", + "qualify-workbench-restarts", + "record-network-workbench", + "score-agent-bench", + "score-network-body", + "score-network-workbench", + "score-operator", + "score-workbench-crashes", + "score-workbench-health", + "score-workbench-recovery", + "score-workbench-restarts" + ], + "status": "optional_dependencies_missing", + "prerequisites": [ + "mujoco==3.15.0", + "numpy", + "headless rendering libraries for image operations", + "qualification commands require owned fixture inputs" + ], + "missing": [ + "mujoco", + "numpy" + ], + "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell", + "command_prerequisites": { + "record-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-order-handoff": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-agent-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-operator": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ] + } + }, + { + "name": "browser-inspection", + "commands": [ + "summarize", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-experiments", + "commands": [ + "compare", + "coverage", + "publication-gate", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-transport", + "commands": [ + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + } + ], + "effect_semantics": "Read action receipts and resource-bound readback; exit 0 alone is not completion proof" + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"schema_version\": \"1\", \"entrypoint\": \"footwork\", \"global_options\": {\"--json\": \"Prefix before the command; preserves exit status and does not certify effects\"}, \"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"agent_commands\": [\"tools\", \"catalog\", \"schema\", \"doctor\", \"invoke\", \"capability\", \"mcp\", \"tool\"], \"surfaces\": {\"browser\": {\"commands\": [\"start\", \"check-file\", \"do\", \"done\", \"grant\", \"inspect-target\", \"look\", \"read\", \"s1\", \"snapshot-file\", \"status\", \"visual-check\", \"cdp\"], \"route\": \"dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)\", \"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}}, \"desktop\": {\"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"route\": \"native Linux X11/AT-SPI; live target binding required\"}}, \"capability\": {\"commands\": [\"doctor\", \"config\", \"server\", \"report\"], \"scope\": \"one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified\"}, \"tools\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"effect_semantics\": \"Read action receipts and resource-bound readback; exit 0 alone is not completion proof\"}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/environment.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/environment.json new file mode 100644 index 0000000..8d96480 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/environment.json @@ -0,0 +1,113 @@ +{ + "utc_started": "2026-10-31T18:56:30.341322+00:00", + "baseline_source": "cad7508f8f4375735c0651c5e0aa5929f3b57700", + "measurement_commit": "cad7508f8f4375735c0651c5e0aa5929f3b57700", + "evidence_commit": "605d2574e08c4544b23bf4f64087be9baa00502d", + "harness_sha256": "edbdc2947f089f6b1ddaa9297d1b75c3c8e4248aaac0a6b0b5bb3966cb61044b", + "wheel": { + "name": "jevdual-0.0.1-py3-none-any.whl", + "sha256": "e466146e5ba77e68470eea7cca86d7beb84d42c3dfe3a7ac7e15ca06a6530660" + }, + "test_sha256": { + "test_cdp_effector.py": "d3d4a2f689c8f0dae42a8a74656b24457f45acd0305f2614868cdd2716ba39b2", + "test_cdp_transport_deadline.py": "c4d10e3605598345b9cdee54ecdd3b4b749c0aefdeb05f675c1bab2f40f68594", + "test_cdp_launch_custody.py": "266544670851452c2c034443bec4abd8fff5815f0b4a2da87342ae7eb3546777", + "test_cdp_click.py": "0c004967776609b3151bc7321f2c0ed96c6e437f12e5ea8311996298c454b7e7", + "test_cdp_click_contract.py": "34c07ad6dbd0eb5764b212d5ca072f81ebd3561bd5844569a3d1b98f02d0e0a1", + "test_browser_durable_authority.py": "9f2323333ecda0585431f16932afb331b42d3de827a396cceaf94a7a843e9b1a", + "test_browser_holder.py": "a826cd8eba5c397a4b10a086f71f8269d465acab26371f5c8067c7dc5572725c", + "test_browser_guard.py": "464a1180f1953495813fb7230a0849026d901125eb8054275c72f039191aff6d", + "test_browser_cdp_cli.py": "6818b7807c65ae64c067a94522558e2bbb4788b91b6c76e957725778a2d11b54", + "test_browser_restart_cli.py": "08368a52eadf7aa3645641a5bbf616eef53b4f71bfe5acd4da70bbb194ac1995" + }, + "verified_installed_package_files": 206, + "origins": { + "jevdual": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/__init__.py", + "operations": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/effectors/cdp/operations.py", + "python": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", + "prefix": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer", + "sys_path": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python312.zip", + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12", + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/lib-dynload", + "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages" + ] + }, + "packages": { + "Pygments": "2.21.0", + "jevdual": "0.0.1", + "psutil": "7.2.2", + "pytest": "8.4.2", + "pluggy": "1.7.0", + "websockets": "15.0.1", + "packaging": "26.3", + "iniconfig": "2.3.1" + }, + "optional_backends": { + "cua_driver": false, + "browser_use": false + }, + "python": "3.12.14 (main, Aug 25 2026, 14:00:49) [Clang 22.1.3 ]", + "os_release": "PRETTY_NAME=\"Debian GNU/Linux 13 (trixie)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"13\"\nVERSION=\"13 (trixie)\"\nVERSION_CODENAME=trixie\nDEBIAN_VERSION_FULL=13.6\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"", + "kernel": { + "system": "Linux", + "release": "6.18.57", + "machine": "x86_64" + }, + "chrome": { + "executable": "/usr/lib/chromium/chromium", + "sha256": "4dc9f9f9b20e9bd95bf201f43d2d643f48938f36a70ddcb6fce3dd611a178180", + "version": "Chromium 154.0.8037.57", + "sandbox_override": false + }, + "cgroup_membership": "0::/", + "cgroup": { + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-4", + "memory.max": "17179869184", + "memory.swap.max": "max", + "pids.max": "max", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0", + "pids.events": "max 0" + }, + "affinity": [ + 0, + 1, + 2, + 3, + 4 + ], + "uid": 1000, + "rlimits": { + "RLIMIT_CORE": [ + 0, + -1 + ], + "RLIMIT_NPROC": [ + 71955, + 71955 + ], + "RLIMIT_NOFILE": [ + 16384, + 16384 + ], + "RLIMIT_AS": [ + -1, + -1 + ] + }, + "kernel_policy": { + "/proc/sys/kernel/unprivileged_userns_clone": { + "unavailable": "FileNotFoundError" + }, + "/proc/sys/user/max_user_namespaces": "71955", + "/proc/sys/kernel/core_pattern": { + "unavailable": "FileNotFoundError" + } + }, + "pid1": "tail", + "test_wrapper_subreaper": true, + "watchdog_seconds": 600, + "cleanup_grace_seconds": 3, + "scope": "explicit durable CDP CLI and holder; typing/completion oracle/light metadata split remain off" +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/inspected-summary.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/inspected-summary.json new file mode 100644 index 0000000..ab38143 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/inspected-summary.json @@ -0,0 +1,88 @@ +{ + "source": "cad7508f8f4375735c0651c5e0aa5929f3b57700", + "wheel_sha256": "e466146e5ba77e68470eea7cca86d7beb84d42c3dfe3a7ac7e15ca06a6530660", + "total": 190, + "passed": 187, + "failed": 3, + "skipped": 0, + "by_module": { + "test_browser_cdp_cli": 3, + "test_browser_durable_authority": 49, + "test_browser_guard": 6, + "test_browser_holder": 18, + "test_browser_restart_cli": 3, + "test_cdp_click": 30, + "test_cdp_click_contract": 33, + "test_cdp_effector": 17, + "test_cdp_launch_custody": 10, + "test_cdp_transport_deadline": 21 + }, + "failure_cases": [ + "test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", + "test_cli_recovers_abrupt_holder_death_without_redispatch[started]", + "test_cli_recovers_abrupt_holder_death_without_redispatch[retained]" + ], + "assessment": "not a clean qualification: test-only collector Path(Popen) errors bypassed fixture cleanup", + "cells": { + "client-lost-ack": { + "fixture_records": [ + [ + "intended" + ] + ], + "markers": [], + "helper_receipts": 9 + }, + "missing-guard": { + "fixture_records": [ + [] + ], + "markers": [], + "helper_receipts": 5 + }, + "prepared": { + "fixture_records": [ + [] + ], + "markers": [ + { + "boundary": "prepared", + "operation_id": "op_da3d2908bf86", + "ingress_before_exit": null, + "heavy_imports": [] + } + ], + "helper_receipts": 7 + }, + "started": { + "fixture_records": [ + [] + ], + "markers": [ + { + "boundary": "started", + "operation_id": "op_20043ef2b6d0", + "ingress_before_exit": null, + "heavy_imports": [] + } + ], + "helper_receipts": 7 + }, + "retained": { + "fixture_records": [ + [ + "intended" + ] + ], + "markers": [ + { + "boundary": "retained", + "operation_id": "op_89933f38bf72", + "ingress_before_exit": 1, + "heavy_imports": [] + } + ], + "helper_receipts": 7 + } + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/junit.xml b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/junit.xml new file mode 100644 index 0000000..b958a9a --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/junit.xml @@ -0,0 +1,476 @@ +boundary = 'prepared' +ingress = ('http://127.0.0.1:37135/', [], <threading.Event at 0x7f045c2e2fc0: unset>) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. + _test_cleanup(holder, identities) + fresh_session = root / "next" + blocked = _cli(root, "start", "Try a new intent", "--session", str(fresh_session), + "--authority", str(root / "authority.db"), "--url", url, success=False) + assert blocked["ok"] is False + assert not list(fresh_session.glob("profile-*")) + assert not (fresh_session / "holder.json").exists() + assert records == (["intended"] if boundary == "retained" else []) + finally: +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:282: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c47f8b0> +args = (<Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...>,) +paths = [] +arg = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> +path = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeErrorboundary = 'started' +ingress = ('http://127.0.0.1:37761/', [], <threading.Event at 0x7f045c377da0: unset>) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:273: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c17a810> +args = (<Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...>,) +paths = [] +arg = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> +path = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError + +During handling of the above exception, another exception occurred: + +boundary = 'started' +ingress = ('http://127.0.0.1:37761/', [], <threading.Event at 0x7f045c377da0: unset>) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. + _test_cleanup(holder, identities) + fresh_session = root / "next" + blocked = _cli(root, "start", "Try a new intent", "--session", str(fresh_session), + "--authority", str(root / "authority.db"), "--url", url, success=False) + assert blocked["ok"] is False + assert not list(fresh_session.glob("profile-*")) + assert not (fresh_session / "holder.json").exists() + assert records == (["intended"] if boundary == "retained" else []) + finally: +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:282: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c17a420> +args = (<Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...>,) +paths = [] +arg = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> +path = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeErrorboundary = 'retained' +ingress = ('http://127.0.0.1:46123/', ['intended'], <threading.Event at 0x7f045c374b30: set>) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:273: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c17a0a0> +args = (<Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...>,) +paths = [] +arg = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> +path = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError + +During handling of the above exception, another exception occurred: + +boundary = 'retained' +ingress = ('http://127.0.0.1:46123/', ['intended'], <threading.Event at 0x7f045c374b30: set>) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. + _test_cleanup(holder, identities) + fresh_session = root / "next" + blocked = _cli(root, "start", "Try a new intent", "--session", str(fresh_session), + "--authority", str(root / "authority.db"), "--url", url, success=False) + assert blocked["ok"] is False + assert not list(fresh_session.glob("profile-*")) + assert not (fresh_session / "holder.json").exists() + assert records == (["intended"] if boundary == "retained" else []) + finally: +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:282: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c17bf40> +args = (<Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...>,) +paths = [] +arg = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> +path = <Popen: returncode: 86 args: ['/workspace/scratch/footwork-durable-cdp-cad75...> + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError \ No newline at end of file diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/observer.jsonl b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/observer.jsonl new file mode 100644 index 0000000..ae218a4 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/observer.jsonl @@ -0,0 +1,925 @@ +{"kind": "pytest_report", "monotonic": 6556.893403785, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "phase": "setup", "outcome": "passed", "duration": 0.00015101400003914023, "longrepr": null} +{"kind": "spawn", "monotonic": 6556.894075531, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7211, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6556.992972536, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7211, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6556.99307656, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7211, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6556.993472277, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7211, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "09458eda566d93cb41bdedd11ced83077dcee7f7e0c0b284969858fcad58282f", "bytes": 6642, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"schema_version": "1", "entrypoint": "footwork", "global_options": {"--json": "Prefix before the command; preserves exit status and does not certify effects"}, "commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "agent_commands": ["tools", "catalog", "schema", "doctor", "invoke", "capability", "mcp", "tool"], "surfaces": {"browser": {"commands": ["start", "check-file", "do", "done", "grant", "inspect-target", "look", "read", "s1", "snapshot-file", "status", "visual-check", "cdp"], "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", "cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}}, "desktop": {"commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "route": "native Linux X11/AT-SPI; live target binding required"}}, "capability": {"commands": ["doctor", "config", "server", "report"], "scope": "one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified"}, "tools": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "effect_semantics": "Read action receipts and resource-bound readback; exit 0 alone is not completion proof"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"schema_version\": \"1\", \"entrypoint\": \"footwork\", \"global_options\": {\"--json\": \"Prefix before the command; preserves exit status and does not certify effects\"}, \"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"agent_commands\": [\"tools\", \"catalog\", \"schema\", \"doctor\", \"invoke\", \"capability\", \"mcp\", \"tool\"], \"surfaces\": {\"browser\": {\"commands\": [\"start\", \"check-file\", \"do\", \"done\", \"grant\", \"inspect-target\", \"look\", \"read\", \"s1\", \"snapshot-file\", \"status\", \"visual-check\", \"cdp\"], \"route\": \"dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)\", \"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}}, \"desktop\": {\"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"route\": \"native Linux X11/AT-SPI; live target binding required\"}}, \"capability\": {\"commands\": [\"doctor\", \"config\", \"server\", \"report\"], \"scope\": \"one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified\"}, \"tools\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"effect_semantics\": \"Read action receipts and resource-bound readback; exit 0 alone is not completion proof\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6556.993702277, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7211, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6556.993822686, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["tools"], "result": {"schema_version": "1", "entrypoint": "footwork", "global_options": {"--json": "Prefix before the command; preserves exit status and does not certify effects"}, "commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "agent_commands": ["tools", "catalog", "schema", "doctor", "invoke", "capability", "mcp", "tool"], "surfaces": {"browser": {"commands": ["start", "check-file", "do", "done", "grant", "inspect-target", "look", "read", "s1", "snapshot-file", "status", "visual-check", "cdp"], "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", "cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}}, "desktop": {"commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "route": "native Linux X11/AT-SPI; live target binding required"}}, "capability": {"commands": ["doctor", "config", "server", "report"], "scope": "one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified"}, "tools": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "effect_semantics": "Read action receipts and resource-bound readback; exit 0 alone is not completion proof"}} +{"kind": "spawn", "monotonic": 6556.994477507, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7212, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6557.134190184, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7212, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6557.134335659, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7212, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6557.135113843, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7212, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "eef4b6b8904a4a348d4c36a4025633fa7affb9801cfd97a4c76b41d9f854399b", "bytes": 12092, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"platform": "linux", "supported": true, "runtime": {"python_version": "3.12.14", "python_requirement": ">=3.11,<4.0", "python_compatible": true, "interpreter": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "architecture": "x86_64", "distribution": {"version": "0.0.1", "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages"}, "loaded_modules": {"jevdual": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/__init__.py", "jevdual.capability.setup": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py"}}, "dependencies": {"browser-use": {"version": null, "requirement": "==0.13.14", "compatible": false, "location": null}, "typesafe-sdk": {"version": null, "requirement": "<1,>=0.7", "compatible": false, "location": null}, "orjson": {"version": null, "requirement": ">=3.10", "compatible": false, "location": null}, "psutil": {"version": "7.2.2", "requirement": "==7.2.2", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages"}, "websockets": {"version": "15.0.1", "requirement": "==15.0.1", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages"}, "mcp": {"version": null, "requirement": "==2.1.1", "compatible": false, "location": null}, "packaging": {"version": "26.3", "requirement": "<27,>=25", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages"}, "cua-driver": {"version": null, "requirement": "==0.38.0+footwork.d5373879.cleanup2", "compatible": false, "location": null}, "jeepney": {"version": null, "requirement": "==0.9.0", "compatible": false, "location": null}}, "dependency_status": "blocked", "permissions": {"accessibility": "not_checked", "screen_recording": "not_checked", "session": {"x11_display_present": false, "dbus_session_present": false, "wayland_display_present": false, "connection": "not_checked"}, "requirements": ["An accessible X11 display and D-Bus desktop session.", "AT-SPI accessibility access to the explicitly bound process and window.", "Live observation and exact text readback before input; environment presence grants no access."]}, "scope": "not_checked", "journal": "not_checked", "warnings": ["Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified."], "dependency_metadata": "installed distribution", "limitation": "Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.", "runtime_qualification": "not_checked", "provider_account_required": false, "rust_toolchain_required": false, "blockers": ["dependency_missing", "accessibility_not_checked", "x11_display_not_configured", "session_bus_not_configured"], "prerequisite_status": "blocked", "qualification": "Prerequisites only. Window identity, current state, effects and job completion require separate checks.", "acceleration": {"component": "jevdual._core", "available": false, "status": "disabled", "backend": "pure-python", "scope": "Optional Jev Rust hot paths; independent of the CUA native driver"}, "host_prerequisites": {"schema_version": 1, "platform": "linux", "architecture": "x86_64", "kernel": "6.18.57", "libc": "glibc 2.41", "distribution": {"PRETTY_NAME": "Debian GNU/Linux 13 (trixie)", "VERSION_ID": "13", "ID": "debian"}, "python": {"version": "3.12.14", "pip_module": false, "venv_module": true, "ensurepip_module": true}, "resources": {"memory": {"total_bytes": 18882662400, "available_bytes": 17950654464}, "cgroup": {"versions": [2], "membership_readable": true, "memory_limit_bytes": 17179869184, "memory_remaining_bytes": 16183717888, "cpu_quota_cores": 4.0, "scope": "visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified", "null_limit_meaning": "no finite limit observed, not proof of unlimited resources", "pids_limit": null, "pids_remaining_upper_bound": null, "swap_limit_bytes": null, "memory_and_swap_limit_bytes": null, "task_swap_event_snapshots": [{"path": ".", "pids_limit": null, "pids_current": 52, "pids_events": {"max": 0}, "swap_limit_bytes": null, "swap_current_bytes": 0, "swap_events": {"high": 0, "max": 0, "fail": 0}, "memory_events": {"low": 0, "high": 0, "max": 0, "oom": 0, "oom_kill": 0, "oom_group_kill": 0}, "memory_failcnt": null, "memory_and_swap_failcnt": null}], "counter_scope": "bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown"}, "available_memory_upper_bound_bytes": 16183717888, "cpu_count": 5, "cpu_affinity_count": 5}, "process_supervision": {"pid1_comm": "tail", "self_parent_pid": 7210, "pid1_is_self": false, "orphan_reaping": "not_checked", "wait_ownership": "not_checked"}, "executables_present": {"uv": true, "pip": true, "pip3": true, "rustc": false, "cargo": false, "rustup": false, "cc": true, "clang": false, "pkg-config": true, "google-chrome": false, "google-chrome-stable": false, "chromium": true, "chromium-browser": false, "dbus-run-session": true, "dbus-send": true, "gdbus": true, "Xvfb": false, "node": true, "ffmpeg": true, "tesseract": true}, "session_indicators_present": {"DISPLAY": false, "WAYLAND_DISPLAY": false, "DBUS_SESSION_BUS_ADDRESS": false, "XDG_RUNTIME_DIR": false}, "prerequisite_candidates": {"browser_executable": true, "graphical_session_indicator": false, "session_bus_indicator": false}, "runtime_qualification": "unverified", "effect_verification": "not_asserted", "limitations": ["Executable and environment presence do not establish connection, permissions, or driver support.", "No browser, desktop, accessibility service, native CUA library, or provider was started or queried.", "Resource values are a transient upper bound, not a reservation or build-capacity guarantee.", "Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control."]}, "tool_families": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "browser_profiles": {"cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "prerequisite_presence": {"chrome": true, "psutil": true, "websockets": true, "jev_environment_configured": false, "judgment_adapter": "explicit per-session configuration; not checked by offline doctor"}, "runtime_qualification": "not_checked"}, "legacy": {"profile": "full-desktop", "requires": ["CUA", "X11/AT-SPI on Linux"]}}, "profile_note": "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.", "effect_verification": "not_asserted"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"platform\": \"linux\", \"supported\": true, \"runtime\": {\"python_version\": \"3.12.14\", \"python_requirement\": \">=3.11,<4.0\", \"python_compatible\": true, \"interpreter\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python\", \"architecture\": \"x86_64\", \"distribution\": {\"version\": \"0.0.1\", \"location\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages\"}, \"loaded_modules\": {\"jevdual\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/__init__.py\", \"jevdual.capability.setup\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py\"}}, \"dependencies\": {\"browser-use\": {\"version\": null, \"requirement\": \"==0.13.14\", \"compatible\": false, \"location\": null}, \"typesafe-sdk\": {\"version\": null, \"requirement\": \"<1,>=0.7\", \"compatible\": false, \"location\": null}, \"orjson\": {\"version\": null, \"requirement\": \">=3.10\", \"compatible\": false, \"location\": null}, \"psutil\": {\"version\": \"7.2.2\", \"requirement\": \"==7.2.2\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages\"}, \"websockets\": {\"version\": \"15.0.1\", \"requirement\": \"==15.0.1\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages\"}, \"mcp\": {\"version\": null, \"requirement\": \"==2.1.1\", \"compatible\": false, \"location\": null}, \"packaging\": {\"version\": \"26.3\", \"requirement\": \"<27,>=25\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages\"}, \"cua-driver\": {\"version\": null, \"requirement\": \"==0.38.0+footwork.d5373879.cleanup2\", \"compatible\": false, \"location\": null}, \"jeepney\": {\"version\": null, \"requirement\": \"==0.9.0\", \"compatible\": false, \"location\": null}}, \"dependency_status\": \"blocked\", \"permissions\": {\"accessibility\": \"not_checked\", \"screen_recording\": \"not_checked\", \"session\": {\"x11_display_present\": false, \"dbus_session_present\": false, \"wayland_display_present\": false, \"connection\": \"not_checked\"}, \"requirements\": [\"An accessible X11 display and D-Bus desktop session.\", \"AT-SPI accessibility access to the explicitly bound process and window.\", \"Live observation and exact text readback before input; environment presence grants no access.\"]}, \"scope\": \"not_checked\", \"journal\": \"not_checked\", \"warnings\": [\"Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified.\"], \"dependency_metadata\": \"installed distribution\", \"limitation\": \"Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.\", \"runtime_qualification\": \"not_checked\", \"provider_account_required\": false, \"rust_toolchain_required\": false, \"blockers\": [\"dependency_missing\", \"accessibility_not_checked\", \"x11_display_not_configured\", \"session_bus_not_configured\"], \"prerequisite_status\": \"blocked\", \"qualification\": \"Prerequisites only. Window identity, current state, effects and job completion require separate checks.\", \"acceleration\": {\"component\": \"jevdual._core\", \"available\": false, \"status\": \"disabled\", \"backend\": \"pure-python\", \"scope\": \"Optional Jev Rust hot paths; independent of the CUA native driver\"}, \"host_prerequisites\": {\"schema_version\": 1, \"platform\": \"linux\", \"architecture\": \"x86_64\", \"kernel\": \"6.18.57\", \"libc\": \"glibc 2.41\", \"distribution\": {\"PRETTY_NAME\": \"Debian GNU/Linux 13 (trixie)\", \"VERSION_ID\": \"13\", \"ID\": \"debian\"}, \"python\": {\"version\": \"3.12.14\", \"pip_module\": false, \"venv_module\": true, \"ensurepip_module\": true}, \"resources\": {\"memory\": {\"total_bytes\": 18882662400, \"available_bytes\": 17950654464}, \"cgroup\": {\"versions\": [2], \"membership_readable\": true, \"memory_limit_bytes\": 17179869184, \"memory_remaining_bytes\": 16183717888, \"cpu_quota_cores\": 4.0, \"scope\": \"visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified\", \"null_limit_meaning\": \"no finite limit observed, not proof of unlimited resources\", \"pids_limit\": null, \"pids_remaining_upper_bound\": null, \"swap_limit_bytes\": null, \"memory_and_swap_limit_bytes\": null, \"task_swap_event_snapshots\": [{\"path\": \".\", \"pids_limit\": null, \"pids_current\": 52, \"pids_events\": {\"max\": 0}, \"swap_limit_bytes\": null, \"swap_current_bytes\": 0, \"swap_events\": {\"high\": 0, \"max\": 0, \"fail\": 0}, \"memory_events\": {\"low\": 0, \"high\": 0, \"max\": 0, \"oom\": 0, \"oom_kill\": 0, \"oom_group_kill\": 0}, \"memory_failcnt\": null, \"memory_and_swap_failcnt\": null}], \"counter_scope\": \"bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown\"}, \"available_memory_upper_bound_bytes\": 16183717888, \"cpu_count\": 5, \"cpu_affinity_count\": 5}, \"process_supervision\": {\"pid1_comm\": \"tail\", \"self_parent_pid\": 7210, \"pid1_is_self\": false, \"orphan_reaping\": \"not_checked\", \"wait_ownership\": \"not_checked\"}, \"executables_present\": {\"uv\": true, \"pip\": true, \"pip3\": true, \"rustc\": false, \"cargo\": false, \"rustup\": false, \"cc\": true, \"clang\": false, \"pkg-config\": true, \"google-chrome\": false, \"google-chrome-stable\": false, \"chromium\": true, \"chromium-browser\": false, \"dbus-run-session\": true, \"dbus-send\": true, \"gdbus\": true, \"Xvfb\": false, \"node\": true, \"ffmpeg\": true, \"tesseract\": true}, \"session_indicators_present\": {\"DISPLAY\": false, \"WAYLAND_DISPLAY\": false, \"DBUS_SESSION_BUS_ADDRESS\": false, \"XDG_RUNTIME_DIR\": false}, \"prerequisite_candidates\": {\"browser_executable\": true, \"graphical_session_indicator\": false, \"session_bus_indicator\": false}, \"runtime_qualification\": \"unverified\", \"effect_verification\": \"not_asserted\", \"limitations\": [\"Executable and environment presence do not establish connection, permissions, or driver support.\", \"No browser, desktop, accessibility service, native CUA library, or provider was started or queried.\", \"Resource values are a transient upper bound, not a reservation or build-capacity guarantee.\", \"Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control.\"]}, \"tool_families\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"browser_profiles\": {\"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"prerequisite_presence\": {\"chrome\": true, \"psutil\": true, \"websockets\": true, \"jev_environment_configured\": false, \"judgment_adapter\": \"explicit per-session configuration; not checked by offline doctor\"}, \"runtime_qualification\": \"not_checked\"}, \"legacy\": {\"profile\": \"full-desktop\", \"requires\": [\"CUA\", \"X11/AT-SPI on Linux\"]}}, \"profile_note\": \"Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.\", \"effect_verification\": \"not_asserted\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6557.13547649, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7212, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6557.135581556, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["doctor"], "result": {"platform": "linux", "supported": true, "runtime": {"python_version": "3.12.14", "python_requirement": ">=3.11,<4.0", "python_compatible": true, "interpreter": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "architecture": "x86_64", "distribution": {"version": "0.0.1", "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages"}, "loaded_modules": {"jevdual": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/__init__.py", "jevdual.capability.setup": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py"}}, "dependencies": {"browser-use": {"version": null, "requirement": "==0.13.14", "compatible": false, "location": null}, "typesafe-sdk": {"version": null, "requirement": "<1,>=0.7", "compatible": false, "location": null}, "orjson": {"version": null, "requirement": ">=3.10", "compatible": false, "location": null}, "psutil": {"version": "7.2.2", "requirement": "==7.2.2", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages"}, "websockets": {"version": "15.0.1", "requirement": "==15.0.1", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages"}, "mcp": {"version": null, "requirement": "==2.1.1", "compatible": false, "location": null}, "packaging": {"version": "26.3", "requirement": "<27,>=25", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-cad7508/consumer/lib/python3.12/site-packages"}, "cua-driver": {"version": null, "requirement": "==0.38.0+footwork.d5373879.cleanup2", "compatible": false, "location": null}, "jeepney": {"version": null, "requirement": "==0.9.0", "compatible": false, "location": null}}, "dependency_status": "blocked", "permissions": {"accessibility": "not_checked", "screen_recording": "not_checked", "session": {"x11_display_present": false, "dbus_session_present": false, "wayland_display_present": false, "connection": "not_checked"}, "requirements": ["An accessible X11 display and D-Bus desktop session.", "AT-SPI accessibility access to the explicitly bound process and window.", "Live observation and exact text readback before input; environment presence grants no access."]}, "scope": "not_checked", "journal": "not_checked", "warnings": ["Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified."], "dependency_metadata": "installed distribution", "limitation": "Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.", "runtime_qualification": "not_checked", "provider_account_required": false, "rust_toolchain_required": false, "blockers": ["dependency_missing", "accessibility_not_checked", "x11_display_not_configured", "session_bus_not_configured"], "prerequisite_status": "blocked", "qualification": "Prerequisites only. Window identity, current state, effects and job completion require separate checks.", "acceleration": {"component": "jevdual._core", "available": false, "status": "disabled", "backend": "pure-python", "scope": "Optional Jev Rust hot paths; independent of the CUA native driver"}, "host_prerequisites": {"schema_version": 1, "platform": "linux", "architecture": "x86_64", "kernel": "6.18.57", "libc": "glibc 2.41", "distribution": {"PRETTY_NAME": "Debian GNU/Linux 13 (trixie)", "VERSION_ID": "13", "ID": "debian"}, "python": {"version": "3.12.14", "pip_module": false, "venv_module": true, "ensurepip_module": true}, "resources": {"memory": {"total_bytes": 18882662400, "available_bytes": 17950654464}, "cgroup": {"versions": [2], "membership_readable": true, "memory_limit_bytes": 17179869184, "memory_remaining_bytes": 16183717888, "cpu_quota_cores": 4.0, "scope": "visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified", "null_limit_meaning": "no finite limit observed, not proof of unlimited resources", "pids_limit": null, "pids_remaining_upper_bound": null, "swap_limit_bytes": null, "memory_and_swap_limit_bytes": null, "task_swap_event_snapshots": [{"path": ".", "pids_limit": null, "pids_current": 52, "pids_events": {"max": 0}, "swap_limit_bytes": null, "swap_current_bytes": 0, "swap_events": {"high": 0, "max": 0, "fail": 0}, "memory_events": {"low": 0, "high": 0, "max": 0, "oom": 0, "oom_kill": 0, "oom_group_kill": 0}, "memory_failcnt": null, "memory_and_swap_failcnt": null}], "counter_scope": "bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown"}, "available_memory_upper_bound_bytes": 16183717888, "cpu_count": 5, "cpu_affinity_count": 5}, "process_supervision": {"pid1_comm": "tail", "self_parent_pid": 7210, "pid1_is_self": false, "orphan_reaping": "not_checked", "wait_ownership": "not_checked"}, "executables_present": {"uv": true, "pip": true, "pip3": true, "rustc": false, "cargo": false, "rustup": false, "cc": true, "clang": false, "pkg-config": true, "google-chrome": false, "google-chrome-stable": false, "chromium": true, "chromium-browser": false, "dbus-run-session": true, "dbus-send": true, "gdbus": true, "Xvfb": false, "node": true, "ffmpeg": true, "tesseract": true}, "session_indicators_present": {"DISPLAY": false, "WAYLAND_DISPLAY": false, "DBUS_SESSION_BUS_ADDRESS": false, "XDG_RUNTIME_DIR": false}, "prerequisite_candidates": {"browser_executable": true, "graphical_session_indicator": false, "session_bus_indicator": false}, "runtime_qualification": "unverified", "effect_verification": "not_asserted", "limitations": ["Executable and environment presence do not establish connection, permissions, or driver support.", "No browser, desktop, accessibility service, native CUA library, or provider was started or queried.", "Resource values are a transient upper bound, not a reservation or build-capacity guarantee.", "Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control."]}, "tool_families": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-cad7508/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "browser_profiles": {"cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "prerequisite_presence": {"chrome": true, "psutil": true, "websockets": true, "jev_environment_configured": false, "judgment_adapter": "explicit per-session configuration; not checked by offline doctor"}, "runtime_qualification": "not_checked"}, "legacy": {"profile": "full-desktop", "requires": ["CUA", "X11/AT-SPI on Linux"]}}, "profile_note": "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.", "effect_verification": "not_asserted"}} +{"kind": "spawn", "monotonic": 6557.136353365, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7213, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6557.200534179, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7213, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6557.20062943, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7213, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6557.200765782, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7213, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "fc39375dd5ed7c43bb2bb15e23a9713ad9c8438328e198d387e0325cd5e594fa", "bytes": 834, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"command": ["cdp", "click"], "arguments": [{"name": "help", "flags": ["-h", "--help"], "required": false, "nargs": 0, "choices": null, "help": "show this help message and exit", "default": "==SUPPRESS=="}, {"name": "session", "flags": ["--session"], "required": true, "nargs": null, "choices": null, "help": null, "default": null}, {"name": "ref", "flags": ["--ref"], "required": true, "nargs": null, "choices": null, "help": "opaque ref from the last look; never reselected by label", "default": null}, {"name": "token", "flags": ["--token"], "required": true, "nargs": null, "choices": null, "help": "stable token for this intended activation", "default": null}], "subcommands": []}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"command\": [\"cdp\", \"click\"], \"arguments\": [{\"name\": \"help\", \"flags\": [\"-h\", \"--help\"], \"required\": false, \"nargs\": 0, \"choices\": null, \"help\": \"show this help message and exit\", \"default\": \"==SUPPRESS==\"}, {\"name\": \"session\", \"flags\": [\"--session\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": null, \"default\": null}, {\"name\": \"ref\", \"flags\": [\"--ref\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"opaque ref from the last look; never reselected by label\", \"default\": null}, {\"name\": \"token\", \"flags\": [\"--token\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"stable token for this intended activation\", \"default\": null}], \"subcommands\": []}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6557.200836647, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7213, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6557.200888975, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["schema", "browser", "cdp", "click"], "result": {"command": ["cdp", "click"], "arguments": [{"name": "help", "flags": ["-h", "--help"], "required": false, "nargs": 0, "choices": null, "help": "show this help message and exit", "default": "==SUPPRESS=="}, {"name": "session", "flags": ["--session"], "required": true, "nargs": null, "choices": null, "help": null, "default": null}, {"name": "ref", "flags": ["--ref"], "required": true, "nargs": null, "choices": null, "help": "opaque ref from the last look; never reselected by label", "default": null}, {"name": "token", "flags": ["--token"], "required": true, "nargs": null, "choices": null, "help": "stable token for this intended activation", "default": null}], "subcommands": []}} +{"kind": "spawn", "monotonic": 6557.201406842, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7214, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6557.295655032, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7214, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6557.295751765, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7214, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6557.295945152, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7214, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "80c96660aef007556c2ec3c0eb530adb54b7f3aa985c13592e59e8f0fcaa4cf6", "bytes": 2717, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"package_version": "0.0.1", "profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "loop": ["start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", "look --session DIR; choose the exact opaque ref returned by this holder", "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", "recover --session DIR after holder loss: read-only recovery; no browser is launched", "stop --session DIR; retain the authority database and all unresolved operations"], "guard_adapter": {"configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses"}, "limits": ["An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol."]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"package_version\": \"0.0.1\", \"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"loop\": [\"start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL\", \"look --session DIR; choose the exact opaque ref returned by this holder\", \"click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence\", \"status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record\", \"recover --session DIR after holder loss: read-only recovery; no browser is launched\", \"stop --session DIR; retain the authority database and all unresolved operations\"], \"guard_adapter\": {\"configuration\": \"--guard-command FILE containing JSON argv, absolute executable first; trusted policy code\", \"stdin\": \"footwork.browser.guard.request v1: digest, task, targets, url, title, binding\", \"stdout\": \"{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}\", \"semantics\": \"same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses\"}, \"limits\": [\"An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.\", \"This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.\", \"A new token cannot clear an unresolved admission, even across sessions sharing this authority database.\", \"No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.\", \"The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.\", \"Initial URL loading can itself have website effects; it is setup outside the guarded click protocol.\"]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6557.296105179, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7214, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6557.296170135, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["browser", "cdp", "guide"], "result": {"package_version": "0.0.1", "profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "loop": ["start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", "look --session DIR; choose the exact opaque ref returned by this holder", "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", "recover --session DIR after holder loss: read-only recovery; no browser is launched", "stop --session DIR; retain the authority database and all unresolved operations"], "guard_adapter": {"configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses"}, "limits": ["An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol."]}} +{"kind": "spawn", "monotonic": 6557.296707391, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7215, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6557.373454532, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7215, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 2, "signal": null} +{"kind": "wait", "monotonic": 6557.373550724, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7215, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 2, "signal": null} +{"kind": "communicate", "monotonic": 6557.373645064, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7215, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 2, "signal": null, "stdout": {"sha256": "5e02584e3273c1b284ad62c3dbded09e37e153ba8a5cb7c704b3b84583f77cd2", "bytes": 400, "json": {"schema_version": "1", "exit_code": 2, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "usage: footwork browser cdp [-h]\n {start,look,click,status,recover,stop,guide} ...\nfootwork browser cdp: error: argument command: invalid choice: 'type' (choose from start, look, click, status, recover, stop, guide)\n", "data": null}, "text": "{\"schema_version\": \"1\", \"exit_code\": 2, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"usage: footwork browser cdp [-h]\\n {start,look,click,status,recover,stop,guide} ...\\nfootwork browser cdp: error: argument command: invalid choice: 'type' (choose from start, look, click, status, recover, stop, guide)\\n\", \"data\": null}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6557.3737302, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 7215, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 2, "signal": null} +{"kind": "pytest_report", "monotonic": 6557.374068492, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "phase": "call", "outcome": "passed", "duration": 0.4804194729995288, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6557.378318441, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "phase": "teardown", "outcome": "passed", "duration": 0.000171384000168473, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6557.381436533, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "phase": "setup", "outcome": "passed", "duration": 0.0027743219998228597, "longrepr": null} +{"kind": "spawn", "monotonic": 6557.382147927, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6558.06751731, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6558.067615546, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6558.067747662, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "560d28c1bac7f57cfb0dd3c68a76b4620bdcfcfa61e33e90bd2ff68c455b24ea", "bytes": 1202, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "operations": []}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_74a654f1b3e640d2b5ea052282189291\", \"profile\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}, \"holder\": {\"ok\": true, \"session_id\": \"cdp_74a654f1b3e640d2b5ea052282189291\", \"operations\": []}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6558.06782087, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7217, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6558.067880419, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--authority", "/tmp/fw-cdp-g2e_lzz_/authority.db", "--url", "http://127.0.0.1:33757/", "--guard-command", "/tmp/fw-cdp-g2e_lzz_/guard-argv.json"], "result": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "operations": []}}} +{"kind": "session_snapshot", "monotonic": 6558.068305549, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-g2e_lzz_", "files": [{"path": "/tmp/fw-cdp-g2e_lzz_/session/browser.json", "sha256": "7775f016f8fa6425e059def01f88affaeeecb0a3b62e01322a6d4311b34ee153", "mtime_ns": 1793472991824295048, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:33757/", "authority": "/tmp/fw-cdp-g2e_lzz_/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-cdp-g2e_lzz_/guard.py"]}}, {"path": "/tmp/fw-cdp-g2e_lzz_/session/holder.json", "sha256": "e7afc125d7a17878b4dcca7e09c2a4d33ff84cc4593b984c5a9138a802c5046c", "mtime_ns": 1793472992369812438, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7218, "start": "1793472991.46", "nonce": {"redacted_nonce_sha256": "aa1651c649dc2e043f1f3829b3ef6289bd011580c91cc71d0b6abe8060b258e5"}, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "socket": "/tmp/fw-cdp-g2e_lzz_/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6558.068511644, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-g2e_lzz_", "files": [{"path": "/tmp/fw-cdp-g2e_lzz_/session/browser.json", "sha256": "7775f016f8fa6425e059def01f88affaeeecb0a3b62e01322a6d4311b34ee153", "mtime_ns": 1793472991824295048, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:33757/", "authority": "/tmp/fw-cdp-g2e_lzz_/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-cdp-g2e_lzz_/guard.py"]}}, {"path": "/tmp/fw-cdp-g2e_lzz_/session/holder.json", "sha256": "e7afc125d7a17878b4dcca7e09c2a4d33ff84cc4593b984c5a9138a802c5046c", "mtime_ns": 1793472992369812438, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7218, "start": "1793472991.46", "nonce": {"redacted_nonce_sha256": "aa1651c649dc2e043f1f3829b3ef6289bd011580c91cc71d0b6abe8060b258e5"}, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "socket": "/tmp/fw-cdp-g2e_lzz_/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6558.069031354, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6558.194336843, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6558.194430942, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6558.19457104, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "885fd32898ab16ed9d61a71156a6598292f1a35a2618f040401472bc134bad85", "bytes": 954, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:33757/", "title": "Durable fixture"}, "snapshot": {"id": "fdf7f80a4f48", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "fdf7f80a4f48:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "fdf7f80a4f48:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "DEFBC106547B3D2415B90717222D54AF", "loader_id": "6998FC5820B14CF02CEBE5B366490349"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_74a654f1b3e640d2b5ea052282189291\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:33757/\", \"title\": \"Durable fixture\"}, \"snapshot\": {\"id\": \"fdf7f80a4f48\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"fdf7f80a4f48:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}, {\"ref\": \"fdf7f80a4f48:2\", \"role\": \"button\", \"name\": \"Sentinel\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"DEFBC106547B3D2415B90717222D54AF\", \"loader_id\": \"6998FC5820B14CF02CEBE5B366490349\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6558.194664338, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7333, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6558.194844495, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "look", "--session", "/tmp/fw-cdp-g2e_lzz_/session"], "result": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:33757/", "title": "Durable fixture"}, "snapshot": {"id": "fdf7f80a4f48", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "fdf7f80a4f48:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "fdf7f80a4f48:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "DEFBC106547B3D2415B90717222D54AF", "loader_id": "6998FC5820B14CF02CEBE5B366490349"}}}} +{"kind": "session_snapshot", "monotonic": 6558.195075758, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-g2e_lzz_", "files": [{"path": "/tmp/fw-cdp-g2e_lzz_/session/browser.json", "sha256": "7775f016f8fa6425e059def01f88affaeeecb0a3b62e01322a6d4311b34ee153", "mtime_ns": 1793472991824295048, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:33757/", "authority": "/tmp/fw-cdp-g2e_lzz_/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-cdp-g2e_lzz_/guard.py"]}}, {"path": "/tmp/fw-cdp-g2e_lzz_/session/holder.json", "sha256": "e7afc125d7a17878b4dcca7e09c2a4d33ff84cc4593b984c5a9138a802c5046c", "mtime_ns": 1793472992369812438, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7218, "start": "1793472991.46", "nonce": {"redacted_nonce_sha256": "aa1651c649dc2e043f1f3829b3ef6289bd011580c91cc71d0b6abe8060b258e5"}, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "socket": "/tmp/fw-cdp-g2e_lzz_/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6558.196276097, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7334, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--ref", "fdf7f80a4f48:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6558.35635145, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7334, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--ref", "fdf7f80a4f48:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": -9, "signal": 9} +{"kind": "wait", "monotonic": 6558.356459901, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7334, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--ref", "fdf7f80a4f48:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": -9, "signal": 9} +{"kind": "communicate", "monotonic": 6558.356568692, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7334, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--ref", "fdf7f80a4f48:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": -9, "signal": 9, "stdout": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "session_snapshot", "monotonic": 6559.857387749, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-g2e_lzz_", "files": [{"path": "/tmp/fw-cdp-g2e_lzz_/session/browser.json", "sha256": "7775f016f8fa6425e059def01f88affaeeecb0a3b62e01322a6d4311b34ee153", "mtime_ns": 1793472991824295048, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:33757/", "authority": "/tmp/fw-cdp-g2e_lzz_/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-cdp-g2e_lzz_/guard.py"]}}, {"path": "/tmp/fw-cdp-g2e_lzz_/session/holder.json", "sha256": "e7afc125d7a17878b4dcca7e09c2a4d33ff84cc4593b984c5a9138a802c5046c", "mtime_ns": 1793472992369812438, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7218, "start": "1793472991.46", "nonce": {"redacted_nonce_sha256": "aa1651c649dc2e043f1f3829b3ef6289bd011580c91cc71d0b6abe8060b258e5"}, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "socket": "/tmp/fw-cdp-g2e_lzz_/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6559.857944504, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7336, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests"} +{"kind": "wait", "monotonic": 6559.942188075, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7336, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6559.942330236, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7336, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6559.942586246, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 7336, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-g2e_lzz_/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-cad7508/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "98ba7a9b47b87bfdf6068efeb08210b18d9dd60c0111e7fe5a61c14e343f1859", "bytes": 5145, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_74a654f1b3e640d2b5ea052282189291", "operations": [{"id": "op_4936d669a0f2", "task": "cdp_74a654f1b3e640d2b5ea052282189291", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5A8B439207B903F1F9ADBFA971621937\",\"pid\":7220,\"start\":\"1793472991.54\",\"target\":\"DEFBC106547B3D2415B90717222D54AF\"}", "observation": "fdf7f80a4f48:1", "target": "7", "move": "click", "args": {"ref": "fdf7f80a4f48:1", "route": "dom_event_native_button"}, "request_digest": "39fe834470320c66e1834022e430797491f789f69a877f94b73870876da1be1a", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "5A8B439207B903F1F9ADBFA971621937", "cdp_session": "1161E0E0A932CBD8C4C541B5DA007B9E", "document_token": "5d3fc295ce059853e0843884ec8eb915", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'});let t=Date.now()+1200;while(Date.now())\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n _test_cleanup(holder, identities)\n fresh_session = root / \"next\"\n blocked = _cli(root, \"start\", \"Try a new intent\", \"--session\", str(fresh_session),\n \"--authority\", str(root / \"authority.db\"), \"--url\", url, success=False)\n assert blocked[\"ok\"] is False\n assert not list(fresh_session.glob(\"profile-*\"))\n assert not (fresh_session / \"holder.json\").exists()\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n finally:\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:282: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c47f8b0>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError"} +{"kind": "independent_fixture_records", "monotonic": 6564.023023012, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", "fixture": "ingress", "url": "http://127.0.0.1:37135/", "records": []} +{"kind": "pytest_report", "monotonic": 6564.256557686, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared]", "phase": "teardown", "outcome": "passed", "duration": 0.23298249599974952, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6564.257561289, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "phase": "setup", "outcome": "passed", "duration": 0.0006279060007727821, "longrepr": null} +{"kind": "spawn", "monotonic": 6564.258565097, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 29, "process_kind": "test_only_holder_shim", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7605, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "-c", {"test_script_sha256": "2bc2b9b43581e039c0a135d7b912ca485301be56f7dcf026911f94cceb440c1e", "characters": 1742}, "/tmp/fw-crash-lfmqsw5x/session", "started"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "session_snapshot", "monotonic": 6564.703525284, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__setup", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6564.70391379, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6564.707271467, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6564.828782257, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6564.828883637, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6564.829014231, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "b8e64e4b5f51d26baa1f0bbf7bd81ad903f09f173096a4b36f300d36810dbcde", "bytes": 787, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "restart-fixture", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:37761/", "title": "Restart boundary"}, "snapshot": {"id": "720ae8e1bddb", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "720ae8e1bddb:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "D7C29F287E4850DD12572CC8FF7D12B6", "loader_id": "FEFF3672F2EA2D73F51E225CCC976925"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"restart-fixture\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:37761/\", \"title\": \"Restart boundary\"}, \"snapshot\": {\"id\": \"720ae8e1bddb\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"720ae8e1bddb:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"D7C29F287E4850DD12572CC8FF7D12B6\", \"loader_id\": \"FEFF3672F2EA2D73F51E225CCC976925\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6564.829087149, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 30, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7717, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6564.829147879, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "look", "--session", "/tmp/fw-crash-lfmqsw5x/session"], "result": {"ok": true, "session_id": "restart-fixture", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:37761/", "title": "Restart boundary"}, "snapshot": {"id": "720ae8e1bddb", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "720ae8e1bddb:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "D7C29F287E4850DD12572CC8FF7D12B6", "loader_id": "FEFF3672F2EA2D73F51E225CCC976925"}}}} +{"kind": "session_snapshot", "monotonic": 6564.829432181, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6564.830685208, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6564.831252038, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6564.977109784, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "wait", "monotonic": 6564.977231684, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "communicate", "monotonic": 6564.977336269, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null, "stdout": {"sha256": "607553ea9eecc8f11f1b890e7f1676dbace803e50f334dd6149e0e52c4290761", "bytes": 239, "json": {"schema_version": "1", "exit_code": 3, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": false, "code": "browser_response_unknown", "dispatched": null, "retryable": false}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 3, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": false, \"code\": \"browser_response_unknown\", \"dispatched\": null, \"retryable\": false}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6564.977400004, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 31, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7719, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "helper_return", "monotonic": 6564.977455887, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "result": {"ok": false, "code": "browser_response_unknown", "dispatched": null, "retryable": false}} +{"kind": "session_snapshot", "monotonic": 6564.977858123, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "wait", "monotonic": 6564.977968727, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 29, "process_kind": "test_only_holder_shim", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7605, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "-c", {"test_script_sha256": "2bc2b9b43581e039c0a135d7b912ca485301be56f7dcf026911f94cceb440c1e", "characters": 1742}, "/tmp/fw-crash-lfmqsw5x/session", "started"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 86, "signal": null} +{"kind": "session_snapshot", "monotonic": 6564.978181082, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6564.978860088, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.059654349, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6565.059754548, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6565.059905051, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "7ad0826decf2758e517ca5050361439c892bf5df96bfca999aa588c7d8f6eae0", "bytes": 1315, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"holder\": \"unavailable; no relaunch attempted\", \"session_id\": \"restart-fixture\", \"operations\": [{\"id\": \"op_20043ef2b6d0\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"5EB23C93CE04AEA7C57169EF540E8464\\\",\\\"pid\\\":7607,\\\"start\\\":\\\"1793472998.33\\\",\\\"target\\\":\\\"D7C29F287E4850DD12572CC8FF7D12B6\\\"}\", \"observation\": \"720ae8e1bddb:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"720ae8e1bddb:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"ambiguous\", \"evidence\": {}, \"error\": \"process ended during dispatch\", \"resolved_by\": null, \"history\": [{\"t\": 1793472999.3239045, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793472999.324241, \"kind\": \"dispatch_started\"}, {\"t\": 1793472999.4091787, \"kind\": \"recovered_unknown\"}], \"created\": 1793472999.3237054, \"updated\": 1793472999.409095, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.059983687, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 32, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7721, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6565.060260968, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "recover", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "result": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}} +{"kind": "session_snapshot", "monotonic": 6565.060603776, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6565.060933565, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6565.061919917, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.141053967, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6565.141154867, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6565.141351048, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "7ad0826decf2758e517ca5050361439c892bf5df96bfca999aa588c7d8f6eae0", "bytes": 1315, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"holder\": \"unavailable; no relaunch attempted\", \"session_id\": \"restart-fixture\", \"operations\": [{\"id\": \"op_20043ef2b6d0\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"5EB23C93CE04AEA7C57169EF540E8464\\\",\\\"pid\\\":7607,\\\"start\\\":\\\"1793472998.33\\\",\\\"target\\\":\\\"D7C29F287E4850DD12572CC8FF7D12B6\\\"}\", \"observation\": \"720ae8e1bddb:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"720ae8e1bddb:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"ambiguous\", \"evidence\": {}, \"error\": \"process ended during dispatch\", \"resolved_by\": null, \"history\": [{\"t\": 1793472999.3239045, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793472999.324241, \"kind\": \"dispatch_started\"}, {\"t\": 1793472999.4091787, \"kind\": \"recovered_unknown\"}], \"created\": 1793472999.3237054, \"updated\": 1793472999.409095, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.141431297, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 33, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7722, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6565.141494781, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "status", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--token", "intent-1"], "result": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}} +{"kind": "session_snapshot", "monotonic": 6565.141731011, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6565.141928143, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6565.142549394, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.223768454, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6565.223861723, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6565.224037573, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "0c29c6f72f9815f8e5477a8d17e8e1ede0453242d7217e8c8ae2ca2377d30a64", "bytes": 1274, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"replayed\": true, \"holder\": \"unavailable\", \"operation\": {\"id\": \"op_20043ef2b6d0\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"5EB23C93CE04AEA7C57169EF540E8464\\\",\\\"pid\\\":7607,\\\"start\\\":\\\"1793472998.33\\\",\\\"target\\\":\\\"D7C29F287E4850DD12572CC8FF7D12B6\\\"}\", \"observation\": \"720ae8e1bddb:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"720ae8e1bddb:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"ambiguous\", \"evidence\": {}, \"error\": \"process ended during dispatch\", \"resolved_by\": null, \"history\": [{\"t\": 1793472999.3239045, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793472999.324241, \"kind\": \"dispatch_started\"}, {\"t\": 1793472999.4091787, \"kind\": \"recovered_unknown\"}], \"created\": 1793472999.3237054, \"updated\": 1793472999.409095, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.22414968, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 34, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7723, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6565.224257029, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "result": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}} +{"kind": "session_snapshot", "monotonic": 6565.224524815, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6565.224719394, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6565.225321867, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.309661492, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6565.309763704, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6565.309910041, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null, "stdout": {"sha256": "0c29c6f72f9815f8e5477a8d17e8e1ede0453242d7217e8c8ae2ca2377d30a64", "bytes": 1274, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"replayed\": true, \"holder\": \"unavailable\", \"operation\": {\"id\": \"op_20043ef2b6d0\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"5EB23C93CE04AEA7C57169EF540E8464\\\",\\\"pid\\\":7607,\\\"start\\\":\\\"1793472998.33\\\",\\\"target\\\":\\\"D7C29F287E4850DD12572CC8FF7D12B6\\\"}\", \"observation\": \"720ae8e1bddb:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"720ae8e1bddb:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"ambiguous\", \"evidence\": {}, \"error\": \"process ended during dispatch\", \"resolved_by\": null, \"history\": [{\"t\": 1793472999.3239045, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793472999.324241, \"kind\": \"dispatch_started\"}, {\"t\": 1793472999.4091787, \"kind\": \"recovered_unknown\"}], \"created\": 1793472999.3237054, \"updated\": 1793472999.409095, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.309991091, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 35, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7724, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6565.310053734, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-1"], "result": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_20043ef2b6d0", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"5EB23C93CE04AEA7C57169EF540E8464\",\"pid\":7607,\"start\":\"1793472998.33\",\"target\":\"D7C29F287E4850DD12572CC8FF7D12B6\"}", "observation": "720ae8e1bddb:1", "target": "7", "move": "click", "args": {"ref": "720ae8e1bddb:1", "route": "dom_event_native_button"}, "request_digest": "379512119d22feb9bbf633933c28ab6ed7d7ffd1d3d263701d271b6228c94174", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "ambiguous", "evidence": {}, "error": "process ended during dispatch", "resolved_by": null, "history": [{"t": 1793472999.3239045, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793472999.324241, "kind": "dispatch_started"}, {"t": 1793472999.4091787, "kind": "recovered_unknown"}], "created": 1793472999.3237054, "updated": 1793472999.409095, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}} +{"kind": "session_snapshot", "monotonic": 6565.31032091, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6565.310518943, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "before__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6565.31111723, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x"} +{"kind": "wait", "monotonic": 6565.394250528, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "wait", "monotonic": 6565.394449883, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "communicate", "monotonic": 6565.394559496, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null, "stdout": {"sha256": "c573ecde228329a1555ee90b85ef07827458df065705be0e8ee1e3130f866b11", "bytes": 308, "json": {"schema_version": "1", "exit_code": 3, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": false, "code": "browser_session_unavailable", "message": "request refused; inspect retained authority; no automatic retry", "error_type": "ValueError"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 3, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": false, \"code\": \"browser_session_unavailable\", \"message\": \"request refused; inspect retained authority; no automatic retry\", \"error_type\": \"ValueError\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6565.394611513, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "process_number": 36, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "pid": 7746, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-lfmqsw5x", "returncode": 3, "signal": null} +{"kind": "helper_return", "monotonic": 6565.394666495, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "helper": "_cli", "arguments": ["/tmp/fw-crash-lfmqsw5x", "click", "--session", "/tmp/fw-crash-lfmqsw5x/session", "--ref", "720ae8e1bddb:1", "--token", "intent-2"], "result": {"ok": false, "code": "browser_session_unavailable", "message": "request refused; inspect retained authority; no automatic retry", "error_type": "ValueError"}} +{"kind": "session_snapshot", "monotonic": 6565.3948792, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "stage": "after__cli", "root": "/tmp/fw-crash-lfmqsw5x", "files": [{"path": "/tmp/fw-crash-lfmqsw5x/session/browser.json", "sha256": "f85cf11ceb6093c51d33004a719139883cdc69103ad8810ed8b1f9f80c250afb", "mtime_ns": 1793472998620338884, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:37761/", "authority": "/tmp/fw-crash-lfmqsw5x/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-lfmqsw5x/guard.py"]}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/holder.json", "sha256": "baccc2e88c1f2645b5e319e439453130ebbd825b2e538b8292448f46fea03732", "mtime_ns": 1793472999042567144, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7605, "start": "1793472998.25", "nonce": {"redacted_nonce_sha256": "bb7967c544ba4d6ccc645884417a7480281ba004e26de3e5b09887f81fa9b338"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-lfmqsw5x/session/holder.sock"}}, {"path": "/tmp/fw-crash-lfmqsw5x/session/test-boundary.json", "sha256": "bd7a391e763a3aeaaaad0bc826fd9216d1de350f38869d51b3e66ab9ed7fd6bf", "mtime_ns": 1793472999324478485, "mode": "0o600", "json": {"boundary": "started", "operation_id": "op_20043ef2b6d0", "ingress_before_exit": null, "heavy_imports": []}}]} +{"kind": "pytest_report", "monotonic": 6565.430825819, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "phase": "call", "outcome": "failed", "duration": 1.1384708400000818, "longrepr": "boundary = 'started'\ningress = ('http://127.0.0.1:37761/', [], )\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:273: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c17a810>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError\n\nDuring handling of the above exception, another exception occurred:\n\nboundary = 'started'\ningress = ('http://127.0.0.1:37761/', [], )\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n _test_cleanup(holder, identities)\n fresh_session = root / \"next\"\n blocked = _cli(root, \"start\", \"Try a new intent\", \"--session\", str(fresh_session),\n \"--authority\", str(root / \"authority.db\"), \"--url\", url, success=False)\n assert blocked[\"ok\"] is False\n assert not list(fresh_session.glob(\"profile-*\"))\n assert not (fresh_session / \"holder.json\").exists()\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n finally:\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:282: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c17a420>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError"} +{"kind": "independent_fixture_records", "monotonic": 6565.43092112, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "fixture": "ingress", "url": "http://127.0.0.1:37761/", "records": []} +{"kind": "pytest_report", "monotonic": 6565.654689352, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started]", "phase": "teardown", "outcome": "passed", "duration": 0.2231105969995042, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6565.655686129, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "phase": "setup", "outcome": "passed", "duration": 0.0006132389999038423, "longrepr": null} +{"kind": "spawn", "monotonic": 6565.656719931, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 37, "process_kind": "test_only_holder_shim", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7748, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "-c", {"test_script_sha256": "2bc2b9b43581e039c0a135d7b912ca485301be56f7dcf026911f94cceb440c1e", "characters": 1742}, "/tmp/fw-crash-7dr_6o74/session", "retained"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "session_snapshot", "monotonic": 6566.076653416, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__setup", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6566.076995423, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6566.077836309, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.206070595, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.206170834, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.206341917, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "8937079d56ee97b7f80afb1dc3dde6b671fe7c9896a2bdc4c32e0399eaa96ef8", "bytes": 787, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "restart-fixture", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:46123/", "title": "Restart boundary"}, "snapshot": {"id": "0983b856c340", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "0983b856c340:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "C0027B55C62C76CA1DFA440ECE19F069", "loader_id": "A96D07F9D985D29BBB04496E29D8B547"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"restart-fixture\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:46123/\", \"title\": \"Restart boundary\"}, \"snapshot\": {\"id\": \"0983b856c340\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"0983b856c340:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader_id\": \"A96D07F9D985D29BBB04496E29D8B547\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.206418601, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 38, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7860, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.206479641, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "look", "--session", "/tmp/fw-crash-7dr_6o74/session"], "result": {"ok": true, "session_id": "restart-fixture", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:46123/", "title": "Restart boundary"}, "snapshot": {"id": "0983b856c340", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "0983b856c340:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "C0027B55C62C76CA1DFA440ECE19F069", "loader_id": "A96D07F9D985D29BBB04496E29D8B547"}}}} +{"kind": "session_snapshot", "monotonic": 6566.206697975, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6566.208491914, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6566.209364387, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.386758024, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "wait", "monotonic": 6566.386859344, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "communicate", "monotonic": 6566.387049316, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null, "stdout": {"sha256": "607553ea9eecc8f11f1b890e7f1676dbace803e50f334dd6149e0e52c4290761", "bytes": 239, "json": {"schema_version": "1", "exit_code": 3, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": false, "code": "browser_response_unknown", "dispatched": null, "retryable": false}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 3, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": false, \"code\": \"browser_response_unknown\", \"dispatched\": null, \"retryable\": false}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.387111438, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 39, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7861, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "helper_return", "monotonic": 6566.387169123, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "result": {"ok": false, "code": "browser_response_unknown", "dispatched": null, "retryable": false}} +{"kind": "session_snapshot", "monotonic": 6566.387709745, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "wait", "monotonic": 6566.387817364, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 37, "process_kind": "test_only_holder_shim", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7748, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "-c", {"test_script_sha256": "2bc2b9b43581e039c0a135d7b912ca485301be56f7dcf026911f94cceb440c1e", "characters": 1742}, "/tmp/fw-crash-7dr_6o74/session", "retained"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 86, "signal": null} +{"kind": "session_snapshot", "monotonic": 6566.388089277, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.388748805, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.500277364, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.500393597, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.500659421, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "fb2f6d95878a8b553c7cea16379c57b52c767f26e409fc8e935f9ae1ae97d605", "bytes": 5156, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"holder\": \"unavailable; no relaunch attempted\", \"session_id\": \"restart-fixture\", \"operations\": [{\"id\": \"op_89933f38bf72\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"observation\": \"0983b856c340:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"0983b856c340:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"sent\", \"evidence\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"execution_receipt\": {\"basis\": \"activation_ack\", \"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"custody\": \"returned\", \"dispatched\": true, \"effect\": \"unverifiable\", \"error\": null, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"interval\": {\"end\": 1793473000.7103014, \"start\": 1793473000.70342}, \"kind\": \"browser_execution\", \"move\": \"click\", \"observation\": \"0983b856c340:1\", \"operation_id\": \"op_89933f38bf72\", \"phase\": \"sent\", \"producer\": {\"name\": \"footwork.browser.cdp\", \"version\": 1}, \"projection\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"reply\": {\"code\": null, \"dispatched\": true, \"route\": \"dom_event_native_button\", \"status\": \"ok\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"schema_version\": 1, \"session_id\": \"restart-fixture\", \"target\": \"7\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"prior_uncertainty\": {\"error\": \"process ended during dispatch\", \"phase\": \"ambiguous\"}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"error\": null, \"resolved_by\": null, \"history\": [{\"t\": 1793473000.703113, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793473000.7034364, \"kind\": \"dispatch_started\"}, {\"t\": 1793473000.7107244, \"kind\": \"browser_execution_retained\", \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, {\"t\": 1793473000.8473587, \"kind\": \"recovered_unknown\"}, {\"t\": 1793473000.848666, \"kind\": \"execution_reconciled\", \"disposition\": \"unknown\", \"phase\": \"sent\"}], \"created\": 1793473000.7029896, \"updated\": 1793473000.8486094, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.500797405, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 40, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7866, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.500898846, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "recover", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "result": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}} +{"kind": "session_snapshot", "monotonic": 6566.501173463, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6566.501398857, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.502082595, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.604897004, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.605001128, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.605355874, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "fb2f6d95878a8b553c7cea16379c57b52c767f26e409fc8e935f9ae1ae97d605", "bytes": 5156, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"holder\": \"unavailable; no relaunch attempted\", \"session_id\": \"restart-fixture\", \"operations\": [{\"id\": \"op_89933f38bf72\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"observation\": \"0983b856c340:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"0983b856c340:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"sent\", \"evidence\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"execution_receipt\": {\"basis\": \"activation_ack\", \"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"custody\": \"returned\", \"dispatched\": true, \"effect\": \"unverifiable\", \"error\": null, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"interval\": {\"end\": 1793473000.7103014, \"start\": 1793473000.70342}, \"kind\": \"browser_execution\", \"move\": \"click\", \"observation\": \"0983b856c340:1\", \"operation_id\": \"op_89933f38bf72\", \"phase\": \"sent\", \"producer\": {\"name\": \"footwork.browser.cdp\", \"version\": 1}, \"projection\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"reply\": {\"code\": null, \"dispatched\": true, \"route\": \"dom_event_native_button\", \"status\": \"ok\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"schema_version\": 1, \"session_id\": \"restart-fixture\", \"target\": \"7\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"prior_uncertainty\": {\"error\": \"process ended during dispatch\", \"phase\": \"ambiguous\"}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"error\": null, \"resolved_by\": null, \"history\": [{\"t\": 1793473000.703113, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793473000.7034364, \"kind\": \"dispatch_started\"}, {\"t\": 1793473000.7107244, \"kind\": \"browser_execution_retained\", \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, {\"t\": 1793473000.8473587, \"kind\": \"recovered_unknown\"}, {\"t\": 1793473000.848666, \"kind\": \"execution_reconciled\", \"disposition\": \"unknown\", \"phase\": \"sent\"}], \"created\": 1793473000.7029896, \"updated\": 1793473000.8486094, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.605531294, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 41, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7872, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.605638884, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "status", "--session", "/tmp/fw-crash-7dr_6o74/session", "--token", "intent-1"], "result": {"ok": true, "holder": "unavailable; no relaunch attempted", "session_id": "restart-fixture", "operations": [{"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}]}} +{"kind": "session_snapshot", "monotonic": 6566.606072647, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6566.606499409, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.607055664, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.703710793, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.703835157, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.704162512, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "d1127041e5f52f539da58663fb0f7553c67b83a2be4177ff724692e9592e7f23", "bytes": 5115, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"replayed\": true, \"holder\": \"unavailable\", \"operation\": {\"id\": \"op_89933f38bf72\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"observation\": \"0983b856c340:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"0983b856c340:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"sent\", \"evidence\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"execution_receipt\": {\"basis\": \"activation_ack\", \"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"custody\": \"returned\", \"dispatched\": true, \"effect\": \"unverifiable\", \"error\": null, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"interval\": {\"end\": 1793473000.7103014, \"start\": 1793473000.70342}, \"kind\": \"browser_execution\", \"move\": \"click\", \"observation\": \"0983b856c340:1\", \"operation_id\": \"op_89933f38bf72\", \"phase\": \"sent\", \"producer\": {\"name\": \"footwork.browser.cdp\", \"version\": 1}, \"projection\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"reply\": {\"code\": null, \"dispatched\": true, \"route\": \"dom_event_native_button\", \"status\": \"ok\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"schema_version\": 1, \"session_id\": \"restart-fixture\", \"target\": \"7\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"prior_uncertainty\": {\"error\": \"process ended during dispatch\", \"phase\": \"ambiguous\"}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"error\": null, \"resolved_by\": null, \"history\": [{\"t\": 1793473000.703113, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793473000.7034364, \"kind\": \"dispatch_started\"}, {\"t\": 1793473000.7107244, \"kind\": \"browser_execution_retained\", \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, {\"t\": 1793473000.8473587, \"kind\": \"recovered_unknown\"}, {\"t\": 1793473000.848666, \"kind\": \"execution_reconciled\", \"disposition\": \"unknown\", \"phase\": \"sent\"}], \"created\": 1793473000.7029896, \"updated\": 1793473000.8486094, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.704654071, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 42, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7873, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.704755872, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "result": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}} +{"kind": "session_snapshot", "monotonic": 6566.70516595, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6566.705474206, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.70604356, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.788409255, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6566.788509524, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6566.788779233, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null, "stdout": {"sha256": "d1127041e5f52f539da58663fb0f7553c67b83a2be4177ff724692e9592e7f23", "bytes": 5115, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"replayed\": true, \"holder\": \"unavailable\", \"operation\": {\"id\": \"op_89933f38bf72\", \"task\": \"restart-fixture\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"observation\": \"0983b856c340:1\", \"target\": \"7\", \"move\": \"click\", \"args\": {\"ref\": \"0983b856c340:1\", \"route\": \"dom_event_native_button\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"client_token\": \"intent-1\", \"state\": \"unknown\", \"disposition\": \"unknown\", \"phase\": \"sent\", \"evidence\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"execution_receipt\": {\"basis\": \"activation_ack\", \"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"custody\": \"returned\", \"dispatched\": true, \"effect\": \"unverifiable\", \"error\": null, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"interval\": {\"end\": 1793473000.7103014, \"start\": 1793473000.70342}, \"kind\": \"browser_execution\", \"move\": \"click\", \"observation\": \"0983b856c340:1\", \"operation_id\": \"op_89933f38bf72\", \"phase\": \"sent\", \"producer\": {\"name\": \"footwork.browser.cdp\", \"version\": 1}, \"projection\": {\"binding\": {\"backend_node\": 7, \"boot\": \"2ae8c489-cacb-4de9-872b-77459e8d3000\", \"browser_context\": \"ADAF03314A2024F9C5CDCC640CA9BF9D\", \"cdp_session\": \"9C0F86FE412A8C20381FBE056967CD05\", \"document_token\": \"476b87135eff14cc753cf54ad86307c9\", \"execution_context\": 3, \"fingerprint\": \"{\\\"tag\\\":\\\"button\\\",\\\"attrs\\\":[[\\\"onclick\\\",\\\"fetch('/ingress',{method:'POST',body:'intended'})\\\"],[\\\"type\\\",\\\"button\\\"]],\\\"text\\\":\\\"Commit fixture\\\",\\\"ancestors\\\":[{\\\"tag\\\":\\\"html\\\",\\\"attrs\\\":[]},{\\\"tag\\\":\\\"body\\\",\\\"attrs\\\":[]}]}\", \"frame\": \"C0027B55C62C76CA1DFA440ECE19F069\", \"loader\": \"A96D07F9D985D29BBB04496E29D8B547\", \"pid\": 7750, \"start\": \"1793472999.72\", \"target\": \"C0027B55C62C76CA1DFA440ECE19F069\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"protocol\": \"footwork.browser.cdp\", \"reply\": {\"code\": null, \"dispatched\": true, \"route\": \"dom_event_native_button\", \"status\": \"ok\"}, \"request_digest\": \"53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91\", \"resource\": \"browser:{\\\"boot\\\":\\\"2ae8c489-cacb-4de9-872b-77459e8d3000\\\",\\\"browser_context\\\":\\\"ADAF03314A2024F9C5CDCC640CA9BF9D\\\",\\\"pid\\\":7750,\\\"start\\\":\\\"1793472999.72\\\",\\\"target\\\":\\\"C0027B55C62C76CA1DFA440ECE19F069\\\"}\", \"schema_version\": 1, \"session_id\": \"restart-fixture\", \"target\": \"7\"}, \"guard\": {\"decision\": \"allow\", \"digest\": \"d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537\", \"producer\": \"footwork.browser.guard\", \"version\": 1}, \"prior_uncertainty\": {\"error\": \"process ended during dispatch\", \"phase\": \"ambiguous\"}, \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, \"error\": null, \"resolved_by\": null, \"history\": [{\"t\": 1793473000.703113, \"kind\": \"intent\", \"protocol\": 1, \"authorization\": \"configured_browser_guard\"}, {\"t\": 1793473000.7034364, \"kind\": \"dispatch_started\"}, {\"t\": 1793473000.7107244, \"kind\": \"browser_execution_retained\", \"protocol\": \"footwork.browser.cdp\", \"version\": 1}, {\"t\": 1793473000.8473587, \"kind\": \"recovered_unknown\"}, {\"t\": 1793473000.848666, \"kind\": \"execution_reconciled\", \"disposition\": \"unknown\", \"phase\": \"sent\"}], \"created\": 1793473000.7029896, \"updated\": 1793473000.8486094, \"recovery\": null, \"execution_stage\": \"started\", \"completion\": \"unverified\", \"retryable\": false}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.788936797, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 43, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7895, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6566.789028613, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-1"], "result": {"ok": true, "replayed": true, "holder": "unavailable", "operation": {"id": "op_89933f38bf72", "task": "restart-fixture", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "observation": "0983b856c340:1", "target": "7", "move": "click", "args": {"ref": "0983b856c340:1", "route": "dom_event_native_button"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "execution_receipt": {"basis": "activation_ack", "binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "custody": "returned", "dispatched": true, "effect": "unverifiable", "error": null, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "interval": {"end": 1793473000.7103014, "start": 1793473000.70342}, "kind": "browser_execution", "move": "click", "observation": "0983b856c340:1", "operation_id": "op_89933f38bf72", "phase": "sent", "producer": {"name": "footwork.browser.cdp", "version": 1}, "projection": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "ADAF03314A2024F9C5CDCC640CA9BF9D", "cdp_session": "9C0F86FE412A8C20381FBE056967CD05", "document_token": "476b87135eff14cc753cf54ad86307c9", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'})\"],[\"type\",\"button\"]],\"text\":\"Commit fixture\",\"ancestors\":[{\"tag\":\"html\",\"attrs\":[]},{\"tag\":\"body\",\"attrs\":[]}]}", "frame": "C0027B55C62C76CA1DFA440ECE19F069", "loader": "A96D07F9D985D29BBB04496E29D8B547", "pid": 7750, "start": "1793472999.72", "target": "C0027B55C62C76CA1DFA440ECE19F069"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "protocol": "footwork.browser.cdp", "version": 1}, "protocol": "footwork.browser.cdp", "reply": {"code": null, "dispatched": true, "route": "dom_event_native_button", "status": "ok"}, "request_digest": "53d424a3334b0d4ba90140b47224949f04eec80f9779ba64a707b7c5826cfc91", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"ADAF03314A2024F9C5CDCC640CA9BF9D\",\"pid\":7750,\"start\":\"1793472999.72\",\"target\":\"C0027B55C62C76CA1DFA440ECE19F069\"}", "schema_version": 1, "session_id": "restart-fixture", "target": "7"}, "guard": {"decision": "allow", "digest": "d2f3d33dc85bc1a1f68e5208f9d68d23fba3079f3150cfaf8b5b8ee926795537", "producer": "footwork.browser.guard", "version": 1}, "prior_uncertainty": {"error": "process ended during dispatch", "phase": "ambiguous"}, "protocol": "footwork.browser.cdp", "version": 1}, "error": null, "resolved_by": null, "history": [{"t": 1793473000.703113, "kind": "intent", "protocol": 1, "authorization": "configured_browser_guard"}, {"t": 1793473000.7034364, "kind": "dispatch_started"}, {"t": 1793473000.7107244, "kind": "browser_execution_retained", "protocol": "footwork.browser.cdp", "version": 1}, {"t": 1793473000.8473587, "kind": "recovered_unknown"}, {"t": 1793473000.848666, "kind": "execution_reconciled", "disposition": "unknown", "phase": "sent"}], "created": 1793473000.7029896, "updated": 1793473000.8486094, "recovery": null, "execution_stage": "started", "completion": "unverified", "retryable": false}}} +{"kind": "session_snapshot", "monotonic": 6566.789327316, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "session_snapshot", "monotonic": 6566.789554843, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "before__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "spawn", "monotonic": 6566.790170906, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74"} +{"kind": "wait", "monotonic": 6566.873084168, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "wait", "monotonic": 6566.873181622, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "communicate", "monotonic": 6566.873323493, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null, "stdout": {"sha256": "c573ecde228329a1555ee90b85ef07827458df065705be0e8ee1e3130f866b11", "bytes": 308, "json": {"schema_version": "1", "exit_code": 3, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": false, "code": "browser_session_unavailable", "message": "request refused; inspect retained authority; no automatic retry", "error_type": "ValueError"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 3, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": false, \"code\": \"browser_session_unavailable\", \"message\": \"request refused; inspect retained authority; no automatic retry\", \"error_type\": \"ValueError\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6566.873378174, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "process_number": 44, "process_kind": "public_cli", "owner_nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "pid": 7896, "argv": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "cwd": "/tmp/fw-crash-7dr_6o74", "returncode": 3, "signal": null} +{"kind": "helper_return", "monotonic": 6566.873442038, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "helper": "_cli", "arguments": ["/tmp/fw-crash-7dr_6o74", "click", "--session", "/tmp/fw-crash-7dr_6o74/session", "--ref", "0983b856c340:1", "--token", "intent-2"], "result": {"ok": false, "code": "browser_session_unavailable", "message": "request refused; inspect retained authority; no automatic retry", "error_type": "ValueError"}} +{"kind": "session_snapshot", "monotonic": 6566.873660052, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "stage": "after__cli", "root": "/tmp/fw-crash-7dr_6o74", "files": [{"path": "/tmp/fw-crash-7dr_6o74/session/browser.json", "sha256": "effa5c4ffbbbb0d1750833a0a1e6f095edc81946e8fe5075109a0870c7d1ca15", "mtime_ns": 1793473000018458977, "mode": "0o600", "json": {"version": 1, "session_id": "restart-fixture", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:46123/", "authority": "/tmp/fw-crash-7dr_6o74/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-cad7508/consumer/bin/python", "/tmp/fw-crash-7dr_6o74/guard.py"]}}, {"path": "/tmp/fw-crash-7dr_6o74/session/holder.json", "sha256": "15e147d9cc90059ca4f9373868d14ff276a9b60243163c79ff12b8fe01104861", "mtime_ns": 1793473000416848608, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 7748, "start": "1793472999.65", "nonce": {"redacted_nonce_sha256": "7871dbcb1a9d539a1fc220bf6030a234f92cc2a5f86e7bc3d53cded84b572432"}, "session_id": "restart-fixture", "socket": "/tmp/fw-crash-7dr_6o74/session/holder.sock"}}, {"path": "/tmp/fw-crash-7dr_6o74/session/test-boundary.json", "sha256": "df2f2d9753787866a439f41301563ce1344060511709a2c8b3a467d5dd1eca5e", "mtime_ns": 1793473000726794037, "mode": "0o600", "json": {"boundary": "retained", "operation_id": "op_89933f38bf72", "ingress_before_exit": 1, "heavy_imports": []}}]} +{"kind": "pytest_report", "monotonic": 6566.917819894, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "phase": "call", "outcome": "failed", "duration": 1.2190761060001023, "longrepr": "boundary = 'retained'\ningress = ('http://127.0.0.1:46123/', ['intended'], )\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:273: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c17a0a0>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError\n\nDuring handling of the above exception, another exception occurred:\n\nboundary = 'retained'\ningress = ('http://127.0.0.1:46123/', ['intended'], )\n\n @pytest.mark.browser\n @pytest.mark.parametrize(\"boundary\", [\"prepared\", \"started\", \"retained\"])\n def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress):\n url, records, arrived = ingress\n with tempfile.TemporaryDirectory(prefix=\"fw-crash-\", dir=\"/tmp\") as directory:\n root = Path(directory)\n session, holder, identities = _setup(root, url, boundary)\n try:\n snapshot = _cli(root, \"look\", \"--session\", str(session))[\"snapshot\"]\n ref = next(row[\"ref\"] for row in snapshot[\"refs\"] if row[\"name\"] == \"Commit fixture\")\n _inventory(holder, identities)\n invocation = (\"click\", \"--session\", str(session), \"--ref\", ref, \"--token\", \"intent-1\")\n interrupted = _cli(root, *invocation, success=False)\n assert holder.wait(timeout=10) == 86\n assert interrupted[\"ok\"] is False\n assert interrupted[\"dispatched\"] is None # transport loss itself proves no no-send predicate\n marker = json.loads((session / \"test-boundary.json\").read_text())\n assert marker[\"boundary\"] == boundary\n assert marker[\"heavy_imports\"] == []\n if boundary == \"retained\":\n assert arrived.wait(10), \"activation did not reach the independent fixture ingress\"\n assert marker[\"ingress_before_exit\"] == 1\n recovered = _cli(root, \"recover\", \"--session\", str(session), \"--token\", \"intent-1\")\n op = recovered[\"operations\"][0]\n assert op[\"id\"] == marker[\"operation_id\"]\n assert op[\"completion\"] == \"unverified\" and op[\"retryable\"] is False\n assert op[\"state\"] == (\"final\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"disposition\"] == (\"not_sent\" if boundary == \"prepared\" else \"unknown\")\n assert op[\"phase\"] == (\"not_sent\" if boundary == \"prepared\" else \"sent\" if boundary == \"retained\" else \"ambiguous\")\n if boundary == \"retained\":\n assert op[\"evidence\"][\"execution_receipt\"][\"basis\"] == \"activation_ack\"\n else:\n assert \"execution_receipt\" not in op[\"evidence\"]\n status = _cli(root, \"status\", \"--session\", str(session), \"--token\", \"intent-1\")\n assert status[\"operations\"] == recovered[\"operations\"]\n for _ in range(2):\n replay = _cli(root, *invocation)\n assert replay[\"replayed\"] is True and replay[\"operation\"][\"id\"] == op[\"id\"]\n assert replay[\"operation\"][\"disposition\"] == op[\"disposition\"]\n new_intent = _cli(root, *invocation[:-1], \"intent-2\", success=False)\n assert new_intent[\"ok\"] is False # offline recovery cannot grant a fresh mutation\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n if boundary != \"prepared\":\n # Remove abandoned test-owned custodians before starting another browser.\n # The public start route must reject this domain before launching Chrome.\n _test_cleanup(holder, identities)\n fresh_session = root / \"next\"\n blocked = _cli(root, \"start\", \"Try a new intent\", \"--session\", str(fresh_session),\n \"--authority\", str(root / \"authority.db\"), \"--url\", url, success=False)\n assert blocked[\"ok\"] is False\n assert not list(fresh_session.glob(\"profile-*\"))\n assert not (fresh_session / \"holder.json\").exists()\n assert records == ([\"intended\"] if boundary == \"retained\" else [])\n finally:\n> _test_cleanup(holder, identities)\n\ntest_browser_restart_cli.py:282: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n../receipt_plugin.py:153: in observed\n snapshots(root, 'before_' + name)\n../receipt_plugin.py:119: in snapshots\n root = Path(root)\n ^^^^^^^^^^\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__\n super().__init__(*args)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <[AttributeError(\"'PosixPath' object has no attribute '_raw_paths'\") raised in repr()] PosixPath object at 0x7f045c17bf40>\nargs = (,)\npaths = []\narg = \npath = \n\n def __init__(self, *args):\n paths = []\n for arg in args:\n if isinstance(arg, PurePath):\n if arg._flavour is not self._flavour:\n # GH-103631: Convert separators for backwards compatibility.\n paths.append(arg.as_posix())\n else:\n paths.extend(arg._raw_paths)\n else:\n try:\n path = os.fspath(arg)\n except TypeError:\n path = arg\n if not isinstance(path, str):\n> raise TypeError(\n \"argument should be a str or an os.PathLike \"\n \"object where __fspath__ returns a str, \"\n f\"not {type(path).__name__!r}\")\nE TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen'\n\n/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError"} +{"kind": "independent_fixture_records", "monotonic": 6566.918017998, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "fixture": "ingress", "url": "http://127.0.0.1:46123/", "records": ["intended"]} +{"kind": "pytest_report", "monotonic": 6567.365683059, "nodeid": "test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained]", "phase": "teardown", "outcome": "passed", "duration": 0.4469800659999237, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6567.568928529, "nodeid": "test_cdp_click.py::test_observation_marker_has_no_fixture_effect", "phase": "setup", "outcome": "passed", "duration": 0.2027545620003366, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6567.743115043, "nodeid": "test_cdp_click.py::test_observation_marker_has_no_fixture_effect", "phase": "call", "outcome": "passed", "duration": 0.1739090330002, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6567.743268861, "nodeid": "test_cdp_click.py::test_observation_marker_has_no_fixture_effect", "fixture": "ingress", "url": "http://127.0.0.1:36379/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6567.795380985, "nodeid": "test_cdp_click.py::test_observation_marker_has_no_fixture_effect", "phase": "teardown", "outcome": "passed", "duration": 0.05177772799925151, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6567.950448727, "nodeid": "test_cdp_click.py::test_native_button_activation_records_exactly_one_independent_ingress", "phase": "setup", "outcome": "passed", "duration": 0.1545432240000082, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6568.156443962, "nodeid": "test_cdp_click.py::test_native_button_activation_records_exactly_one_independent_ingress", "phase": "call", "outcome": "passed", "duration": 0.2057079899996097, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6568.156554656, "nodeid": "test_cdp_click.py::test_native_button_activation_records_exactly_one_independent_ingress", "fixture": "ingress", "url": "http://127.0.0.1:41041/fixture", "records": ["intended"]} +{"kind": "pytest_report", "monotonic": 6568.224116134, "nodeid": "test_cdp_click.py::test_native_button_activation_records_exactly_one_independent_ingress", "phase": "teardown", "outcome": "passed", "duration": 0.06716094400053407, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6568.379069366, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.textContent = 'Delete fixture']", "phase": "setup", "outcome": "passed", "duration": 0.1538006939999832, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6568.606431536, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.textContent = 'Delete fixture']", "phase": "call", "outcome": "passed", "duration": 0.22694287900048948, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6568.606614327, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.textContent = 'Delete fixture']", "fixture": "ingress", "url": "http://127.0.0.1:32883/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6568.642567696, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.textContent = 'Delete fixture']", "phase": "teardown", "outcome": "passed", "duration": 0.035629338000035204, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6568.797652689, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('data-record-id', 'other-record')]", "phase": "setup", "outcome": "passed", "duration": 0.1546608139997261, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6568.988280442, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('data-record-id', 'other-record')]", "phase": "call", "outcome": "passed", "duration": 0.19031120399995416, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6568.988393249, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('data-record-id', 'other-record')]", "fixture": "ingress", "url": "http://127.0.0.1:35305/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6569.055873266, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('data-record-id', 'other-record')]", "phase": "teardown", "outcome": "passed", "duration": 0.06683167600021989, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6569.209273682, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('type', 'submit')]", "phase": "setup", "outcome": "passed", "duration": 0.15262855099990702, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6569.3968284, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('type', 'submit')]", "phase": "call", "outcome": "passed", "duration": 0.1872966750006526, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6569.396903231, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('type', 'submit')]", "fixture": "ingress", "url": "http://127.0.0.1:40797/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6569.453534438, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('type', 'submit')]", "phase": "teardown", "outcome": "passed", "duration": 0.056365192999692226, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6569.6063962, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.disabled = true]", "phase": "setup", "outcome": "passed", "duration": 0.15234077999957663, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6569.814233766, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.disabled = true]", "phase": "call", "outcome": "passed", "duration": 0.2070386019995567, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6569.814318041, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.disabled = true]", "fixture": "ingress", "url": "http://127.0.0.1:33931/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6569.865656108, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.disabled = true]", "phase": "teardown", "outcome": "passed", "duration": 0.05106500199963193, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6570.018329166, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('aria-label', 'Delete fixture')]", "phase": "setup", "outcome": "passed", "duration": 0.15223108299960586, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6570.220579964, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('aria-label', 'Delete fixture')]", "phase": "call", "outcome": "passed", "duration": 0.20165987300060806, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6570.220665821, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('aria-label', 'Delete fixture')]", "fixture": "ingress", "url": "http://127.0.0.1:38751/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6570.27396887, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('aria-label', 'Delete fixture')]", "phase": "teardown", "outcome": "passed", "duration": 0.05302556799961167, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6570.42677971, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('data-customer-id', 'other')]", "phase": "setup", "outcome": "passed", "duration": 0.152342415000021, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6570.626998005, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('data-customer-id', 'other')]", "phase": "call", "outcome": "passed", "duration": 0.19987924199995177, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6570.627074448, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('data-customer-id', 'other')]", "fixture": "ingress", "url": "http://127.0.0.1:37901/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6570.683547705, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('data-customer-id', 'other')]", "phase": "teardown", "outcome": "passed", "duration": 0.0561704980000286, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6570.837506962, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let css=document.createElement('style'); css.textContent='#intended::before{content:\"Delete \"}'; document.head.append(css)]", "phase": "setup", "outcome": "passed", "duration": 0.1535278470000776, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6571.010414369, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let css=document.createElement('style'); css.textContent='#intended::before{content:\"Delete \"}'; document.head.append(css)]", "phase": "call", "outcome": "passed", "duration": 0.17253608600003645, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6571.010537541, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let css=document.createElement('style'); css.textContent='#intended::before{content:\"Delete \"}'; document.head.append(css)]", "fixture": "ingress", "url": "http://127.0.0.1:46247/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6571.074083606, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let css=document.createElement('style'); css.textContent='#intended::before{content:\"Delete \"}'; document.head.append(css)]", "phase": "teardown", "outcome": "passed", "duration": 0.06322022199947241, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6571.2284227, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.replaceWith(intended.cloneNode(true))]", "phase": "setup", "outcome": "passed", "duration": 0.15388046499992925, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6571.42813461, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.replaceWith(intended.cloneNode(true))]", "phase": "call", "outcome": "passed", "duration": 0.19946144800087495, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6571.428253106, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.replaceWith(intended.cloneNode(true))]", "fixture": "ingress", "url": "http://127.0.0.1:35593/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6571.492460206, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.replaceWith(intended.cloneNode(true))]", "phase": "teardown", "outcome": "passed", "duration": 0.06392711599983159, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6571.64560503, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('inert', '')]", "phase": "setup", "outcome": "passed", "duration": 0.15272736600036296, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6571.850058843, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('inert', '')]", "phase": "call", "outcome": "passed", "duration": 0.20417774399993505, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6571.850163668, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('inert', '')]", "fixture": "ingress", "url": "http://127.0.0.1:37987/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6571.904816282, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('inert', '')]", "phase": "teardown", "outcome": "passed", "duration": 0.05432259500048531, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6572.057889506, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let fieldset=document.createElement('fieldset'); fieldset.disabled=true; intended.before(fieldset); fieldset.append(intended)]", "phase": "setup", "outcome": "passed", "duration": 0.15221753500009072, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6572.234679927, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let fieldset=document.createElement('fieldset'); fieldset.disabled=true; intended.before(fieldset); fieldset.append(intended)]", "phase": "call", "outcome": "passed", "duration": 0.17653136700027972, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6572.234753406, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let fieldset=document.createElement('fieldset'); fieldset.disabled=true; intended.before(fieldset); fieldset.append(intended)]", "fixture": "ingress", "url": "http://127.0.0.1:38871/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6572.307437545, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let fieldset=document.createElement('fieldset'); fieldset.disabled=true; intended.before(fieldset); fieldset.append(intended)]", "phase": "teardown", "outcome": "passed", "duration": 0.07240452499991079, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6572.461535443, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let form=document.createElement('form'); intended.before(form); form.append(intended)]", "phase": "setup", "outcome": "passed", "duration": 0.15336586299963528, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6572.644143597, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let form=document.createElement('form'); intended.before(form); form.append(intended)]", "phase": "call", "outcome": "passed", "duration": 0.18170667800040974, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6572.64425376, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let form=document.createElement('form'); intended.before(form); form.append(intended)]", "fixture": "ingress", "url": "http://127.0.0.1:43661/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6572.678781276, "nodeid": "test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let form=document.createElement('form'); intended.before(form); form.append(intended)]", "phase": "teardown", "outcome": "passed", "duration": 0.034253258999342506, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6572.835367512, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.textContent='A'.repeat(121)+' Delete fixture'-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]", "phase": "setup", "outcome": "passed", "duration": 0.15616201700049714, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6573.026227221, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.textContent='A'.repeat(121)+' Delete fixture'-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]", "phase": "call", "outcome": "passed", "duration": 0.19061070099996869, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6573.026318286, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.textContent='A'.repeat(121)+' Delete fixture'-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]", "fixture": "ingress", "url": "http://127.0.0.1:39467/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6573.086615476, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.textContent='A'.repeat(121)+' Delete fixture'-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]", "phase": "teardown", "outcome": "passed", "duration": 0.06003183600023476, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6573.240558053, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('role','button')-Commit fixture]", "phase": "setup", "outcome": "passed", "duration": 0.15346365700042952, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6573.446639269, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('role','button')-Commit fixture]", "phase": "call", "outcome": "passed", "duration": 0.20582380300038494, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6573.446712577, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('role','button')-Commit fixture]", "fixture": "ingress", "url": "http://127.0.0.1:45913/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6573.513794007, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('role','button')-Commit fixture]", "phase": "teardown", "outcome": "passed", "duration": 0.06681161100004829, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6573.667715067, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.innerHTML='Commit fixture'-Commit fixture]", "phase": "setup", "outcome": "passed", "duration": 0.15345292599977256, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6573.867384395, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.innerHTML='Commit fixture'-Commit fixture]", "phase": "call", "outcome": "passed", "duration": 0.19903192299989314, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6573.867494768, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.innerHTML='Commit fixture'-Commit fixture]", "fixture": "ingress", "url": "http://127.0.0.1:38231/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6573.920100188, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.innerHTML='Commit fixture'-Commit fixture]", "phase": "teardown", "outcome": "passed", "duration": 0.05224941200049216, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6574.073230161, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[let name=document.createElement('span'); name.id='external'; name.textContent='Commit fixture'; document.body.append(name); intended.setAttribute('aria-labelledby','external')-Commit fixture]", "phase": "setup", "outcome": "passed", "duration": 0.15255979799985653, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6574.280537699, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[let name=document.createElement('span'); name.id='external'; name.textContent='Commit fixture'; document.body.append(name); intended.setAttribute('aria-labelledby','external')-Commit fixture]", "phase": "call", "outcome": "passed", "duration": 0.20696957699965424, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6574.280822671, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[let name=document.createElement('span'); name.id='external'; name.textContent='Commit fixture'; document.body.append(name); intended.setAttribute('aria-labelledby','external')-Commit fixture]", "fixture": "ingress", "url": "http://127.0.0.1:33425/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6574.336728527, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[let name=document.createElement('span'); name.id='external'; name.textContent='Commit fixture'; document.body.append(name); intended.setAttribute('aria-labelledby','external')-Commit fixture]", "phase": "teardown", "outcome": "passed", "duration": 0.055618219999814755, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6574.493523187, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('data-payload','x'.repeat(9000))-Commit fixture]", "phase": "setup", "outcome": "passed", "duration": 0.1563168009997753, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6574.667118503, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('data-payload','x'.repeat(9000))-Commit fixture]", "phase": "call", "outcome": "passed", "duration": 0.17335195600026054, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6574.668084495, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('data-payload','x'.repeat(9000))-Commit fixture]", "fixture": "ingress", "url": "http://127.0.0.1:35085/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6574.722683389, "nodeid": "test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('data-payload','x'.repeat(9000))-Commit fixture]", "phase": "teardown", "outcome": "passed", "duration": 0.054249276000518876, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6574.878430561, "nodeid": "test_cdp_click.py::test_page_method_and_getter_overrides_cannot_redirect_activation", "phase": "setup", "outcome": "passed", "duration": 0.15529842699925211, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6575.11510846, "nodeid": "test_cdp_click.py::test_page_method_and_getter_overrides_cannot_redirect_activation", "phase": "call", "outcome": "passed", "duration": 0.23640184000032605, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6575.115257811, "nodeid": "test_cdp_click.py::test_page_method_and_getter_overrides_cannot_redirect_activation", "fixture": "ingress", "url": "http://127.0.0.1:42181/fixture", "records": ["intended"]} +{"kind": "pytest_report", "monotonic": 6575.196513164, "nodeid": "test_cdp_click.py::test_page_method_and_getter_overrides_cannot_redirect_activation", "phase": "teardown", "outcome": "passed", "duration": 0.08094143800008169, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6575.407694234, "nodeid": "test_cdp_click.py::test_pointerdown_only_app_does_not_gain_a_business_completion_claim", "phase": "setup", "outcome": "passed", "duration": 0.210751161999724, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6575.58319602, "nodeid": "test_cdp_click.py::test_pointerdown_only_app_does_not_gain_a_business_completion_claim", "phase": "call", "outcome": "passed", "duration": 0.17528358300023683, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6575.583309468, "nodeid": "test_cdp_click.py::test_pointerdown_only_app_does_not_gain_a_business_completion_claim", "fixture": "ingress", "url": "http://127.0.0.1:36555/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6575.641251968, "nodeid": "test_cdp_click.py::test_pointerdown_only_app_does_not_gain_a_business_completion_claim", "phase": "teardown", "outcome": "passed", "duration": 0.05764466900018306, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6575.84404868, "nodeid": "test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[False]", "phase": "setup", "outcome": "passed", "duration": 0.20234510299997055, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6576.030383813, "nodeid": "test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[False]", "phase": "call", "outcome": "passed", "duration": 0.18609747099981178, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6576.030460948, "nodeid": "test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[False]", "fixture": "ingress", "url": "http://127.0.0.1:34107/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6576.091944451, "nodeid": "test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[False]", "phase": "teardown", "outcome": "passed", "duration": 0.061220473999128444, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6576.250025513, "nodeid": "test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[True]", "phase": "setup", "outcome": "passed", "duration": 0.15753599399977247, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6576.482086183, "nodeid": "test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[True]", "phase": "call", "outcome": "passed", "duration": 0.2314479320002647, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6576.482169026, "nodeid": "test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[True]", "fixture": "ingress", "url": "http://127.0.0.1:37853/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6576.519895888, "nodeid": "test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[True]", "phase": "teardown", "outcome": "passed", "duration": 0.03743338799995399, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6576.722972595, "nodeid": "test_cdp_click.py::test_numeric_handle_alias_cannot_adopt_an_identical_new_document_button", "phase": "setup", "outcome": "passed", "duration": 0.20257535400014604, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6576.940068736, "nodeid": "test_cdp_click.py::test_numeric_handle_alias_cannot_adopt_an_identical_new_document_button", "phase": "call", "outcome": "passed", "duration": 0.21683475299960264, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6576.940141494, "nodeid": "test_cdp_click.py::test_numeric_handle_alias_cannot_adopt_an_identical_new_document_button", "fixture": "ingress", "url": "http://127.0.0.1:45353/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6576.973345517, "nodeid": "test_cdp_click.py::test_numeric_handle_alias_cannot_adopt_an_identical_new_document_button", "phase": "teardown", "outcome": "passed", "duration": 0.032885221000469755, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6577.178751903, "nodeid": "test_cdp_click.py::test_document_open_root_replacement_cannot_reuse_an_old_observation", "phase": "setup", "outcome": "passed", "duration": 0.20491357500031882, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6577.362975336, "nodeid": "test_cdp_click.py::test_document_open_root_replacement_cannot_reuse_an_old_observation", "phase": "call", "outcome": "passed", "duration": 0.184005320000324, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6577.363046672, "nodeid": "test_cdp_click.py::test_document_open_root_replacement_cannot_reuse_an_old_observation", "fixture": "ingress", "url": "http://127.0.0.1:36799/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6577.412938665, "nodeid": "test_cdp_click.py::test_document_open_root_replacement_cannot_reuse_an_old_observation", "phase": "teardown", "outcome": "passed", "duration": 0.04949227100041753, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6577.565770085, "nodeid": "test_cdp_click.py::test_closed_pinned_tab_does_not_activate_a_live_sentinel_tab", "phase": "setup", "outcome": "passed", "duration": 0.15233059799993498, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6577.836907989, "nodeid": "test_cdp_click.py::test_closed_pinned_tab_does_not_activate_a_live_sentinel_tab", "phase": "call", "outcome": "passed", "duration": 0.2708896759995696, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6577.836984102, "nodeid": "test_cdp_click.py::test_closed_pinned_tab_does_not_activate_a_live_sentinel_tab", "fixture": "ingress", "url": "http://127.0.0.1:44719/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6577.889100151, "nodeid": "test_cdp_click.py::test_closed_pinned_tab_does_not_activate_a_live_sentinel_tab", "phase": "teardown", "outcome": "passed", "duration": 0.05185477200029709, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6578.091803019, "nodeid": "test_cdp_click.py::test_reobservation_and_foreign_connection_reject_old_refs", "phase": "setup", "outcome": "passed", "duration": 0.20228161399973033, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6578.273232482, "nodeid": "test_cdp_click.py::test_reobservation_and_foreign_connection_reject_old_refs", "phase": "call", "outcome": "passed", "duration": 0.1811615360002179, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6578.273338258, "nodeid": "test_cdp_click.py::test_reobservation_and_foreign_connection_reject_old_refs", "fixture": "ingress", "url": "http://127.0.0.1:43957/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6578.321182096, "nodeid": "test_cdp_click.py::test_reobservation_and_foreign_connection_reject_old_refs", "phase": "teardown", "outcome": "passed", "duration": 0.04756390199963789, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6578.529320134, "nodeid": "test_cdp_click.py::test_concurrent_calls_with_one_ref_dispatch_once", "phase": "setup", "outcome": "passed", "duration": 0.20766481600003317, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6578.694941782, "nodeid": "test_cdp_click.py::test_concurrent_calls_with_one_ref_dispatch_once", "phase": "call", "outcome": "passed", "duration": 0.16532870399987587, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6578.69502833, "nodeid": "test_cdp_click.py::test_concurrent_calls_with_one_ref_dispatch_once", "fixture": "ingress", "url": "http://127.0.0.1:41583/fixture", "records": ["intended"]} +{"kind": "pytest_report", "monotonic": 6578.747044942, "nodeid": "test_cdp_click.py::test_concurrent_calls_with_one_ref_dispatch_once", "phase": "teardown", "outcome": "passed", "duration": 0.051497582000592956, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6578.901586277, "nodeid": "test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[False]", "phase": "setup", "outcome": "passed", "duration": 0.15391773099963757, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6579.122877035, "nodeid": "test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[False]", "phase": "call", "outcome": "passed", "duration": 0.22101480899982562, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6579.122980278, "nodeid": "test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[False]", "fixture": "ingress", "url": "http://127.0.0.1:39515/fixture", "records": ["intended"]} +{"kind": "pytest_report", "monotonic": 6579.159034826, "nodeid": "test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[False]", "phase": "teardown", "outcome": "passed", "duration": 0.0357389199998579, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6579.314632431, "nodeid": "test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[True]", "phase": "setup", "outcome": "passed", "duration": 0.1551153800000975, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6579.536930257, "nodeid": "test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[True]", "phase": "call", "outcome": "passed", "duration": 0.221434646000489, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6579.537017687, "nodeid": "test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[True]", "fixture": "ingress", "url": "http://127.0.0.1:40535/fixture", "records": ["intended"]} +{"kind": "pytest_report", "monotonic": 6579.593227138, "nodeid": "test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[True]", "phase": "teardown", "outcome": "passed", "duration": 0.055880023000099754, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6579.747540395, "nodeid": "test_cdp_click.py::test_typing_trusted_click_and_navigation_stay_disabled", "phase": "setup", "outcome": "passed", "duration": 0.15386949999992794, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6579.983745664, "nodeid": "test_cdp_click.py::test_typing_trusted_click_and_navigation_stay_disabled", "phase": "call", "outcome": "passed", "duration": 0.23595041099997616, "longrepr": null} +{"kind": "independent_fixture_records", "monotonic": 6579.983849188, "nodeid": "test_cdp_click.py::test_typing_trusted_click_and_navigation_stay_disabled", "fixture": "ingress", "url": "http://127.0.0.1:35343/fixture", "records": []} +{"kind": "pytest_report", "monotonic": 6580.01728889, "nodeid": "test_cdp_click.py::test_typing_trusted_click_and_navigation_stay_disabled", "phase": "teardown", "outcome": "passed", "duration": 0.032683991999874706, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.017796252, "nodeid": "test_cdp_click_contract.py::test_button_target_keeps_complete_attributes_text_and_ancestor_identity", "phase": "setup", "outcome": "passed", "duration": 9.229700026480714e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.018028306, "nodeid": "test_cdp_click_contract.py::test_button_target_keeps_complete_attributes_text_and_ancestor_identity", "phase": "call", "outcome": "passed", "duration": 0.00014611700044042664, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.018192289, "nodeid": "test_cdp_click_contract.py::test_button_target_keeps_complete_attributes_text_and_ancestor_identity", "phase": "teardown", "outcome": "passed", "duration": 4.472700038604671e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.018500556, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc0-Continue]", "phase": "setup", "outcome": "passed", "duration": 0.00011730400001397356, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.018634525, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc0-Continue]", "phase": "call", "outcome": "passed", "duration": 6.597800074814586e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.018764808, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc0-Continue]", "phase": "teardown", "outcome": "passed", "duration": 4.763100059790304e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.018977603, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc1-Continue]", "phase": "setup", "outcome": "passed", "duration": 7.884699971327791e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.019113965, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc1-Continue]", "phase": "call", "outcome": "passed", "duration": 7.130500034691067e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.019275955, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc1-Continue]", "phase": "teardown", "outcome": "passed", "duration": 7.395899956463836e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.019493107, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc2-Continue]", "phase": "setup", "outcome": "passed", "duration": 7.733499933237908e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.019627416, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc2-Continue]", "phase": "call", "outcome": "passed", "duration": 7.085499964887276e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.019757389, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc2-Continue]", "phase": "teardown", "outcome": "passed", "duration": 4.6438999561360106e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.019963134, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc3-Continue]", "phase": "setup", "outcome": "passed", "duration": 7.526199988205917e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.020394093, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc3-Continue]", "phase": "call", "outcome": "passed", "duration": 0.00035562700031732675, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.020541672, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc3-Continue]", "phase": "teardown", "outcome": "passed", "duration": 5.001399949833285e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.020757251, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc4-Continue]", "phase": "setup", "outcome": "passed", "duration": 7.766500038997037e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.020889116, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc4-Continue]", "phase": "call", "outcome": "passed", "duration": 6.789999952161452e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.021010897, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc4-Continue]", "phase": "teardown", "outcome": "passed", "duration": 4.353399981482653e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.021247137, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc5-Continue]", "phase": "setup", "outcome": "passed", "duration": 7.28880004317034e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.021388336, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc5-Continue]", "phase": "call", "outcome": "passed", "duration": 7.323899990296923e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.021621332, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc5-Continue]", "phase": "teardown", "outcome": "passed", "duration": 6.240299990167841e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.021944431, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc6-Continue]", "phase": "setup", "outcome": "passed", "duration": 8.392400013690349e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.022100883, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc6-Continue]", "phase": "call", "outcome": "passed", "duration": 7.745499988232041e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.022353247, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc6-Continue]", "phase": "teardown", "outcome": "passed", "duration": 0.00014650699995399918, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.022599872, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc7-Delete]", "phase": "setup", "outcome": "passed", "duration": 8.482499924866715e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.022739589, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc7-Delete]", "phase": "call", "outcome": "passed", "duration": 7.330900007218588e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.022866357, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc7-Delete]", "phase": "teardown", "outcome": "passed", "duration": 4.52879994554678e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.023067605, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc8-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]", "phase": "setup", "outcome": "passed", "duration": 7.287800053745741e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.023250957, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc8-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]", "phase": "call", "outcome": "passed", "duration": 8.247200003097532e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.023473978, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc8-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]", "phase": "teardown", "outcome": "passed", "duration": 5.9829000747413374e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.023696648, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc9-Con tinue]", "phase": "setup", "outcome": "passed", "duration": 7.98680002844776e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.023844237, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc9-Con tinue]", "phase": "call", "outcome": "passed", "duration": 8.297299973492045e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.02397499, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc9-Con tinue]", "phase": "teardown", "outcome": "passed", "duration": 4.5157000386097934e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.024296487, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc10-Continue]", "phase": "setup", "outcome": "passed", "duration": 0.0001101140005630441, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.024433891, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc10-Continue]", "phase": "call", "outcome": "passed", "duration": 6.338399998639943e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.024557764, "nodeid": "test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc10-Continue]", "phase": "teardown", "outcome": "passed", "duration": 4.310400072427001e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.024751672, "nodeid": "test_cdp_click_contract.py::test_aria_label_is_admitted_only_when_the_offered_name_matches", "phase": "setup", "outcome": "passed", "duration": 4.658900070353411e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.024914643, "nodeid": "test_cdp_click_contract.py::test_aria_label_is_admitted_only_when_the_offered_name_matches", "phase": "call", "outcome": "passed", "duration": 0.00010064900016004685, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.025027571, "nodeid": "test_cdp_click_contract.py::test_aria_label_is_admitted_only_when_the_offered_name_matches", "phase": "teardown", "outcome": "passed", "duration": 3.7155000427446794e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.025188599, "nodeid": "test_cdp_click_contract.py::test_native_activation_consumes_refs_and_resolves_only_into_the_observed_world", "phase": "setup", "outcome": "passed", "duration": 3.9738999475957826e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.025749771, "nodeid": "test_cdp_click_contract.py::test_native_activation_consumes_refs_and_resolves_only_into_the_observed_world", "phase": "call", "outcome": "passed", "duration": 0.000451228999736486, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.025888447, "nodeid": "test_cdp_click_contract.py::test_native_activation_consumes_refs_and_resolves_only_into_the_observed_world", "phase": "teardown", "outcome": "passed", "duration": 4.311300017434405e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.026071388, "nodeid": "test_cdp_click_contract.py::test_a_ref_without_an_observation_document_token_cannot_activate", "phase": "setup", "outcome": "passed", "duration": 4.4254999920667615e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.026418853, "nodeid": "test_cdp_click_contract.py::test_a_ref_without_an_observation_document_token_cannot_activate", "phase": "call", "outcome": "passed", "duration": 0.00027329500062478473, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.02655204, "nodeid": "test_cdp_click_contract.py::test_a_ref_without_an_observation_document_token_cannot_activate", "phase": "teardown", "outcome": "passed", "duration": 4.1711999983817805e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.026730004, "nodeid": "test_cdp_click_contract.py::test_observation_marks_one_private_slot_before_reading_nodes_and_replaces_the_token", "phase": "setup", "outcome": "passed", "duration": 4.357499983598245e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.02715906, "nodeid": "test_cdp_click_contract.py::test_observation_marks_one_private_slot_before_reading_nodes_and_replaces_the_token", "phase": "call", "outcome": "passed", "duration": 0.00035455499983072514, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.027329903, "nodeid": "test_cdp_click_contract.py::test_observation_marks_one_private_slot_before_reading_nodes_and_replaces_the_token", "phase": "teardown", "outcome": "passed", "duration": 4.5957999645906966e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.027581817, "nodeid": "test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply0]", "phase": "setup", "outcome": "passed", "duration": 7.508100043196464e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.028147134, "nodeid": "test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply0]", "phase": "call", "outcome": "passed", "duration": 0.0004752039994855295, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.028352228, "nodeid": "test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply0]", "phase": "teardown", "outcome": "passed", "duration": 5.97890002609347e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.028579726, "nodeid": "test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply1]", "phase": "setup", "outcome": "passed", "duration": 7.232700045278762e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.029117402, "nodeid": "test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply1]", "phase": "call", "outcome": "passed", "duration": 0.00045229999977891566, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.029317169, "nodeid": "test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply1]", "phase": "teardown", "outcome": "passed", "duration": 9.058399973582709e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.029747106, "nodeid": "test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply2]", "phase": "setup", "outcome": "passed", "duration": 0.00013538100029109046, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.030173337, "nodeid": "test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply2]", "phase": "call", "outcome": "passed", "duration": 0.0003313510005682474, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.030369969, "nodeid": "test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply2]", "phase": "teardown", "outcome": "passed", "duration": 5.7854999795381445e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.030683393, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result0]", "phase": "setup", "outcome": "passed", "duration": 0.00015405799967993516, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.031169243, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result0]", "phase": "call", "outcome": "passed", "duration": 0.00039792899951862637, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.031358624, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result0]", "phase": "teardown", "outcome": "passed", "duration": 5.486100053531118e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.031574614, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result1]", "phase": "setup", "outcome": "passed", "duration": 6.761100030416856e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.0320911, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result1]", "phase": "call", "outcome": "passed", "duration": 0.00034984899957635207, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.032291857, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result1]", "phase": "teardown", "outcome": "passed", "duration": 8.577700009482214e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.032521748, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result2]", "phase": "setup", "outcome": "passed", "duration": 7.041499975457555e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.032869684, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result2]", "phase": "call", "outcome": "passed", "duration": 0.0002717119996304973, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.033011364, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result2]", "phase": "teardown", "outcome": "passed", "duration": 4.790099956153426e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.033254424, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result3]", "phase": "setup", "outcome": "passed", "duration": 6.594699971174123e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.033600046, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result3]", "phase": "call", "outcome": "passed", "duration": 0.00026453200007381383, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.033738021, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result3]", "phase": "teardown", "outcome": "passed", "duration": 4.677899960370269e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.033941572, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result4]", "phase": "setup", "outcome": "passed", "duration": 6.557800043083262e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.03431106, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result4]", "phase": "call", "outcome": "passed", "duration": 0.0002905199999077013, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.034454593, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result4]", "phase": "teardown", "outcome": "passed", "duration": 4.7590000576747116e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.034662811, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result5]", "phase": "setup", "outcome": "passed", "duration": 6.599799962714314e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.034994703, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result5]", "phase": "call", "outcome": "passed", "duration": 0.0002588340003057965, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.035129593, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result5]", "phase": "teardown", "outcome": "passed", "duration": 4.6719999772903975e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.035380015, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result6]", "phase": "setup", "outcome": "passed", "duration": 7.25780000720988e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.035808229, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result6]", "phase": "call", "outcome": "passed", "duration": 0.000257422000686347, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.03595747, "nodeid": "test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result6]", "phase": "teardown", "outcome": "passed", "duration": 4.9573000069358386e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.036188012, "nodeid": "test_cdp_click_contract.py::test_known_pre_activation_refusal_and_closed_socket_are_not_sent", "phase": "setup", "outcome": "passed", "duration": 5.004399918107083e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.03681431, "nodeid": "test_cdp_click_contract.py::test_known_pre_activation_refusal_and_closed_socket_are_not_sent", "phase": "call", "outcome": "passed", "duration": 0.0004957649998686975, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.036954108, "nodeid": "test_cdp_click_contract.py::test_known_pre_activation_refusal_and_closed_socket_are_not_sent", "phase": "teardown", "outcome": "passed", "duration": 4.4116000026406255e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.037143168, "nodeid": "test_cdp_click_contract.py::test_read_only_validation_loss_never_claims_input_was_sent", "phase": "setup", "outcome": "passed", "duration": 4.6379000195884146e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.037471334, "nodeid": "test_cdp_click_contract.py::test_read_only_validation_loss_never_claims_input_was_sent", "phase": "call", "outcome": "passed", "duration": 0.00025337600072816713, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.037602569, "nodeid": "test_cdp_click_contract.py::test_read_only_validation_loss_never_claims_input_was_sent", "phase": "teardown", "outcome": "passed", "duration": 4.069999977218686e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.037779822, "nodeid": "test_cdp_click_contract.py::test_concurrent_callers_cannot_reuse_the_admitted_ref", "phase": "setup", "outcome": "passed", "duration": 4.3383999582147226e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.038142459, "nodeid": "test_cdp_click_contract.py::test_concurrent_callers_cannot_reuse_the_admitted_ref", "phase": "call", "outcome": "passed", "duration": 0.0002906809995693038, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.038321775, "nodeid": "test_cdp_click_contract.py::test_concurrent_callers_cannot_reuse_the_admitted_ref", "phase": "teardown", "outcome": "passed", "duration": 4.9934000344364904e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.038510945, "nodeid": "test_cdp_click_contract.py::test_cancellation_keeps_unknown_and_does_not_enable_a_retry", "phase": "setup", "outcome": "passed", "duration": 4.491600066103274e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.038887964, "nodeid": "test_cdp_click_contract.py::test_cancellation_keeps_unknown_and_does_not_enable_a_retry", "phase": "call", "outcome": "passed", "duration": 0.00030367099952854915, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.039017837, "nodeid": "test_cdp_click_contract.py::test_cancellation_keeps_unknown_and_does_not_enable_a_retry", "phase": "teardown", "outcome": "passed", "duration": 4.076000004715752e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.03919557, "nodeid": "test_cdp_click_contract.py::test_cancellation_during_handle_cleanup_cannot_lose_the_successful_activation", "phase": "setup", "outcome": "passed", "duration": 4.438599989953218e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.039631005, "nodeid": "test_cdp_click_contract.py::test_cancellation_during_handle_cleanup_cannot_lose_the_successful_activation", "phase": "call", "outcome": "passed", "duration": 0.000322187000165286, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.039762791, "nodeid": "test_cdp_click_contract.py::test_cancellation_during_handle_cleanup_cannot_lose_the_successful_activation", "phase": "teardown", "outcome": "passed", "duration": 4.1262000195274595e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.039940745, "nodeid": "test_cdp_click_contract.py::test_typing_navigation_and_trusted_click_remain_disabled", "phase": "setup", "outcome": "passed", "duration": 4.313400040700799e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.040340056, "nodeid": "test_cdp_click_contract.py::test_typing_navigation_and_trusted_click_remain_disabled", "phase": "call", "outcome": "passed", "duration": 0.0003219069994884194, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.040481686, "nodeid": "test_cdp_click_contract.py::test_typing_navigation_and_trusted_click_remain_disabled", "phase": "teardown", "outcome": "passed", "duration": 4.246299977239687e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.04065943, "nodeid": "test_cdp_click_contract.py::test_bridge_reports_actual_activation_route_without_promoting_business_completion", "phase": "setup", "outcome": "passed", "duration": 4.3435000407043844e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.040966014, "nodeid": "test_cdp_click_contract.py::test_bridge_reports_actual_activation_route_without_promoting_business_completion", "phase": "call", "outcome": "passed", "duration": 0.00023554899962618947, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.041096277, "nodeid": "test_cdp_click_contract.py::test_bridge_reports_actual_activation_route_without_promoting_business_completion", "phase": "teardown", "outcome": "passed", "duration": 4.0859999899112154e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.04140196, "nodeid": "test_cdp_effector.py::test_replies_are_matched_by_id_and_events_reach_listeners", "phase": "setup", "outcome": "passed", "duration": 5.5311999858531635e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.04193506, "nodeid": "test_cdp_effector.py::test_replies_are_matched_by_id_and_events_reach_listeners", "phase": "call", "outcome": "passed", "duration": 0.00045242099986353423, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.042070962, "nodeid": "test_cdp_effector.py::test_replies_are_matched_by_id_and_events_reach_listeners", "phase": "teardown", "outcome": "passed", "duration": 4.297400028008269e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.042303637, "nodeid": "test_cdp_effector.py::test_an_error_reply_is_a_received_refusal", "phase": "setup", "outcome": "passed", "duration": 8.672800049680518e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.042703749, "nodeid": "test_cdp_effector.py::test_an_error_reply_is_a_received_refusal", "phase": "call", "outcome": "passed", "duration": 0.00032005400043999543, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.042851428, "nodeid": "test_cdp_effector.py::test_an_error_reply_is_a_received_refusal", "phase": "teardown", "outcome": "passed", "duration": 4.3043000005127396e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.043032887, "nodeid": "test_cdp_effector.py::test_a_lost_connection_leaves_in_flight_commands_unknown_and_sends_nothing_after", "phase": "setup", "outcome": "passed", "duration": 4.562800040730508e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.043356026, "nodeid": "test_cdp_effector.py::test_a_lost_connection_leaves_in_flight_commands_unknown_and_sends_nothing_after", "phase": "call", "outcome": "passed", "duration": 0.000249179000093136, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.043484967, "nodeid": "test_cdp_effector.py::test_a_lost_connection_leaves_in_flight_commands_unknown_and_sends_nothing_after", "phase": "teardown", "outcome": "passed", "duration": 4.088100013177609e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.043661479, "nodeid": "test_cdp_effector.py::test_no_reply_within_the_deadline_is_unknown_not_failed", "phase": "setup", "outcome": "passed", "duration": 4.423500013217563e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.094620833, "nodeid": "test_cdp_effector.py::test_no_reply_within_the_deadline_is_unknown_not_failed", "phase": "call", "outcome": "passed", "duration": 0.05078324300029635, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.094907719, "nodeid": "test_cdp_effector.py::test_no_reply_within_the_deadline_is_unknown_not_failed", "phase": "teardown", "outcome": "passed", "duration": 8.679799975652713e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.095244037, "nodeid": "test_cdp_effector.py::test_only_a_loopback_endpoint_is_opened", "phase": "setup", "outcome": "passed", "duration": 6.564700015587732e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.095683959, "nodeid": "test_cdp_effector.py::test_only_a_loopback_endpoint_is_opened", "phase": "call", "outcome": "passed", "duration": 0.00033528699987073196, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.095829234, "nodeid": "test_cdp_effector.py::test_only_a_loopback_endpoint_is_opened", "phase": "teardown", "outcome": "passed", "duration": 4.622899996320484e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.096086375, "nodeid": "test_cdp_effector.py::test_composition_withholds_sensitive_values_and_disables_disabled_controls", "phase": "setup", "outcome": "passed", "duration": 4.911300038656918e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.096441612, "nodeid": "test_cdp_effector.py::test_composition_withholds_sensitive_values_and_disables_disabled_controls", "phase": "call", "outcome": "passed", "duration": 0.0002530350002416526, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.096586156, "nodeid": "test_cdp_effector.py::test_composition_withholds_sensitive_values_and_disables_disabled_controls", "phase": "teardown", "outcome": "passed", "duration": 4.574699960357975e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.096775717, "nodeid": "test_cdp_effector.py::test_a_controls_user_agent_internals_never_become_candidates_or_labels", "phase": "setup", "outcome": "passed", "duration": 4.795099994225893e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.096983655, "nodeid": "test_cdp_effector.py::test_a_controls_user_agent_internals_never_become_candidates_or_labels", "phase": "call", "outcome": "passed", "duration": 0.00013837499955116073, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.097104454, "nodeid": "test_cdp_effector.py::test_a_controls_user_agent_internals_never_become_candidates_or_labels", "phase": "teardown", "outcome": "passed", "duration": 3.821600057563046e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.097311671, "nodeid": "test_cdp_effector.py::test_child_frames_make_the_snapshot_incomplete", "phase": "setup", "outcome": "passed", "duration": 5.026500002713874e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.097431479, "nodeid": "test_cdp_effector.py::test_child_frames_make_the_snapshot_incomplete", "phase": "call", "outcome": "passed", "duration": 5.713500013371231e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.097542844, "nodeid": "test_cdp_effector.py::test_child_frames_make_the_snapshot_incomplete", "phase": "teardown", "outcome": "passed", "duration": 3.7195999539108016e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.097760306, "nodeid": "test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[section-billing billing cc-number]", "phase": "setup", "outcome": "passed", "duration": 9.063400011655176e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.097922226, "nodeid": "test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[section-billing billing cc-number]", "phase": "call", "outcome": "passed", "duration": 9.881599999062018e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.098048443, "nodeid": "test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[section-billing billing cc-number]", "phase": "teardown", "outcome": "passed", "duration": 4.666899985750206e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.098311263, "nodeid": "test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[shipping one-time-code]", "phase": "setup", "outcome": "passed", "duration": 9.627200051909313e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.098475827, "nodeid": "test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[shipping one-time-code]", "phase": "call", "outcome": "passed", "duration": 9.686399971542414e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.098604908, "nodeid": "test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[shipping one-time-code]", "phase": "teardown", "outcome": "passed", "duration": 4.306399932829663e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.098796392, "nodeid": "test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[section-X CC-CSC]", "phase": "setup", "outcome": "passed", "duration": 6.22629995632451e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.098952443, "nodeid": "test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[section-X CC-CSC]", "phase": "call", "outcome": "passed", "duration": 9.160499939753208e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.099076227, "nodeid": "test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[section-X CC-CSC]", "phase": "teardown", "outcome": "passed", "duration": 4.5107000005373266e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.099273699, "nodeid": "test_cdp_effector.py::test_omitted_custom_controls_prevent_a_complete_observation_claim", "phase": "setup", "outcome": "passed", "duration": 6.884200047352351e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.099390432, "nodeid": "test_cdp_effector.py::test_omitted_custom_controls_prevent_a_complete_observation_claim", "phase": "call", "outcome": "passed", "duration": 5.5252000493055675e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.099501908, "nodeid": "test_cdp_effector.py::test_omitted_custom_controls_prevent_a_complete_observation_claim", "phase": "teardown", "outcome": "passed", "duration": 3.640399972937303e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.253304413, "nodeid": "test_cdp_effector.py::test_the_owned_browser_is_observed_as_the_fixture_declares", "phase": "setup", "outcome": "passed", "duration": 0.15351540000028763, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.470940323, "nodeid": "test_cdp_effector.py::test_the_owned_browser_is_observed_as_the_fixture_declares", "phase": "call", "outcome": "passed", "duration": 0.216134405000048, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6580.925801878, "nodeid": "test_cdp_effector.py::test_the_owned_browser_is_observed_as_the_fixture_declares", "phase": "teardown", "outcome": "passed", "duration": 0.4545875479998358, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6581.12976671, "nodeid": "test_cdp_effector.py::test_actions_refuse_before_dispatch_and_a_reload_invalidates_refs", "phase": "setup", "outcome": "passed", "duration": 0.2034465540000383, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6581.408832338, "nodeid": "test_cdp_effector.py::test_actions_refuse_before_dispatch_and_a_reload_invalidates_refs", "phase": "call", "outcome": "passed", "duration": 0.27881528600028105, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6581.904411884, "nodeid": "test_cdp_effector.py::test_actions_refuse_before_dispatch_and_a_reload_invalidates_refs", "phase": "teardown", "outcome": "passed", "duration": 0.494926497999586, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.106662145, "nodeid": "test_cdp_effector.py::test_a_stale_port_file_or_a_foreign_endpoint_is_refused", "phase": "setup", "outcome": "passed", "duration": 0.20180379900011758, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.171536002, "nodeid": "test_cdp_effector.py::test_a_stale_port_file_or_a_foreign_endpoint_is_refused", "phase": "call", "outcome": "passed", "duration": 0.06451290199947834, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.1966734, "nodeid": "test_cdp_effector.py::test_a_stale_port_file_or_a_foreign_endpoint_is_refused", "phase": "teardown", "outcome": "passed", "duration": 0.024828429999615764, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.197265377, "nodeid": "test_cdp_effector.py::test_the_cdp_package_imports_no_third_party_module_until_a_connection_opens", "phase": "setup", "outcome": "passed", "duration": 0.00016892999974515988, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.258308332, "nodeid": "test_cdp_effector.py::test_the_cdp_package_imports_no_third_party_module_until_a_connection_opens", "phase": "call", "outcome": "passed", "duration": 0.06078280900055688, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.258608968, "nodeid": "test_cdp_effector.py::test_the_cdp_package_imports_no_third_party_module_until_a_connection_opens", "phase": "teardown", "outcome": "passed", "duration": 8.893199992598966e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.258924165, "nodeid": "test_cdp_effector.py::test_only_an_effector_that_refused_before_sending_reports_not_sent", "phase": "setup", "outcome": "passed", "duration": 6.657900030404562e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.259761015, "nodeid": "test_cdp_effector.py::test_only_an_effector_that_refused_before_sending_reports_not_sent", "phase": "call", "outcome": "passed", "duration": 0.0007422600001518731, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.259924277, "nodeid": "test_cdp_effector.py::test_only_an_effector_that_refused_before_sending_reports_not_sent", "phase": "teardown", "outcome": "passed", "duration": 5.21080000908114e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.260846184, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[empty]", "phase": "setup", "outcome": "passed", "duration": 0.0006351909996737959, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.261082424, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[empty]", "phase": "call", "outcome": "passed", "duration": 0.00015276700014510425, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.261520964, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[empty]", "phase": "teardown", "outcome": "passed", "duration": 0.00016375299946957966, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.262032161, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[populated]", "phase": "setup", "outcome": "passed", "duration": 0.0003325730003780336, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.262383632, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[populated]", "phase": "call", "outcome": "passed", "duration": 0.0002669460000106483, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.262573754, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[populated]", "phase": "teardown", "outcome": "passed", "duration": 8.829100079310592e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.263044021, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[symlink]", "phase": "setup", "outcome": "passed", "duration": 0.00031567800033371896, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.263395372, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[symlink]", "phase": "call", "outcome": "passed", "duration": 0.0002742769993346883, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.263550893, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[symlink]", "phase": "teardown", "outcome": "passed", "duration": 6.032000055711251e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.264261576, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[file]", "phase": "setup", "outcome": "passed", "duration": 0.00037118999989615986, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.264479369, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[file]", "phase": "call", "outcome": "passed", "duration": 0.00013583100007963367, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.264638635, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[file]", "phase": "teardown", "outcome": "passed", "duration": 6.0008999753335956e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.265293756, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[dangling_symlink]", "phase": "setup", "outcome": "passed", "duration": 0.00033220299974345835, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.26558639, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[dangling_symlink]", "phase": "call", "outcome": "passed", "duration": 0.000196750999748474, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.265747368, "nodeid": "test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[dangling_symlink]", "phase": "teardown", "outcome": "passed", "duration": 6.104000021878164e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.279790742, "nodeid": "test_cdp_launch_custody.py::test_fresh_profile_is_created_private_before_process_launch", "phase": "setup", "outcome": "passed", "duration": 0.013790519000394852, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.28013323, "nodeid": "test_cdp_launch_custody.py::test_fresh_profile_is_created_private_before_process_launch", "phase": "call", "outcome": "passed", "duration": 0.0002363399999012472, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.280344183, "nodeid": "test_cdp_launch_custody.py::test_fresh_profile_is_created_private_before_process_launch", "phase": "teardown", "outcome": "passed", "duration": 7.130599988158792e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6582.280835751, "nodeid": "test_cdp_launch_custody.py::test_stop_cleans_a_captured_term_resistant_child_without_touching_a_sentinel", "phase": "setup", "outcome": "passed", "duration": 0.0003111810001428239, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.364905698, "nodeid": "test_cdp_launch_custody.py::test_stop_cleans_a_captured_term_resistant_child_without_touching_a_sentinel", "phase": "call", "outcome": "passed", "duration": 3.083869580999817, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.365293694, "nodeid": "test_cdp_launch_custody.py::test_stop_cleans_a_captured_term_resistant_child_without_touching_a_sentinel", "phase": "teardown", "outcome": "passed", "duration": 0.00015703200006100815, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.366349639, "nodeid": "test_cdp_launch_custody.py::test_stop_reports_uncertainty_when_the_root_exited_before_inventory", "phase": "setup", "outcome": "passed", "duration": 0.0007178139994721278, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.382719842, "nodeid": "test_cdp_launch_custody.py::test_stop_reports_uncertainty_when_the_root_exited_before_inventory", "phase": "call", "outcome": "passed", "duration": 0.01619614500032185, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.383014809, "nodeid": "test_cdp_launch_custody.py::test_stop_reports_uncertainty_when_the_root_exited_before_inventory", "phase": "teardown", "outcome": "passed", "duration": 9.738399967318401e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.38377137, "nodeid": "test_cdp_launch_custody.py::test_a_descendant_exiting_during_identity_capture_does_not_block_root_cleanup", "phase": "setup", "outcome": "passed", "duration": 0.0004498769994825125, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.385511369, "nodeid": "test_cdp_launch_custody.py::test_a_descendant_exiting_during_identity_capture_does_not_block_root_cleanup", "phase": "call", "outcome": "passed", "duration": 0.0016337520000888617, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.385724105, "nodeid": "test_cdp_launch_custody.py::test_a_descendant_exiting_during_identity_capture_does_not_block_root_cleanup", "phase": "teardown", "outcome": "passed", "duration": 6.961300005059456e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.386305016, "nodeid": "test_cdp_launch_custody.py::test_changed_root_incarnation_is_never_signaled", "phase": "setup", "outcome": "passed", "duration": 0.0003878050001731026, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.388050222, "nodeid": "test_cdp_launch_custody.py::test_changed_root_incarnation_is_never_signaled", "phase": "call", "outcome": "passed", "duration": 0.001611278000382299, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.388280424, "nodeid": "test_cdp_launch_custody.py::test_changed_root_incarnation_is_never_signaled", "phase": "teardown", "outcome": "passed", "duration": 9.032399975694716e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.388604344, "nodeid": "test_cdp_transport_deadline.py::test_command_deadline_bounds_blocked_send_and_retires_the_connection", "phase": "setup", "outcome": "passed", "duration": 6.0399000176403206e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.409647293, "nodeid": "test_cdp_transport_deadline.py::test_command_deadline_bounds_blocked_send_and_retires_the_connection", "phase": "call", "outcome": "passed", "duration": 0.020875911000075575, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.409911094, "nodeid": "test_cdp_transport_deadline.py::test_command_deadline_bounds_blocked_send_and_retires_the_connection", "phase": "teardown", "outcome": "passed", "duration": 7.84659996497794e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.41034036, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222@attacker.example/devtools/browser/x]", "phase": "setup", "outcome": "passed", "duration": 0.00019943499955843436, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.410696648, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222@attacker.example/devtools/browser/x]", "phase": "call", "outcome": "passed", "duration": 0.00026591400001052534, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.410856946, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222@attacker.example/devtools/browser/x]", "phase": "teardown", "outcome": "passed", "duration": 6.015899998601526e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.411092425, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222@127.0.0.1:9222/devtools/browser/x]", "phase": "setup", "outcome": "passed", "duration": 8.331299977726303e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.411394122, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222@127.0.0.1:9222/devtools/browser/x]", "phase": "call", "outcome": "passed", "duration": 0.00022214999989955686, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.411546167, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222@127.0.0.1:9222/devtools/browser/x]", "phase": "teardown", "outcome": "passed", "duration": 5.5763000091246795e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.411967372, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://user:password@127.0.0.1:9222/devtools/browser/x]", "phase": "setup", "outcome": "passed", "duration": 0.0002670959993338329, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.412345172, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://user:password@127.0.0.1:9222/devtools/browser/x]", "phase": "call", "outcome": "passed", "duration": 0.0002388339999015443, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.412509075, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://user:password@127.0.0.1:9222/devtools/browser/x]", "phase": "teardown", "outcome": "passed", "duration": 5.6273999689437915e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.412736942, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:0/devtools/browser/x]", "phase": "setup", "outcome": "passed", "duration": 8.224199973483337e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.412987083, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:0/devtools/browser/x]", "phase": "call", "outcome": "passed", "duration": 0.0001758700000209501, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.413168532, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:0/devtools/browser/x]", "phase": "teardown", "outcome": "passed", "duration": 5.747599971073214e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.413424591, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:65536/devtools/browser/x]", "phase": "setup", "outcome": "passed", "duration": 8.319300013681641e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.413679159, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:65536/devtools/browser/x]", "phase": "call", "outcome": "passed", "duration": 0.00017814399961935123, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.413821149, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:65536/devtools/browser/x]", "phase": "teardown", "outcome": "passed", "duration": 5.139600034453906e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.414033324, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:bad/devtools/browser/x]", "phase": "setup", "outcome": "passed", "duration": 7.656300022063078e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.414310464, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:bad/devtools/browser/x]", "phase": "call", "outcome": "passed", "duration": 0.00020260000019334257, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.414453907, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:bad/devtools/browser/x]", "phase": "teardown", "outcome": "passed", "duration": 5.170599979464896e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.414668805, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1/devtools/browser/x]", "phase": "setup", "outcome": "passed", "duration": 7.830599952285411e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.414911145, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1/devtools/browser/x]", "phase": "call", "outcome": "passed", "duration": 0.00017015299999911804, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.415048278, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1/devtools/browser/x]", "phase": "teardown", "outcome": "passed", "duration": 5.0225000450154766e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.415296095, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[wss://127.0.0.1:9222/devtools/browser/x]", "phase": "setup", "outcome": "passed", "duration": 0.00010892199952650117, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.41553585, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[wss://127.0.0.1:9222/devtools/browser/x]", "phase": "call", "outcome": "passed", "duration": 0.00016727799993532244, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.415680465, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[wss://127.0.0.1:9222/devtools/browser/x]", "phase": "teardown", "outcome": "passed", "duration": 5.192699973122217e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.415889745, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.2:9222/devtools/browser/x]", "phase": "setup", "outcome": "passed", "duration": 7.531099981861189e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.416276899, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.2:9222/devtools/browser/x]", "phase": "call", "outcome": "passed", "duration": 0.00027474800026539015, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.41667572, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.2:9222/devtools/browser/x]", "phase": "teardown", "outcome": "passed", "duration": 0.00028188800024508964, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.416929866, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/page/x]", "phase": "setup", "outcome": "passed", "duration": 8.835100015858188e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.417190793, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/page/x]", "phase": "call", "outcome": "passed", "duration": 0.00018226999964099377, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.417393924, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/page/x]", "phase": "teardown", "outcome": "passed", "duration": 5.97080006627948e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.417617065, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/]", "phase": "setup", "outcome": "passed", "duration": 8.015899948077276e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.417860586, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/]", "phase": "call", "outcome": "passed", "duration": 0.00017141399985121097, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.418000663, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/]", "phase": "teardown", "outcome": "passed", "duration": 5.18769993504975e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.418244365, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/x?host=elsewhere]", "phase": "setup", "outcome": "passed", "duration": 7.776500024192501e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.418499172, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/x?host=elsewhere]", "phase": "call", "outcome": "passed", "duration": 0.00017677199957688572, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.418674182, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/x?host=elsewhere]", "phase": "teardown", "outcome": "passed", "duration": 8.163099937519291e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.41888877, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/x#fragment]", "phase": "setup", "outcome": "passed", "duration": 7.551199996669311e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.419126632, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/x#fragment]", "phase": "call", "outcome": "passed", "duration": 0.00016973200035863556, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.419305427, "nodeid": "test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/x#fragment]", "phase": "teardown", "outcome": "passed", "duration": 8.231199990405003e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.419506064, "nodeid": "test_cdp_transport_deadline.py::test_valid_loopback_browser_endpoint_reaches_connect", "phase": "setup", "outcome": "passed", "duration": 6.45950003672624e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.419820621, "nodeid": "test_cdp_transport_deadline.py::test_valid_loopback_browser_endpoint_reaches_connect", "phase": "call", "outcome": "passed", "duration": 0.00024137799937307136, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.419957974, "nodeid": "test_cdp_transport_deadline.py::test_valid_loopback_browser_endpoint_reaches_connect", "phase": "teardown", "outcome": "passed", "duration": 4.919299954053713e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.420183058, "nodeid": "test_cdp_transport_deadline.py::test_sending_and_reply_wait_share_one_budget", "phase": "setup", "outcome": "passed", "duration": 4.9342999773216434e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.922038375, "nodeid": "test_cdp_transport_deadline.py::test_sending_and_reply_wait_share_one_budget", "phase": "call", "outcome": "passed", "duration": 0.5016481900001963, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.922450836, "nodeid": "test_cdp_transport_deadline.py::test_sending_and_reply_wait_share_one_budget", "phase": "teardown", "outcome": "passed", "duration": 0.00010053899950435152, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.922769419, "nodeid": "test_cdp_transport_deadline.py::test_serialization_failure_does_not_admit_or_send_a_command", "phase": "setup", "outcome": "passed", "duration": 6.822100021963706e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.92326283, "nodeid": "test_cdp_transport_deadline.py::test_serialization_failure_does_not_admit_or_send_a_command", "phase": "call", "outcome": "passed", "duration": 0.0003494080001473776, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.923592348, "nodeid": "test_cdp_transport_deadline.py::test_serialization_failure_does_not_admit_or_send_a_command", "phase": "teardown", "outcome": "passed", "duration": 0.00011400899984437274, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.923824863, "nodeid": "test_cdp_transport_deadline.py::test_an_interrupted_send_retires_other_inflight_commands_as_unknown", "phase": "setup", "outcome": "passed", "duration": 5.702500038751168e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.924442518, "nodeid": "test_cdp_transport_deadline.py::test_an_interrupted_send_retires_other_inflight_commands_as_unknown", "phase": "call", "outcome": "passed", "duration": 0.000529053999343887, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.924626571, "nodeid": "test_cdp_transport_deadline.py::test_an_interrupted_send_retires_other_inflight_commands_as_unknown", "phase": "teardown", "outcome": "passed", "duration": 5.029499970987672e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.924858925, "nodeid": "test_cdp_transport_deadline.py::test_cancelling_a_close_waiter_does_not_cancel_owned_transport_cleanup", "phase": "setup", "outcome": "passed", "duration": 6.993399983912241e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.925430393, "nodeid": "test_cdp_transport_deadline.py::test_cancelling_a_close_waiter_does_not_cancel_owned_transport_cleanup", "phase": "call", "outcome": "passed", "duration": 0.0004852189995290246, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.925579053, "nodeid": "test_cdp_transport_deadline.py::test_cancelling_a_close_waiter_does_not_cancel_owned_transport_cleanup", "phase": "teardown", "outcome": "passed", "duration": 4.623900076694554e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.925947549, "nodeid": "test_cdp_transport_deadline.py::test_cancellation_removes_pending_command_and_preserves_cancellation[True]", "phase": "setup", "outcome": "passed", "duration": 0.00011046399959013797, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.926408132, "nodeid": "test_cdp_transport_deadline.py::test_cancellation_removes_pending_command_and_preserves_cancellation[True]", "phase": "call", "outcome": "passed", "duration": 0.00033918299959623255, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.926561559, "nodeid": "test_cdp_transport_deadline.py::test_cancellation_removes_pending_command_and_preserves_cancellation[True]", "phase": "teardown", "outcome": "passed", "duration": 5.3159000344749074e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.926781766, "nodeid": "test_cdp_transport_deadline.py::test_cancellation_removes_pending_command_and_preserves_cancellation[False]", "phase": "setup", "outcome": "passed", "duration": 7.205600013548974e-05, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.927121739, "nodeid": "test_cdp_transport_deadline.py::test_cancellation_removes_pending_command_and_preserves_cancellation[False]", "phase": "call", "outcome": "passed", "duration": 0.00026294999952369835, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6585.92781041, "nodeid": "test_cdp_transport_deadline.py::test_cancellation_removes_pending_command_and_preserves_cancellation[False]", "phase": "teardown", "outcome": "passed", "duration": 0.000586999999541149, "longrepr": null} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/owned-process-history.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/owned-process-history.json new file mode 100644 index 0000000..b4f56eb --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/owned-process-history.json @@ -0,0 +1,4601 @@ +[ + { + "pid": 7210, + "start": 1793472990.27, + "parent": 7206, + "name": "python", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7211, + "start": 1793472990.89, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7212, + "start": 1793472990.99, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7213, + "start": 1793472991.13, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7214, + "start": 1793472991.2, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7215, + "start": 1793472991.29, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7217, + "start": 1793472991.38, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7218, + "start": 1793472991.46, + "parent": 7206, + "name": "python", + "status": "zombie", + "session": 7218, + "group": 7218 + }, + { + "pid": 7220, + "start": 1793472991.54, + "parent": 7218, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7222, + "start": 1793472991.58, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7221, + "group": 7221 + }, + { + "pid": 7225, + "start": 1793472991.58, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7224, + "group": 7224 + }, + { + "pid": 7228, + "start": 1793472991.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7229, + "start": 1793472991.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7231, + "start": 1793472991.68, + "parent": 7229, + "name": "chromium", + "status": "sleeping", + "session": 7220, + "group": 7220 + }, + { + "pid": 7253, + "start": 1793472991.69, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7255, + "start": 1793472991.7, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7269, + "start": 1793472991.77, + "parent": 7231, + "name": "chromium", + "status": "sleeping", + "session": 7220, + "group": 7220 + }, + { + "pid": 7292, + "start": 1793472991.85, + "parent": 7229, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7300, + "start": 1793472991.88, + "parent": 7231, + "name": "chromium", + "status": "sleeping", + "session": 7220, + "group": 7220 + }, + { + "pid": 7302, + "start": 1793472991.88, + "parent": 7231, + "name": "chromium", + "status": "sleeping", + "session": 7220, + "group": 7220 + }, + { + "pid": 7333, + "start": 1793472992.06, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7334, + "start": 1793472992.19, + "parent": 7210, + "name": "footwork", + "status": "sleeping", + "session": 7210, + "group": 7210 + }, + { + "pid": 7335, + "start": 1793472992.33, + "parent": 7218, + "name": "python", + "status": "running", + "session": 7218, + "group": 7218 + }, + { + "pid": 7336, + "start": 1793472993.85, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7337, + "start": 1793472993.94, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7338, + "start": 1793472994.03, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7339, + "start": 1793472994.12, + "parent": 7210, + "name": "footwork", + "status": "sleeping", + "session": 7210, + "group": 7210 + }, + { + "pid": 7342, + "start": 1793472994.54, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7343, + "start": 1793472994.63, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7344, + "start": 1793472994.71, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7346, + "start": 1793472994.99, + "parent": 7210, + "name": "footwork", + "status": "sleeping", + "session": 7210, + "group": 7210 + }, + { + "pid": 7347, + "start": 1793472995.05, + "parent": 7206, + "name": "python", + "status": "zombie", + "session": 7347, + "group": 7347 + }, + { + "pid": 7351, + "start": 1793472995.16, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7350, + "group": 7350 + }, + { + "pid": 7354, + "start": 1793472995.16, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7353, + "group": 7353 + }, + { + "pid": 7349, + "start": 1793472995.13, + "parent": 7347, + "name": "chromium", + "status": "sleeping", + "session": 7349, + "group": 7349 + }, + { + "pid": 7357, + "start": 1793472995.16, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7358, + "start": 1793472995.16, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7382, + "start": 1793472995.22, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7360, + "start": 1793472995.2, + "parent": 7358, + "name": "chromium", + "status": "sleeping", + "session": 7349, + "group": 7349 + }, + { + "pid": 7380, + "start": 1793472995.21, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7401, + "start": 1793472995.27, + "parent": 7360, + "name": "chromium", + "status": "sleeping", + "session": 7349, + "group": 7349 + }, + { + "pid": 7419, + "start": 1793472995.32, + "parent": 7360, + "name": "chromium", + "status": "sleeping", + "session": 7349, + "group": 7349 + }, + { + "pid": 7428, + "start": 1793472995.35, + "parent": 7360, + "name": "chromium", + "status": "sleeping", + "session": 7349, + "group": 7349 + }, + { + "pid": 7429, + "start": 1793472995.35, + "parent": 7360, + "name": "chromium", + "status": "sleeping", + "session": 7349, + "group": 7349 + }, + { + "pid": 7462, + "start": 1793472995.48, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7467, + "start": 1793472995.6, + "parent": 7210, + "name": "footwork", + "status": "sleeping", + "session": 7210, + "group": 7210 + }, + { + "pid": 7468, + "start": 1793472995.72, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7469, + "start": 1793472995.8, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7476, + "start": 1793472996.58, + "parent": 7210, + "name": "python", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7482, + "start": 1793472996.85, + "parent": 7210, + "name": "python", + "status": "sleeping", + "session": 7482, + "group": 7482 + }, + { + "pid": 7484, + "start": 1793472996.94, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7486, + "start": 1793472996.97, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7485, + "group": 7485 + }, + { + "pid": 7490, + "start": 1793472996.97, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7489, + "group": 7489 + }, + { + "pid": 7491, + "start": 1793472996.98, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7493, + "start": 1793472996.98, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7517, + "start": 1793472997.04, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7495, + "start": 1793472997.02, + "parent": 7493, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7515, + "start": 1793472997.03, + "parent": 7491, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7540, + "start": 1793472997.08, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7555, + "start": 1793472997.13, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7564, + "start": 1793472997.15, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7566, + "start": 1793472997.16, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7596, + "start": 1793472997.31, + "parent": 7210, + "name": "footwork", + "status": "sleeping", + "session": 7210, + "group": 7210 + }, + { + "pid": 7597, + "start": 1793472997.42, + "parent": 7210, + "name": "footwork", + "status": "sleeping", + "session": 7210, + "group": 7210 + }, + { + "pid": 7598, + "start": 1793472997.54, + "parent": 7482, + "name": "python", + "status": "running", + "session": 7482, + "group": 7482 + }, + { + "pid": 7599, + "start": 1793472997.58, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7600, + "start": 1793472997.66, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7601, + "start": 1793472997.74, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7602, + "start": 1793472997.82, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7603, + "start": 1793472997.9, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7605, + "start": 1793472998.25, + "parent": 7210, + "name": "python", + "status": "zombie", + "session": 7605, + "group": 7605 + }, + { + "pid": 7607, + "start": 1793472998.33, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7609, + "start": 1793472998.36, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7608, + "group": 7608 + }, + { + "pid": 7613, + "start": 1793472998.37, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7611, + "group": 7611 + }, + { + "pid": 7614, + "start": 1793472998.37, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7616, + "start": 1793472998.37, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7648, + "start": 1793472998.43, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7618, + "start": 1793472998.41, + "parent": 7616, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7639, + "start": 1793472998.42, + "parent": 7614, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7665, + "start": 1793472998.49, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7679, + "start": 1793472998.54, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7688, + "start": 1793472998.56, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7689, + "start": 1793472998.56, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7717, + "start": 1793472998.7, + "parent": 7210, + "name": "footwork", + "status": "sleeping", + "session": 7210, + "group": 7210 + }, + { + "pid": 7719, + "start": 1793472998.83, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7721, + "start": 1793472998.97, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7722, + "start": 1793472999.06, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7723, + "start": 1793472999.14, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7724, + "start": 1793472999.22, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7732, + "start": 1793472999.27, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7746, + "start": 1793472999.31, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7748, + "start": 1793472999.65, + "parent": 7210, + "name": "python", + "status": "running", + "session": 7748, + "group": 7748 + }, + { + "pid": 7752, + "start": 1793472999.76, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7751, + "group": 7751 + }, + { + "pid": 7756, + "start": 1793472999.76, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7755, + "group": 7755 + }, + { + "pid": 7750, + "start": 1793472999.72, + "parent": 7206, + "name": "chromium", + "status": "running", + "session": 7750, + "group": 7750 + }, + { + "pid": 7757, + "start": 1793472999.76, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7759, + "start": 1793472999.76, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7791, + "start": 1793472999.81, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7761, + "start": 1793472999.79, + "parent": 7759, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7783, + "start": 1793472999.8, + "parent": 7757, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7808, + "start": 1793472999.85, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7823, + "start": 1793472999.9, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7832, + "start": 1793472999.93, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7833, + "start": 1793472999.94, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7860, + "start": 1793473000.07, + "parent": 7210, + "name": "footwork", + "status": "sleeping", + "session": 7210, + "group": 7210 + }, + { + "pid": 7861, + "start": 1793473000.2, + "parent": 7210, + "name": "footwork", + "status": "sleeping", + "session": 7210, + "group": 7210 + }, + { + "pid": 7866, + "start": 1793473000.38, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7872, + "start": 1793473000.5, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7873, + "start": 1793473000.6, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7881, + "start": 1793473000.67, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7895, + "start": 1793473000.7, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7896, + "start": 1793473000.78, + "parent": 7210, + "name": "footwork", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 7897, + "start": 1793473001.36, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 7897, + "group": 7897 + }, + { + "pid": 7899, + "start": 1793473001.4, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7898, + "group": 7898 + }, + { + "pid": 7903, + "start": 1793473001.4, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7902, + "group": 7902 + }, + { + "pid": 7905, + "start": 1793473001.4, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7897, + "group": 7897 + }, + { + "pid": 7906, + "start": 1793473001.4, + "parent": 7897, + "name": "chromium", + "status": "sleeping", + "session": 7897, + "group": 7897 + }, + { + "pid": 7931, + "start": 1793473001.46, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7897, + "group": 7897 + }, + { + "pid": 7908, + "start": 1793473001.44, + "parent": 7906, + "name": "chromium", + "status": "sleeping", + "session": 7897, + "group": 7897 + }, + { + "pid": 7929, + "start": 1793473001.45, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7897, + "group": 7897 + }, + { + "pid": 7954, + "start": 1793473001.5, + "parent": 7908, + "name": "chromium", + "status": "sleeping", + "session": 7897, + "group": 7897 + }, + { + "pid": 7972, + "start": 1793473001.56, + "parent": 7908, + "name": "chromium", + "status": "running", + "session": 7897, + "group": 7897 + }, + { + "pid": 7982, + "start": 1793473001.58, + "parent": 7908, + "name": "chromium", + "status": "sleeping", + "session": 7897, + "group": 7897 + }, + { + "pid": 7983, + "start": 1793473001.58, + "parent": 7908, + "name": "chromium", + "status": "sleeping", + "session": 7897, + "group": 7897 + }, + { + "pid": 8011, + "start": 1793473001.79, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 8011, + "group": 8011 + }, + { + "pid": 8013, + "start": 1793473001.82, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8012, + "group": 8012 + }, + { + "pid": 8017, + "start": 1793473001.83, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8016, + "group": 8016 + }, + { + "pid": 8018, + "start": 1793473001.83, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8011, + "group": 8011 + }, + { + "pid": 8019, + "start": 1793473001.83, + "parent": 8011, + "name": "chromium", + "status": "sleeping", + "session": 8011, + "group": 8011 + }, + { + "pid": 8022, + "start": 1793473001.86, + "parent": 8019, + "name": "chromium", + "status": "sleeping", + "session": 8011, + "group": 8011 + }, + { + "pid": 8044, + "start": 1793473001.88, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8011, + "group": 8011 + }, + { + "pid": 8063, + "start": 1793473001.91, + "parent": 8022, + "name": "chromium", + "status": "sleeping", + "session": 8011, + "group": 8011 + }, + { + "pid": 8042, + "start": 1793473001.87, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8011, + "group": 8011 + }, + { + "pid": 8088, + "start": 1793473001.97, + "parent": 8022, + "name": "chromium", + "status": "running", + "session": 8011, + "group": 8011 + }, + { + "pid": 8097, + "start": 1793473001.99, + "parent": 8022, + "name": "chromium", + "status": "sleeping", + "session": 8011, + "group": 8011 + }, + { + "pid": 8099, + "start": 1793473001.99, + "parent": 8022, + "name": "chromium", + "status": "sleeping", + "session": 8011, + "group": 8011 + }, + { + "pid": 8154, + "start": 1793473002.22, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 8154, + "group": 8154 + }, + { + "pid": 8156, + "start": 1793473002.25, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8155, + "group": 8155 + }, + { + "pid": 8160, + "start": 1793473002.25, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8159, + "group": 8159 + }, + { + "pid": 8161, + "start": 1793473002.25, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8154, + "group": 8154 + }, + { + "pid": 8162, + "start": 1793473002.25, + "parent": 8154, + "name": "chromium", + "status": "sleeping", + "session": 8154, + "group": 8154 + }, + { + "pid": 8193, + "start": 1793473002.31, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8154, + "group": 8154 + }, + { + "pid": 8165, + "start": 1793473002.29, + "parent": 8162, + "name": "chromium", + "status": "sleeping", + "session": 8154, + "group": 8154 + }, + { + "pid": 8185, + "start": 1793473002.3, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8154, + "group": 8154 + }, + { + "pid": 8210, + "start": 1793473002.35, + "parent": 8165, + "name": "chromium", + "status": "sleeping", + "session": 8154, + "group": 8154 + }, + { + "pid": 8232, + "start": 1793473002.4, + "parent": 8165, + "name": "chromium", + "status": "running", + "session": 8154, + "group": 8154 + }, + { + "pid": 8241, + "start": 1793473002.42, + "parent": 8165, + "name": "chromium", + "status": "sleeping", + "session": 8154, + "group": 8154 + }, + { + "pid": 8246, + "start": 1793473002.43, + "parent": 8165, + "name": "chromium", + "status": "sleeping", + "session": 8154, + "group": 8154 + }, + { + "pid": 8276, + "start": 1793473002.64, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 8276, + "group": 8276 + }, + { + "pid": 8278, + "start": 1793473002.68, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8277, + "group": 8277 + }, + { + "pid": 8281, + "start": 1793473002.68, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8280, + "group": 8280 + }, + { + "pid": 8284, + "start": 1793473002.68, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8285, + "start": 1793473002.68, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8311, + "start": 1793473002.74, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8287, + "start": 1793473002.72, + "parent": 8285, + "name": "chromium", + "status": "sleeping", + "session": 8276, + "group": 8276 + }, + { + "pid": 8309, + "start": 1793473002.73, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8334, + "start": 1793473002.78, + "parent": 8287, + "name": "chromium", + "status": "sleeping", + "session": 8276, + "group": 8276 + }, + { + "pid": 8352, + "start": 1793473002.83, + "parent": 8287, + "name": "chromium", + "status": "running", + "session": 8276, + "group": 8276 + }, + { + "pid": 8361, + "start": 1793473002.85, + "parent": 8287, + "name": "chromium", + "status": "sleeping", + "session": 8276, + "group": 8276 + }, + { + "pid": 8362, + "start": 1793473002.85, + "parent": 8287, + "name": "chromium", + "status": "sleeping", + "session": 8276, + "group": 8276 + }, + { + "pid": 8394, + "start": 1793473003.05, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 8394, + "group": 8394 + }, + { + "pid": 8396, + "start": 1793473003.08, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8395, + "group": 8395 + }, + { + "pid": 8400, + "start": 1793473003.09, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8399, + "group": 8399 + }, + { + "pid": 8401, + "start": 1793473003.09, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8394, + "group": 8394 + }, + { + "pid": 8403, + "start": 1793473003.09, + "parent": 8394, + "name": "chromium", + "status": "sleeping", + "session": 8394, + "group": 8394 + }, + { + "pid": 8429, + "start": 1793473003.14, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8394, + "group": 8394 + }, + { + "pid": 8405, + "start": 1793473003.12, + "parent": 8403, + "name": "chromium", + "status": "sleeping", + "session": 8394, + "group": 8394 + }, + { + "pid": 8427, + "start": 1793473003.13, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8394, + "group": 8394 + }, + { + "pid": 8448, + "start": 1793473003.18, + "parent": 8405, + "name": "chromium", + "status": "sleeping", + "session": 8394, + "group": 8394 + }, + { + "pid": 8471, + "start": 1793473003.23, + "parent": 8405, + "name": "chromium", + "status": "running", + "session": 8394, + "group": 8394 + }, + { + "pid": 8480, + "start": 1793473003.25, + "parent": 8405, + "name": "chromium", + "status": "sleeping", + "session": 8394, + "group": 8394 + }, + { + "pid": 8481, + "start": 1793473003.25, + "parent": 8405, + "name": "chromium", + "status": "running", + "session": 8394, + "group": 8394 + }, + { + "pid": 8511, + "start": 1793473003.48, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8510, + "group": 8510 + }, + { + "pid": 8515, + "start": 1793473003.48, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8513, + "group": 8513 + }, + { + "pid": 8509, + "start": 1793473003.45, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 8509, + "group": 8509 + }, + { + "pid": 8516, + "start": 1793473003.48, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8509, + "group": 8509 + }, + { + "pid": 8518, + "start": 1793473003.48, + "parent": 8509, + "name": "chromium", + "status": "sleeping", + "session": 8509, + "group": 8509 + }, + { + "pid": 8543, + "start": 1793473003.53, + "parent": 8509, + "name": "chromium", + "status": "sleeping", + "session": 8509, + "group": 8509 + }, + { + "pid": 8520, + "start": 1793473003.51, + "parent": 8518, + "name": "chromium", + "status": "sleeping", + "session": 8509, + "group": 8509 + }, + { + "pid": 8541, + "start": 1793473003.52, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8509, + "group": 8509 + }, + { + "pid": 8565, + "start": 1793473003.57, + "parent": 8520, + "name": "chromium", + "status": "sleeping", + "session": 8509, + "group": 8509 + }, + { + "pid": 8586, + "start": 1793473003.63, + "parent": 8520, + "name": "chromium", + "status": "running", + "session": 8509, + "group": 8509 + }, + { + "pid": 8595, + "start": 1793473003.65, + "parent": 8520, + "name": "chromium", + "status": "sleeping", + "session": 8509, + "group": 8509 + }, + { + "pid": 8596, + "start": 1793473003.65, + "parent": 8520, + "name": "chromium", + "status": "sleeping", + "session": 8509, + "group": 8509 + }, + { + "pid": 8627, + "start": 1793473003.84, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8509, + "group": 8509 + }, + { + "pid": 8629, + "start": 1793473003.86, + "parent": 7210, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8636, + "start": 1793473003.9, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8635, + "group": 8635 + }, + { + "pid": 8640, + "start": 1793473003.9, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8638, + "group": 8638 + }, + { + "pid": 8642, + "start": 1793473003.9, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8643, + "start": 1793473003.9, + "parent": 8629, + "name": "chromium", + "status": "sleeping", + "session": 8629, + "group": 8629 + }, + { + "pid": 8674, + "start": 1793473003.95, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8645, + "start": 1793473003.93, + "parent": 8643, + "name": "chromium", + "status": "sleeping", + "session": 8629, + "group": 8629 + }, + { + "pid": 8666, + "start": 1793473003.94, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8684, + "start": 1793473003.99, + "parent": 8645, + "name": "chromium", + "status": "sleeping", + "session": 8629, + "group": 8629 + }, + { + "pid": 8709, + "start": 1793473004.05, + "parent": 8645, + "name": "chromium", + "status": "running", + "session": 8629, + "group": 8629 + }, + { + "pid": 8718, + "start": 1793473004.07, + "parent": 8645, + "name": "chromium", + "status": "sleeping", + "session": 8629, + "group": 8629 + }, + { + "pid": 8719, + "start": 1793473004.07, + "parent": 8645, + "name": "chromium", + "status": "sleeping", + "session": 8629, + "group": 8629 + }, + { + "pid": 8746, + "start": 1793473004.3, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8745, + "group": 8745 + }, + { + "pid": 8750, + "start": 1793473004.3, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8749, + "group": 8749 + }, + { + "pid": 8744, + "start": 1793473004.27, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 8744, + "group": 8744 + }, + { + "pid": 8751, + "start": 1793473004.3, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8744, + "group": 8744 + }, + { + "pid": 8752, + "start": 1793473004.3, + "parent": 8744, + "name": "chromium", + "status": "sleeping", + "session": 8744, + "group": 8744 + }, + { + "pid": 8784, + "start": 1793473004.36, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8744, + "group": 8744 + }, + { + "pid": 8755, + "start": 1793473004.34, + "parent": 8752, + "name": "chromium", + "status": "sleeping", + "session": 8744, + "group": 8744 + }, + { + "pid": 8776, + "start": 1793473004.35, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8744, + "group": 8744 + }, + { + "pid": 8792, + "start": 1793473004.4, + "parent": 8755, + "name": "chromium", + "status": "sleeping", + "session": 8744, + "group": 8744 + }, + { + "pid": 8824, + "start": 1793473004.46, + "parent": 8755, + "name": "chromium", + "status": "sleeping", + "session": 8744, + "group": 8744 + }, + { + "pid": 8833, + "start": 1793473004.47, + "parent": 8755, + "name": "chromium", + "status": "sleeping", + "session": 8744, + "group": 8744 + }, + { + "pid": 8834, + "start": 1793473004.48, + "parent": 8755, + "name": "chromium", + "status": "sleeping", + "session": 8744, + "group": 8744 + }, + { + "pid": 8865, + "start": 1793473004.68, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 8865, + "group": 8865 + }, + { + "pid": 8867, + "start": 1793473004.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8866, + "group": 8866 + }, + { + "pid": 8871, + "start": 1793473004.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8870, + "group": 8870 + }, + { + "pid": 8873, + "start": 1793473004.71, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8865, + "group": 8865 + }, + { + "pid": 8874, + "start": 1793473004.72, + "parent": 8865, + "name": "chromium", + "status": "sleeping", + "session": 8865, + "group": 8865 + }, + { + "pid": 8907, + "start": 1793473004.77, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8865, + "group": 8865 + }, + { + "pid": 8876, + "start": 1793473004.75, + "parent": 8874, + "name": "chromium", + "status": "sleeping", + "session": 8865, + "group": 8865 + }, + { + "pid": 8898, + "start": 1793473004.76, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8865, + "group": 8865 + }, + { + "pid": 8914, + "start": 1793473004.8, + "parent": 8876, + "name": "chromium", + "status": "sleeping", + "session": 8865, + "group": 8865 + }, + { + "pid": 8943, + "start": 1793473004.86, + "parent": 8876, + "name": "chromium", + "status": "running", + "session": 8865, + "group": 8865 + }, + { + "pid": 8949, + "start": 1793473004.88, + "parent": 8876, + "name": "chromium", + "status": "sleeping", + "session": 8865, + "group": 8865 + }, + { + "pid": 8951, + "start": 1793473004.88, + "parent": 8876, + "name": "chromium", + "status": "sleeping", + "session": 8865, + "group": 8865 + }, + { + "pid": 8985, + "start": 1793473005.07, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 8985, + "group": 8985 + }, + { + "pid": 8987, + "start": 1793473005.1, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8986, + "group": 8986 + }, + { + "pid": 8991, + "start": 1793473005.1, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8990, + "group": 8990 + }, + { + "pid": 8992, + "start": 1793473005.1, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8985, + "group": 8985 + }, + { + "pid": 8994, + "start": 1793473005.11, + "parent": 8985, + "name": "chromium", + "status": "running", + "session": 8985, + "group": 8985 + }, + { + "pid": 8996, + "start": 1793473005.14, + "parent": 8994, + "name": "chromium", + "status": "sleeping", + "session": 8985, + "group": 8985 + }, + { + "pid": 9020, + "start": 1793473005.16, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8985, + "group": 8985 + }, + { + "pid": 9018, + "start": 1793473005.15, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8985, + "group": 8985 + }, + { + "pid": 9043, + "start": 1793473005.2, + "parent": 8996, + "name": "chromium", + "status": "sleeping", + "session": 8985, + "group": 8985 + }, + { + "pid": 9060, + "start": 1793473005.26, + "parent": 8996, + "name": "chromium", + "status": "running", + "session": 8985, + "group": 8985 + }, + { + "pid": 9069, + "start": 1793473005.29, + "parent": 8996, + "name": "chromium", + "status": "sleeping", + "session": 8985, + "group": 8985 + }, + { + "pid": 9070, + "start": 1793473005.29, + "parent": 8996, + "name": "chromium", + "status": "running", + "session": 8985, + "group": 8985 + }, + { + "pid": 9098, + "start": 1793473005.52, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9097, + "group": 9097 + }, + { + "pid": 9101, + "start": 1793473005.52, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9100, + "group": 9100 + }, + { + "pid": 9096, + "start": 1793473005.49, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 9096, + "group": 9096 + }, + { + "pid": 9104, + "start": 1793473005.52, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9096, + "group": 9096 + }, + { + "pid": 9105, + "start": 1793473005.52, + "parent": 9096, + "name": "chromium", + "status": "sleeping", + "session": 9096, + "group": 9096 + }, + { + "pid": 9131, + "start": 1793473005.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9096, + "group": 9096 + }, + { + "pid": 9107, + "start": 1793473005.57, + "parent": 9105, + "name": "chromium", + "status": "sleeping", + "session": 9096, + "group": 9096 + }, + { + "pid": 9129, + "start": 1793473005.58, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9096, + "group": 9096 + }, + { + "pid": 9145, + "start": 1793473005.62, + "parent": 9107, + "name": "chromium", + "status": "sleeping", + "session": 9096, + "group": 9096 + }, + { + "pid": 9172, + "start": 1793473005.67, + "parent": 9107, + "name": "chromium", + "status": "sleeping", + "session": 9096, + "group": 9096 + }, + { + "pid": 9181, + "start": 1793473005.69, + "parent": 9107, + "name": "chromium", + "status": "sleeping", + "session": 9096, + "group": 9096 + }, + { + "pid": 9182, + "start": 1793473005.69, + "parent": 9107, + "name": "chromium", + "status": "sleeping", + "session": 9096, + "group": 9096 + }, + { + "pid": 9214, + "start": 1793473005.9, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 9214, + "group": 9214 + }, + { + "pid": 9216, + "start": 1793473005.93, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9215, + "group": 9215 + }, + { + "pid": 9220, + "start": 1793473005.93, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9219, + "group": 9219 + }, + { + "pid": 9221, + "start": 1793473005.93, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9214, + "group": 9214 + }, + { + "pid": 9223, + "start": 1793473005.94, + "parent": 9214, + "name": "chromium", + "status": "sleeping", + "session": 9214, + "group": 9214 + }, + { + "pid": 9225, + "start": 1793473005.97, + "parent": 9223, + "name": "chromium", + "status": "sleeping", + "session": 9214, + "group": 9214 + }, + { + "pid": 9248, + "start": 1793473005.99, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9214, + "group": 9214 + }, + { + "pid": 9262, + "start": 1793473006.02, + "parent": 9225, + "name": "chromium", + "status": "sleeping", + "session": 9214, + "group": 9214 + }, + { + "pid": 9246, + "start": 1793473005.98, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9214, + "group": 9214 + }, + { + "pid": 9293, + "start": 1793473006.08, + "parent": 9225, + "name": "chromium", + "status": "sleeping", + "session": 9214, + "group": 9214 + }, + { + "pid": 9302, + "start": 1793473006.1, + "parent": 9225, + "name": "chromium", + "status": "sleeping", + "session": 9214, + "group": 9214 + }, + { + "pid": 9303, + "start": 1793473006.1, + "parent": 9225, + "name": "chromium", + "status": "sleeping", + "session": 9214, + "group": 9214 + }, + { + "pid": 9334, + "start": 1793473006.3, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 9334, + "group": 9334 + }, + { + "pid": 9336, + "start": 1793473006.34, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9335, + "group": 9335 + }, + { + "pid": 9339, + "start": 1793473006.34, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9338, + "group": 9338 + }, + { + "pid": 9342, + "start": 1793473006.34, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9343, + "start": 1793473006.34, + "parent": 9334, + "name": "chromium", + "status": "sleeping", + "session": 9334, + "group": 9334 + }, + { + "pid": 9345, + "start": 1793473006.38, + "parent": 9343, + "name": "chromium", + "status": "sleeping", + "session": 9334, + "group": 9334 + }, + { + "pid": 9376, + "start": 1793473006.39, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9389, + "start": 1793473006.43, + "parent": 9343, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9367, + "start": 1793473006.39, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9408, + "start": 1793473006.48, + "parent": 9343, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9417, + "start": 1793473006.5, + "parent": 9345, + "name": "chromium", + "status": "sleeping", + "session": 9334, + "group": 9334 + }, + { + "pid": 9418, + "start": 1793473006.51, + "parent": 9345, + "name": "chromium", + "status": "sleeping", + "session": 9334, + "group": 9334 + }, + { + "pid": 9452, + "start": 1793473006.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9451, + "group": 9451 + }, + { + "pid": 9456, + "start": 1793473006.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9455, + "group": 9455 + }, + { + "pid": 9450, + "start": 1793473006.67, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 9450, + "group": 9450 + }, + { + "pid": 9458, + "start": 1793473006.71, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9450, + "group": 9450 + }, + { + "pid": 9459, + "start": 1793473006.71, + "parent": 9450, + "name": "chromium", + "status": "sleeping", + "session": 9450, + "group": 9450 + }, + { + "pid": 9484, + "start": 1793473006.76, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9450, + "group": 9450 + }, + { + "pid": 9461, + "start": 1793473006.74, + "parent": 9459, + "name": "chromium", + "status": "sleeping", + "session": 9450, + "group": 9450 + }, + { + "pid": 9482, + "start": 1793473006.75, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9450, + "group": 9450 + }, + { + "pid": 9507, + "start": 1793473006.81, + "parent": 9461, + "name": "chromium", + "status": "sleeping", + "session": 9450, + "group": 9450 + }, + { + "pid": 9530, + "start": 1793473006.85, + "parent": 9461, + "name": "chromium", + "status": "running", + "session": 9450, + "group": 9450 + }, + { + "pid": 9539, + "start": 1793473006.87, + "parent": 9461, + "name": "chromium", + "status": "sleeping", + "session": 9450, + "group": 9450 + }, + { + "pid": 9540, + "start": 1793473006.87, + "parent": 9461, + "name": "chromium", + "status": "sleeping", + "session": 9450, + "group": 9450 + }, + { + "pid": 9567, + "start": 1793473007.08, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 9567, + "group": 9567 + }, + { + "pid": 9569, + "start": 1793473007.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9568, + "group": 9568 + }, + { + "pid": 9573, + "start": 1793473007.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9572, + "group": 9572 + }, + { + "pid": 9574, + "start": 1793473007.12, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9567, + "group": 9567 + }, + { + "pid": 9576, + "start": 1793473007.12, + "parent": 9567, + "name": "chromium", + "status": "sleeping", + "session": 9567, + "group": 9567 + }, + { + "pid": 9578, + "start": 1793473007.15, + "parent": 9576, + "name": "chromium", + "status": "sleeping", + "session": 9567, + "group": 9567 + }, + { + "pid": 9600, + "start": 1793473007.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9567, + "group": 9567 + }, + { + "pid": 9622, + "start": 1793473007.21, + "parent": 9578, + "name": "chromium", + "status": "sleeping", + "session": 9567, + "group": 9567 + }, + { + "pid": 9598, + "start": 1793473007.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9567, + "group": 9567 + }, + { + "pid": 9648, + "start": 1793473007.27, + "parent": 9578, + "name": "chromium", + "status": "running", + "session": 9567, + "group": 9567 + }, + { + "pid": 9657, + "start": 1793473007.29, + "parent": 9578, + "name": "chromium", + "status": "sleeping", + "session": 9567, + "group": 9567 + }, + { + "pid": 9658, + "start": 1793473007.29, + "parent": 9578, + "name": "chromium", + "status": "running", + "session": 9567, + "group": 9567 + }, + { + "pid": 9690, + "start": 1793473007.51, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 9690, + "group": 9690 + }, + { + "pid": 9692, + "start": 1793473007.54, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9691, + "group": 9691 + }, + { + "pid": 9696, + "start": 1793473007.54, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9695, + "group": 9695 + }, + { + "pid": 9697, + "start": 1793473007.55, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9690, + "group": 9690 + }, + { + "pid": 9699, + "start": 1793473007.55, + "parent": 9690, + "name": "chromium", + "status": "sleeping", + "session": 9690, + "group": 9690 + }, + { + "pid": 9730, + "start": 1793473007.6, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9690, + "group": 9690 + }, + { + "pid": 9701, + "start": 1793473007.58, + "parent": 9699, + "name": "chromium", + "status": "sleeping", + "session": 9690, + "group": 9690 + }, + { + "pid": 9721, + "start": 1793473007.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9690, + "group": 9690 + }, + { + "pid": 9737, + "start": 1793473007.64, + "parent": 9701, + "name": "chromium", + "status": "sleeping", + "session": 9690, + "group": 9690 + }, + { + "pid": 9768, + "start": 1793473007.69, + "parent": 9701, + "name": "chromium", + "status": "running", + "session": 9690, + "group": 9690 + }, + { + "pid": 9777, + "start": 1793473007.72, + "parent": 9701, + "name": "chromium", + "status": "sleeping", + "session": 9690, + "group": 9690 + }, + { + "pid": 9778, + "start": 1793473007.72, + "parent": 9701, + "name": "chromium", + "status": "sleeping", + "session": 9690, + "group": 9690 + }, + { + "pid": 9810, + "start": 1793473007.92, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 9810, + "group": 9810 + }, + { + "pid": 9815, + "start": 1793473007.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9814, + "group": 9814 + }, + { + "pid": 9819, + "start": 1793473007.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9817, + "group": 9817 + }, + { + "pid": 9821, + "start": 1793473007.95, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9810, + "group": 9810 + }, + { + "pid": 9822, + "start": 1793473007.95, + "parent": 9810, + "name": "chromium", + "status": "sleeping", + "session": 9810, + "group": 9810 + }, + { + "pid": 9824, + "start": 1793473007.99, + "parent": 9822, + "name": "chromium", + "status": "sleeping", + "session": 9810, + "group": 9810 + }, + { + "pid": 9845, + "start": 1793473008.0, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9810, + "group": 9810 + }, + { + "pid": 9854, + "start": 1793473008.01, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9810, + "group": 9810 + }, + { + "pid": 9871, + "start": 1793473008.05, + "parent": 9824, + "name": "chromium", + "status": "sleeping", + "session": 9810, + "group": 9810 + }, + { + "pid": 9888, + "start": 1793473008.1, + "parent": 9824, + "name": "chromium", + "status": "running", + "session": 9810, + "group": 9810 + }, + { + "pid": 9897, + "start": 1793473008.12, + "parent": 9824, + "name": "chromium", + "status": "sleeping", + "session": 9810, + "group": 9810 + }, + { + "pid": 9898, + "start": 1793473008.13, + "parent": 9824, + "name": "chromium", + "status": "sleeping", + "session": 9810, + "group": 9810 + }, + { + "pid": 9928, + "start": 1793473008.33, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 9928, + "group": 9928 + }, + { + "pid": 9930, + "start": 1793473008.36, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9929, + "group": 9929 + }, + { + "pid": 9934, + "start": 1793473008.37, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9933, + "group": 9933 + }, + { + "pid": 9935, + "start": 1793473008.37, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9928, + "group": 9928 + }, + { + "pid": 9937, + "start": 1793473008.37, + "parent": 9928, + "name": "chromium", + "status": "sleeping", + "session": 9928, + "group": 9928 + }, + { + "pid": 9939, + "start": 1793473008.4, + "parent": 9937, + "name": "chromium", + "status": "sleeping", + "session": 9928, + "group": 9928 + }, + { + "pid": 9961, + "start": 1793473008.42, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9928, + "group": 9928 + }, + { + "pid": 9984, + "start": 1793473008.46, + "parent": 9939, + "name": "chromium", + "status": "sleeping", + "session": 9928, + "group": 9928 + }, + { + "pid": 9959, + "start": 1793473008.42, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9928, + "group": 9928 + }, + { + "pid": 10006, + "start": 1793473008.5, + "parent": 9939, + "name": "chromium", + "status": "running", + "session": 9928, + "group": 9928 + }, + { + "pid": 10015, + "start": 1793473008.52, + "parent": 9939, + "name": "chromium", + "status": "sleeping", + "session": 9928, + "group": 9928 + }, + { + "pid": 10016, + "start": 1793473008.52, + "parent": 9939, + "name": "chromium", + "status": "sleeping", + "session": 9928, + "group": 9928 + }, + { + "pid": 10044, + "start": 1793473008.72, + "parent": 7210, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10046, + "start": 1793473008.75, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10045, + "group": 10045 + }, + { + "pid": 10050, + "start": 1793473008.75, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10048, + "group": 10048 + }, + { + "pid": 10052, + "start": 1793473008.75, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10053, + "start": 1793473008.75, + "parent": 10044, + "name": "chromium", + "status": "sleeping", + "session": 10044, + "group": 10044 + }, + { + "pid": 10055, + "start": 1793473008.8, + "parent": 10053, + "name": "chromium", + "status": "sleeping", + "session": 10044, + "group": 10044 + }, + { + "pid": 10079, + "start": 1793473008.82, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10102, + "start": 1793473008.86, + "parent": 10055, + "name": "chromium", + "status": "sleeping", + "session": 10044, + "group": 10044 + }, + { + "pid": 10077, + "start": 1793473008.81, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10123, + "start": 1793473008.91, + "parent": 10055, + "name": "chromium", + "status": "running", + "session": 10044, + "group": 10044 + }, + { + "pid": 10132, + "start": 1793473008.94, + "parent": 10055, + "name": "chromium", + "status": "sleeping", + "session": 10044, + "group": 10044 + }, + { + "pid": 10133, + "start": 1793473008.94, + "parent": 10055, + "name": "chromium", + "status": "running", + "session": 10044, + "group": 10044 + }, + { + "pid": 10165, + "start": 1793473009.23, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10164, + "group": 10164 + }, + { + "pid": 10169, + "start": 1793473009.23, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10168, + "group": 10168 + }, + { + "pid": 10163, + "start": 1793473009.19, + "parent": 7210, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10170, + "start": 1793473009.23, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10171, + "start": 1793473009.23, + "parent": 10163, + "name": "chromium", + "status": "sleeping", + "session": 10163, + "group": 10163 + }, + { + "pid": 10198, + "start": 1793473009.3, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10174, + "start": 1793473009.28, + "parent": 10171, + "name": "chromium", + "status": "sleeping", + "session": 10163, + "group": 10163 + }, + { + "pid": 10196, + "start": 1793473009.29, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10220, + "start": 1793473009.34, + "parent": 10174, + "name": "chromium", + "status": "sleeping", + "session": 10163, + "group": 10163 + }, + { + "pid": 10237, + "start": 1793473009.4, + "parent": 10174, + "name": "chromium", + "status": "running", + "session": 10163, + "group": 10163 + }, + { + "pid": 10247, + "start": 1793473009.42, + "parent": 10174, + "name": "chromium", + "status": "sleeping", + "session": 10163, + "group": 10163 + }, + { + "pid": 10248, + "start": 1793473009.42, + "parent": 10174, + "name": "chromium", + "status": "sleeping", + "session": 10163, + "group": 10163 + }, + { + "pid": 10281, + "start": 1793473009.67, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10280, + "group": 10280 + }, + { + "pid": 10285, + "start": 1793473009.67, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10284, + "group": 10284 + }, + { + "pid": 10279, + "start": 1793473009.64, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 10279, + "group": 10279 + }, + { + "pid": 10287, + "start": 1793473009.67, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10279, + "group": 10279 + }, + { + "pid": 10288, + "start": 1793473009.67, + "parent": 10279, + "name": "chromium", + "status": "sleeping", + "session": 10279, + "group": 10279 + }, + { + "pid": 10319, + "start": 1793473009.73, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10279, + "group": 10279 + }, + { + "pid": 10290, + "start": 1793473009.7, + "parent": 10288, + "name": "chromium", + "status": "sleeping", + "session": 10279, + "group": 10279 + }, + { + "pid": 10310, + "start": 1793473009.72, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10279, + "group": 10279 + }, + { + "pid": 10335, + "start": 1793473009.78, + "parent": 10290, + "name": "chromium", + "status": "sleeping", + "session": 10279, + "group": 10279 + }, + { + "pid": 10358, + "start": 1793473009.83, + "parent": 10290, + "name": "chromium", + "status": "running", + "session": 10279, + "group": 10279 + }, + { + "pid": 10368, + "start": 1793473009.85, + "parent": 10290, + "name": "chromium", + "status": "sleeping", + "session": 10279, + "group": 10279 + }, + { + "pid": 10369, + "start": 1793473009.85, + "parent": 10290, + "name": "chromium", + "status": "sleeping", + "session": 10279, + "group": 10279 + }, + { + "pid": 10400, + "start": 1793473010.09, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 10400, + "group": 10400 + }, + { + "pid": 10402, + "start": 1793473010.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10401, + "group": 10401 + }, + { + "pid": 10406, + "start": 1793473010.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10405, + "group": 10405 + }, + { + "pid": 10407, + "start": 1793473010.12, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10408, + "start": 1793473010.13, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10411, + "start": 1793473010.16, + "parent": 10408, + "name": "chromium", + "status": "sleeping", + "session": 10400, + "group": 10400 + }, + { + "pid": 10435, + "start": 1793473010.18, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10457, + "start": 1793473010.22, + "parent": 10411, + "name": "chromium", + "status": "sleeping", + "session": 10400, + "group": 10400 + }, + { + "pid": 10433, + "start": 1793473010.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10480, + "start": 1793473010.27, + "parent": 10411, + "name": "chromium", + "status": "disk-sleep", + "session": 10400, + "group": 10400 + }, + { + "pid": 10489, + "start": 1793473010.29, + "parent": 10411, + "name": "chromium", + "status": "sleeping", + "session": 10400, + "group": 10400 + }, + { + "pid": 10490, + "start": 1793473010.3, + "parent": 10411, + "name": "chromium", + "status": "sleeping", + "session": 10400, + "group": 10400 + }, + { + "pid": 10521, + "start": 1793473010.52, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 10521, + "group": 10521 + }, + { + "pid": 10523, + "start": 1793473010.55, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10522, + "group": 10522 + }, + { + "pid": 10527, + "start": 1793473010.55, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10525, + "group": 10525 + }, + { + "pid": 10528, + "start": 1793473010.55, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10521, + "group": 10521 + }, + { + "pid": 10529, + "start": 1793473010.55, + "parent": 10521, + "name": "chromium", + "status": "sleeping", + "session": 10521, + "group": 10521 + }, + { + "pid": 10562, + "start": 1793473010.6, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10521, + "group": 10521 + }, + { + "pid": 10532, + "start": 1793473010.59, + "parent": 10529, + "name": "chromium", + "status": "sleeping", + "session": 10521, + "group": 10521 + }, + { + "pid": 10554, + "start": 1793473010.6, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10521, + "group": 10521 + }, + { + "pid": 10579, + "start": 1793473010.66, + "parent": 10532, + "name": "chromium", + "status": "sleeping", + "session": 10521, + "group": 10521 + }, + { + "pid": 10601, + "start": 1793473010.72, + "parent": 10532, + "name": "chromium", + "status": "running", + "session": 10521, + "group": 10521 + }, + { + "pid": 10610, + "start": 1793473010.75, + "parent": 10532, + "name": "chromium", + "status": "sleeping", + "session": 10521, + "group": 10521 + }, + { + "pid": 10611, + "start": 1793473010.75, + "parent": 10532, + "name": "chromium", + "status": "running", + "session": 10521, + "group": 10521 + }, + { + "pid": 10647, + "start": 1793473010.97, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 10647, + "group": 10647 + }, + { + "pid": 10649, + "start": 1793473011.0, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10648, + "group": 10648 + }, + { + "pid": 10653, + "start": 1793473011.0, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10651, + "group": 10651 + }, + { + "pid": 10654, + "start": 1793473011.0, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10647, + "group": 10647 + }, + { + "pid": 10656, + "start": 1793473011.0, + "parent": 10647, + "name": "chromium", + "status": "sleeping", + "session": 10647, + "group": 10647 + }, + { + "pid": 10686, + "start": 1793473011.07, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10647, + "group": 10647 + }, + { + "pid": 10658, + "start": 1793473011.05, + "parent": 10656, + "name": "chromium", + "status": "sleeping", + "session": 10647, + "group": 10647 + }, + { + "pid": 10678, + "start": 1793473011.07, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10647, + "group": 10647 + }, + { + "pid": 10701, + "start": 1793473011.11, + "parent": 10658, + "name": "chromium", + "status": "sleeping", + "session": 10647, + "group": 10647 + }, + { + "pid": 10719, + "start": 1793473011.17, + "parent": 10658, + "name": "chromium", + "status": "running", + "session": 10647, + "group": 10647 + }, + { + "pid": 10729, + "start": 1793473011.19, + "parent": 10658, + "name": "chromium", + "status": "sleeping", + "session": 10647, + "group": 10647 + }, + { + "pid": 10730, + "start": 1793473011.19, + "parent": 10658, + "name": "chromium", + "status": "sleeping", + "session": 10647, + "group": 10647 + }, + { + "pid": 10762, + "start": 1793473011.41, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 10762, + "group": 10762 + }, + { + "pid": 10764, + "start": 1793473011.44, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10763, + "group": 10763 + }, + { + "pid": 10768, + "start": 1793473011.44, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10767, + "group": 10767 + }, + { + "pid": 10769, + "start": 1793473011.44, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10762, + "group": 10762 + }, + { + "pid": 10770, + "start": 1793473011.44, + "parent": 10762, + "name": "chromium", + "status": "sleeping", + "session": 10762, + "group": 10762 + }, + { + "pid": 10802, + "start": 1793473011.5, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10762, + "group": 10762 + }, + { + "pid": 10773, + "start": 1793473011.48, + "parent": 10770, + "name": "chromium", + "status": "sleeping", + "session": 10762, + "group": 10762 + }, + { + "pid": 10820, + "start": 1793473011.54, + "parent": 10773, + "name": "chromium", + "status": "sleeping", + "session": 10762, + "group": 10762 + }, + { + "pid": 10793, + "start": 1793473011.49, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10762, + "group": 10762 + }, + { + "pid": 10842, + "start": 1793473011.59, + "parent": 10773, + "name": "chromium", + "status": "running", + "session": 10762, + "group": 10762 + }, + { + "pid": 10851, + "start": 1793473011.62, + "parent": 10773, + "name": "chromium", + "status": "sleeping", + "session": 10762, + "group": 10762 + }, + { + "pid": 10853, + "start": 1793473011.62, + "parent": 10773, + "name": "chromium", + "status": "running", + "session": 10762, + "group": 10762 + }, + { + "pid": 10882, + "start": 1793473011.79, + "parent": 10773, + "name": "chromium", + "status": "sleeping", + "session": 10762, + "group": 10762 + }, + { + "pid": 10896, + "start": 1793473011.88, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 10896, + "group": 10896 + }, + { + "pid": 10898, + "start": 1793473011.92, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10897, + "group": 10897 + }, + { + "pid": 10902, + "start": 1793473011.92, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10901, + "group": 10901 + }, + { + "pid": 10904, + "start": 1793473011.92, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10896, + "group": 10896 + }, + { + "pid": 10905, + "start": 1793473011.92, + "parent": 10896, + "name": "chromium", + "status": "sleeping", + "session": 10896, + "group": 10896 + }, + { + "pid": 10907, + "start": 1793473011.95, + "parent": 10905, + "name": "chromium", + "status": "sleeping", + "session": 10896, + "group": 10896 + }, + { + "pid": 10938, + "start": 1793473011.97, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10896, + "group": 10896 + }, + { + "pid": 10954, + "start": 1793473012.02, + "parent": 10907, + "name": "chromium", + "status": "sleeping", + "session": 10896, + "group": 10896 + }, + { + "pid": 10929, + "start": 1793473011.96, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10896, + "group": 10896 + }, + { + "pid": 10972, + "start": 1793473012.08, + "parent": 10907, + "name": "chromium", + "status": "sleeping", + "session": 10896, + "group": 10896 + }, + { + "pid": 10982, + "start": 1793473012.11, + "parent": 10907, + "name": "chromium", + "status": "sleeping", + "session": 10896, + "group": 10896 + }, + { + "pid": 10983, + "start": 1793473012.11, + "parent": 10907, + "name": "chromium", + "status": "sleeping", + "session": 10896, + "group": 10896 + }, + { + "pid": 11014, + "start": 1793473012.32, + "parent": 7210, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11016, + "start": 1793473012.35, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11015, + "group": 11015 + }, + { + "pid": 11020, + "start": 1793473012.35, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11019, + "group": 11019 + }, + { + "pid": 11021, + "start": 1793473012.35, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11022, + "start": 1793473012.35, + "parent": 11014, + "name": "chromium", + "status": "sleeping", + "session": 11014, + "group": 11014 + }, + { + "pid": 11025, + "start": 1793473012.38, + "parent": 11022, + "name": "chromium", + "status": "sleeping", + "session": 11014, + "group": 11014 + }, + { + "pid": 11046, + "start": 1793473012.4, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11048, + "start": 1793473012.4, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11071, + "start": 1793473012.45, + "parent": 11025, + "name": "chromium", + "status": "sleeping", + "session": 11014, + "group": 11014 + }, + { + "pid": 11093, + "start": 1793473012.51, + "parent": 11025, + "name": "chromium", + "status": "running", + "session": 11014, + "group": 11014 + }, + { + "pid": 11103, + "start": 1793473012.53, + "parent": 11025, + "name": "chromium", + "status": "sleeping", + "session": 11014, + "group": 11014 + }, + { + "pid": 11104, + "start": 1793473012.54, + "parent": 11025, + "name": "chromium", + "status": "running", + "session": 11014, + "group": 11014 + }, + { + "pid": 11139, + "start": 1793473012.78, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11138, + "group": 11138 + }, + { + "pid": 11143, + "start": 1793473012.78, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11142, + "group": 11142 + }, + { + "pid": 11137, + "start": 1793473012.74, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 11137, + "group": 11137 + }, + { + "pid": 11144, + "start": 1793473012.78, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11137, + "group": 11137 + }, + { + "pid": 11146, + "start": 1793473012.78, + "parent": 11137, + "name": "chromium", + "status": "sleeping", + "session": 11137, + "group": 11137 + }, + { + "pid": 11177, + "start": 1793473012.83, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11137, + "group": 11137 + }, + { + "pid": 11148, + "start": 1793473012.82, + "parent": 11146, + "name": "chromium", + "status": "sleeping", + "session": 11137, + "group": 11137 + }, + { + "pid": 11169, + "start": 1793473012.83, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11137, + "group": 11137 + }, + { + "pid": 11187, + "start": 1793473012.87, + "parent": 11148, + "name": "chromium", + "status": "sleeping", + "session": 11137, + "group": 11137 + }, + { + "pid": 11218, + "start": 1793473012.92, + "parent": 11148, + "name": "chromium", + "status": "running", + "session": 11137, + "group": 11137 + }, + { + "pid": 11224, + "start": 1793473012.94, + "parent": 11148, + "name": "chromium", + "status": "sleeping", + "session": 11137, + "group": 11137 + }, + { + "pid": 11228, + "start": 1793473012.94, + "parent": 11148, + "name": "chromium", + "status": "sleeping", + "session": 11137, + "group": 11137 + }, + { + "pid": 11256, + "start": 1793473013.15, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 11256, + "group": 11256 + }, + { + "pid": 11258, + "start": 1793473013.19, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11257, + "group": 11257 + }, + { + "pid": 11260, + "start": 1793473013.19, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11259, + "group": 11259 + }, + { + "pid": 11264, + "start": 1793473013.19, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11256, + "group": 11256 + }, + { + "pid": 11265, + "start": 1793473013.19, + "parent": 11256, + "name": "chromium", + "status": "sleeping", + "session": 11256, + "group": 11256 + }, + { + "pid": 11267, + "start": 1793473013.23, + "parent": 11265, + "name": "chromium", + "status": "sleeping", + "session": 11256, + "group": 11256 + }, + { + "pid": 11290, + "start": 1793473013.24, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11256, + "group": 11256 + }, + { + "pid": 11304, + "start": 1793473013.29, + "parent": 11267, + "name": "chromium", + "status": "sleeping", + "session": 11256, + "group": 11256 + }, + { + "pid": 11288, + "start": 1793473013.24, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11256, + "group": 11256 + }, + { + "pid": 11336, + "start": 1793473013.35, + "parent": 11267, + "name": "chromium", + "status": "running", + "session": 11256, + "group": 11256 + }, + { + "pid": 11345, + "start": 1793473013.38, + "parent": 11267, + "name": "chromium", + "status": "sleeping", + "session": 11256, + "group": 11256 + }, + { + "pid": 11346, + "start": 1793473013.38, + "parent": 11267, + "name": "chromium", + "status": "sleeping", + "session": 11256, + "group": 11256 + }, + { + "pid": 11377, + "start": 1793473013.59, + "parent": 7210, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11379, + "start": 1793473013.62, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11378, + "group": 11378 + }, + { + "pid": 11383, + "start": 1793473013.62, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11381, + "group": 11381 + }, + { + "pid": 11384, + "start": 1793473013.62, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11385, + "start": 1793473013.62, + "parent": 11377, + "name": "chromium", + "status": "sleeping", + "session": 11377, + "group": 11377 + }, + { + "pid": 11388, + "start": 1793473013.66, + "parent": 11385, + "name": "chromium", + "status": "sleeping", + "session": 11377, + "group": 11377 + }, + { + "pid": 11409, + "start": 1793473013.67, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11418, + "start": 1793473013.68, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11434, + "start": 1793473013.71, + "parent": 11388, + "name": "chromium", + "status": "sleeping", + "session": 11377, + "group": 11377 + }, + { + "pid": 11453, + "start": 1793473013.77, + "parent": 11388, + "name": "chromium", + "status": "running", + "session": 11377, + "group": 11377 + }, + { + "pid": 11462, + "start": 1793473013.79, + "parent": 11388, + "name": "chromium", + "status": "sleeping", + "session": 11377, + "group": 11377 + }, + { + "pid": 11463, + "start": 1793473013.79, + "parent": 11388, + "name": "chromium", + "status": "sleeping", + "session": 11377, + "group": 11377 + }, + { + "pid": 11493, + "start": 1793473014.1, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 11493, + "group": 11493 + }, + { + "pid": 11495, + "start": 1793473014.13, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11494, + "group": 11494 + }, + { + "pid": 11499, + "start": 1793473014.13, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11497, + "group": 11497 + }, + { + "pid": 11500, + "start": 1793473014.13, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11493, + "group": 11493 + }, + { + "pid": 11502, + "start": 1793473014.13, + "parent": 11493, + "name": "chromium", + "status": "sleeping", + "session": 11493, + "group": 11493 + }, + { + "pid": 11526, + "start": 1793473014.18, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11493, + "group": 11493 + }, + { + "pid": 11504, + "start": 1793473014.16, + "parent": 11502, + "name": "chromium", + "status": "sleeping", + "session": 11493, + "group": 11493 + }, + { + "pid": 11524, + "start": 1793473014.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11493, + "group": 11493 + }, + { + "pid": 11550, + "start": 1793473014.23, + "parent": 11504, + "name": "chromium", + "status": "sleeping", + "session": 11493, + "group": 11493 + }, + { + "pid": 11570, + "start": 1793473014.28, + "parent": 11504, + "name": "chromium", + "status": "sleeping", + "session": 11493, + "group": 11493 + }, + { + "pid": 11579, + "start": 1793473014.3, + "parent": 11504, + "name": "chromium", + "status": "sleeping", + "session": 11493, + "group": 11493 + }, + { + "pid": 11580, + "start": 1793473014.3, + "parent": 11504, + "name": "chromium", + "status": "sleeping", + "session": 11493, + "group": 11493 + }, + { + "pid": 11608, + "start": 1793473014.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11607, + "group": 11607 + }, + { + "pid": 11612, + "start": 1793473014.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11610, + "group": 11610 + }, + { + "pid": 11606, + "start": 1793473014.92, + "parent": 7210, + "name": "chromium", + "status": "sleeping", + "session": 11606, + "group": 11606 + }, + { + "pid": 11614, + "start": 1793473014.96, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11606, + "group": 11606 + }, + { + "pid": 11615, + "start": 1793473014.96, + "parent": 11606, + "name": "chromium", + "status": "sleeping", + "session": 11606, + "group": 11606 + }, + { + "pid": 11639, + "start": 1793473015.02, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11606, + "group": 11606 + }, + { + "pid": 11617, + "start": 1793473015.01, + "parent": 11615, + "name": "chromium", + "status": "sleeping", + "session": 11606, + "group": 11606 + }, + { + "pid": 11637, + "start": 1793473015.02, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11606, + "group": 11606 + }, + { + "pid": 11662, + "start": 1793473015.07, + "parent": 11617, + "name": "chromium", + "status": "sleeping", + "session": 11606, + "group": 11606 + }, + { + "pid": 11685, + "start": 1793473015.13, + "parent": 11617, + "name": "chromium", + "status": "sleeping", + "session": 11606, + "group": 11606 + }, + { + "pid": 11694, + "start": 1793473015.15, + "parent": 11617, + "name": "chromium", + "status": "sleeping", + "session": 11606, + "group": 11606 + }, + { + "pid": 11695, + "start": 1793473015.15, + "parent": 11617, + "name": "chromium", + "status": "sleeping", + "session": 11606, + "group": 11606 + }, + { + "pid": 11727, + "start": 1793473015.9, + "parent": 7210, + "name": "chromium", + "status": "running", + "session": 11727, + "group": 11727 + }, + { + "pid": 11729, + "start": 1793473015.94, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11728, + "group": 11728 + }, + { + "pid": 11733, + "start": 1793473015.94, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11732, + "group": 11732 + }, + { + "pid": 11734, + "start": 1793473015.94, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11727, + "group": 11727 + }, + { + "pid": 11735, + "start": 1793473015.94, + "parent": 11727, + "name": "chromium", + "status": "sleeping", + "session": 11727, + "group": 11727 + }, + { + "pid": 11762, + "start": 1793473016.01, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11727, + "group": 11727 + }, + { + "pid": 11738, + "start": 1793473015.99, + "parent": 11735, + "name": "chromium", + "status": "sleeping", + "session": 11727, + "group": 11727 + }, + { + "pid": 11785, + "start": 1793473016.05, + "parent": 11738, + "name": "chromium", + "status": "sleeping", + "session": 11727, + "group": 11727 + }, + { + "pid": 11760, + "start": 1793473016.01, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11727, + "group": 11727 + }, + { + "pid": 11829, + "start": 1793473016.19, + "parent": 7210, + "name": "python", + "status": "running", + "session": 7210, + "group": 7210 + }, + { + "pid": 11830, + "start": 1793473016.28, + "parent": 7210, + "name": "python", + "status": "zombie", + "session": 11830, + "group": 11830 + }, + { + "pid": 11831, + "start": 1793473016.28, + "parent": 7210, + "name": "python", + "status": "sleeping", + "session": 11831, + "group": 11831 + }, + { + "pid": 11832, + "start": 1793473016.3, + "parent": 7206, + "name": "python", + "status": "zombie", + "session": 11830, + "group": 11830 + } +] diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/post-pytest-before-wrapper-reaping.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/post-pytest-before-wrapper-reaping.json new file mode 100644 index 0000000..40339c1 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/post-pytest-before-wrapper-reaping.json @@ -0,0 +1,1964 @@ +[ + { + "pid": 7218, + "start": 1793472991.46, + "parent": 7206, + "name": "python", + "status": "zombie", + "session": 7218, + "group": 7218 + }, + { + "pid": 7222, + "start": 1793472991.58, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7221, + "group": 7221 + }, + { + "pid": 7225, + "start": 1793472991.58, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7224, + "group": 7224 + }, + { + "pid": 7228, + "start": 1793472991.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7229, + "start": 1793472991.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7253, + "start": 1793472991.69, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7255, + "start": 1793472991.7, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7220, + "group": 7220 + }, + { + "pid": 7347, + "start": 1793472995.05, + "parent": 7206, + "name": "python", + "status": "zombie", + "session": 7347, + "group": 7347 + }, + { + "pid": 7351, + "start": 1793472995.16, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7350, + "group": 7350 + }, + { + "pid": 7354, + "start": 1793472995.16, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7353, + "group": 7353 + }, + { + "pid": 7357, + "start": 1793472995.16, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7358, + "start": 1793472995.16, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7380, + "start": 1793472995.21, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7382, + "start": 1793472995.22, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7349, + "group": 7349 + }, + { + "pid": 7484, + "start": 1793472996.94, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7486, + "start": 1793472996.97, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7485, + "group": 7485 + }, + { + "pid": 7490, + "start": 1793472996.97, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7489, + "group": 7489 + }, + { + "pid": 7607, + "start": 1793472998.33, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7609, + "start": 1793472998.36, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7608, + "group": 7608 + }, + { + "pid": 7613, + "start": 1793472998.37, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7611, + "group": 7611 + }, + { + "pid": 7750, + "start": 1793472999.72, + "parent": 7206, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7752, + "start": 1793472999.76, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7751, + "group": 7751 + }, + { + "pid": 7756, + "start": 1793472999.76, + "parent": 7206, + "name": "chrome_crashpad_handler", + "status": "sleeping", + "session": 7755, + "group": 7755 + }, + { + "pid": 7899, + "start": 1793473001.4, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7898, + "group": 7898 + }, + { + "pid": 7903, + "start": 1793473001.4, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 7902, + "group": 7902 + }, + { + "pid": 7905, + "start": 1793473001.4, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7897, + "group": 7897 + }, + { + "pid": 7929, + "start": 1793473001.45, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7897, + "group": 7897 + }, + { + "pid": 7931, + "start": 1793473001.46, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 7897, + "group": 7897 + }, + { + "pid": 8013, + "start": 1793473001.82, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8012, + "group": 8012 + }, + { + "pid": 8017, + "start": 1793473001.83, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8016, + "group": 8016 + }, + { + "pid": 8018, + "start": 1793473001.83, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8011, + "group": 8011 + }, + { + "pid": 8042, + "start": 1793473001.87, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8011, + "group": 8011 + }, + { + "pid": 8044, + "start": 1793473001.88, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8011, + "group": 8011 + }, + { + "pid": 8156, + "start": 1793473002.25, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8155, + "group": 8155 + }, + { + "pid": 8160, + "start": 1793473002.25, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8159, + "group": 8159 + }, + { + "pid": 8161, + "start": 1793473002.25, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8154, + "group": 8154 + }, + { + "pid": 8185, + "start": 1793473002.3, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8154, + "group": 8154 + }, + { + "pid": 8193, + "start": 1793473002.31, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8154, + "group": 8154 + }, + { + "pid": 8278, + "start": 1793473002.68, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8277, + "group": 8277 + }, + { + "pid": 8281, + "start": 1793473002.68, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8280, + "group": 8280 + }, + { + "pid": 8284, + "start": 1793473002.68, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8285, + "start": 1793473002.68, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8309, + "start": 1793473002.73, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8311, + "start": 1793473002.74, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8276, + "group": 8276 + }, + { + "pid": 8396, + "start": 1793473003.08, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8395, + "group": 8395 + }, + { + "pid": 8400, + "start": 1793473003.09, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8399, + "group": 8399 + }, + { + "pid": 8401, + "start": 1793473003.09, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8394, + "group": 8394 + }, + { + "pid": 8427, + "start": 1793473003.13, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8394, + "group": 8394 + }, + { + "pid": 8429, + "start": 1793473003.14, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8394, + "group": 8394 + }, + { + "pid": 8511, + "start": 1793473003.48, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8510, + "group": 8510 + }, + { + "pid": 8515, + "start": 1793473003.48, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8513, + "group": 8513 + }, + { + "pid": 8516, + "start": 1793473003.48, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8509, + "group": 8509 + }, + { + "pid": 8541, + "start": 1793473003.52, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8509, + "group": 8509 + }, + { + "pid": 8627, + "start": 1793473003.84, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8509, + "group": 8509 + }, + { + "pid": 8636, + "start": 1793473003.9, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8635, + "group": 8635 + }, + { + "pid": 8640, + "start": 1793473003.9, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8638, + "group": 8638 + }, + { + "pid": 8642, + "start": 1793473003.9, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8666, + "start": 1793473003.94, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8674, + "start": 1793473003.95, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8629, + "group": 8629 + }, + { + "pid": 8746, + "start": 1793473004.3, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8745, + "group": 8745 + }, + { + "pid": 8750, + "start": 1793473004.3, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8749, + "group": 8749 + }, + { + "pid": 8751, + "start": 1793473004.3, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8744, + "group": 8744 + }, + { + "pid": 8776, + "start": 1793473004.35, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8744, + "group": 8744 + }, + { + "pid": 8784, + "start": 1793473004.36, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8744, + "group": 8744 + }, + { + "pid": 8867, + "start": 1793473004.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8866, + "group": 8866 + }, + { + "pid": 8871, + "start": 1793473004.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8870, + "group": 8870 + }, + { + "pid": 8873, + "start": 1793473004.71, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8865, + "group": 8865 + }, + { + "pid": 8898, + "start": 1793473004.76, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8865, + "group": 8865 + }, + { + "pid": 8907, + "start": 1793473004.77, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8865, + "group": 8865 + }, + { + "pid": 8987, + "start": 1793473005.1, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8986, + "group": 8986 + }, + { + "pid": 8991, + "start": 1793473005.1, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 8990, + "group": 8990 + }, + { + "pid": 8992, + "start": 1793473005.1, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8985, + "group": 8985 + }, + { + "pid": 9018, + "start": 1793473005.15, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8985, + "group": 8985 + }, + { + "pid": 9020, + "start": 1793473005.16, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 8985, + "group": 8985 + }, + { + "pid": 9098, + "start": 1793473005.52, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9097, + "group": 9097 + }, + { + "pid": 9101, + "start": 1793473005.52, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9100, + "group": 9100 + }, + { + "pid": 9104, + "start": 1793473005.52, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9096, + "group": 9096 + }, + { + "pid": 9129, + "start": 1793473005.58, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9096, + "group": 9096 + }, + { + "pid": 9131, + "start": 1793473005.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9096, + "group": 9096 + }, + { + "pid": 9216, + "start": 1793473005.93, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9215, + "group": 9215 + }, + { + "pid": 9220, + "start": 1793473005.93, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9219, + "group": 9219 + }, + { + "pid": 9221, + "start": 1793473005.93, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9214, + "group": 9214 + }, + { + "pid": 9246, + "start": 1793473005.98, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9214, + "group": 9214 + }, + { + "pid": 9248, + "start": 1793473005.99, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9214, + "group": 9214 + }, + { + "pid": 9336, + "start": 1793473006.34, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9335, + "group": 9335 + }, + { + "pid": 9339, + "start": 1793473006.34, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9338, + "group": 9338 + }, + { + "pid": 9342, + "start": 1793473006.34, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9367, + "start": 1793473006.39, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9376, + "start": 1793473006.39, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9334, + "group": 9334 + }, + { + "pid": 9452, + "start": 1793473006.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9451, + "group": 9451 + }, + { + "pid": 9456, + "start": 1793473006.71, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9455, + "group": 9455 + }, + { + "pid": 9458, + "start": 1793473006.71, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9450, + "group": 9450 + }, + { + "pid": 9482, + "start": 1793473006.75, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9450, + "group": 9450 + }, + { + "pid": 9484, + "start": 1793473006.76, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9450, + "group": 9450 + }, + { + "pid": 9569, + "start": 1793473007.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9568, + "group": 9568 + }, + { + "pid": 9573, + "start": 1793473007.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9572, + "group": 9572 + }, + { + "pid": 9574, + "start": 1793473007.12, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9567, + "group": 9567 + }, + { + "pid": 9598, + "start": 1793473007.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9567, + "group": 9567 + }, + { + "pid": 9600, + "start": 1793473007.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9567, + "group": 9567 + }, + { + "pid": 9692, + "start": 1793473007.54, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9691, + "group": 9691 + }, + { + "pid": 9696, + "start": 1793473007.54, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9695, + "group": 9695 + }, + { + "pid": 9697, + "start": 1793473007.55, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9690, + "group": 9690 + }, + { + "pid": 9721, + "start": 1793473007.59, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9690, + "group": 9690 + }, + { + "pid": 9730, + "start": 1793473007.6, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9690, + "group": 9690 + }, + { + "pid": 9815, + "start": 1793473007.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9814, + "group": 9814 + }, + { + "pid": 9819, + "start": 1793473007.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9817, + "group": 9817 + }, + { + "pid": 9821, + "start": 1793473007.95, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9810, + "group": 9810 + }, + { + "pid": 9845, + "start": 1793473008.0, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9810, + "group": 9810 + }, + { + "pid": 9854, + "start": 1793473008.01, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9810, + "group": 9810 + }, + { + "pid": 9930, + "start": 1793473008.36, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9929, + "group": 9929 + }, + { + "pid": 9934, + "start": 1793473008.37, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 9933, + "group": 9933 + }, + { + "pid": 9935, + "start": 1793473008.37, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9928, + "group": 9928 + }, + { + "pid": 9959, + "start": 1793473008.42, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9928, + "group": 9928 + }, + { + "pid": 9961, + "start": 1793473008.42, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 9928, + "group": 9928 + }, + { + "pid": 10046, + "start": 1793473008.75, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10045, + "group": 10045 + }, + { + "pid": 10050, + "start": 1793473008.75, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10048, + "group": 10048 + }, + { + "pid": 10052, + "start": 1793473008.75, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10077, + "start": 1793473008.81, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10079, + "start": 1793473008.82, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10044, + "group": 10044 + }, + { + "pid": 10165, + "start": 1793473009.23, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10164, + "group": 10164 + }, + { + "pid": 10169, + "start": 1793473009.23, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10168, + "group": 10168 + }, + { + "pid": 10170, + "start": 1793473009.23, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10196, + "start": 1793473009.29, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10198, + "start": 1793473009.3, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10163, + "group": 10163 + }, + { + "pid": 10281, + "start": 1793473009.67, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10280, + "group": 10280 + }, + { + "pid": 10285, + "start": 1793473009.67, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10284, + "group": 10284 + }, + { + "pid": 10287, + "start": 1793473009.67, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10279, + "group": 10279 + }, + { + "pid": 10310, + "start": 1793473009.72, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10279, + "group": 10279 + }, + { + "pid": 10319, + "start": 1793473009.73, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10279, + "group": 10279 + }, + { + "pid": 10402, + "start": 1793473010.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10401, + "group": 10401 + }, + { + "pid": 10406, + "start": 1793473010.12, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10405, + "group": 10405 + }, + { + "pid": 10407, + "start": 1793473010.12, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10408, + "start": 1793473010.13, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10433, + "start": 1793473010.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10435, + "start": 1793473010.18, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10400, + "group": 10400 + }, + { + "pid": 10523, + "start": 1793473010.55, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10522, + "group": 10522 + }, + { + "pid": 10527, + "start": 1793473010.55, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10525, + "group": 10525 + }, + { + "pid": 10528, + "start": 1793473010.55, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10521, + "group": 10521 + }, + { + "pid": 10554, + "start": 1793473010.6, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10521, + "group": 10521 + }, + { + "pid": 10562, + "start": 1793473010.6, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10521, + "group": 10521 + }, + { + "pid": 10649, + "start": 1793473011.0, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10648, + "group": 10648 + }, + { + "pid": 10653, + "start": 1793473011.0, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10651, + "group": 10651 + }, + { + "pid": 10654, + "start": 1793473011.0, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10647, + "group": 10647 + }, + { + "pid": 10678, + "start": 1793473011.07, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10647, + "group": 10647 + }, + { + "pid": 10686, + "start": 1793473011.07, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10647, + "group": 10647 + }, + { + "pid": 10764, + "start": 1793473011.44, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10763, + "group": 10763 + }, + { + "pid": 10768, + "start": 1793473011.44, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10767, + "group": 10767 + }, + { + "pid": 10769, + "start": 1793473011.44, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10762, + "group": 10762 + }, + { + "pid": 10793, + "start": 1793473011.49, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10762, + "group": 10762 + }, + { + "pid": 10802, + "start": 1793473011.5, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10762, + "group": 10762 + }, + { + "pid": 10898, + "start": 1793473011.92, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10897, + "group": 10897 + }, + { + "pid": 10902, + "start": 1793473011.92, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 10901, + "group": 10901 + }, + { + "pid": 10904, + "start": 1793473011.92, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10896, + "group": 10896 + }, + { + "pid": 10929, + "start": 1793473011.96, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10896, + "group": 10896 + }, + { + "pid": 10938, + "start": 1793473011.97, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 10896, + "group": 10896 + }, + { + "pid": 11016, + "start": 1793473012.35, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11015, + "group": 11015 + }, + { + "pid": 11020, + "start": 1793473012.35, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11019, + "group": 11019 + }, + { + "pid": 11021, + "start": 1793473012.35, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11046, + "start": 1793473012.4, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11048, + "start": 1793473012.4, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11014, + "group": 11014 + }, + { + "pid": 11139, + "start": 1793473012.78, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11138, + "group": 11138 + }, + { + "pid": 11143, + "start": 1793473012.78, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11142, + "group": 11142 + }, + { + "pid": 11144, + "start": 1793473012.78, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11137, + "group": 11137 + }, + { + "pid": 11169, + "start": 1793473012.83, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11137, + "group": 11137 + }, + { + "pid": 11177, + "start": 1793473012.83, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11137, + "group": 11137 + }, + { + "pid": 11258, + "start": 1793473013.19, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11257, + "group": 11257 + }, + { + "pid": 11260, + "start": 1793473013.19, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11259, + "group": 11259 + }, + { + "pid": 11264, + "start": 1793473013.19, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11256, + "group": 11256 + }, + { + "pid": 11288, + "start": 1793473013.24, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11256, + "group": 11256 + }, + { + "pid": 11290, + "start": 1793473013.24, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11256, + "group": 11256 + }, + { + "pid": 11379, + "start": 1793473013.62, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11378, + "group": 11378 + }, + { + "pid": 11383, + "start": 1793473013.62, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11381, + "group": 11381 + }, + { + "pid": 11384, + "start": 1793473013.62, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11409, + "start": 1793473013.67, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11418, + "start": 1793473013.68, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11377, + "group": 11377 + }, + { + "pid": 11495, + "start": 1793473014.13, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11494, + "group": 11494 + }, + { + "pid": 11499, + "start": 1793473014.13, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11497, + "group": 11497 + }, + { + "pid": 11500, + "start": 1793473014.13, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11493, + "group": 11493 + }, + { + "pid": 11524, + "start": 1793473014.17, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11493, + "group": 11493 + }, + { + "pid": 11526, + "start": 1793473014.18, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11493, + "group": 11493 + }, + { + "pid": 11608, + "start": 1793473014.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11607, + "group": 11607 + }, + { + "pid": 11612, + "start": 1793473014.95, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11610, + "group": 11610 + }, + { + "pid": 11614, + "start": 1793473014.96, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11606, + "group": 11606 + }, + { + "pid": 11637, + "start": 1793473015.02, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11606, + "group": 11606 + }, + { + "pid": 11639, + "start": 1793473015.02, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11606, + "group": 11606 + }, + { + "pid": 11729, + "start": 1793473015.94, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11728, + "group": 11728 + }, + { + "pid": 11733, + "start": 1793473015.94, + "parent": 7206, + "name": "chrome_crashpad", + "status": "zombie", + "session": 11732, + "group": 11732 + }, + { + "pid": 11734, + "start": 1793473015.94, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11727, + "group": 11727 + }, + { + "pid": 11760, + "start": 1793473016.01, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11727, + "group": 11727 + }, + { + "pid": 11762, + "start": 1793473016.01, + "parent": 7206, + "name": "chromium", + "status": "zombie", + "session": 11727, + "group": 11727 + }, + { + "pid": 11832, + "start": 1793473016.3, + "parent": 7206, + "name": "python", + "status": "zombie", + "session": 11830, + "group": 11830 + }, + { + "pid": 7757, + "start": 1793472999.76, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7759, + "start": 1793472999.76, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7791, + "start": 1793472999.81, + "parent": 7750, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7761, + "start": 1793472999.79, + "parent": 7759, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7808, + "start": 1793472999.85, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7823, + "start": 1793472999.9, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7832, + "start": 1793472999.93, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7833, + "start": 1793472999.94, + "parent": 7761, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7783, + "start": 1793472999.8, + "parent": 7757, + "name": "chromium", + "status": "sleeping", + "session": 7750, + "group": 7750 + }, + { + "pid": 7614, + "start": 1793472998.37, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7616, + "start": 1793472998.37, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7648, + "start": 1793472998.43, + "parent": 7607, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7618, + "start": 1793472998.41, + "parent": 7616, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7665, + "start": 1793472998.49, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7679, + "start": 1793472998.54, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7688, + "start": 1793472998.56, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7689, + "start": 1793472998.56, + "parent": 7618, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7639, + "start": 1793472998.42, + "parent": 7614, + "name": "chromium", + "status": "sleeping", + "session": 7607, + "group": 7607 + }, + { + "pid": 7491, + "start": 1793472996.98, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7493, + "start": 1793472996.98, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7517, + "start": 1793472997.04, + "parent": 7484, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7495, + "start": 1793472997.02, + "parent": 7493, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7540, + "start": 1793472997.08, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7555, + "start": 1793472997.13, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7564, + "start": 1793472997.15, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7566, + "start": 1793472997.16, + "parent": 7495, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + }, + { + "pid": 7515, + "start": 1793472997.03, + "parent": 7491, + "name": "chromium", + "status": "sleeping", + "session": 7484, + "group": 7484 + } +] diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/post-run-check.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/post-run-check.json new file mode 100644 index 0000000..d2c4c71 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/post-run-check.json @@ -0,0 +1,9 @@ +{ + "utc_checked": "2026-10-31T19:02:14.755195+00:00", + "remaining_observed_identities": [], + "cgroup_events": { + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0", + "pids.events": "max 0" + }, + "original_measured_runner_hash_verified": true +} diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/pre-owned-processes.json b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/pre-owned-processes.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/pre-owned-processes.json @@ -0,0 +1 @@ +[] diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/pytest.stderr.txt b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/pytest.stderr.txt new file mode 100644 index 0000000..e69de29 diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/pytest.stdout.txt b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/pytest.stdout.txt new file mode 100644 index 0000000..c49f160 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/pytest.stdout.txt @@ -0,0 +1,691 @@ +........................................................................ [ 37%] +....FFF................................................................. [ 75%] +.............................................. [100%] +=================================== FAILURES =================================== +______ test_cli_recovers_abrupt_holder_death_without_redispatch[prepared] ______ + +boundary = 'prepared' +ingress = ('http://127.0.0.1:37135/', [], ) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. + _test_cleanup(holder, identities) + fresh_session = root / "next" + blocked = _cli(root, "start", "Try a new intent", "--session", str(fresh_session), + "--authority", str(root / "authority.db"), "--url", url, success=False) + assert blocked["ok"] is False + assert not list(fresh_session.glob("profile-*")) + assert not (fresh_session / "holder.json").exists() + assert records == (["intended"] if boundary == "retained" else []) + finally: +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:282: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c47f8b0> +args = (,) +paths = [] +arg = +path = + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError +______ test_cli_recovers_abrupt_holder_death_without_redispatch[started] _______ + +boundary = 'started' +ingress = ('http://127.0.0.1:37761/', [], ) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:273: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c17a810> +args = (,) +paths = [] +arg = +path = + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError + +During handling of the above exception, another exception occurred: + +boundary = 'started' +ingress = ('http://127.0.0.1:37761/', [], ) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. + _test_cleanup(holder, identities) + fresh_session = root / "next" + blocked = _cli(root, "start", "Try a new intent", "--session", str(fresh_session), + "--authority", str(root / "authority.db"), "--url", url, success=False) + assert blocked["ok"] is False + assert not list(fresh_session.glob("profile-*")) + assert not (fresh_session / "holder.json").exists() + assert records == (["intended"] if boundary == "retained" else []) + finally: +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:282: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c17a420> +args = (,) +paths = [] +arg = +path = + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError +______ test_cli_recovers_abrupt_holder_death_without_redispatch[retained] ______ + +boundary = 'retained' +ingress = ('http://127.0.0.1:46123/', ['intended'], ) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:273: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c17a0a0> +args = (,) +paths = [] +arg = +path = + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError + +During handling of the above exception, another exception occurred: + +boundary = 'retained' +ingress = ('http://127.0.0.1:46123/', ['intended'], ) + + @pytest.mark.browser + @pytest.mark.parametrize("boundary", ["prepared", "started", "retained"]) + def test_cli_recovers_abrupt_holder_death_without_redispatch(boundary, ingress): + url, records, arrived = ingress + with tempfile.TemporaryDirectory(prefix="fw-crash-", dir="/tmp") as directory: + root = Path(directory) + session, holder, identities = _setup(root, url, boundary) + try: + snapshot = _cli(root, "look", "--session", str(session))["snapshot"] + ref = next(row["ref"] for row in snapshot["refs"] if row["name"] == "Commit fixture") + _inventory(holder, identities) + invocation = ("click", "--session", str(session), "--ref", ref, "--token", "intent-1") + interrupted = _cli(root, *invocation, success=False) + assert holder.wait(timeout=10) == 86 + assert interrupted["ok"] is False + assert interrupted["dispatched"] is None # transport loss itself proves no no-send predicate + marker = json.loads((session / "test-boundary.json").read_text()) + assert marker["boundary"] == boundary + assert marker["heavy_imports"] == [] + if boundary == "retained": + assert arrived.wait(10), "activation did not reach the independent fixture ingress" + assert marker["ingress_before_exit"] == 1 + recovered = _cli(root, "recover", "--session", str(session), "--token", "intent-1") + op = recovered["operations"][0] + assert op["id"] == marker["operation_id"] + assert op["completion"] == "unverified" and op["retryable"] is False + assert op["state"] == ("final" if boundary == "prepared" else "unknown") + assert op["disposition"] == ("not_sent" if boundary == "prepared" else "unknown") + assert op["phase"] == ("not_sent" if boundary == "prepared" else "sent" if boundary == "retained" else "ambiguous") + if boundary == "retained": + assert op["evidence"]["execution_receipt"]["basis"] == "activation_ack" + else: + assert "execution_receipt" not in op["evidence"] + status = _cli(root, "status", "--session", str(session), "--token", "intent-1") + assert status["operations"] == recovered["operations"] + for _ in range(2): + replay = _cli(root, *invocation) + assert replay["replayed"] is True and replay["operation"]["id"] == op["id"] + assert replay["operation"]["disposition"] == op["disposition"] + new_intent = _cli(root, *invocation[:-1], "intent-2", success=False) + assert new_intent["ok"] is False # offline recovery cannot grant a fresh mutation + assert records == (["intended"] if boundary == "retained" else []) + if boundary != "prepared": + # Remove abandoned test-owned custodians before starting another browser. + # The public start route must reject this domain before launching Chrome. + _test_cleanup(holder, identities) + fresh_session = root / "next" + blocked = _cli(root, "start", "Try a new intent", "--session", str(fresh_session), + "--authority", str(root / "authority.db"), "--url", url, success=False) + assert blocked["ok"] is False + assert not list(fresh_session.glob("profile-*")) + assert not (fresh_session / "holder.json").exists() + assert records == (["intended"] if boundary == "retained" else []) + finally: +> _test_cleanup(holder, identities) + +test_browser_restart_cli.py:282: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ +../receipt_plugin.py:153: in observed + snapshots(root, 'before_' + name) +../receipt_plugin.py:119: in snapshots + root = Path(root) + ^^^^^^^^^^ +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:1162: in __init__ + super().__init__(*args) +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = <[AttributeError("'PosixPath' object has no attribute '_raw_paths'") raised in repr()] PosixPath object at 0x7f045c17bf40> +args = (,) +paths = [] +arg = +path = + + def __init__(self, *args): + paths = [] + for arg in args: + if isinstance(arg, PurePath): + if arg._flavour is not self._flavour: + # GH-103631: Convert separators for backwards compatibility. + paths.append(arg.as_posix()) + else: + paths.extend(arg._raw_paths) + else: + try: + path = os.fspath(arg) + except TypeError: + path = arg + if not isinstance(path, str): +> raise TypeError( + "argument should be a str or an os.PathLike " + "object where __fspath__ returns a str, " + f"not {type(path).__name__!r}") +E TypeError: argument should be a str or an os.PathLike object where __fspath__ returns a str, not 'Popen' + +/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/pathlib.py:373: TypeError +==================================== PASSES ==================================== +___________________ test_guard_failure_never_allows[kwargs1] ___________________ +------------------------------ Captured log call ------------------------------- +WARNING jevdual.authorize:authorize.py:243 destructive judgment failed on 'Commit fixture': unbound guard reply +___________________ test_guard_failure_never_allows[kwargs2] ___________________ +------------------------------ Captured log call ------------------------------- +WARNING jevdual.authorize:authorize.py:243 destructive judgment failed on 'Commit fixture': guard failed +___________________ test_guard_failure_never_allows[kwargs3] ___________________ +------------------------------ Captured log call ------------------------------- +WARNING jevdual.authorize:authorize.py:243 destructive judgment failed on 'Commit fixture': judgment returned 'invalid', not a probability +- generated xml file: /workspace/scratch/footwork-durable-cdp-cad7508/junit.xml - +=========================== short test summary info ============================ +PASSED test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing +PASSED test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch +PASSED test_browser_cdp_cli.py::test_missing_guard_refuses_before_admission +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change0] +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change1] +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change2] +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change3] +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change4] +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change5] +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change6] +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change7] +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change8] +PASSED test_browser_durable_authority.py::test_binding_rejects_incomplete_or_foreign_identity[change9] +PASSED test_browser_durable_authority.py::test_browser_and_native_bindings_remain_separate +PASSED test_browser_durable_authority.py::test_missing_or_changed_guard_never_admits[change0] +PASSED test_browser_durable_authority.py::test_missing_or_changed_guard_never_admits[change1] +PASSED test_browser_durable_authority.py::test_missing_or_changed_guard_never_admits[change2] +PASSED test_browser_durable_authority.py::test_missing_or_changed_guard_never_admits[change3] +PASSED test_browser_durable_authority.py::test_missing_or_changed_guard_never_admits[change4] +PASSED test_browser_durable_authority.py::test_missing_or_changed_guard_never_admits[change5] +PASSED test_browser_durable_authority.py::test_guard_digest_binds_session_request_and_exact_subject +PASSED test_browser_durable_authority.py::test_absent_guard_never_admits[None] +PASSED test_browser_durable_authority.py::test_absent_guard_never_admits[decision1] +PASSED test_browser_durable_authority.py::test_request_does_not_enable_typing_or_other_routes[request_value0] +PASSED test_browser_durable_authority.py::test_request_does_not_enable_typing_or_other_routes[request_value1] +PASSED test_browser_durable_authority.py::test_request_does_not_enable_typing_or_other_routes[request_value2] +PASSED test_browser_durable_authority.py::test_request_does_not_enable_typing_or_other_routes[request_value3] +PASSED test_browser_durable_authority.py::test_same_token_returns_original_before_reobservation_or_new_guard +PASSED test_browser_durable_authority.py::test_restart_distinguishes_prepared_from_admitted_input[False] +PASSED test_browser_durable_authority.py::test_restart_distinguishes_prepared_from_admitted_input[True] +PASSED test_browser_durable_authority.py::test_acknowledgement_never_claims_application_completion[reply0-sent-unknown] +PASSED test_browser_durable_authority.py::test_acknowledgement_never_claims_application_completion[reply1-not_sent-not_sent] +PASSED test_browser_durable_authority.py::test_acknowledgement_never_claims_application_completion[reply2-ambiguous-unknown] +PASSED test_browser_durable_authority.py::test_acknowledgement_never_claims_application_completion[reply3-ambiguous-unknown] +PASSED test_browser_durable_authority.py::test_acknowledgement_never_claims_application_completion[reply4-ambiguous-unknown] +PASSED test_browser_durable_authority.py::test_retained_result_survives_death_before_finalization[reply0] +PASSED test_browser_durable_authority.py::test_retained_result_survives_death_before_finalization[reply1] +PASSED test_browser_durable_authority.py::test_retained_result_survives_death_before_finalization[reply2] +PASSED test_browser_durable_authority.py::test_arbitrary_finish_cannot_assert_no_send_or_completion +PASSED test_browser_durable_authority.py::test_tampered_browser_evidence_never_releases_custody[digest] +PASSED test_browser_durable_authority.py::test_tampered_browser_evidence_never_releases_custody[binding] +PASSED test_browser_durable_authority.py::test_tampered_browser_evidence_never_releases_custody[producer] +PASSED test_browser_durable_authority.py::test_tampered_browser_evidence_never_releases_custody[effect] +PASSED test_browser_durable_authority.py::test_tampered_browser_evidence_never_releases_custody[guard] +PASSED test_browser_durable_authority.py::test_tampered_browser_evidence_never_releases_custody[request] +PASSED test_browser_durable_authority.py::test_runtime_evidence_is_immutable +PASSED test_browser_durable_authority.py::test_browser_unknown_blocks_native_and_native_unknown_blocks_browser +PASSED test_browser_durable_authority.py::test_manual_resolution_remains_unsupported +PASSED test_browser_durable_authority.py::test_interruption_records_unknown_without_fabricating_returned_evidence +PASSED test_browser_durable_authority.py::test_interruption_prefers_a_retained_returned_record[reply0] +PASSED test_browser_durable_authority.py::test_interruption_prefers_a_retained_returned_record[reply1] +PASSED test_browser_durable_authority.py::test_native_retained_receipt_keeps_its_native_validator_in_browser_store +PASSED test_browser_guard.py::test_configured_guard_binding +PASSED test_browser_guard.py::test_guard_failure_never_allows[kwargs0] +PASSED test_browser_guard.py::test_guard_failure_never_allows[kwargs1] +PASSED test_browser_guard.py::test_guard_failure_never_allows[kwargs2] +PASSED test_browser_guard.py::test_guard_failure_never_allows[kwargs3] +PASSED test_browser_guard.py::test_guard_failure_never_allows[kwargs4] +PASSED test_browser_holder.py::test_admission_and_started_stage_are_committed_before_possible_activation +PASSED test_browser_holder.py::test_replay_returns_retained_operation_before_observation_or_guard +PASSED test_browser_holder.py::test_guard_refusal_retains_refs_and_never_admits_or_activates +PASSED test_browser_holder.py::test_post_admission_failure_and_cancellation_retain_unknown[failure0] +PASSED test_browser_holder.py::test_post_admission_failure_and_cancellation_retain_unknown[failure1] +PASSED test_browser_holder.py::test_wrong_session_and_unbounded_methods_never_touch_browser[extra0] +PASSED test_browser_holder.py::test_wrong_session_and_unbounded_methods_never_touch_browser[extra1] +PASSED test_browser_holder.py::test_wrong_session_and_unbounded_methods_never_touch_browser[extra2] +PASSED test_browser_holder.py::test_wrong_session_and_unbounded_methods_never_touch_browser[extra3] +PASSED test_browser_holder.py::test_wrong_session_and_unbounded_methods_never_touch_browser[extra4] +PASSED test_browser_holder.py::test_close_uses_only_original_handle_and_does_not_settle_unknown +PASSED test_browser_holder.py::test_cleanup_failure_is_reported_without_claiming_all_processes_stopped +PASSED test_browser_holder.py::test_private_files_and_descriptor_incarnation_are_checked_before_connect +PASSED test_browser_holder.py::test_lost_socket_response_then_repeat_token_has_one_activation +PASSED test_browser_holder.py::test_oversize_request_refuses_without_browser_or_journal_activity +PASSED test_browser_holder.py::test_rpc_deadline_after_admission_retains_unknown_without_retry +PASSED test_browser_holder.py::test_foreign_socket_peer_is_refused_before_request_read +PASSED test_browser_holder.py::test_stale_holder_record_refuses_start_without_launch_or_cleanup +PASSED test_cdp_click.py::test_observation_marker_has_no_fixture_effect +PASSED test_cdp_click.py::test_native_button_activation_records_exactly_one_independent_ingress +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.textContent = 'Delete fixture'] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('data-record-id', 'other-record')] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('type', 'submit')] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.disabled = true] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.setAttribute('aria-label', 'Delete fixture')] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('data-customer-id', 'other')] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let css=document.createElement('style'); css.textContent='#intended::before{content:"Delete "}'; document.head.append(css)] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[intended.replaceWith(intended.cloneNode(true))] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[document.body.setAttribute('inert', '')] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let fieldset=document.createElement('fieldset'); fieldset.disabled=true; intended.before(fieldset); fieldset.append(intended)] +PASSED test_cdp_click.py::test_changed_subject_refuses_without_any_fixture_ingress[let form=document.createElement('form'); intended.before(form); form.append(intended)] +PASSED test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.textContent='A'.repeat(121)+' Delete fixture'-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA] +PASSED test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('role','button')-Commit fixture] +PASSED test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.innerHTML='Commit fixture'-Commit fixture] +PASSED test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[let name=document.createElement('span'); name.id='external'; name.textContent='Commit fixture'; document.body.append(name); intended.setAttribute('aria-labelledby','external')-Commit fixture] +PASSED test_cdp_click.py::test_unsupported_or_incompletely_represented_button_names_refuse[intended.setAttribute('data-payload','x'.repeat(9000))-Commit fixture] +PASSED test_cdp_click.py::test_page_method_and_getter_overrides_cannot_redirect_activation +PASSED test_cdp_click.py::test_pointerdown_only_app_does_not_gain_a_business_completion_claim +PASSED test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[False] +PASSED test_cdp_click.py::test_same_url_reload_never_uses_a_new_document_context[True] +PASSED test_cdp_click.py::test_numeric_handle_alias_cannot_adopt_an_identical_new_document_button +PASSED test_cdp_click.py::test_document_open_root_replacement_cannot_reuse_an_old_observation +PASSED test_cdp_click.py::test_closed_pinned_tab_does_not_activate_a_live_sentinel_tab +PASSED test_cdp_click.py::test_reobservation_and_foreign_connection_reject_old_refs +PASSED test_cdp_click.py::test_concurrent_calls_with_one_ref_dispatch_once +PASSED test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[False] +PASSED test_cdp_click.py::test_lost_ack_or_cancellation_after_ingress_blocks_even_a_fresh_ref[True] +PASSED test_cdp_click.py::test_typing_trusted_click_and_navigation_stay_disabled +PASSED test_cdp_click_contract.py::test_button_target_keeps_complete_attributes_text_and_ancestor_identity +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc0-Continue] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc1-Continue] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc2-Continue] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc3-Continue] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc4-Continue] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc5-Continue] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc6-Continue] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc7-Delete] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc8-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc9-Con tinue] +PASSED test_cdp_click_contract.py::test_unsupported_or_unrepresentable_button_is_not_admitted[doc10-Continue] +PASSED test_cdp_click_contract.py::test_aria_label_is_admitted_only_when_the_offered_name_matches +PASSED test_cdp_click_contract.py::test_native_activation_consumes_refs_and_resolves_only_into_the_observed_world +PASSED test_cdp_click_contract.py::test_a_ref_without_an_observation_document_token_cannot_activate +PASSED test_cdp_click_contract.py::test_observation_marks_one_private_slot_before_reading_nodes_and_replaces_the_token +PASSED test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply0] +PASSED test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply1] +PASSED test_cdp_click_contract.py::test_malformed_marker_setup_keeps_the_observation_unavailable[marker_reply2] +PASSED test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result0] +PASSED test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result1] +PASSED test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result2] +PASSED test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result3] +PASSED test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result4] +PASSED test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result5] +PASSED test_cdp_click_contract.py::test_ambiguous_activation_blocks_even_a_new_observation_ref[result6] +PASSED test_cdp_click_contract.py::test_known_pre_activation_refusal_and_closed_socket_are_not_sent +PASSED test_cdp_click_contract.py::test_read_only_validation_loss_never_claims_input_was_sent +PASSED test_cdp_click_contract.py::test_concurrent_callers_cannot_reuse_the_admitted_ref +PASSED test_cdp_click_contract.py::test_cancellation_keeps_unknown_and_does_not_enable_a_retry +PASSED test_cdp_click_contract.py::test_cancellation_during_handle_cleanup_cannot_lose_the_successful_activation +PASSED test_cdp_click_contract.py::test_typing_navigation_and_trusted_click_remain_disabled +PASSED test_cdp_click_contract.py::test_bridge_reports_actual_activation_route_without_promoting_business_completion +PASSED test_cdp_effector.py::test_replies_are_matched_by_id_and_events_reach_listeners +PASSED test_cdp_effector.py::test_an_error_reply_is_a_received_refusal +PASSED test_cdp_effector.py::test_a_lost_connection_leaves_in_flight_commands_unknown_and_sends_nothing_after +PASSED test_cdp_effector.py::test_no_reply_within_the_deadline_is_unknown_not_failed +PASSED test_cdp_effector.py::test_only_a_loopback_endpoint_is_opened +PASSED test_cdp_effector.py::test_composition_withholds_sensitive_values_and_disables_disabled_controls +PASSED test_cdp_effector.py::test_a_controls_user_agent_internals_never_become_candidates_or_labels +PASSED test_cdp_effector.py::test_child_frames_make_the_snapshot_incomplete +PASSED test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[section-billing billing cc-number] +PASSED test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[shipping one-time-code] +PASSED test_cdp_effector.py::test_compound_sensitive_autocomplete_never_exposes_the_field_value[section-X CC-CSC] +PASSED test_cdp_effector.py::test_omitted_custom_controls_prevent_a_complete_observation_claim +PASSED test_cdp_effector.py::test_the_owned_browser_is_observed_as_the_fixture_declares +PASSED test_cdp_effector.py::test_actions_refuse_before_dispatch_and_a_reload_invalidates_refs +PASSED test_cdp_effector.py::test_a_stale_port_file_or_a_foreign_endpoint_is_refused +PASSED test_cdp_effector.py::test_the_cdp_package_imports_no_third_party_module_until_a_connection_opens +PASSED test_cdp_effector.py::test_only_an_effector_that_refused_before_sending_reports_not_sent +PASSED test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[empty] +PASSED test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[populated] +PASSED test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[symlink] +PASSED test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[file] +PASSED test_cdp_launch_custody.py::test_existing_profile_paths_are_refused_without_mutation[dangling_symlink] +PASSED test_cdp_launch_custody.py::test_fresh_profile_is_created_private_before_process_launch +PASSED test_cdp_launch_custody.py::test_stop_cleans_a_captured_term_resistant_child_without_touching_a_sentinel +PASSED test_cdp_launch_custody.py::test_stop_reports_uncertainty_when_the_root_exited_before_inventory +PASSED test_cdp_launch_custody.py::test_a_descendant_exiting_during_identity_capture_does_not_block_root_cleanup +PASSED test_cdp_launch_custody.py::test_changed_root_incarnation_is_never_signaled +PASSED test_cdp_transport_deadline.py::test_command_deadline_bounds_blocked_send_and_retires_the_connection +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222@attacker.example/devtools/browser/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222@127.0.0.1:9222/devtools/browser/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://user:password@127.0.0.1:9222/devtools/browser/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:0/devtools/browser/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:65536/devtools/browser/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:bad/devtools/browser/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1/devtools/browser/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[wss://127.0.0.1:9222/devtools/browser/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.2:9222/devtools/browser/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/page/x] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/x?host=elsewhere] +PASSED test_cdp_transport_deadline.py::test_invalid_endpoint_never_opens_a_connection[ws://127.0.0.1:9222/devtools/browser/x#fragment] +PASSED test_cdp_transport_deadline.py::test_valid_loopback_browser_endpoint_reaches_connect +PASSED test_cdp_transport_deadline.py::test_sending_and_reply_wait_share_one_budget +PASSED test_cdp_transport_deadline.py::test_serialization_failure_does_not_admit_or_send_a_command +PASSED test_cdp_transport_deadline.py::test_an_interrupted_send_retires_other_inflight_commands_as_unknown +PASSED test_cdp_transport_deadline.py::test_cancelling_a_close_waiter_does_not_cancel_owned_transport_cleanup +PASSED test_cdp_transport_deadline.py::test_cancellation_removes_pending_command_and_preserves_cancellation[True] +PASSED test_cdp_transport_deadline.py::test_cancellation_removes_pending_command_and_preserves_cancellation[False] +FAILED test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[prepared] +FAILED test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[started] +FAILED test_browser_restart_cli.py::test_cli_recovers_abrupt_holder_death_without_redispatch[retained] +3 failed, 187 passed in 29.31s diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/report.md b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/report.md new file mode 100644 index 0000000..3cfe11f --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/report.md @@ -0,0 +1,47 @@ +# First durable CDP VM candidate: retained harness failure + +**This is not a clean qualification.** Exact source `cad7508f8f4375735c0651c5e0aa5929f3b57700` ran one unchanged ten-module installed batch: **187 passed, 3 failed, zero skips**, in **29.31 seconds**. Pytest and outer runner exited **1**. All three failures are the test-only collector's `Path(Popen)` error while wrapping restart-fixture `_test_cleanup`; it prevented that helper's original cleanup. They are not attributed to the product and are not removed from the denominator. [JUnit](junit.xml), [full output](pytest.stdout.txt), [inspected summary](inspected-summary.json). + +## Exact installed boundary + +Candidate checkout: `/workspace/footwork-durable-cdp-cad7508`, detached and unchanged. Wheel `jevdual-0.0.1-py3-none-any.whl`, **211 entries**, SHA256 **`e466146e5ba77e68470eea7cca86d7beb84d42c3dfe3a7ac7e15ca06a6530660`**. All **206 installed product package files** byte-match. [Build](build.json), [source/test/wheel hashes and installed origins](environment.json). + +Fresh consumer `/workspace/scratch/footwork-durable-cdp-cad7508/consumer`: binary pytest8.4.2, psutil7.2.2, websockets15.0.1, packaging26.3 and pytest dependencies; product installed `--no-deps`. CUA/browser-use are absent. Matching consumer Python and `FOOTWORK_EXECUTABLE` point at the installed script. Ten tests were copied unchanged outside checkout; no checkout conftest or PYTHONPATH. The test-only receipt plugin is explicit and its original source was committed before measurement at605d257; copied plugin/bootstrap hashes match [collector provenance](collector-provenance.json). Provider key was omitted from the test process environment; judgment uses the supplied fixture adapters, with no paid calls. [Command](command.json). + +| Module | Passed | Failed | +|---|---:|---:| +| CDP effector / transport / custody | 17 / 21 / 10 | 0 | +| CDP click / contract | 30 / 33 | 0 | +| Browser durable authority | 49 | 0 | +| Browser holder | 18 | 0 | +| Browser guard | 6 | 0 | +| Public CDP CLI | 3 | 0 | +| Public holder restart | 0 | 3 collector cleanup errors | + +## Per-cell retained evidence + +The stock tests use an explicitly test-only holder shim calling `os._exit(86)` only after the original real journal transaction commits. Public look/click/status/recover/offline replay remain actual installed subprocess commands. The collector never patched product code, commands or replies. It recorded numeric process waits, public output and boundary files before temporary directories disappeared; holder nonces are hashed/redacted, not dumped. Full [observer events](observer.jsonl) accompany cell-specific receipts. + +| Cell | Independent ingress | Recovered state / disposition / phase | Retained boundary | +|---|---:|---|---| +| [prepared](cells/prepared/receipt.json) | 0 | final / not_sent / not_sent | exit86 after admit commit; no execution receipt | +| [started](cells/started/receipt.json) | 0 | unknown / unknown / ambiguous | exit86 after start commit; no execution receipt | +| [retained](cells/retained/receipt.json) | 1 intended | unknown / unknown / sent | independent `/count` was1 **before exit86**; basis activation_ack | + +All three markers have `heavy_imports=[]`, retained operation IDs match public recovery/status, and the original same-token replays return retained identity/disposition without another ingress. Completion remains unverified and retryable false. The prepared cell reached its final assertions before finally-cleanup failed. The started/retained cells reached recovery/status/replays/new-token refusal and correct ingress, but collector failure during the earlier cleanup call prevented the subsequent fresh-start/domain-block assertions from running. These partial cells are not promoted to passed tests. + +The separate [real client-kill cell](cells/client-lost-ack/receipt.json) **passed**: the client was SIGKILLed after independent onclick ingress, one intended effect remained through repeat token/new-token block/stop/recover/offline replay. The [missing-guard cell](cells/missing-guard/receipt.json) **passed** with no admission or ingress. Durable/native separation, changed token/binding, missing/failed guard, absent readback, tampered evidence and disabled typing/other-route negatives passed their unchanged unit cases. + +Actual installed output is retained for [tools](discovery/tools.json), [doctor](discovery/doctor.json), [schema](discovery/schema.json), [guide](discovery/guide.json). Doctor distinguishes prerequisite presence from `runtime_qualification=not_checked`, CDP needs no desktop/CUA, typing is disabled, acknowledgement is not business completion, unknown blocks new mutation, and full package metadata/light-split limits are explicit. No generic completion reader or metadata split is claimed. + +## Process accounting and limits + +Debian13.6, Linux6.18.57 native x86-64, Python3.12.14, Chromium154.0.8037.57, unchanged default sandbox flags. Visible policy remains **4-CPU quota / 16GiB**, cpuset0-4, cgroup PID/swap caps max; actual SwapTotal0. No 2CPU/8GB claim, system install, new VM/cloud infrastructure or runtime implementation change. + +After pytest exited, the dedicated **test-only subreaper** captured **182 zombies and 36 live descendants**. Because the collector prevented fixture cleanup, the wrapper had to intervene: **36 SIGTERM attempts**, **35 sent by pidfd**, **one already exited**, then **202 adopted-child numeric waits**; final owned descendants are empty. Some original parents can reap children while termination proceeds, so pre-snapshot counts must not be equated with wrapper wait counts. [Pre-wrapper snapshot](post-pytest-before-wrapper-reaping.json), [cleanup receipt](cleanup.json), [observed identities](owned-process-history.json). This is wrapper cleanup of a failed harness run, not graceful product cleanup or a no-zombie guarantee. Non-atomic inventory/daemon-escape/global-cleanliness limits remain. + +The raw `observer_gap=false` flag only checks explicitly handled observer-error records; these uncaught helper exceptions instead appear as failed pytest calls. That flag does **not** establish passive collection. The original frozen collector and copies remain intact. A separately versioned v2 collector restricts path snapshots to path-taking helpers and keeps snapshot errors outside original cleanup; it is prepared, **not yet measured**. + +## Pending replacement + +Parent review separately found holder TERM/INT setup too late during Chrome readiness, and CLI startup exceptions bypassing direct-child cleanup. This batch did not independently exercise those pre-readiness boundaries. Parent is fixing them and will supply another exact source/wheel/recipe. No old cell is rerun, no VM product patch is made, and no green gate is inferred from187 passes. All first failures and partial receipts remain preserved for comparison. diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/runner.stderr.txt b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/runner.stderr.txt new file mode 100644 index 0000000..e69de29 diff --git a/jevdual/results/durable-cdp-vm-20261031/cad7508-first/runner.stdout.txt b/jevdual/results/durable-cdp-vm-20261031/cad7508-first/runner.stdout.txt new file mode 100644 index 0000000..e69de29 diff --git a/jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin_v2.py b/jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin_v2.py new file mode 100644 index 0000000..e1c26c5 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin_v2.py @@ -0,0 +1,208 @@ +"""Test-only passive receipts; never change a subprocess command/result or product state.""" +import functools +import hashlib +import json +import os +import subprocess +import threading +import time +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parent # copied into the new owned run before execution +CURRENT = None +LOCK = threading.Lock() +COUNTER = 0 + + +def digest(value): + return hashlib.sha256(value).hexdigest() + + +def clean(value): + if isinstance(value, dict): + return {k: {'redacted_nonce_sha256': digest(str(v).encode())} if k == 'nonce' else clean(v) + for k, v in value.items()} + if isinstance(value, (list, tuple)): + return [clean(v) for v in value] + if isinstance(value, bytes): + return value.decode(errors='replace') + if isinstance(value, Path): + return str(value) + return value + + +def emit(kind, **fields): + with LOCK, (ROOT / 'observer.jsonl').open('a') as stream: + stream.write(json.dumps(clean({'kind': kind, 'monotonic': time.monotonic(), + 'nodeid': CURRENT, **fields})) + '\n') + + +def observer_error(stage, error): + with LOCK, (ROOT / 'observer-errors.jsonl').open('a') as stream: + stream.write(json.dumps({'stage': stage, 'nodeid': CURRENT, + 'type': type(error).__name__, 'message': str(error)}) + '\n') + + +def output(value): + if value is None: + return None + raw = value if isinstance(value, bytes) else value.encode() + text = raw.decode(errors='replace') + try: + parsed = json.loads(text) + except ValueError: + parsed = None + return {'sha256': digest(raw), 'bytes': len(raw), + 'json': clean(parsed), 'text': json.dumps(clean(parsed)) if parsed is not None else text} + + +def selected(argv): + if not isinstance(argv, (tuple, list)): + return None + if str(argv[0]) == os.environ.get('FOOTWORK_EXECUTABLE'): + return 'public_cli' + if '-c' in argv and any('test-boundary.json' in str(x) and 'os._exit(86)' in str(x) for x in argv): + return 'test_only_holder_shim' + return None + + +def arguments(argv): + values = list(map(str, argv)) + if '-c' in values: + index = values.index('-c') + 1 + values[index] = {'test_script_sha256': digest(values[index].encode()), 'characters': len(values[index])} + return values + + +def pytest_configure(config): + global ORIGINAL_INIT, ORIGINAL_WAIT, ORIGINAL_COMMUNICATE + ORIGINAL_INIT = subprocess.Popen.__init__ + ORIGINAL_WAIT = subprocess.Popen.wait + ORIGINAL_COMMUNICATE = subprocess.Popen.communicate + + def initialize(self, args, *positional, **kwargs): + global COUNTER + ORIGINAL_INIT(self, args, *positional, **kwargs) + kind = selected(args) + if kind: + with LOCK: + COUNTER += 1 + number = COUNTER + self._vm_receipt = {'process_number': number, 'process_kind': kind, 'owner_nodeid': CURRENT, + 'pid': self.pid, 'argv': arguments(args), 'cwd': str(kwargs.get('cwd') or os.getcwd())} + emit('spawn', **self._vm_receipt) + + def wait(self, *args, **kwargs): + result = ORIGINAL_WAIT(self, *args, **kwargs) + record = getattr(self, '_vm_receipt', None) + if record: + emit('wait', **record, returncode=result, signal=-result if result < 0 else None) + return result + + def communicate(self, *args, **kwargs): + result = ORIGINAL_COMMUNICATE(self, *args, **kwargs) + record = getattr(self, '_vm_receipt', None) + if record: + emit('communicate', **record, returncode=self.returncode, + signal=-self.returncode if self.returncode is not None and self.returncode < 0 else None, + stdout=output(result[0]), stderr=output(result[1])) + return result + + subprocess.Popen.__init__ = initialize + subprocess.Popen.wait = wait + subprocess.Popen.communicate = communicate + + +def snapshots(root, stage): + root = Path(root) + files = [] + for directory in [root, root / 'session', root / 'next']: + for name in ['browser.json', 'holder.json', 'test-boundary.json', 'holder.stderr.log', 'holder.stdout.log']: + path = directory / name + try: + raw = path.read_bytes() + info = path.stat() + except FileNotFoundError: + continue + item = {'path': str(path), 'sha256': digest(raw), 'mtime_ns': info.st_mtime_ns, + 'mode': oct(info.st_mode & 0o777)} + try: + item['json'] = clean(json.loads(raw)) + except ValueError: + item['text'] = raw.decode(errors='replace') + files.append(item) + if files: + emit('session_snapshot', stage=stage, root=root, files=files) + + +def safe_snapshot(root, stage): + try: + snapshots(root, stage) + except Exception as error: # noqa: BLE001 - diagnostics must not bypass fixture cleanup + observer_error(stage, error) + + +def wrap_helper(module, name): + original = getattr(module, name, None) + if original is None or getattr(original, '_vm_observed', False): + return + + @functools.wraps(original) + def observed(*args, **kwargs): + root = None + if module.__name__ == 'test_browser_restart_cli' and name in ('_cli', '_setup') and args: + root = args[0] + elif '--session' in args: + root = Path(args[args.index('--session') + 1]).parent + if root is not None: + safe_snapshot(root, 'before_' + name) + try: + result = original(*args, **kwargs) + if name in ('_cli', 'cli'): + emit('helper_return', helper=name, arguments=list(map(str, args)), result=result) + return result + finally: + if root is not None: + safe_snapshot(root, 'after_' + name) + + observed._vm_observed = True + setattr(module, name, observed) + + +def pytest_runtest_setup(item): + global CURRENT + CURRENT = item.nodeid + if item.module.__name__ in ('test_browser_restart_cli', 'test_browser_cdp_cli'): + for name in ('_cli', 'cli', '_setup', '_test_cleanup'): + wrap_helper(item.module, name) + + +def fixture_records(item): + for name in ('ingress', 'page'): + fixture = item.funcargs.get(name) + if not isinstance(fixture, tuple) or len(fixture) < 2: + continue + records = fixture[1]() if callable(fixture[1]) else fixture[1] + if isinstance(records, list): + emit('independent_fixture_records', fixture=name, url=fixture[0], records=list(records)) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_runtest_makereport(item, call): + outcome = yield + report = outcome.get_result() + emit('pytest_report', phase=report.when, outcome=report.outcome, + duration=report.duration, longrepr=str(report.longrepr) if report.failed else None) + if report.when == 'call': + try: + fixture_records(item) + except Exception as error: # noqa: BLE001 - preserve collector gaps separately from product results + observer_error('fixture_records', error) + + +def pytest_unconfigure(config): + subprocess.Popen.__init__ = ORIGINAL_INIT + subprocess.Popen.wait = ORIGINAL_WAIT + subprocess.Popen.communicate = ORIGINAL_COMMUNICATE diff --git a/jevdual/results/durable-cdp-vm-20261031/notebook-check.txt b/jevdual/results/durable-cdp-vm-20261031/notebook-check.txt new file mode 100644 index 0000000..820d03f --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/notebook-check.txt @@ -0,0 +1,110 @@ +865 entries, 290 predictions: 208 held, 47 failed, 25 inconclusive, 10 open +held rate 208/255 of predictions resolved held or failed + +failed (the diagnoses to learn from): + A3 (2026-09-26-a-session-evidence.md): two places, not one. `_field_receipt` substitutes the placeholder in `shown` but puts the real value in `holds + resolved by U3: running the afe6d94 `session.py` against a synthetic marker put it in four places: the receipt, the rendered o + C1 (2026-09-26-c-trusted-input.md): a cross-site navigation. Chromium's site isolation moves the tab to a new renderer process when the site chang + resolved by U8: `scripts/diag_nav_input.py`, ten fresh headless browser-use sessions per variant: a 303 redirect after browser + C3 (2026-09-26-c-trusted-input.md): yes, in most launches, as on 2026-09-23 (1 of 4 launches kept it on the inventory page). + resolved by U10: six launches, saucedemo only (`results/c-nav-input-20260926/live-diag-sauce.txt`). The login-page probe got on + C4 (2026-09-26-c-trusted-input.md): it fails intermittently, and when it fails the click is delivered but lands off the button (browser-use comput + resolved by U13: `add-to-cart.jsonl`, ten launches: browser-use's own click on the backpack's "Add to cart" added it in 10 of 1 + C6 (2026-09-26-c-trusted-input.md): Chrome's breached-password check. `secret_sauce` is in public breach lists; after a login form submits it, Chr + resolved by U16: `results/c-agent-loop-20260926/leak-2x2.jsonl`, `diag_add_to_cart.py`, six launches per cell: Chrome's default + V2 (2026-09-26-e-verifier-evidence.md): the deterministic claim check binds no fact to its subject, so it accepts the adversarial cases whose facts ar + resolved by U31: `results/claims-audit-20260927` (18 labelled dones, 10 incorrect): claim check alone, `page`: false acceptance + V3 (2026-09-26-e-verifier-evidence.md): in strict mode, (1) apply the no-fact demotion only when the task asks for an answer, and (2) give Jev the non + resolved by U32: `results/claims-audit-20260927b`, strict full verifier after the two changes: false acceptance 0/10, false rej + V4 (2026-09-26-e-verifier-evidence.md): task 1 was refused because the verifier read the destination window alone ("The document's last line is the fi + resolved by U41: `results/v4-offline-20260928.json`: correct destination without the other surface's context: verify (complete + V5 (2026-09-26-e-verifier-evidence.md): at `done`, for each carried value this session typed or appended, the harness compares the field's current val + resolved by U42: `results/v5-offline-20260928.json`: with the harness check, the tampered destination is rejected ("The documen + V6 (2026-09-26-e-verifier-evidence.md): with the match's surrounding lines in the carry ("A Light in the Attic / £51.77 / In stock / Add to basket", f + resolved by U43: `results/v6-offline-20260928.json`: with the carry's occurrence ("match 1 of 3 on the page") and surroundings + V7 (2026-09-26-e-verifier-evidence.md): split task 1's requirements by surface: on the books page, "the value read is the first book's price" (the ver + resolved by U44: `results/v7-q13-task1-20260928` (task 1, three repeats, per-surface requirements): the oracle confirmed 3 of 3 + G1 (2026-09-26-g-cross-surface.md): yes, end to end, with every step's receipt true: the read names the page and the match; the append's readback + resolved by U22: `scripts/pilot_cross_surface.sh` on c81c0e5 exited 0. `read --match` carried '£51.77' from books.toscrape.com; + G6 (2026-09-26-g-cross-surface.md): early reads: TextEdit finishes writing after 0.5 s, so polling for up to 3 s turns them into `confirmed`. + resolved by U28: `results/g6-native-append` on 809e346 (polling up to 3 s): 6 of 6 verified again; the first Command-S read `pa + N1 (2026-09-26-notebook-practice.md): across packages A to C, at least one prediction per package fails or is revised, and each failure names a chan + resolved by U21: `uv run python -m evals.notebook docs/notebook` and `git log -S` per entry, after package C closed: every one + R5 (2026-09-28-q19-rounds.md): with the app activated before the bound window is raised, the bound TextEdit document becomes key, so Command- + resolved by U48: Command-S through the D17 session was refused `not_key` again; d15.txt and other.txt unchanged. Probes with Te + M1 (2026-09-29-model-completion.md): two of the three are the done decision's evidence model, not the verifier's judgment. H10's done ("QUIET-83 27 + resolved by U50: `results/m1-offline-20260929.json` (scripts/m1_offline.py, 3 replays per case and arm). Positives, before → M1 + M3 (2026-09-29-model-completion.md): H03's twenty steps and H02's duplicate attempt are control gaps. The loop sees only the tail of each observati + resolved by U52: `results/m3-dev/` (`scripts/m3_summary.py`), 3 repeats per arm. X1 (withdrawn archive): A exhausted its budget + M4 (2026-09-29-model-completion.md): with progress counted only from a state not seen before, a newly carried value, or a new effect record (saved + resolved by U53: `results/m4-dev/` on 861249a (`scripts/m3_summary.py results/m4-dev`). X1 ended before the budget in 5 of 6 (M + M6 (2026-09-29-model-completion.md): the verifier cannot connect a bare number to the task's qualifier. The page lists 95 washers (reserved) and 60 + resolved by U55: `results/m6-offline-20260929.json` (scripts/m6_offline.py on the stored X3 session, 5 replays each, mean compl + DAPI1 (2026-10-08-decisions-jev.md): native predicates and choice distributions make a portable semantic-judge contract practical; completion cover + resolved by U-DTEXT: All 636 scheduled version 2 attempts finished; nine unused-target refusals make 627 strictly valid batches. De + DAPI4 (2026-10-08-decisions-jev.md): combined image/text resolves visual proposals better than normal observed text, with abstention on ambiguous i + resolved by U-D3RESULT: All216calls and72first-replay reconstruction checks finish on c465377. Combined all-three correctness19/24 exc + CR7B (2026-10-09-capability-comparison.md): the bounded large-frame repair removes the raw host's transport failures while preserving exact four/seven too + resolved by CR7B-U1: development v2 passed inventory isolation and large-response transport. Clean Footwork completed, raw stopped + SIM4 (2026-10-10-independent-controller-recovery.md): a separately running controller with durable acceptance, exact operation identity and lower-layer receipt reco + resolved by SIM4-U3: targeted process scenarios failed before fixes: a saved unknown controller fallback with intact lower terminal + AA1 (2026-10-10-restart-agent-acceptance.md): fresh Claude and Codex callers can recover qualified historical append results from the public four-tool inter + resolved by AAU3: v1 Claude Opus5.5 executed all four scenarios safely with one operation each and $0.2771692 reported cost, but + AA4 (2026-10-10-restart-agent-acceptance.md): explicit operation reporting guidance (unknown execution cannot be attributed from matching text; disk persist + resolved by AAU9: root final-answer review passes Claude4/4 and Codex3/4. In the no-receipt case, Codex received unknown histori + SIM5 (2026-10-10-versioned-application-fulfillment.md): an immutable leased order snapshot plus a current-revision compare-and-swap and exact controller evidence can + resolved by SIM5-U1: the first implementation permitted mutations with missing or foreign expected application identity; SIM5-ID's + SIM8-CLI (2026-10-11-bench-operator.md): the installed authenticated Codex CLI can return one schema-valid image-based action with action tools disable + resolved by SIM8-CLI-U1: the first committed-source probe exited 0 with a valid movement action but the adapter refused it as unexpecte + UF1 (2026-10-12-onboarding-fixture-v4.md): closing the unique fixture document by exact AXDocument identity and its AXCloseButton, with any discard butto + resolved by UFU6: installed native-v1 exits0 and reports passed with its actual installed worker observed. Exact fixture PID5262 + UF3 (2026-10-12-onboarding-fixture-v4.md): a source-frozen packetv4 with the unchanged reviewed wheel permits a separately recorded denied-to-granted gue + resolved by UFU7: UFU6 records two resolutions on one field, but the notebook reader recognizes only its first prediction. This + SIM14-P4 (2026-10-12-reusable-body-recovery.md): a blocking prompt write can prevent the guardian from observing host death if its planner never reads stdin; m + resolved by SIM14-U4: the current guardian retired a never-reading planner after host-only SIGKILL with a valid 60000-byte prompt; c + UC1 (2026-10-27-unified-cli.md): a packaged command router and discoverable machine-readable catalog can expose existing browser/native operati + resolved by UCU3: the first implementation did not fully preserve the existing CLI diagnostic boundary: string SystemExit messag + MS1 (2026-10-28-move-submit.md): Finder's own Copy, Go to Folder and Move Item Here UI can move the exact manifest-bound inode with qualified i + resolved by MSU7: the modal route never completed a qualified move. After closing verified owned leftover modal windows, a fresh + MS4 (2026-10-28-move-submit.md): the frozen installed candidate completes all required app tasks and a process-interrupted full cross-app chain + resolved by MSU16: The full primary gate remains open: final pre-header disconnect produced two ingresses and could not complete + MS7 (2026-10-28-move-submit.md): the Go to Folder Return must target the exact proven owned modal sheet CGWindowID rather than its parent windo + resolved by MSU18: The modal Return route never completed a qualified move; its uncertain attempts remain retained. The reader ac + MS8 (2026-10-28-move-submit.md): removing redundant SDK captures between owned Finder foreground binding and its direct AX input avoids a focus + resolved by MSU5: avoiding redundant captures allowed rename to settle but a later owned Go sheet still lost foreground to Chrom + MS11 (2026-10-28-move-submit.md): a separately launched owned Preview process provides a fresh first-rotation undo baseline and exact document b + resolved by MSU9: a new Preview process restored prior documents, and the exact-document assertion stopped before input. A fresh + MS14 (2026-10-28-move-submit.md): after the committed same-inode rename, exact-window foreground reassertion restores the normal filename AXURL + resolved by MSU13: 1bd8f51 still stopped before reacquisition. After Return, the old editor object no longer has a readable frame + LR4 (2026-10-30-linux-native-reliability.md): a UniFFI continuation can publish its asyncio wake before the native callback has returned; interpreter finali + resolved by LRU2: all 40 unchanged minimal processes completed three create/list/observe/shutdown cycles and normal exit. Three + LR8 (2026-10-30-linux-native-reliability.md): cleanup can poll a still-running direct child, then observe its new zombie state and stop the wait loop withou + resolved by LRU5: candidate c43a044 reached readiness and completed all 90 worker driver cycles across 30 fresh admissions, but + LXRT2 (2026-10-30-linux-runtime-tranche.md): an owned session supervisor with fresh XDG profiles, bounded subprocess probes and staged readiness prevents t + resolved by LXRTU3: initial lifecycle tests and native readiness/save passed, but code review exposed stale Popen root IDs grantin + LXRT3 (2026-10-30-linux-runtime-tranche.md): Linux zero-window browser recovery can launch the qualified ELF executable into the existing exact profile and + resolved by LXRTU4: the public scenario first reproduced Linux calling macOS open. The initial native Linux helper replacement fai + LINUXVM1 (2026-10-30-linux-vm-acceptance.md): the prepared Debian 13 x86-64 environment can run the available checkout's offline regression suite and headle + resolved by LINUXVMU2: baseline f849e16 completed with 2253 passes, 28 skips and one failure caused by this package's duplicate noteb + LINUXVM3 (2026-10-30-linux-vm-acceptance.md): the exact 0b1e82c product wheel and existing pinned native x86-64 CUA wheel can complete the documented instal + resolved by LINUXVMU4: the fresh binary consumer installation succeeded and all 191 package files matched the product wheel. Direct/m + LINUXVMSR1 (2026-10-30-linux-vm-save-receipt.md): the 045fc5d bridge fix recognizes the real pinned CUA foreground_unavailable pre-input response on this Debian + resolved by LINUXVMSRU1: the 045fc5d wheel installed and all 191 package files matched; only native.py changed from the previous wheel. + LCDC1 (2026-10-31-cdp-dom-click.md): refs tied to the observation's isolated execution context, complete document tuple and bounded native-button f + resolved by LCDCU2: the numeric-only draft passed ordinary reload and changed-subject controls but activated an identical new-docu + LCD1 (2026-10-31-light-cdp-read.md): a Chrome launched by Footwork with `--remote-debugging-port=0` into a fresh profile directory is reached only + resolved by LCDU1: the first real headless Chrome 156 run gave five extra candidates beyond the fixture's declared controls: each + LCDVMC3 (2026-10-31-linux-cdp-qualification.md): allocating one otherwise-unexposed script-node backend through legitimate Runtime.evaluate plus DOM.describeNo + resolved by LCDVMCU3: both extra attempts legitimately describe the new script at backend3, already allocated, leaving intended back + +open: + W1 (2026-10-01-inspection-v2.md, 2026-10-01 16:34): each exercised step has distinct precondition/action/immediate/settled/readback statuses; an absent + SIM14-P2 (2026-10-12-reusable-body-recovery.md, 2026-10-12 22:14): old planner authority is revoked, verified owned children retire before new planning, unresolved own + SIM14-P3 (2026-10-12-reusable-body-recovery.md, 2026-10-12 22:14): wire semantics and existing bounds remain unchanged, unknown bench operations stay refused, generic + SIM14-P5 (2026-10-12-reusable-body-recovery.md, 2026-10-12 22:45): normal image-guided planning remains functional, actual startup has no shell-snapshot group, and all + CA1 (2026-10-14-consolidation-adoption.md, 2026-10-14 12:51): merged tree includes both disjoint work streams, tests/review/CI pass, existing qualified8dc81c72 re + CA2 (2026-10-14-consolidation-adoption.md, 2026-10-14 12:51): actual Codex can follow README-only setup, identify permittedtargets through the publicsurface, comp + CA8 (2026-10-14-consolidation-adoption.md, 2026-10-14 13:25): all 54 unavailable-module errors disappear without dropping synthetic safety tests; cleanup observes + CA10 (2026-10-14-consolidation-adoption.md, 2026-10-14 13:50): originalclock-isolation regression fails thenpasses; readiness stillwaits40syntheticpolls andstrictd + CTL1 (2026-10-28-control-state.md, 2026-10-28 20:36): mixed state and expanded baselines fail before repair; repairs preserve known transitions without co + DCVMOBS2 (2026-10-31-durable-cdp-vm.md, 2026-10-31 14:58): original fixture cleanup runs, per-cell CLI/boundary/ingress receipts remain available, and no Path( diff --git a/jevdual/results/durable-cdp-vm-20261031/redaction.txt b/jevdual/results/durable-cdp-vm-20261031/redaction.txt new file mode 100644 index 0000000..3569d36 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/redaction.txt @@ -0,0 +1 @@ +redacted 0 files under results/durable-cdp-vm-20261031 diff --git a/jevdual/results/durable-cdp-vm-20261031/report.md b/jevdual/results/durable-cdp-vm-20261031/report.md new file mode 100644 index 0000000..91d4f21 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/report.md @@ -0,0 +1,5 @@ +# Durable CDP Linux VM evidence + +The first candidate **cad7508f8f4375735c0651c5e0aa5929f3b57700** / wheel **e466146e5ba77e68470eea7cca86d7beb84d42c3dfe3a7ac7e15ca06a6530660** is retained as **187 passed / 3 collector-caused failures**, not a clean qualification. [Complete first-candidate report](cad7508-first/report.md), including per-cell public receipts,0/0/1 independent ingress, boundary metadata, discovery output and truthful wrapper intervention. + +No replacement startup-fixed candidate has been measured yet. Parent owns implementation, review, PR and merge. All changes on `codex/durable-cdp-vm-evidence` are notebook/results only. Previous VM failures and evidence remain unchanged; no old case has been rerun or substituted. From 60de3d8cf7959dac7dedb7b2657936f888a4d7d7 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 19:03:40 +0000 Subject: [PATCH 12/18] docs: preregister exact startup-fixed installed 199-case batch (cherry picked from commit ae7f396e9238a7d0604eb01c528449b522dd01b8) --- jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md index 495b9db..8737c9f 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md @@ -31,3 +31,11 @@ Refs: results/durable-cdp-vm-20261031/harness/receipt_plugin_v2.py; first frozen Observed: all three restart markers are retained with heavy_imports empty, holder exit86, matching operation IDs and independent ingress0/0/1; retained marker proves independent /count1 before holder exit. Recovery/status phases are final/not_sent/not_sent, unknown/unknown/ambiguous and unknown/unknown/sent respectively; all retain unverified completion. Real client SIGKILL lost-ack, missing guard and actual discovery cases passed. The3 restart cases remain failed because collector cleanup interception prevented the original cleanup, including later fresh-start assertions in started/retained. More precisely than DCVMU1's wording,36 wrapper SIGTERM attempts produced35 actual pidfd deliveries plus one already-exited result, and202 adopted waits; these counts are not additive to the earlier182zombie/36live snapshot because parents may reap during termination. Final owned descendants are empty. The versioned v2 collector is prepared but untested pending the replacement candidate. Next: publish first evidence on codex/durable-cdp-vm-evidence and preserve it unchanged. Wait for the parent's exact startup-fixed SHA/wheel/recipe before further runtime tests or fault probes; do not patch candidate source. Refs: results/durable-cdp-vm-20261031/cad7508-first/report.md; results/durable-cdp-vm-20261031/cad7508-first/cleanup.json; results/durable-cdp-vm-20261031/cad7508-first/cells/ + +## DCVM2 · prediction · 2026-10-31 15:03 +Revises: DCVM1 +Hypothesis: startup-fixed exact candidate3484b03b2c6c639f4d896317fc765d2267a6fe98 retains its actual Chrome handle through early TERM/INT/readiness cancellation, and its unchanged installed public CLI/holder tests preserve durable token/no-redispatch semantics under the corrected test-only receipt collector. +Test: require211-entry wheel/hash8042e0f94dfcde08d285685744225a48f007bd7b08e1a20147e8660ec4861384, a fresh minimal consumer and exact copied12 modules outside checkout, including candidate startup_cli/startup_lifecycle. Run one full expected199-case batch with the original frozen600-second wrapper bound/default sandbox/current4CPU16GiB envelope. Preserve all original tests and real subprocess commands. Use the prepared path-safe collector, adding only recognition of the dedicated startup test supervisor and capture of its actual stdout JSON/stderr/numeric exit plus startup-boundary metadata before temporary directories disappear. The four real startup cells must assert zero captured LIVE processes BEFORE their own test cleanup (TERM launch/connect/navigation, INT launch); retain their zombie/reaping reports separately. Preserve0/0/1 restart ingress, real client lost-ack count1, all public receipts/discovery/refusals/native separation, and no heavy imports. This is a new exact artifact batch, not replacement of the old failed190 batch. +Predicts: all199 cases pass without skips or collector errors; startup holder exits0 without readiness publication and all four supervisor pre/post-live sets are empty; stable replay adds no ingress and unknown remains blocking/unverified. Outer captured live residue is zero before wrapper cleanup, with any orphan zombies explicitly counted/reaped as test-only behavior. +Against: any failed/skipped/collector-corrupted case, unintended/repeated ingress, completed-from-ack claim, lost handle/live startup residue, readiness publication after stop, raw credential dump, source import/optional heavy backend, or wrong source/wheel identity. +Refs: first failed run d4a312a; candidate3484b03b2c6c639f4d896317fc765d2267a6fe98; results/durable-cdp-vm-20261031/3484b03/; parent startup-fixed handoff From e2bb8a3da45ad1abb3b1d4661cc6263c5c845bb2 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 19:03:40 +0000 Subject: [PATCH 13/18] test: freeze path-safe receipts and startup supervisor capture for new artifact (cherry picked from commit eaba616cee07921cc8a4c63b632fd9e452650169) --- .../harness/receipt_plugin_v3.py | 212 ++++++++++++++++++ .../harness/run_3484b03.py | 210 +++++++++++++++++ 2 files changed, 422 insertions(+) create mode 100644 jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin_v3.py create mode 100644 jevdual/results/durable-cdp-vm-20261031/harness/run_3484b03.py diff --git a/jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin_v3.py b/jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin_v3.py new file mode 100644 index 0000000..e7bfd18 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/harness/receipt_plugin_v3.py @@ -0,0 +1,212 @@ +"""Test-only passive receipts; never change a subprocess command/result or product state.""" +import functools +import hashlib +import json +import os +import subprocess +import threading +import time +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parent # copied into the new owned run before execution +CURRENT = None +LOCK = threading.Lock() +COUNTER = 0 + + +def digest(value): + return hashlib.sha256(value).hexdigest() + + +def clean(value): + if isinstance(value, dict): + return {k: {'redacted_nonce_sha256': digest(str(v).encode())} if k == 'nonce' else clean(v) + for k, v in value.items()} + if isinstance(value, (list, tuple)): + return [clean(v) for v in value] + if isinstance(value, bytes): + return value.decode(errors='replace') + if isinstance(value, Path): + return str(value) + return value + + +def emit(kind, **fields): + with LOCK, (ROOT / 'observer.jsonl').open('a') as stream: + stream.write(json.dumps(clean({'kind': kind, 'monotonic': time.monotonic(), + 'nodeid': CURRENT, **fields})) + '\n') + + +def observer_error(stage, error): + with LOCK, (ROOT / 'observer-errors.jsonl').open('a') as stream: + stream.write(json.dumps({'stage': stage, 'nodeid': CURRENT, + 'type': type(error).__name__, 'message': str(error)}) + '\n') + + +def output(value): + if value is None: + return None + raw = value if isinstance(value, bytes) else value.encode() + text = raw.decode(errors='replace') + try: + parsed = json.loads(text) + except ValueError: + parsed = None + return {'sha256': digest(raw), 'bytes': len(raw), + 'json': clean(parsed), 'text': json.dumps(clean(parsed)) if parsed is not None else text} + + +def selected(argv): + if not isinstance(argv, (tuple, list)): + return None + if str(argv[0]) == os.environ.get('FOOTWORK_EXECUTABLE'): + return 'public_cli' + if '-c' in argv and any('test-boundary.json' in str(x) and 'os._exit(86)' in str(x) for x in argv): + return 'test_only_holder_shim' + if '-c' in argv and any('zombies_before_test_reap' in str(x) and 'live_before_test_cleanup' in str(x) for x in argv): + return 'test_only_startup_supervisor' + return None + + +def arguments(argv): + values = list(map(str, argv)) + if '-c' in values: + index = values.index('-c') + 1 + values[index] = {'test_script_sha256': digest(values[index].encode()), 'characters': len(values[index])} + return values + + +def pytest_configure(config): + global ORIGINAL_INIT, ORIGINAL_WAIT, ORIGINAL_COMMUNICATE + ORIGINAL_INIT = subprocess.Popen.__init__ + ORIGINAL_WAIT = subprocess.Popen.wait + ORIGINAL_COMMUNICATE = subprocess.Popen.communicate + + def initialize(self, args, *positional, **kwargs): + global COUNTER + ORIGINAL_INIT(self, args, *positional, **kwargs) + kind = selected(args) + if kind: + with LOCK: + COUNTER += 1 + number = COUNTER + self._vm_receipt = {'process_number': number, 'process_kind': kind, 'owner_nodeid': CURRENT, + 'pid': self.pid, 'argv': arguments(args), 'cwd': str(kwargs.get('cwd') or os.getcwd())} + emit('spawn', **self._vm_receipt) + + def wait(self, *args, **kwargs): + result = ORIGINAL_WAIT(self, *args, **kwargs) + record = getattr(self, '_vm_receipt', None) + if record: + emit('wait', **record, returncode=result, signal=-result if result < 0 else None) + return result + + def communicate(self, *args, **kwargs): + result = ORIGINAL_COMMUNICATE(self, *args, **kwargs) + record = getattr(self, '_vm_receipt', None) + if record: + emit('communicate', **record, returncode=self.returncode, + signal=-self.returncode if self.returncode is not None and self.returncode < 0 else None, + stdout=output(result[0]), stderr=output(result[1])) + if record['process_kind'] == 'test_only_startup_supervisor': + safe_snapshot(record['cwd'], 'startup_supervisor_return') + return result + + subprocess.Popen.__init__ = initialize + subprocess.Popen.wait = wait + subprocess.Popen.communicate = communicate + + +def snapshots(root, stage): + root = Path(root) + files = [] + for directory in [root, root / 'session', root / 'next']: + for name in ['browser.json', 'holder.json', 'test-boundary.json', 'startup-boundary.json', 'holder.stderr.log', 'holder.stdout.log']: + path = directory / name + try: + raw = path.read_bytes() + info = path.stat() + except FileNotFoundError: + continue + item = {'path': str(path), 'sha256': digest(raw), 'mtime_ns': info.st_mtime_ns, + 'mode': oct(info.st_mode & 0o777)} + try: + item['json'] = clean(json.loads(raw)) + except ValueError: + item['text'] = raw.decode(errors='replace') + files.append(item) + if files: + emit('session_snapshot', stage=stage, root=root, files=files) + + +def safe_snapshot(root, stage): + try: + snapshots(root, stage) + except Exception as error: # noqa: BLE001 - diagnostics must not bypass fixture cleanup + observer_error(stage, error) + + +def wrap_helper(module, name): + original = getattr(module, name, None) + if original is None or getattr(original, '_vm_observed', False): + return + + @functools.wraps(original) + def observed(*args, **kwargs): + root = None + if module.__name__ == 'test_browser_restart_cli' and name in ('_cli', '_setup') and args: + root = args[0] + elif '--session' in args: + root = Path(args[args.index('--session') + 1]).parent + if root is not None: + safe_snapshot(root, 'before_' + name) + try: + result = original(*args, **kwargs) + if name in ('_cli', 'cli'): + emit('helper_return', helper=name, arguments=list(map(str, args)), result=result) + return result + finally: + if root is not None: + safe_snapshot(root, 'after_' + name) + + observed._vm_observed = True + setattr(module, name, observed) + + +def pytest_runtest_setup(item): + global CURRENT + CURRENT = item.nodeid + if item.module.__name__ in ('test_browser_restart_cli', 'test_browser_cdp_cli'): + for name in ('_cli', 'cli', '_setup', '_test_cleanup'): + wrap_helper(item.module, name) + + +def fixture_records(item): + for name in ('ingress', 'page'): + fixture = item.funcargs.get(name) + if not isinstance(fixture, tuple) or len(fixture) < 2: + continue + records = fixture[1]() if callable(fixture[1]) else fixture[1] + if isinstance(records, list): + emit('independent_fixture_records', fixture=name, url=fixture[0], records=list(records)) + + +@pytest.hookimpl(hookwrapper=True) +def pytest_runtest_makereport(item, call): + outcome = yield + report = outcome.get_result() + emit('pytest_report', phase=report.when, outcome=report.outcome, + duration=report.duration, longrepr=str(report.longrepr) if report.failed else None) + if report.when == 'call': + try: + fixture_records(item) + except Exception as error: # noqa: BLE001 - preserve collector gaps separately from product results + observer_error('fixture_records', error) + + +def pytest_unconfigure(config): + subprocess.Popen.__init__ = ORIGINAL_INIT + subprocess.Popen.wait = ORIGINAL_WAIT + subprocess.Popen.communicate = ORIGINAL_COMMUNICATE diff --git a/jevdual/results/durable-cdp-vm-20261031/harness/run_3484b03.py b/jevdual/results/durable-cdp-vm-20261031/harness/run_3484b03.py new file mode 100644 index 0000000..f910ecd --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/harness/run_3484b03.py @@ -0,0 +1,210 @@ +"""Run unchanged installed-wheel candidate tests; never import checkout product code.""" +import ctypes +import hashlib +import importlib.metadata +import importlib.util +import json +import os +import platform +import resource +import shutil +import signal +import subprocess +import sys +import time +import zipfile +from datetime import UTC, datetime +from pathlib import Path + +import psutil + +SOURCE = Path('/workspace/footwork-durable-cdp-3484b03') +ROOT = Path('/workspace/scratch/footwork-durable-cdp-3484b03') +BASE = '3484b03b2c6c639f4d896317fc765d2267a6fe98' +CHROME = '/usr/lib/chromium/chromium' +TESTS = ['test_cdp_effector.py', 'test_cdp_transport_deadline.py', 'test_cdp_launch_custody.py', 'test_cdp_click.py', 'test_cdp_click_contract.py', 'test_browser_durable_authority.py', 'test_browser_holder.py', 'test_browser_guard.py', 'test_browser_cdp_cli.py', 'test_browser_restart_cli.py', 'test_browser_startup_cli.py', 'test_browser_startup_lifecycle.py'] + + +def sha(path): + return hashlib.file_digest(path.open('rb'), 'sha256').hexdigest() + + +def read(path): + try: + return Path(path).read_text().strip() + except OSError as error: + return {'unavailable': type(error).__name__} + + +def save(name, data): + (ROOT / name).write_text(json.dumps(data, indent=2) + '\n') + + +def identity(process): + return {'pid': process.pid, 'start': process.create_time(), 'parent': process.ppid(), + 'name': process.name(), 'status': process.status(), + 'session': os.getsid(process.pid), 'group': os.getpgid(process.pid)} + + +def descendants(): + rows = [] + for process in psutil.Process().children(recursive=True): + try: + rows.append(identity(process)) + except psutil.NoSuchProcess: + pass + return rows + + +def pinned_signal(row, sig): + fd = None + try: + process = psutil.Process(row['pid']) + if process.create_time() != row['start']: + return 'identity_changed' + fd = os.pidfd_open(process.pid) + if process.create_time() != row['start']: + return 'identity_changed' + signal.pidfd_send_signal(fd, sig) + return 'sent' + except (ProcessLookupError, psutil.NoSuchProcess): + return 'exited' + except (OSError, psutil.Error) as error: + return type(error).__name__ + finally: + if fd is not None: + os.close(fd) + + +def main(): + assert sys.prefix == str(ROOT / 'consumer') + assert not importlib.util.find_spec('cua_driver') + assert not importlib.util.find_spec('browser_use') + import jevdual + from jevdual.effectors.cdp import operations + + wheel = next((ROOT / 'wheel').glob('*.whl')) + package_root = Path(jevdual.__file__).parent.parent + assert package_root.is_relative_to(ROOT / 'consumer') + verified = [] + with zipfile.ZipFile(wheel) as archive: + for name in archive.namelist(): + if name.startswith('jevdual/'): + installed = package_root / name + assert installed.read_bytes() == archive.read(name), name + verified.append(name) + for helper in ('receipt_plugin.py', 'pytest_main.py'): + shutil.copyfile(Path(__file__).with_name('receipt_plugin_v3.py' if helper == 'receipt_plugin.py' else helper), ROOT / helper) + testdir = ROOT / 'tests' + testdir.mkdir(mode=0o700) + hashes = {} + for name in TESTS: + original = SOURCE / 'jevdual/tests' / name + copied = testdir / name + shutil.copyfile(original, copied) + assert copied.read_bytes() == original.read_bytes() + hashes[name] = sha(copied) + libc = ctypes.CDLL(None, use_errno=True) + assert libc.prctl(36, 1, 0, 0, 0) == 0, ctypes.get_errno() # task-only child subreaper + state = ctypes.c_int() + assert libc.prctl(37, ctypes.byref(state), 0, 0, 0) == 0 and state.value == 1 + metadata = { + 'utc_started': datetime.now(UTC).isoformat(), 'baseline_source': BASE, + 'measurement_commit': subprocess.check_output(['git', '-C', str(SOURCE), 'rev-parse', 'HEAD'], text=True).strip(), + 'evidence_commit': subprocess.check_output(['git', '-C', '/workspace/footwork-durable-cdp-vm-evidence', 'rev-parse', 'HEAD'], text=True).strip(), + 'receipt_helpers_sha256': {name: sha(ROOT / name) for name in ['receipt_plugin.py', 'pytest_main.py']}, + 'harness_sha256': sha(Path(__file__)), 'wheel': {'name': wheel.name, 'sha256': sha(wheel)}, + 'test_sha256': hashes, 'verified_installed_package_files': len(verified), + 'origins': {'jevdual': jevdual.__file__, 'operations': operations.__file__, + 'python': sys.executable, 'prefix': sys.prefix, 'sys_path': sys.path}, + 'packages': {d.metadata['Name']: d.version for d in importlib.metadata.distributions()}, + 'optional_backends': {'cua_driver': False, 'browser_use': False}, + 'python': sys.version, 'os_release': read('/etc/os-release'), + 'kernel': {'system': platform.system(), 'release': platform.release(), 'machine': platform.machine()}, + 'chrome': {'executable': CHROME, 'sha256': sha(Path(CHROME)), + 'version': subprocess.check_output([CHROME, '--version'], text=True).strip(), + 'sandbox_override': False}, + 'cgroup_membership': read('/proc/self/cgroup'), + 'cgroup': {n: read('/sys/fs/cgroup/' + n) for n in + ['cpu.max', 'cpuset.cpus.effective', 'memory.max', 'memory.swap.max', 'pids.max', + 'memory.events', 'pids.events']}, + 'affinity': sorted(os.sched_getaffinity(0)), 'uid': os.getuid(), + 'rlimits': {n: resource.getrlimit(getattr(resource, n)) for n in + ['RLIMIT_CORE', 'RLIMIT_NPROC', 'RLIMIT_NOFILE', 'RLIMIT_AS']}, + 'kernel_policy': {p: read(p) for p in ['/proc/sys/kernel/unprivileged_userns_clone', + '/proc/sys/user/max_user_namespaces', '/proc/sys/kernel/core_pattern']}, + 'pid1': psutil.Process(1).name(), 'test_wrapper_subreaper': True, + 'watchdog_seconds': 600, 'cleanup_grace_seconds': 3, + 'scope': 'explicit durable CDP CLI and holder; typing/completion oracle/light metadata split remain off', + } + save('environment.json', metadata) + env = dict(os.environ) + env.pop('PYTHONPATH', None) + env.pop('TYPESAFE_API_KEY', None) # fixture guards only; no provider-backed calls + env['FOOTWORK_EXECUTABLE'] = str(ROOT / 'consumer/bin/footwork') + env.update(FOOTWORK_CHROME_EXECUTABLE=CHROME, JEVDUAL_PURE_PY='1', PYTEST_DISABLE_PLUGIN_AUTOLOAD='1') + command = [sys.executable, '-I', str(ROOT / 'pytest_main.py'), '-q', '-rA', '-o', 'markers=browser: launches a real owned browser', '--confcutdir=' + str(testdir), + '--basetemp=' + str(ROOT / 'pytest-tmp'), '--junitxml=' + str(ROOT / 'junit.xml'), str(testdir)] + save('command.json', {'argv': command, 'cwd': str(testdir), 'PYTHONPATH': 'unset', + 'FOOTWORK_CHROME_EXECUTABLE': CHROME, 'JEVDUAL_PURE_PY': '1', + 'PYTEST_DISABLE_PLUGIN_AUTOLOAD': '1', 'FOOTWORK_EXECUTABLE': env['FOOTWORK_EXECUTABLE'], 'provider_key_forwarded': False}) + save('pre-owned-processes.json', descendants()) + with (ROOT / 'pytest.stdout.txt').open('w') as out, (ROOT / 'pytest.stderr.txt').open('w') as err: + process = subprocess.Popen(command, cwd=testdir, env=env, stdout=out, stderr=err, start_new_session=True) + observed = {} + deadline = time.monotonic() + 600 + while process.poll() is None and time.monotonic() < deadline: + for row in descendants(): + observed[(row['pid'], row['start'])] = row + time.sleep(.05) + timed_out = process.poll() is None + if timed_out: + process.terminate() # sole direct-child Popen identity; watchdog only + try: + process.wait(timeout=3) + except subprocess.TimeoutExpired: + process.kill() + code = process.wait(timeout=3) + pre_cleanup = descendants() + save('owned-process-history.json', list(observed.values())) + save('post-pytest-before-wrapper-reaping.json', pre_cleanup) + signals, waits = [], [] + + def reap(): + while True: + try: + pid, status = os.waitpid(-1, os.WNOHANG) + except ChildProcessError: + break + if pid == 0: + break + waits.append({'pid': pid, 'raw_wait_status': status, + 'returncode': os.waitstatus_to_exitcode(status)}) + + for sig in (signal.SIGTERM, signal.SIGKILL): + for row in descendants(): + if row['status'] != psutil.STATUS_ZOMBIE: + signals.append({**row, 'signal': sig.value, 'delivery': pinned_signal(row, sig)}) + deadline = time.monotonic() + 3 + while descendants() and time.monotonic() < deadline: + reap() + time.sleep(.02) + reap() + if not descendants(): + break + final = descendants() + save('cleanup.json', {'pytest_returncode': code, 'pytest_timeout': timed_out, + 'pre_wrapper_cleanup': pre_cleanup, 'signals': signals, + 'adopted_waits': waits, 'final_owned_descendants': final, + 'utc_finished': datetime.now(UTC).isoformat(), + 'limits': 'bounded known descendants; no atomic inventory/daemon-escape/global no-zombie claim'}) + observer_gap = (ROOT / 'observer-errors.jsonl').exists() and (ROOT / 'observer-errors.jsonl').stat().st_size > 0 + wrapper_code = 1 if timed_out or final or observer_gap else (code if code >= 0 else 128 - code) + receipt = json.loads((ROOT / 'cleanup.json').read_text()) + receipt.update(observer_gap=observer_gap, wrapper_returncode=wrapper_code) + save('cleanup.json', receipt) + return wrapper_code + + +if __name__ == '__main__': + raise SystemExit(main()) From 6a831e6ec33a2b0c3b13f301c310697d346b6262 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 19:09:00 +0000 Subject: [PATCH 14/18] test: publish exact 199-case durable CDP gate with real startup and replay receipts (cherry picked from commit c5011005061ac59165d7145c078c24dfbb627473) --- .../notebook/2026-10-31-durable-cdp-vm.md | 13 + .../3484b03/build.json | 1 + .../cells/client-lost-ack/events.jsonl | 79 + .../cells/client-lost-ack/receipt.json | 954 +++ .../3484b03/cells/missing-guard/events.jsonl | 43 + .../3484b03/cells/missing-guard/receipt.json | 236 + .../3484b03/cells/prepared/events.jsonl | 64 + .../3484b03/cells/prepared/receipt.json | 459 ++ .../3484b03/cells/retained/events.jsonl | 73 + .../3484b03/cells/retained/receipt.json | 936 +++ .../3484b03/cells/started/events.jsonl | 73 + .../3484b03/cells/started/receipt.json | 474 ++ .../cells/startup-connect-15/events.jsonl | 8 + .../cells/startup-connect-15/receipt.json | 94 + .../cells/startup-launch-15/events.jsonl | 8 + .../cells/startup-launch-15/receipt.json | 91 + .../cells/startup-launch-2/events.jsonl | 8 + .../cells/startup-launch-2/receipt.json | 91 + .../cells/startup-navigate-15/events.jsonl | 8 + .../cells/startup-navigate-15/receipt.json | 94 + .../3484b03/cleanup.json | 2954 ++++++++++ .../3484b03/collector-provenance.json | 8 + .../3484b03/command.json | 22 + .../3484b03/discovery/doctor.json | 502 ++ .../3484b03/discovery/guide.json | 89 + .../3484b03/discovery/schema.json | 94 + .../3484b03/discovery/tools.json | 335 ++ .../3484b03/environment.json | 119 + .../3484b03/inspected-summary.json | 255 + .../durable-cdp-vm-20261031/3484b03/junit.xml | 1 + .../3484b03/observer.jsonl | 993 ++++ .../3484b03/owned-process-history.json | 5105 +++++++++++++++++ .../post-pytest-before-wrapper-reaping.json | 1892 ++++++ .../3484b03/post-run-check.json | 9 + .../3484b03/pre-owned-processes.json | 1 + .../3484b03/pytest.stderr.txt | 0 .../3484b03/pytest.stdout.txt | 215 + .../durable-cdp-vm-20261031/3484b03/report.md | 52 + .../3484b03/runner.stderr.txt | 0 .../3484b03/runner.stdout.txt | 0 .../notebook-check.txt | 4 +- .../results/durable-cdp-vm-20261031/report.md | 6 +- 42 files changed, 16459 insertions(+), 4 deletions(-) create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/build.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/client-lost-ack/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/client-lost-ack/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/missing-guard/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/missing-guard/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/prepared/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/prepared/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/retained/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/retained/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/started/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/started/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/startup-connect-15/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/startup-connect-15/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/startup-launch-15/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/startup-launch-15/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/startup-launch-2/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/startup-launch-2/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/startup-navigate-15/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cells/startup-navigate-15/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/cleanup.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/collector-provenance.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/command.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/doctor.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/guide.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/schema.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/tools.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/environment.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/inspected-summary.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/junit.xml create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/observer.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/owned-process-history.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/post-pytest-before-wrapper-reaping.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/post-run-check.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/pre-owned-processes.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/pytest.stderr.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/pytest.stdout.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/report.md create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/runner.stderr.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/3484b03/runner.stdout.txt diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md index 8737c9f..d512d63 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md @@ -39,3 +39,16 @@ Test: require211-entry wheel/hash8042e0f94dfcde08d285685744225a48f007bd7b08e1a20 Predicts: all199 cases pass without skips or collector errors; startup holder exits0 without readiness publication and all four supervisor pre/post-live sets are empty; stable replay adds no ingress and unknown remains blocking/unverified. Outer captured live residue is zero before wrapper cleanup, with any orphan zombies explicitly counted/reaped as test-only behavior. Against: any failed/skipped/collector-corrupted case, unintended/repeated ingress, completed-from-ack claim, lost handle/live startup residue, readiness publication after stop, raw credential dump, source import/optional heavy backend, or wrong source/wheel identity. Refs: first failed run d4a312a; candidate3484b03b2c6c639f4d896317fc765d2267a6fe98; results/durable-cdp-vm-20261031/3484b03/; parent startup-fixed handoff + +## DCVMU3 · update · 2026-10-31 15:08 +Resolves: DCVM2 = held; DCVMOBS2 = held +Observed: exact3484b03b2c6c639f4d896317fc765d2267a6fe98 wheel211/8042e0f9 matches all206 installed package files; no CUA/browser-use and copied12 test hashes match. One complete new batch passes199/199 in52.06seconds with no skips/failures/warnings, pytest/wrapper exits0 and no observer error. All restart cells pass with independent ingress0/0/1 and committed boundary markers/heavy_imports empty; retained /count1 predates exit86. Client SIGKILL retains one ingress through replay/recovery, missing guard has none, native/typing/changed-token negatives and actual discovery pass. Four actual Chrome early-signal supervisors (TERM launch/connect/nav, INT launch) each exit0 with holder exit0, no readiness and empty live-before-test-cleanup/live-after sets; each records five zombies then test-reaps five. Outer wrapper records210 zombies/no live children after pytest, sends no signals, reaps210 and ends empty. Exact supervisor stdout/stderr/exit and boundary snapshots were retained before temp deletion. +Inferred: the startup-fixed installed artifact satisfies this finite VM gate and the corrected collector no longer bypasses fixture cleanup. It does not erase cad7508's first187/3 run or turn test subreaping into product/global no-zombie evidence. Ack/completion remains unknown/unverified, typing disabled and full metadata unchanged. +Next: publish final evidence on the separate branch for the parent's review/import/PR18 decision. No additional runtime probe, code change, duplicate batch or VM merge is required. +Refs: results/durable-cdp-vm-20261031/3484b03/report.md; results/durable-cdp-vm-20261031/3484b03/inspected-summary.json; results/durable-cdp-vm-20261031/3484b03/cleanup.json; original first reportcad7508-first + +## DCVMS · summary · 2026-10-31 15:08 +Established: exact installed startup-fixed3484b03/8042e0f9 passes all199 requested cases, including real public subprocess CLI/holder interruption,0/0/1 independent ingress/replay retention, four early-signal pre-cleanup liveness controls, guard/refusal/native separation and honest offline discovery. Candidate and tests are unchanged. First collector failures, correction prediction history, raw receipts, installed provenance and both artifacts are preserved. Actual VM4CPU16GiB; all captured owned identities end absent, with nested/outer test-only reaping explicitly separated. +Uncertain: finite tested configuration is not universal process-tree or browser reliability; non-atomic inventory/daemon escape/no-zombie product guarantees are not established. Acknowledgement does not prove business completion, generic completion reader and light metadata split remain unshipped. OBS coordination is read-only and separate from Footwork qualification. +Decision: publish notebook/results only, report tested SHA/wheel/branch/range to the parent, and leave PR18/review/merge to that owner. No VM runtime implementation or merge occurred. +Refs: results/durable-cdp-vm-20261031/report.md; results/durable-cdp-vm-20261031/3484b03/report.md; results/durable-cdp-vm-20261031/cad7508-first/report.md diff --git a/jevdual/results/durable-cdp-vm-20261031/3484b03/build.json b/jevdual/results/durable-cdp-vm-20261031/3484b03/build.json new file mode 100644 index 0000000..defc35d --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/3484b03/build.json @@ -0,0 +1 @@ +{"wheel": "/workspace/scratch/footwork-durable-cdp-3484b03/wheel/jevdual-0.0.1-py3-none-any.whl", "files": 211, "sha256": "8042e0f94dfcde08d285685744225a48f007bd7b08e1a20147e8660ec4861384", "verified": true} diff --git a/jevdual/results/durable-cdp-vm-20261031/3484b03/cells/client-lost-ack/events.jsonl b/jevdual/results/durable-cdp-vm-20261031/3484b03/cells/client-lost-ack/events.jsonl new file mode 100644 index 0000000..e29a6c4 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/3484b03/cells/client-lost-ack/events.jsonl @@ -0,0 +1,79 @@ +{"kind": "pytest_report", "monotonic": 6987.951740103, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "phase": "setup", "outcome": "passed", "duration": 0.002067334999992454, "longrepr": null} +{"kind": "spawn", "monotonic": 6987.952555001, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6988.513417588, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6988.513569253, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6988.513743782, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "e48367f1c33958c99dd928e790326e31ffdfd4a52b2944b38e4c3eda7c3395ed", "bytes": 1202, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "operations": []}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_c58b34493d2d402b83d0b6470849dc04\", \"profile\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}, \"holder\": {\"ok\": true, \"session_id\": \"cdp_c58b34493d2d402b83d0b6470849dc04\", \"operations\": []}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6988.513839804, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6988.513932542, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "result": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "operations": []}}} +{"kind": "session_snapshot", "monotonic": 6988.514303341, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-ccztb2ma", "files": [{"path": "/tmp/fw-cdp-ccztb2ma/session/browser.json", "sha256": "c29721acca682687c47ebe143e8ca6df6581708b0619e5b0c32e3e7a672116af", "mtime_ns": 1793473422380173044, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:41277/", "authority": "/tmp/fw-cdp-ccztb2ma/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "/tmp/fw-cdp-ccztb2ma/guard.py"]}}, {"path": "/tmp/fw-cdp-ccztb2ma/session/holder.json", "sha256": "f620682e0b76e76cd7bcbbd245602b270f3cfaf8bf67e6099568bbab285053fc", "mtime_ns": 1793473422811292662, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 12224, "start": "1793473422.01", "nonce": {"redacted_nonce_sha256": "fc66bdf21f85d7722318cc834e7ac1ffdff969914ea5bbdb1520052a0c3a2625"}, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "socket": "/tmp/fw-cdp-ccztb2ma/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6988.514649304, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-ccztb2ma", "files": [{"path": "/tmp/fw-cdp-ccztb2ma/session/browser.json", "sha256": "c29721acca682687c47ebe143e8ca6df6581708b0619e5b0c32e3e7a672116af", "mtime_ns": 1793473422380173044, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:41277/", "authority": "/tmp/fw-cdp-ccztb2ma/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "/tmp/fw-cdp-ccztb2ma/guard.py"]}}, {"path": "/tmp/fw-cdp-ccztb2ma/session/holder.json", "sha256": "f620682e0b76e76cd7bcbbd245602b270f3cfaf8bf67e6099568bbab285053fc", "mtime_ns": 1793473422811292662, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 12224, "start": "1793473422.01", "nonce": {"redacted_nonce_sha256": "fc66bdf21f85d7722318cc834e7ac1ffdff969914ea5bbdb1520052a0c3a2625"}, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "socket": "/tmp/fw-cdp-ccztb2ma/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6988.515181413, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6988.636381982, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6988.63647482, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6988.63661019, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "4de6f9f2fee2d4106e322813eb1a1deb76ef906c91d67359f21d90bd3b7302c5", "bytes": 954, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:41277/", "title": "Durable fixture"}, "snapshot": {"id": "c76950cf54ab", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "c76950cf54ab:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "c76950cf54ab:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "55B82AC0FDAB80DDC603B8F810C3B3D1", "loader_id": "D553B3170DCBA438F66D53EC0ECE6FDA"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_c58b34493d2d402b83d0b6470849dc04\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:41277/\", \"title\": \"Durable fixture\"}, \"snapshot\": {\"id\": \"c76950cf54ab\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"c76950cf54ab:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}, {\"ref\": \"c76950cf54ab:2\", \"role\": \"button\", \"name\": \"Sentinel\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"55B82AC0FDAB80DDC603B8F810C3B3D1\", \"loader_id\": \"D553B3170DCBA438F66D53EC0ECE6FDA\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6988.636681176, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6988.636734114, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "result": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:41277/", "title": "Durable fixture"}, "snapshot": {"id": "c76950cf54ab", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "c76950cf54ab:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "c76950cf54ab:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "55B82AC0FDAB80DDC603B8F810C3B3D1", "loader_id": "D553B3170DCBA438F66D53EC0ECE6FDA"}}}} +{"kind": "session_snapshot", "monotonic": 6988.636975232, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-ccztb2ma", "files": [{"path": "/tmp/fw-cdp-ccztb2ma/session/browser.json", "sha256": "c29721acca682687c47ebe143e8ca6df6581708b0619e5b0c32e3e7a672116af", "mtime_ns": 1793473422380173044, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:41277/", "authority": "/tmp/fw-cdp-ccztb2ma/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "/tmp/fw-cdp-ccztb2ma/guard.py"]}}, {"path": "/tmp/fw-cdp-ccztb2ma/session/holder.json", "sha256": "f620682e0b76e76cd7bcbbd245602b270f3cfaf8bf67e6099568bbab285053fc", "mtime_ns": 1793473422811292662, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 12224, "start": "1793473422.01", "nonce": {"redacted_nonce_sha256": "fc66bdf21f85d7722318cc834e7ac1ffdff969914ea5bbdb1520052a0c3a2625"}, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "socket": "/tmp/fw-cdp-ccztb2ma/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6988.637511887, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12336, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--ref", "c76950cf54ab:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6988.816116669, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12336, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--ref", "c76950cf54ab:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": -9, "signal": 9} +{"kind": "wait", "monotonic": 6988.816195677, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12336, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--ref", "c76950cf54ab:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": -9, "signal": 9} +{"kind": "communicate", "monotonic": 6988.816300772, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12336, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--ref", "c76950cf54ab:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": -9, "signal": 9, "stdout": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "session_snapshot", "monotonic": 6990.31695608, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-ccztb2ma", "files": [{"path": "/tmp/fw-cdp-ccztb2ma/session/browser.json", "sha256": "c29721acca682687c47ebe143e8ca6df6581708b0619e5b0c32e3e7a672116af", "mtime_ns": 1793473422380173044, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:41277/", "authority": "/tmp/fw-cdp-ccztb2ma/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "/tmp/fw-cdp-ccztb2ma/guard.py"]}}, {"path": "/tmp/fw-cdp-ccztb2ma/session/holder.json", "sha256": "f620682e0b76e76cd7bcbbd245602b270f3cfaf8bf67e6099568bbab285053fc", "mtime_ns": 1793473422811292662, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 12224, "start": "1793473422.01", "nonce": {"redacted_nonce_sha256": "fc66bdf21f85d7722318cc834e7ac1ffdff969914ea5bbdb1520052a0c3a2625"}, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "socket": "/tmp/fw-cdp-ccztb2ma/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6990.317665812, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12339, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6990.397823541, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12339, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6990.397938481, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12339, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6990.398170956, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12339, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "1fb34bfc47bbed92ce3370378c68ec29e053c9686f7e82b03e8bd5c397755483", "bytes": 5153, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "operations": [{"id": "op_a35e23ee173b", "task": "cdp_c58b34493d2d402b83d0b6470849dc04", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"E760F86D3CBEF6F6128A42256046E860\",\"pid\":12226,\"start\":\"1793473422.09\",\"target\":\"55B82AC0FDAB80DDC603B8F810C3B3D1\"}", "observation": "c76950cf54ab:1", "target": "7", "move": "click", "args": {"ref": "c76950cf54ab:1", "route": "dom_event_native_button"}, "request_digest": "858b39a944326b0804db214a3898d7638752153082c3a1a965a43f0d9064b2d1", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "E760F86D3CBEF6F6128A42256046E860", "cdp_session": "A2B4CEBF7F0F06DA7E8C7792181EAD2C", "document_token": "e4729bdd6ccfe74499f03b1ecdc8429a", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'});let t=Date.now()+1200;while(Date.now()=3.11,<4.0", + "python_compatible": true, + "interpreter": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", + "architecture": "x86_64", + "distribution": { + "version": "0.0.1", + "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages" + }, + "loaded_modules": { + "jevdual": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/__init__.py", + "jevdual.capability.setup": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py" + } + }, + "dependencies": { + "browser-use": { + "version": null, + "requirement": "==0.13.14", + "compatible": false, + "location": null + }, + "typesafe-sdk": { + "version": null, + "requirement": "<1,>=0.7", + "compatible": false, + "location": null + }, + "orjson": { + "version": null, + "requirement": ">=3.10", + "compatible": false, + "location": null + }, + "psutil": { + "version": "7.2.2", + "requirement": "==7.2.2", + "compatible": true, + "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages" + }, + "websockets": { + "version": "15.0.1", + "requirement": "==15.0.1", + "compatible": true, + "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages" + }, + "mcp": { + "version": null, + "requirement": "==2.1.1", + "compatible": false, + "location": null + }, + "packaging": { + "version": "26.3", + "requirement": "<27,>=25", + "compatible": true, + "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages" + }, + "cua-driver": { + "version": null, + "requirement": "==0.38.0+footwork.d5373879.cleanup2", + "compatible": false, + "location": null + }, + "jeepney": { + "version": null, + "requirement": "==0.9.0", + "compatible": false, + "location": null + } + }, + "dependency_status": "blocked", + "permissions": { + "accessibility": "not_checked", + "screen_recording": "not_checked", + "session": { + "x11_display_present": false, + "dbus_session_present": false, + "wayland_display_present": false, + "connection": "not_checked" + }, + "requirements": [ + "An accessible X11 display and D-Bus desktop session.", + "AT-SPI accessibility access to the explicitly bound process and window.", + "Live observation and exact text readback before input; environment presence grants no access." + ] + }, + "scope": "not_checked", + "journal": "not_checked", + "warnings": [ + "Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified." + ], + "dependency_metadata": "installed distribution", + "limitation": "Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.", + "runtime_qualification": "not_checked", + "provider_account_required": false, + "rust_toolchain_required": false, + "blockers": [ + "dependency_missing", + "accessibility_not_checked", + "x11_display_not_configured", + "session_bus_not_configured" + ], + "prerequisite_status": "blocked", + "qualification": "Prerequisites only. Window identity, current state, effects and job completion require separate checks.", + "acceleration": { + "component": "jevdual._core", + "available": false, + "status": "disabled", + "backend": "pure-python", + "scope": "Optional Jev Rust hot paths; independent of the CUA native driver" + }, + "host_prerequisites": { + "schema_version": 1, + "platform": "linux", + "architecture": "x86_64", + "kernel": "6.18.57", + "libc": "glibc 2.41", + "distribution": { + "PRETTY_NAME": "Debian GNU/Linux 13 (trixie)", + "VERSION_ID": "13", + "ID": "debian" + }, + "python": { + "version": "3.12.14", + "pip_module": false, + "venv_module": true, + "ensurepip_module": true + }, + "resources": { + "memory": { + "total_bytes": 18882662400, + "available_bytes": 17956298752 + }, + "cgroup": { + "versions": [ + 2 + ], + "membership_readable": true, + "memory_limit_bytes": 17179869184, + "memory_remaining_bytes": 15954898944, + "cpu_quota_cores": 4.0, + "scope": "visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified", + "null_limit_meaning": "no finite limit observed, not proof of unlimited resources", + "pids_limit": null, + "pids_remaining_upper_bound": null, + "swap_limit_bytes": null, + "memory_and_swap_limit_bytes": null, + "task_swap_event_snapshots": [ + { + "path": ".", + "pids_limit": null, + "pids_current": 56, + "pids_events": { + "max": 0 + }, + "swap_limit_bytes": null, + "swap_current_bytes": 0, + "swap_events": { + "high": 0, + "max": 0, + "fail": 0 + }, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "memory_failcnt": null, + "memory_and_swap_failcnt": null + } + ], + "counter_scope": "bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown" + }, + "available_memory_upper_bound_bytes": 15954898944, + "cpu_count": 5, + "cpu_affinity_count": 5 + }, + "process_supervision": { + "pid1_comm": "tail", + "self_parent_pid": 12216, + "pid1_is_self": false, + "orphan_reaping": "not_checked", + "wait_ownership": "not_checked" + }, + "executables_present": { + "uv": true, + "pip": true, + "pip3": true, + "rustc": false, + "cargo": false, + "rustup": false, + "cc": true, + "clang": false, + "pkg-config": true, + "google-chrome": false, + "google-chrome-stable": false, + "chromium": true, + "chromium-browser": false, + "dbus-run-session": true, + "dbus-send": true, + "gdbus": true, + "Xvfb": false, + "node": true, + "ffmpeg": true, + "tesseract": true + }, + "session_indicators_present": { + "DISPLAY": false, + "WAYLAND_DISPLAY": false, + "DBUS_SESSION_BUS_ADDRESS": false, + "XDG_RUNTIME_DIR": false + }, + "prerequisite_candidates": { + "browser_executable": true, + "graphical_session_indicator": false, + "session_bus_indicator": false + }, + "runtime_qualification": "unverified", + "effect_verification": "not_asserted", + "limitations": [ + "Executable and environment presence do not establish connection, permissions, or driver support.", + "No browser, desktop, accessibility service, native CUA library, or provider was started or queried.", + "Resource values are a transient upper bound, not a reservation or build-capacity guarantee.", + "Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control." + ] + }, + "tool_families": [ + { + "name": "camera", + "commands": [ + "doctor", + "capture", + "status" + ], + "status": "available", + "prerequisites": [ + "ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment" + }, + { + "name": "inbox", + "commands": [ + "prepare", + "accept", + "status" + ], + "status": "available", + "prerequisites": [ + "explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment" + }, + { + "name": "workbench", + "commands": [ + "link", + "status", + "list" + ], + "status": "available", + "prerequisites": [], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes" + }, + { + "name": "workcell", + "commands": [ + "agent-bench", + "app-handoff", + "bench", + "bench-operator", + "bench-runner", + "body", + "body-network", + "controller", + "episode", + "image-guided", + "measurement", + "network-bench-operator", + "order-app", + "qualify-bench", + "qualify-network-body", + "qualify-network-workbench", + "qualify-order-handoff", + "qualify-workbench-crashes", + "qualify-workbench-health", + "qualify-workbench-recovery", + "qualify-workbench-restarts", + "record-network-workbench", + "score-agent-bench", + "score-network-body", + "score-network-workbench", + "score-operator", + "score-workbench-crashes", + "score-workbench-health", + "score-workbench-recovery", + "score-workbench-restarts" + ], + "status": "optional_dependencies_missing", + "prerequisites": [ + "mujoco==3.15.0", + "numpy", + "headless rendering libraries for image operations", + "qualification commands require owned fixture inputs" + ], + "missing": [ + "mujoco", + "numpy" + ], + "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell", + "command_prerequisites": { + "record-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-order-handoff": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-agent-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-operator": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ] + } + }, + { + "name": "browser-inspection", + "commands": [ + "summarize", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-experiments", + "commands": [ + "compare", + "coverage", + "publication-gate", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-transport", + "commands": [ + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + } + ], + "browser_profiles": { + "cdp": { + "profile": "owned-headless-cdp", + "entrypoint": "footwork browser cdp", + "commands": [ + "start", + "look", + "click", + "status", + "recover", + "stop", + "guide" + ], + "requirements": [ + "Chrome", + "psutil", + "websockets", + "configured Jev or judgment adapter", + "absolute durable authority" + ], + "desktop_required": false, + "cua_required": false, + "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", + "prerequisite_presence": { + "chrome": true, + "psutil": true, + "websockets": true, + "jev_environment_configured": false, + "judgment_adapter": "explicit per-session configuration; not checked by offline doctor" + }, + "runtime_qualification": "not_checked" + }, + "legacy": { + "profile": "full-desktop", + "requires": [ + "CUA", + "X11/AT-SPI on Linux" + ] + } + }, + "profile_note": "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.", + "effect_verification": "not_asserted" + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"platform\": \"linux\", \"supported\": true, \"runtime\": {\"python_version\": \"3.12.14\", \"python_requirement\": \">=3.11,<4.0\", \"python_compatible\": true, \"interpreter\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python\", \"architecture\": \"x86_64\", \"distribution\": {\"version\": \"0.0.1\", \"location\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages\"}, \"loaded_modules\": {\"jevdual\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/__init__.py\", \"jevdual.capability.setup\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py\"}}, \"dependencies\": {\"browser-use\": {\"version\": null, \"requirement\": \"==0.13.14\", \"compatible\": false, \"location\": null}, \"typesafe-sdk\": {\"version\": null, \"requirement\": \"<1,>=0.7\", \"compatible\": false, \"location\": null}, \"orjson\": {\"version\": null, \"requirement\": \">=3.10\", \"compatible\": false, \"location\": null}, \"psutil\": {\"version\": \"7.2.2\", \"requirement\": \"==7.2.2\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages\"}, \"websockets\": {\"version\": \"15.0.1\", \"requirement\": \"==15.0.1\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages\"}, \"mcp\": {\"version\": null, \"requirement\": \"==2.1.1\", \"compatible\": false, \"location\": null}, \"packaging\": {\"version\": \"26.3\", \"requirement\": \"<27,>=25\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages\"}, \"cua-driver\": {\"version\": null, \"requirement\": \"==0.38.0+footwork.d5373879.cleanup2\", \"compatible\": false, \"location\": null}, \"jeepney\": {\"version\": null, \"requirement\": \"==0.9.0\", \"compatible\": false, \"location\": null}}, \"dependency_status\": \"blocked\", \"permissions\": {\"accessibility\": \"not_checked\", \"screen_recording\": \"not_checked\", \"session\": {\"x11_display_present\": false, \"dbus_session_present\": false, \"wayland_display_present\": false, \"connection\": \"not_checked\"}, \"requirements\": [\"An accessible X11 display and D-Bus desktop session.\", \"AT-SPI accessibility access to the explicitly bound process and window.\", \"Live observation and exact text readback before input; environment presence grants no access.\"]}, \"scope\": \"not_checked\", \"journal\": \"not_checked\", \"warnings\": [\"Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified.\"], \"dependency_metadata\": \"installed distribution\", \"limitation\": \"Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.\", \"runtime_qualification\": \"not_checked\", \"provider_account_required\": false, \"rust_toolchain_required\": false, \"blockers\": [\"dependency_missing\", \"accessibility_not_checked\", \"x11_display_not_configured\", \"session_bus_not_configured\"], \"prerequisite_status\": \"blocked\", \"qualification\": \"Prerequisites only. Window identity, current state, effects and job completion require separate checks.\", \"acceleration\": {\"component\": \"jevdual._core\", \"available\": false, \"status\": \"disabled\", \"backend\": \"pure-python\", \"scope\": \"Optional Jev Rust hot paths; independent of the CUA native driver\"}, \"host_prerequisites\": {\"schema_version\": 1, \"platform\": \"linux\", \"architecture\": \"x86_64\", \"kernel\": \"6.18.57\", \"libc\": \"glibc 2.41\", \"distribution\": {\"PRETTY_NAME\": \"Debian GNU/Linux 13 (trixie)\", \"VERSION_ID\": \"13\", \"ID\": \"debian\"}, \"python\": {\"version\": \"3.12.14\", \"pip_module\": false, \"venv_module\": true, \"ensurepip_module\": true}, \"resources\": {\"memory\": {\"total_bytes\": 18882662400, \"available_bytes\": 17956298752}, \"cgroup\": {\"versions\": [2], \"membership_readable\": true, \"memory_limit_bytes\": 17179869184, \"memory_remaining_bytes\": 15954898944, \"cpu_quota_cores\": 4.0, \"scope\": \"visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified\", \"null_limit_meaning\": \"no finite limit observed, not proof of unlimited resources\", \"pids_limit\": null, \"pids_remaining_upper_bound\": null, \"swap_limit_bytes\": null, \"memory_and_swap_limit_bytes\": null, \"task_swap_event_snapshots\": [{\"path\": \".\", \"pids_limit\": null, \"pids_current\": 56, \"pids_events\": {\"max\": 0}, \"swap_limit_bytes\": null, \"swap_current_bytes\": 0, \"swap_events\": {\"high\": 0, \"max\": 0, \"fail\": 0}, \"memory_events\": {\"low\": 0, \"high\": 0, \"max\": 0, \"oom\": 0, \"oom_kill\": 0, \"oom_group_kill\": 0}, \"memory_failcnt\": null, \"memory_and_swap_failcnt\": null}], \"counter_scope\": \"bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown\"}, \"available_memory_upper_bound_bytes\": 15954898944, \"cpu_count\": 5, \"cpu_affinity_count\": 5}, \"process_supervision\": {\"pid1_comm\": \"tail\", \"self_parent_pid\": 12216, \"pid1_is_self\": false, \"orphan_reaping\": \"not_checked\", \"wait_ownership\": \"not_checked\"}, \"executables_present\": {\"uv\": true, \"pip\": true, \"pip3\": true, \"rustc\": false, \"cargo\": false, \"rustup\": false, \"cc\": true, \"clang\": false, \"pkg-config\": true, \"google-chrome\": false, \"google-chrome-stable\": false, \"chromium\": true, \"chromium-browser\": false, \"dbus-run-session\": true, \"dbus-send\": true, \"gdbus\": true, \"Xvfb\": false, \"node\": true, \"ffmpeg\": true, \"tesseract\": true}, \"session_indicators_present\": {\"DISPLAY\": false, \"WAYLAND_DISPLAY\": false, \"DBUS_SESSION_BUS_ADDRESS\": false, \"XDG_RUNTIME_DIR\": false}, \"prerequisite_candidates\": {\"browser_executable\": true, \"graphical_session_indicator\": false, \"session_bus_indicator\": false}, \"runtime_qualification\": \"unverified\", \"effect_verification\": \"not_asserted\", \"limitations\": [\"Executable and environment presence do not establish connection, permissions, or driver support.\", \"No browser, desktop, accessibility service, native CUA library, or provider was started or queried.\", \"Resource values are a transient upper bound, not a reservation or build-capacity guarantee.\", \"Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control.\"]}, \"tool_families\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"browser_profiles\": {\"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"prerequisite_presence\": {\"chrome\": true, \"psutil\": true, \"websockets\": true, \"jev_environment_configured\": false, \"judgment_adapter\": \"explicit per-session configuration; not checked by offline doctor\"}, \"runtime_qualification\": \"not_checked\"}, \"legacy\": {\"profile\": \"full-desktop\", \"requires\": [\"CUA\", \"X11/AT-SPI on Linux\"]}}, \"profile_note\": \"Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.\", \"effect_verification\": \"not_asserted\"}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/guide.json b/jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/guide.json new file mode 100644 index 0000000..4d71f18 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/guide.json @@ -0,0 +1,89 @@ +{ + "kind": "communicate", + "monotonic": 6987.881841175, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 4, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 12220, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", + "--json", + "browser", + "cdp", + "guide" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "80c96660aef007556c2ec3c0eb530adb54b7f3aa985c13592e59e8f0fcaa4cf6", + "bytes": 2717, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "package_version": "0.0.1", + "profile": "owned-headless-cdp", + "entrypoint": "footwork browser cdp", + "commands": [ + "start", + "look", + "click", + "status", + "recover", + "stop", + "guide" + ], + "requirements": [ + "Chrome", + "psutil", + "websockets", + "configured Jev or judgment adapter", + "absolute durable authority" + ], + "desktop_required": false, + "cua_required": false, + "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", + "loop": [ + "start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", + "look --session DIR; choose the exact opaque ref returned by this holder", + "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", + "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", + "recover --session DIR after holder loss: read-only recovery; no browser is launched", + "stop --session DIR; retain the authority database and all unresolved operations" + ], + "guard_adapter": { + "configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", + "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", + "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", + "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses" + }, + "limits": [ + "An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", + "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", + "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", + "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", + "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", + "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol." + ] + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"package_version\": \"0.0.1\", \"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"loop\": [\"start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL\", \"look --session DIR; choose the exact opaque ref returned by this holder\", \"click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence\", \"status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record\", \"recover --session DIR after holder loss: read-only recovery; no browser is launched\", \"stop --session DIR; retain the authority database and all unresolved operations\"], \"guard_adapter\": {\"configuration\": \"--guard-command FILE containing JSON argv, absolute executable first; trusted policy code\", \"stdin\": \"footwork.browser.guard.request v1: digest, task, targets, url, title, binding\", \"stdout\": \"{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}\", \"semantics\": \"same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses\"}, \"limits\": [\"An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.\", \"This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.\", \"A new token cannot clear an unresolved admission, even across sessions sharing this authority database.\", \"No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.\", \"The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.\", \"Initial URL loading can itself have website effects; it is setup outside the guarded click protocol.\"]}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/schema.json b/jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/schema.json new file mode 100644 index 0000000..13f18c8 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/schema.json @@ -0,0 +1,94 @@ +{ + "kind": "communicate", + "monotonic": 6987.801671694, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 3, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 12219, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", + "--json", + "schema", + "browser", + "cdp", + "click" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "fdbc924797411335b521ae523b209cbb14ab8ff17b3d6415d69ea2e1f87eb6c2", + "bytes": 845, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "command": [ + "browser", + "cdp", + "click" + ], + "arguments": [ + { + "name": "help", + "flags": [ + "-h", + "--help" + ], + "required": false, + "nargs": 0, + "choices": null, + "help": "show this help message and exit", + "default": "==SUPPRESS==" + }, + { + "name": "session", + "flags": [ + "--session" + ], + "required": true, + "nargs": null, + "choices": null, + "help": null, + "default": null + }, + { + "name": "ref", + "flags": [ + "--ref" + ], + "required": true, + "nargs": null, + "choices": null, + "help": "opaque ref from the last look; never reselected by label", + "default": null + }, + { + "name": "token", + "flags": [ + "--token" + ], + "required": true, + "nargs": null, + "choices": null, + "help": "stable token for this intended activation", + "default": null + } + ], + "subcommands": [] + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"command\": [\"browser\", \"cdp\", \"click\"], \"arguments\": [{\"name\": \"help\", \"flags\": [\"-h\", \"--help\"], \"required\": false, \"nargs\": 0, \"choices\": null, \"help\": \"show this help message and exit\", \"default\": \"==SUPPRESS==\"}, {\"name\": \"session\", \"flags\": [\"--session\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": null, \"default\": null}, {\"name\": \"ref\", \"flags\": [\"--ref\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"opaque ref from the last look; never reselected by label\", \"default\": null}, {\"name\": \"token\", \"flags\": [\"--token\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"stable token for this intended activation\", \"default\": null}], \"subcommands\": []}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/tools.json b/jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/tools.json new file mode 100644 index 0000000..03f520c --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/3484b03/discovery/tools.json @@ -0,0 +1,335 @@ +{ + "kind": "communicate", + "monotonic": 6987.579885125, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 1, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 12217, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", + "--json", + "tools" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "3a61ee62c1fd4294d348d704cb02c4a7275e31bd39ea73a542cce6d7680e7381", + "bytes": 6642, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "schema_version": "1", + "entrypoint": "footwork", + "global_options": { + "--json": "Prefix before the command; preserves exit status and does not certify effects" + }, + "commands": [ + "run", + "menu", + "apps", + "start", + "look", + "inspect-target", + "visual-check", + "do", + "s1", + "done", + "read", + "check-file", + "check-artifact", + "grant", + "snapshot-file", + "status" + ], + "agent_commands": [ + "tools", + "catalog", + "schema", + "doctor", + "invoke", + "capability", + "mcp", + "tool" + ], + "surfaces": { + "browser": { + "commands": [ + "start", + "check-file", + "do", + "done", + "grant", + "inspect-target", + "look", + "read", + "s1", + "snapshot-file", + "status", + "visual-check", + "cdp" + ], + "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", + "cdp": { + "profile": "owned-headless-cdp", + "entrypoint": "footwork browser cdp", + "commands": [ + "start", + "look", + "click", + "status", + "recover", + "stop", + "guide" + ], + "requirements": [ + "Chrome", + "psutil", + "websockets", + "configured Jev or judgment adapter", + "absolute durable authority" + ], + "desktop_required": false, + "cua_required": false, + "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user" + } + }, + "desktop": { + "commands": [ + "run", + "menu", + "apps", + "start", + "look", + "inspect-target", + "visual-check", + "do", + "s1", + "done", + "read", + "check-file", + "check-artifact", + "grant", + "snapshot-file", + "status" + ], + "route": "native Linux X11/AT-SPI; live target binding required" + } + }, + "capability": { + "commands": [ + "doctor", + "config", + "server", + "report" + ], + "scope": "one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified" + }, + "tools": [ + { + "name": "camera", + "commands": [ + "doctor", + "capture", + "status" + ], + "status": "available", + "prerequisites": [ + "ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment" + }, + { + "name": "inbox", + "commands": [ + "prepare", + "accept", + "status" + ], + "status": "available", + "prerequisites": [ + "explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment" + }, + { + "name": "workbench", + "commands": [ + "link", + "status", + "list" + ], + "status": "available", + "prerequisites": [], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes" + }, + { + "name": "workcell", + "commands": [ + "agent-bench", + "app-handoff", + "bench", + "bench-operator", + "bench-runner", + "body", + "body-network", + "controller", + "episode", + "image-guided", + "measurement", + "network-bench-operator", + "order-app", + "qualify-bench", + "qualify-network-body", + "qualify-network-workbench", + "qualify-order-handoff", + "qualify-workbench-crashes", + "qualify-workbench-health", + "qualify-workbench-recovery", + "qualify-workbench-restarts", + "record-network-workbench", + "score-agent-bench", + "score-network-body", + "score-network-workbench", + "score-operator", + "score-workbench-crashes", + "score-workbench-health", + "score-workbench-recovery", + "score-workbench-restarts" + ], + "status": "optional_dependencies_missing", + "prerequisites": [ + "mujoco==3.15.0", + "numpy", + "headless rendering libraries for image operations", + "qualification commands require owned fixture inputs" + ], + "missing": [ + "mujoco", + "numpy" + ], + "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell", + "command_prerequisites": { + "record-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-order-handoff": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-agent-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-operator": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ] + } + }, + { + "name": "browser-inspection", + "commands": [ + "summarize", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-experiments", + "commands": [ + "compare", + "coverage", + "publication-gate", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-transport", + "commands": [ + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + } + ], + "effect_semantics": "Read action receipts and resource-bound readback; exit 0 alone is not completion proof" + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"schema_version\": \"1\", \"entrypoint\": \"footwork\", \"global_options\": {\"--json\": \"Prefix before the command; preserves exit status and does not certify effects\"}, \"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"agent_commands\": [\"tools\", \"catalog\", \"schema\", \"doctor\", \"invoke\", \"capability\", \"mcp\", \"tool\"], \"surfaces\": {\"browser\": {\"commands\": [\"start\", \"check-file\", \"do\", \"done\", \"grant\", \"inspect-target\", \"look\", \"read\", \"s1\", \"snapshot-file\", \"status\", \"visual-check\", \"cdp\"], \"route\": \"dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)\", \"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}}, \"desktop\": {\"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"route\": \"native Linux X11/AT-SPI; live target binding required\"}}, \"capability\": {\"commands\": [\"doctor\", \"config\", \"server\", \"report\"], \"scope\": \"one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified\"}, \"tools\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"effect_semantics\": \"Read action receipts and resource-bound readback; exit 0 alone is not completion proof\"}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/3484b03/environment.json b/jevdual/results/durable-cdp-vm-20261031/3484b03/environment.json new file mode 100644 index 0000000..5a693c5 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/3484b03/environment.json @@ -0,0 +1,119 @@ +{ + "utc_started": "2026-10-31T19:03:40.996163+00:00", + "baseline_source": "3484b03b2c6c639f4d896317fc765d2267a6fe98", + "measurement_commit": "3484b03b2c6c639f4d896317fc765d2267a6fe98", + "evidence_commit": "eaba616cee07921cc8a4c63b632fd9e452650169", + "receipt_helpers_sha256": { + "receipt_plugin.py": "beece1b7042b449af48b533c6a984fe2e899c7017825d830f2d84a445391e9df", + "pytest_main.py": "c23cefeb8fb2cf19f48946a23cd1cb66606953798057a99d3e5ba34d20ac5c27" + }, + "harness_sha256": "9acc47e71e957cf749c729b6a2fe7886f9f993537e3e301d4110edbb0849f9e0", + "wheel": { + "name": "jevdual-0.0.1-py3-none-any.whl", + "sha256": "8042e0f94dfcde08d285685744225a48f007bd7b08e1a20147e8660ec4861384" + }, + "test_sha256": { + "test_cdp_effector.py": "d3d4a2f689c8f0dae42a8a74656b24457f45acd0305f2614868cdd2716ba39b2", + "test_cdp_transport_deadline.py": "c4d10e3605598345b9cdee54ecdd3b4b749c0aefdeb05f675c1bab2f40f68594", + "test_cdp_launch_custody.py": "266544670851452c2c034443bec4abd8fff5815f0b4a2da87342ae7eb3546777", + "test_cdp_click.py": "0c004967776609b3151bc7321f2c0ed96c6e437f12e5ea8311996298c454b7e7", + "test_cdp_click_contract.py": "34c07ad6dbd0eb5764b212d5ca072f81ebd3561bd5844569a3d1b98f02d0e0a1", + "test_browser_durable_authority.py": "9f2323333ecda0585431f16932afb331b42d3de827a396cceaf94a7a843e9b1a", + "test_browser_holder.py": "a826cd8eba5c397a4b10a086f71f8269d465acab26371f5c8067c7dc5572725c", + "test_browser_guard.py": "464a1180f1953495813fb7230a0849026d901125eb8054275c72f039191aff6d", + "test_browser_cdp_cli.py": "6818b7807c65ae64c067a94522558e2bbb4788b91b6c76e957725778a2d11b54", + "test_browser_restart_cli.py": "08368a52eadf7aa3645641a5bbf616eef53b4f71bfe5acd4da70bbb194ac1995", + "test_browser_startup_cli.py": "5010f823a9710ea69bc89e3c53fe61a9ea4ee1f28420c7551b948ac6768b7e84", + "test_browser_startup_lifecycle.py": "330232c60a1e56ae657744dc82ab3e7d2efadf6e3771981052c2018fcf4b97bf" + }, + "verified_installed_package_files": 206, + "origins": { + "jevdual": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/__init__.py", + "operations": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/effectors/cdp/operations.py", + "python": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", + "prefix": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer", + "sys_path": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python312.zip", + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12", + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/lib-dynload", + "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages" + ] + }, + "packages": { + "Pygments": "2.21.0", + "jevdual": "0.0.1", + "psutil": "7.2.2", + "pytest": "8.4.2", + "pluggy": "1.7.0", + "websockets": "15.0.1", + "packaging": "26.3", + "iniconfig": "2.3.1" + }, + "optional_backends": { + "cua_driver": false, + "browser_use": false + }, + "python": "3.12.14 (main, Aug 25 2026, 14:00:49) [Clang 22.1.3 ]", + "os_release": "PRETTY_NAME=\"Debian GNU/Linux 13 (trixie)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"13\"\nVERSION=\"13 (trixie)\"\nVERSION_CODENAME=trixie\nDEBIAN_VERSION_FULL=13.6\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"", + "kernel": { + "system": "Linux", + "release": "6.18.57", + "machine": "x86_64" + }, + "chrome": { + "executable": "/usr/lib/chromium/chromium", + "sha256": "4dc9f9f9b20e9bd95bf201f43d2d643f48938f36a70ddcb6fce3dd611a178180", + "version": "Chromium 154.0.8037.57", + "sandbox_override": false + }, + "cgroup_membership": "0::/", + "cgroup": { + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-4", + "memory.max": "17179869184", + "memory.swap.max": "max", + "pids.max": "max", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0", + "pids.events": "max 0" + }, + "affinity": [ + 0, + 1, + 2, + 3, + 4 + ], + "uid": 1000, + "rlimits": { + "RLIMIT_CORE": [ + 0, + -1 + ], + "RLIMIT_NPROC": [ + 71955, + 71955 + ], + "RLIMIT_NOFILE": [ + 16384, + 16384 + ], + "RLIMIT_AS": [ + -1, + -1 + ] + }, + "kernel_policy": { + "/proc/sys/kernel/unprivileged_userns_clone": { + "unavailable": "FileNotFoundError" + }, + "/proc/sys/user/max_user_namespaces": "71955", + "/proc/sys/kernel/core_pattern": { + "unavailable": "FileNotFoundError" + } + }, + "pid1": "tail", + "test_wrapper_subreaper": true, + "watchdog_seconds": 600, + "cleanup_grace_seconds": 3, + "scope": "explicit durable CDP CLI and holder; typing/completion oracle/light metadata split remain off" +} diff --git a/jevdual/results/durable-cdp-vm-20261031/3484b03/inspected-summary.json b/jevdual/results/durable-cdp-vm-20261031/3484b03/inspected-summary.json new file mode 100644 index 0000000..698e8e2 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/3484b03/inspected-summary.json @@ -0,0 +1,255 @@ +{ + "source": "3484b03b2c6c639f4d896317fc765d2267a6fe98", + "wheel_sha256": "8042e0f94dfcde08d285685744225a48f007bd7b08e1a20147e8660ec4861384", + "total": 199, + "passed": 199, + "failed": 0, + "skipped": 0, + "by_module": { + "test_browser_cdp_cli": 3, + "test_browser_durable_authority": 49, + "test_browser_guard": 6, + "test_browser_holder": 18, + "test_browser_restart_cli": 3, + "test_browser_startup_cli": 3, + "test_browser_startup_lifecycle": 6, + "test_cdp_click": 30, + "test_cdp_click_contract": 33, + "test_cdp_effector": 17, + "test_cdp_launch_custody": 10, + "test_cdp_transport_deadline": 21 + }, + "cells": { + "client-lost-ack": { + "fixture_records": [ + [ + "intended" + ] + ], + "markers": [], + "helper_receipts": 9, + "startup_reports": [] + }, + "missing-guard": { + "fixture_records": [ + [] + ], + "markers": [], + "helper_receipts": 5, + "startup_reports": [] + }, + "prepared": { + "fixture_records": [ + [] + ], + "markers": [ + { + "boundary": "prepared", + "operation_id": "op_a74ffb7c639d", + "ingress_before_exit": null, + "heavy_imports": [] + } + ], + "helper_receipts": 7, + "startup_reports": [] + }, + "started": { + "fixture_records": [ + [] + ], + "markers": [ + { + "boundary": "started", + "operation_id": "op_b98530032630", + "ingress_before_exit": null, + "heavy_imports": [] + } + ], + "helper_receipts": 8, + "startup_reports": [] + }, + "retained": { + "fixture_records": [ + [ + "intended" + ] + ], + "markers": [ + { + "boundary": "retained", + "operation_id": "op_fd28402ec2b4", + "ingress_before_exit": 1, + "heavy_imports": [] + } + ], + "helper_receipts": 8, + "startup_reports": [] + }, + "startup-launch-15": { + "fixture_records": [], + "markers": [ + { + "phase": "launch", + "pid": 12863, + "start": 1793473449.7, + "captured": { + "12863": 1793473449.7, + "12870": 1793473449.73, + "12872": 1793473449.73, + "12897": 1793473449.78, + "12874": 1793473449.76, + "12920": 1793473449.82, + "12895": 1793473449.77 + } + } + ], + "helper_receipts": 0, + "startup_reports": [ + { + "phase": "launch", + "test_subreaper": true, + "holder_exit": 0, + "live_before_test_cleanup": [], + "holder_published": false, + "chrome_pid": 12863, + "captured_count": 10, + "zombies_before_test_reap": [ + 12865, + 12869, + 12870, + 12895, + 12897 + ], + "test_reaped": 5, + "live_after_test_cleanup": [] + } + ] + }, + "startup-launch-2": { + "fixture_records": [], + "markers": [ + { + "phase": "launch", + "pid": 12978, + "start": 1793473451.6, + "captured": { + "12978": 1793473451.6, + "12986": 1793473451.64, + "12987": 1793473451.64, + "13018": 1793473451.71, + "12989": 1793473451.68, + "13034": 1793473451.77, + "13009": 1793473451.7 + } + } + ], + "helper_receipts": 0, + "startup_reports": [ + { + "phase": "launch", + "test_subreaper": true, + "holder_exit": 0, + "live_before_test_cleanup": [], + "holder_published": false, + "chrome_pid": 12978, + "captured_count": 10, + "zombies_before_test_reap": [ + 12980, + 12982, + 12986, + 13009, + 13018 + ], + "test_reaped": 5, + "live_after_test_cleanup": [] + } + ] + }, + "startup-connect-15": { + "fixture_records": [], + "markers": [ + { + "phase": "connect", + "pid": 13085, + "start": 1793473453.47, + "captured": { + "13085": 1793473453.47, + "13093": 1793473453.51, + "13094": 1793473453.51, + "13118": 1793473453.58, + "13096": 1793473453.56, + "13132": 1793473453.62, + "13159": 1793473453.67, + "13168": 1793473453.71, + "13169": 1793473453.71, + "13114": 1793473453.58 + } + } + ], + "helper_receipts": 0, + "startup_reports": [ + { + "phase": "connect", + "test_subreaper": true, + "holder_exit": 0, + "live_before_test_cleanup": [], + "holder_published": false, + "chrome_pid": 13085, + "captured_count": 13, + "zombies_before_test_reap": [ + 13087, + 13091, + 13093, + 13118, + 13114 + ], + "test_reaped": 5, + "live_after_test_cleanup": [] + } + ] + }, + "startup-navigate-15": { + "fixture_records": [], + "markers": [ + { + "phase": "navigate", + "pid": 13196, + "start": 1793473453.94, + "captured": { + "13196": 1793473453.94, + "13204": 1793473453.98, + "13205": 1793473453.98, + "13231": 1793473454.03, + "13207": 1793473454.01, + "13255": 1793473454.08, + "13268": 1793473454.13, + "13277": 1793473454.15, + "13278": 1793473454.16, + "13228": 1793473454.02 + } + } + ], + "helper_receipts": 0, + "startup_reports": [ + { + "phase": "navigate", + "test_subreaper": true, + "holder_exit": 0, + "live_before_test_cleanup": [], + "holder_published": false, + "chrome_pid": 13196, + "captured_count": 14, + "zombies_before_test_reap": [ + 13198, + 13201, + 13204, + 13228, + 13231 + ], + "test_reaped": 5, + "live_after_test_cleanup": [] + } + ] + } + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/3484b03/junit.xml b/jevdual/results/durable-cdp-vm-20261031/3484b03/junit.xml new file mode 100644 index 0000000..fca05cf --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/3484b03/junit.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/jevdual/results/durable-cdp-vm-20261031/3484b03/observer.jsonl b/jevdual/results/durable-cdp-vm-20261031/3484b03/observer.jsonl new file mode 100644 index 0000000..56b5d64 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/3484b03/observer.jsonl @@ -0,0 +1,993 @@ +{"kind": "pytest_report", "monotonic": 6987.504683718, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "phase": "setup", "outcome": "passed", "duration": 0.00012623700058611576, "longrepr": null} +{"kind": "spawn", "monotonic": 6987.505631893, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12217, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6987.579459534, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12217, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6987.579560604, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12217, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6987.579885125, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12217, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "3a61ee62c1fd4294d348d704cb02c4a7275e31bd39ea73a542cce6d7680e7381", "bytes": 6642, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"schema_version": "1", "entrypoint": "footwork", "global_options": {"--json": "Prefix before the command; preserves exit status and does not certify effects"}, "commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "agent_commands": ["tools", "catalog", "schema", "doctor", "invoke", "capability", "mcp", "tool"], "surfaces": {"browser": {"commands": ["start", "check-file", "do", "done", "grant", "inspect-target", "look", "read", "s1", "snapshot-file", "status", "visual-check", "cdp"], "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", "cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}}, "desktop": {"commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "route": "native Linux X11/AT-SPI; live target binding required"}}, "capability": {"commands": ["doctor", "config", "server", "report"], "scope": "one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified"}, "tools": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "effect_semantics": "Read action receipts and resource-bound readback; exit 0 alone is not completion proof"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"schema_version\": \"1\", \"entrypoint\": \"footwork\", \"global_options\": {\"--json\": \"Prefix before the command; preserves exit status and does not certify effects\"}, \"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"agent_commands\": [\"tools\", \"catalog\", \"schema\", \"doctor\", \"invoke\", \"capability\", \"mcp\", \"tool\"], \"surfaces\": {\"browser\": {\"commands\": [\"start\", \"check-file\", \"do\", \"done\", \"grant\", \"inspect-target\", \"look\", \"read\", \"s1\", \"snapshot-file\", \"status\", \"visual-check\", \"cdp\"], \"route\": \"dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)\", \"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}}, \"desktop\": {\"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"route\": \"native Linux X11/AT-SPI; live target binding required\"}}, \"capability\": {\"commands\": [\"doctor\", \"config\", \"server\", \"report\"], \"scope\": \"one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified\"}, \"tools\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"effect_semantics\": \"Read action receipts and resource-bound readback; exit 0 alone is not completion proof\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6987.580086563, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12217, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6987.580175035, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["tools"], "result": {"schema_version": "1", "entrypoint": "footwork", "global_options": {"--json": "Prefix before the command; preserves exit status and does not certify effects"}, "commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "agent_commands": ["tools", "catalog", "schema", "doctor", "invoke", "capability", "mcp", "tool"], "surfaces": {"browser": {"commands": ["start", "check-file", "do", "done", "grant", "inspect-target", "look", "read", "s1", "snapshot-file", "status", "visual-check", "cdp"], "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", "cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}}, "desktop": {"commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "route": "native Linux X11/AT-SPI; live target binding required"}}, "capability": {"commands": ["doctor", "config", "server", "report"], "scope": "one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified"}, "tools": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "effect_semantics": "Read action receipts and resource-bound readback; exit 0 alone is not completion proof"}} +{"kind": "spawn", "monotonic": 6987.580814452, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12218, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6987.727416163, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12218, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6987.727522851, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12218, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6987.728499899, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12218, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "33588b623681d298c369e0bd56d285c573db0ff35e0d4cc8aaa2f999ceedae15", "bytes": 12093, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"platform": "linux", "supported": true, "runtime": {"python_version": "3.12.14", "python_requirement": ">=3.11,<4.0", "python_compatible": true, "interpreter": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "architecture": "x86_64", "distribution": {"version": "0.0.1", "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages"}, "loaded_modules": {"jevdual": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/__init__.py", "jevdual.capability.setup": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py"}}, "dependencies": {"browser-use": {"version": null, "requirement": "==0.13.14", "compatible": false, "location": null}, "typesafe-sdk": {"version": null, "requirement": "<1,>=0.7", "compatible": false, "location": null}, "orjson": {"version": null, "requirement": ">=3.10", "compatible": false, "location": null}, "psutil": {"version": "7.2.2", "requirement": "==7.2.2", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages"}, "websockets": {"version": "15.0.1", "requirement": "==15.0.1", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages"}, "mcp": {"version": null, "requirement": "==2.1.1", "compatible": false, "location": null}, "packaging": {"version": "26.3", "requirement": "<27,>=25", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages"}, "cua-driver": {"version": null, "requirement": "==0.38.0+footwork.d5373879.cleanup2", "compatible": false, "location": null}, "jeepney": {"version": null, "requirement": "==0.9.0", "compatible": false, "location": null}}, "dependency_status": "blocked", "permissions": {"accessibility": "not_checked", "screen_recording": "not_checked", "session": {"x11_display_present": false, "dbus_session_present": false, "wayland_display_present": false, "connection": "not_checked"}, "requirements": ["An accessible X11 display and D-Bus desktop session.", "AT-SPI accessibility access to the explicitly bound process and window.", "Live observation and exact text readback before input; environment presence grants no access."]}, "scope": "not_checked", "journal": "not_checked", "warnings": ["Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified."], "dependency_metadata": "installed distribution", "limitation": "Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.", "runtime_qualification": "not_checked", "provider_account_required": false, "rust_toolchain_required": false, "blockers": ["dependency_missing", "accessibility_not_checked", "x11_display_not_configured", "session_bus_not_configured"], "prerequisite_status": "blocked", "qualification": "Prerequisites only. Window identity, current state, effects and job completion require separate checks.", "acceleration": {"component": "jevdual._core", "available": false, "status": "disabled", "backend": "pure-python", "scope": "Optional Jev Rust hot paths; independent of the CUA native driver"}, "host_prerequisites": {"schema_version": 1, "platform": "linux", "architecture": "x86_64", "kernel": "6.18.57", "libc": "glibc 2.41", "distribution": {"PRETTY_NAME": "Debian GNU/Linux 13 (trixie)", "VERSION_ID": "13", "ID": "debian"}, "python": {"version": "3.12.14", "pip_module": false, "venv_module": true, "ensurepip_module": true}, "resources": {"memory": {"total_bytes": 18882662400, "available_bytes": 17956298752}, "cgroup": {"versions": [2], "membership_readable": true, "memory_limit_bytes": 17179869184, "memory_remaining_bytes": 15954898944, "cpu_quota_cores": 4.0, "scope": "visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified", "null_limit_meaning": "no finite limit observed, not proof of unlimited resources", "pids_limit": null, "pids_remaining_upper_bound": null, "swap_limit_bytes": null, "memory_and_swap_limit_bytes": null, "task_swap_event_snapshots": [{"path": ".", "pids_limit": null, "pids_current": 56, "pids_events": {"max": 0}, "swap_limit_bytes": null, "swap_current_bytes": 0, "swap_events": {"high": 0, "max": 0, "fail": 0}, "memory_events": {"low": 0, "high": 0, "max": 0, "oom": 0, "oom_kill": 0, "oom_group_kill": 0}, "memory_failcnt": null, "memory_and_swap_failcnt": null}], "counter_scope": "bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown"}, "available_memory_upper_bound_bytes": 15954898944, "cpu_count": 5, "cpu_affinity_count": 5}, "process_supervision": {"pid1_comm": "tail", "self_parent_pid": 12216, "pid1_is_self": false, "orphan_reaping": "not_checked", "wait_ownership": "not_checked"}, "executables_present": {"uv": true, "pip": true, "pip3": true, "rustc": false, "cargo": false, "rustup": false, "cc": true, "clang": false, "pkg-config": true, "google-chrome": false, "google-chrome-stable": false, "chromium": true, "chromium-browser": false, "dbus-run-session": true, "dbus-send": true, "gdbus": true, "Xvfb": false, "node": true, "ffmpeg": true, "tesseract": true}, "session_indicators_present": {"DISPLAY": false, "WAYLAND_DISPLAY": false, "DBUS_SESSION_BUS_ADDRESS": false, "XDG_RUNTIME_DIR": false}, "prerequisite_candidates": {"browser_executable": true, "graphical_session_indicator": false, "session_bus_indicator": false}, "runtime_qualification": "unverified", "effect_verification": "not_asserted", "limitations": ["Executable and environment presence do not establish connection, permissions, or driver support.", "No browser, desktop, accessibility service, native CUA library, or provider was started or queried.", "Resource values are a transient upper bound, not a reservation or build-capacity guarantee.", "Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control."]}, "tool_families": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "browser_profiles": {"cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "prerequisite_presence": {"chrome": true, "psutil": true, "websockets": true, "jev_environment_configured": false, "judgment_adapter": "explicit per-session configuration; not checked by offline doctor"}, "runtime_qualification": "not_checked"}, "legacy": {"profile": "full-desktop", "requires": ["CUA", "X11/AT-SPI on Linux"]}}, "profile_note": "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.", "effect_verification": "not_asserted"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"platform\": \"linux\", \"supported\": true, \"runtime\": {\"python_version\": \"3.12.14\", \"python_requirement\": \">=3.11,<4.0\", \"python_compatible\": true, \"interpreter\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python\", \"architecture\": \"x86_64\", \"distribution\": {\"version\": \"0.0.1\", \"location\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages\"}, \"loaded_modules\": {\"jevdual\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/__init__.py\", \"jevdual.capability.setup\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py\"}}, \"dependencies\": {\"browser-use\": {\"version\": null, \"requirement\": \"==0.13.14\", \"compatible\": false, \"location\": null}, \"typesafe-sdk\": {\"version\": null, \"requirement\": \"<1,>=0.7\", \"compatible\": false, \"location\": null}, \"orjson\": {\"version\": null, \"requirement\": \">=3.10\", \"compatible\": false, \"location\": null}, \"psutil\": {\"version\": \"7.2.2\", \"requirement\": \"==7.2.2\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages\"}, \"websockets\": {\"version\": \"15.0.1\", \"requirement\": \"==15.0.1\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages\"}, \"mcp\": {\"version\": null, \"requirement\": \"==2.1.1\", \"compatible\": false, \"location\": null}, \"packaging\": {\"version\": \"26.3\", \"requirement\": \"<27,>=25\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages\"}, \"cua-driver\": {\"version\": null, \"requirement\": \"==0.38.0+footwork.d5373879.cleanup2\", \"compatible\": false, \"location\": null}, \"jeepney\": {\"version\": null, \"requirement\": \"==0.9.0\", \"compatible\": false, \"location\": null}}, \"dependency_status\": \"blocked\", \"permissions\": {\"accessibility\": \"not_checked\", \"screen_recording\": \"not_checked\", \"session\": {\"x11_display_present\": false, \"dbus_session_present\": false, \"wayland_display_present\": false, \"connection\": \"not_checked\"}, \"requirements\": [\"An accessible X11 display and D-Bus desktop session.\", \"AT-SPI accessibility access to the explicitly bound process and window.\", \"Live observation and exact text readback before input; environment presence grants no access.\"]}, \"scope\": \"not_checked\", \"journal\": \"not_checked\", \"warnings\": [\"Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified.\"], \"dependency_metadata\": \"installed distribution\", \"limitation\": \"Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.\", \"runtime_qualification\": \"not_checked\", \"provider_account_required\": false, \"rust_toolchain_required\": false, \"blockers\": [\"dependency_missing\", \"accessibility_not_checked\", \"x11_display_not_configured\", \"session_bus_not_configured\"], \"prerequisite_status\": \"blocked\", \"qualification\": \"Prerequisites only. Window identity, current state, effects and job completion require separate checks.\", \"acceleration\": {\"component\": \"jevdual._core\", \"available\": false, \"status\": \"disabled\", \"backend\": \"pure-python\", \"scope\": \"Optional Jev Rust hot paths; independent of the CUA native driver\"}, \"host_prerequisites\": {\"schema_version\": 1, \"platform\": \"linux\", \"architecture\": \"x86_64\", \"kernel\": \"6.18.57\", \"libc\": \"glibc 2.41\", \"distribution\": {\"PRETTY_NAME\": \"Debian GNU/Linux 13 (trixie)\", \"VERSION_ID\": \"13\", \"ID\": \"debian\"}, \"python\": {\"version\": \"3.12.14\", \"pip_module\": false, \"venv_module\": true, \"ensurepip_module\": true}, \"resources\": {\"memory\": {\"total_bytes\": 18882662400, \"available_bytes\": 17956298752}, \"cgroup\": {\"versions\": [2], \"membership_readable\": true, \"memory_limit_bytes\": 17179869184, \"memory_remaining_bytes\": 15954898944, \"cpu_quota_cores\": 4.0, \"scope\": \"visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified\", \"null_limit_meaning\": \"no finite limit observed, not proof of unlimited resources\", \"pids_limit\": null, \"pids_remaining_upper_bound\": null, \"swap_limit_bytes\": null, \"memory_and_swap_limit_bytes\": null, \"task_swap_event_snapshots\": [{\"path\": \".\", \"pids_limit\": null, \"pids_current\": 56, \"pids_events\": {\"max\": 0}, \"swap_limit_bytes\": null, \"swap_current_bytes\": 0, \"swap_events\": {\"high\": 0, \"max\": 0, \"fail\": 0}, \"memory_events\": {\"low\": 0, \"high\": 0, \"max\": 0, \"oom\": 0, \"oom_kill\": 0, \"oom_group_kill\": 0}, \"memory_failcnt\": null, \"memory_and_swap_failcnt\": null}], \"counter_scope\": \"bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown\"}, \"available_memory_upper_bound_bytes\": 15954898944, \"cpu_count\": 5, \"cpu_affinity_count\": 5}, \"process_supervision\": {\"pid1_comm\": \"tail\", \"self_parent_pid\": 12216, \"pid1_is_self\": false, \"orphan_reaping\": \"not_checked\", \"wait_ownership\": \"not_checked\"}, \"executables_present\": {\"uv\": true, \"pip\": true, \"pip3\": true, \"rustc\": false, \"cargo\": false, \"rustup\": false, \"cc\": true, \"clang\": false, \"pkg-config\": true, \"google-chrome\": false, \"google-chrome-stable\": false, \"chromium\": true, \"chromium-browser\": false, \"dbus-run-session\": true, \"dbus-send\": true, \"gdbus\": true, \"Xvfb\": false, \"node\": true, \"ffmpeg\": true, \"tesseract\": true}, \"session_indicators_present\": {\"DISPLAY\": false, \"WAYLAND_DISPLAY\": false, \"DBUS_SESSION_BUS_ADDRESS\": false, \"XDG_RUNTIME_DIR\": false}, \"prerequisite_candidates\": {\"browser_executable\": true, \"graphical_session_indicator\": false, \"session_bus_indicator\": false}, \"runtime_qualification\": \"unverified\", \"effect_verification\": \"not_asserted\", \"limitations\": [\"Executable and environment presence do not establish connection, permissions, or driver support.\", \"No browser, desktop, accessibility service, native CUA library, or provider was started or queried.\", \"Resource values are a transient upper bound, not a reservation or build-capacity guarantee.\", \"Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control.\"]}, \"tool_families\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"browser_profiles\": {\"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"prerequisite_presence\": {\"chrome\": true, \"psutil\": true, \"websockets\": true, \"jev_environment_configured\": false, \"judgment_adapter\": \"explicit per-session configuration; not checked by offline doctor\"}, \"runtime_qualification\": \"not_checked\"}, \"legacy\": {\"profile\": \"full-desktop\", \"requires\": [\"CUA\", \"X11/AT-SPI on Linux\"]}}, \"profile_note\": \"Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.\", \"effect_verification\": \"not_asserted\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6987.728738563, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12218, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6987.729009084, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["doctor"], "result": {"platform": "linux", "supported": true, "runtime": {"python_version": "3.12.14", "python_requirement": ">=3.11,<4.0", "python_compatible": true, "interpreter": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "architecture": "x86_64", "distribution": {"version": "0.0.1", "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages"}, "loaded_modules": {"jevdual": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/__init__.py", "jevdual.capability.setup": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py"}}, "dependencies": {"browser-use": {"version": null, "requirement": "==0.13.14", "compatible": false, "location": null}, "typesafe-sdk": {"version": null, "requirement": "<1,>=0.7", "compatible": false, "location": null}, "orjson": {"version": null, "requirement": ">=3.10", "compatible": false, "location": null}, "psutil": {"version": "7.2.2", "requirement": "==7.2.2", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages"}, "websockets": {"version": "15.0.1", "requirement": "==15.0.1", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages"}, "mcp": {"version": null, "requirement": "==2.1.1", "compatible": false, "location": null}, "packaging": {"version": "26.3", "requirement": "<27,>=25", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-3484b03/consumer/lib/python3.12/site-packages"}, "cua-driver": {"version": null, "requirement": "==0.38.0+footwork.d5373879.cleanup2", "compatible": false, "location": null}, "jeepney": {"version": null, "requirement": "==0.9.0", "compatible": false, "location": null}}, "dependency_status": "blocked", "permissions": {"accessibility": "not_checked", "screen_recording": "not_checked", "session": {"x11_display_present": false, "dbus_session_present": false, "wayland_display_present": false, "connection": "not_checked"}, "requirements": ["An accessible X11 display and D-Bus desktop session.", "AT-SPI accessibility access to the explicitly bound process and window.", "Live observation and exact text readback before input; environment presence grants no access."]}, "scope": "not_checked", "journal": "not_checked", "warnings": ["Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified."], "dependency_metadata": "installed distribution", "limitation": "Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.", "runtime_qualification": "not_checked", "provider_account_required": false, "rust_toolchain_required": false, "blockers": ["dependency_missing", "accessibility_not_checked", "x11_display_not_configured", "session_bus_not_configured"], "prerequisite_status": "blocked", "qualification": "Prerequisites only. Window identity, current state, effects and job completion require separate checks.", "acceleration": {"component": "jevdual._core", "available": false, "status": "disabled", "backend": "pure-python", "scope": "Optional Jev Rust hot paths; independent of the CUA native driver"}, "host_prerequisites": {"schema_version": 1, "platform": "linux", "architecture": "x86_64", "kernel": "6.18.57", "libc": "glibc 2.41", "distribution": {"PRETTY_NAME": "Debian GNU/Linux 13 (trixie)", "VERSION_ID": "13", "ID": "debian"}, "python": {"version": "3.12.14", "pip_module": false, "venv_module": true, "ensurepip_module": true}, "resources": {"memory": {"total_bytes": 18882662400, "available_bytes": 17956298752}, "cgroup": {"versions": [2], "membership_readable": true, "memory_limit_bytes": 17179869184, "memory_remaining_bytes": 15954898944, "cpu_quota_cores": 4.0, "scope": "visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified", "null_limit_meaning": "no finite limit observed, not proof of unlimited resources", "pids_limit": null, "pids_remaining_upper_bound": null, "swap_limit_bytes": null, "memory_and_swap_limit_bytes": null, "task_swap_event_snapshots": [{"path": ".", "pids_limit": null, "pids_current": 56, "pids_events": {"max": 0}, "swap_limit_bytes": null, "swap_current_bytes": 0, "swap_events": {"high": 0, "max": 0, "fail": 0}, "memory_events": {"low": 0, "high": 0, "max": 0, "oom": 0, "oom_kill": 0, "oom_group_kill": 0}, "memory_failcnt": null, "memory_and_swap_failcnt": null}], "counter_scope": "bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown"}, "available_memory_upper_bound_bytes": 15954898944, "cpu_count": 5, "cpu_affinity_count": 5}, "process_supervision": {"pid1_comm": "tail", "self_parent_pid": 12216, "pid1_is_self": false, "orphan_reaping": "not_checked", "wait_ownership": "not_checked"}, "executables_present": {"uv": true, "pip": true, "pip3": true, "rustc": false, "cargo": false, "rustup": false, "cc": true, "clang": false, "pkg-config": true, "google-chrome": false, "google-chrome-stable": false, "chromium": true, "chromium-browser": false, "dbus-run-session": true, "dbus-send": true, "gdbus": true, "Xvfb": false, "node": true, "ffmpeg": true, "tesseract": true}, "session_indicators_present": {"DISPLAY": false, "WAYLAND_DISPLAY": false, "DBUS_SESSION_BUS_ADDRESS": false, "XDG_RUNTIME_DIR": false}, "prerequisite_candidates": {"browser_executable": true, "graphical_session_indicator": false, "session_bus_indicator": false}, "runtime_qualification": "unverified", "effect_verification": "not_asserted", "limitations": ["Executable and environment presence do not establish connection, permissions, or driver support.", "No browser, desktop, accessibility service, native CUA library, or provider was started or queried.", "Resource values are a transient upper bound, not a reservation or build-capacity guarantee.", "Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control."]}, "tool_families": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-3484b03/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "browser_profiles": {"cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "prerequisite_presence": {"chrome": true, "psutil": true, "websockets": true, "jev_environment_configured": false, "judgment_adapter": "explicit per-session configuration; not checked by offline doctor"}, "runtime_qualification": "not_checked"}, "legacy": {"profile": "full-desktop", "requires": ["CUA", "X11/AT-SPI on Linux"]}}, "profile_note": "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.", "effect_verification": "not_asserted"}} +{"kind": "spawn", "monotonic": 6987.729599149, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12219, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6987.801445889, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12219, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6987.801538827, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12219, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6987.801671694, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12219, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "fdbc924797411335b521ae523b209cbb14ab8ff17b3d6415d69ea2e1f87eb6c2", "bytes": 845, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"command": ["browser", "cdp", "click"], "arguments": [{"name": "help", "flags": ["-h", "--help"], "required": false, "nargs": 0, "choices": null, "help": "show this help message and exit", "default": "==SUPPRESS=="}, {"name": "session", "flags": ["--session"], "required": true, "nargs": null, "choices": null, "help": null, "default": null}, {"name": "ref", "flags": ["--ref"], "required": true, "nargs": null, "choices": null, "help": "opaque ref from the last look; never reselected by label", "default": null}, {"name": "token", "flags": ["--token"], "required": true, "nargs": null, "choices": null, "help": "stable token for this intended activation", "default": null}], "subcommands": []}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"command\": [\"browser\", \"cdp\", \"click\"], \"arguments\": [{\"name\": \"help\", \"flags\": [\"-h\", \"--help\"], \"required\": false, \"nargs\": 0, \"choices\": null, \"help\": \"show this help message and exit\", \"default\": \"==SUPPRESS==\"}, {\"name\": \"session\", \"flags\": [\"--session\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": null, \"default\": null}, {\"name\": \"ref\", \"flags\": [\"--ref\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"opaque ref from the last look; never reselected by label\", \"default\": null}, {\"name\": \"token\", \"flags\": [\"--token\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"stable token for this intended activation\", \"default\": null}], \"subcommands\": []}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6987.801742228, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12219, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6987.801795737, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["schema", "browser", "cdp", "click"], "result": {"command": ["browser", "cdp", "click"], "arguments": [{"name": "help", "flags": ["-h", "--help"], "required": false, "nargs": 0, "choices": null, "help": "show this help message and exit", "default": "==SUPPRESS=="}, {"name": "session", "flags": ["--session"], "required": true, "nargs": null, "choices": null, "help": null, "default": null}, {"name": "ref", "flags": ["--ref"], "required": true, "nargs": null, "choices": null, "help": "opaque ref from the last look; never reselected by label", "default": null}, {"name": "token", "flags": ["--token"], "required": true, "nargs": null, "choices": null, "help": "stable token for this intended activation", "default": null}], "subcommands": []}} +{"kind": "spawn", "monotonic": 6987.802428465, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12220, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6987.881608179, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12220, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6987.881699755, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12220, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6987.881841175, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12220, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "80c96660aef007556c2ec3c0eb530adb54b7f3aa985c13592e59e8f0fcaa4cf6", "bytes": 2717, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"package_version": "0.0.1", "profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "loop": ["start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", "look --session DIR; choose the exact opaque ref returned by this holder", "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", "recover --session DIR after holder loss: read-only recovery; no browser is launched", "stop --session DIR; retain the authority database and all unresolved operations"], "guard_adapter": {"configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses"}, "limits": ["An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol."]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"package_version\": \"0.0.1\", \"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"loop\": [\"start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL\", \"look --session DIR; choose the exact opaque ref returned by this holder\", \"click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence\", \"status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record\", \"recover --session DIR after holder loss: read-only recovery; no browser is launched\", \"stop --session DIR; retain the authority database and all unresolved operations\"], \"guard_adapter\": {\"configuration\": \"--guard-command FILE containing JSON argv, absolute executable first; trusted policy code\", \"stdin\": \"footwork.browser.guard.request v1: digest, task, targets, url, title, binding\", \"stdout\": \"{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}\", \"semantics\": \"same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses\"}, \"limits\": [\"An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.\", \"This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.\", \"A new token cannot clear an unresolved admission, even across sessions sharing this authority database.\", \"No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.\", \"The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.\", \"Initial URL loading can itself have website effects; it is setup outside the guarded click protocol.\"]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6987.881974192, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12220, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6987.882031567, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["browser", "cdp", "guide"], "result": {"package_version": "0.0.1", "profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "loop": ["start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", "look --session DIR; choose the exact opaque ref returned by this holder", "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", "recover --session DIR after holder loss: read-only recovery; no browser is launched", "stop --session DIR; retain the authority database and all unresolved operations"], "guard_adapter": {"configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses"}, "limits": ["An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol."]}} +{"kind": "spawn", "monotonic": 6987.882579639, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12221, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6987.944444869, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12221, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 2, "signal": null} +{"kind": "wait", "monotonic": 6987.944530496, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12221, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 2, "signal": null} +{"kind": "communicate", "monotonic": 6987.944620239, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12221, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 2, "signal": null, "stdout": {"sha256": "5e02584e3273c1b284ad62c3dbded09e37e153ba8a5cb7c704b3b84583f77cd2", "bytes": 400, "json": {"schema_version": "1", "exit_code": 2, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "usage: footwork browser cdp [-h]\n {start,look,click,status,recover,stop,guide} ...\nfootwork browser cdp: error: argument command: invalid choice: 'type' (choose from start, look, click, status, recover, stop, guide)\n", "data": null}, "text": "{\"schema_version\": \"1\", \"exit_code\": 2, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"usage: footwork browser cdp [-h]\\n {start,look,click,status,recover,stop,guide} ...\\nfootwork browser cdp: error: argument command: invalid choice: 'type' (choose from start, look, click, status, recover, stop, guide)\\n\", \"data\": null}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6987.944777352, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 12221, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 2, "signal": null} +{"kind": "pytest_report", "monotonic": 6987.945078358, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "phase": "call", "outcome": "passed", "duration": 0.44019535500046914, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6987.949274838, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "phase": "teardown", "outcome": "passed", "duration": 0.00012039800003549317, "longrepr": null} +{"kind": "pytest_report", "monotonic": 6987.951740103, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "phase": "setup", "outcome": "passed", "duration": 0.002067334999992454, "longrepr": null} +{"kind": "spawn", "monotonic": 6987.952555001, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6988.513417588, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6988.513569253, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6988.513743782, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "e48367f1c33958c99dd928e790326e31ffdfd4a52b2944b38e4c3eda7c3395ed", "bytes": 1202, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "operations": []}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_c58b34493d2d402b83d0b6470849dc04\", \"profile\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}, \"holder\": {\"ok\": true, \"session_id\": \"cdp_c58b34493d2d402b83d0b6470849dc04\", \"operations\": []}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6988.513839804, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12223, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6988.513932542, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--authority", "/tmp/fw-cdp-ccztb2ma/authority.db", "--url", "http://127.0.0.1:41277/", "--guard-command", "/tmp/fw-cdp-ccztb2ma/guard-argv.json"], "result": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "operations": []}}} +{"kind": "session_snapshot", "monotonic": 6988.514303341, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-ccztb2ma", "files": [{"path": "/tmp/fw-cdp-ccztb2ma/session/browser.json", "sha256": "c29721acca682687c47ebe143e8ca6df6581708b0619e5b0c32e3e7a672116af", "mtime_ns": 1793473422380173044, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:41277/", "authority": "/tmp/fw-cdp-ccztb2ma/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "/tmp/fw-cdp-ccztb2ma/guard.py"]}}, {"path": "/tmp/fw-cdp-ccztb2ma/session/holder.json", "sha256": "f620682e0b76e76cd7bcbbd245602b270f3cfaf8bf67e6099568bbab285053fc", "mtime_ns": 1793473422811292662, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 12224, "start": "1793473422.01", "nonce": {"redacted_nonce_sha256": "fc66bdf21f85d7722318cc834e7ac1ffdff969914ea5bbdb1520052a0c3a2625"}, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "socket": "/tmp/fw-cdp-ccztb2ma/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 6988.514649304, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-ccztb2ma", "files": [{"path": "/tmp/fw-cdp-ccztb2ma/session/browser.json", "sha256": "c29721acca682687c47ebe143e8ca6df6581708b0619e5b0c32e3e7a672116af", "mtime_ns": 1793473422380173044, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:41277/", "authority": "/tmp/fw-cdp-ccztb2ma/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "/tmp/fw-cdp-ccztb2ma/guard.py"]}}, {"path": "/tmp/fw-cdp-ccztb2ma/session/holder.json", "sha256": "f620682e0b76e76cd7bcbbd245602b270f3cfaf8bf67e6099568bbab285053fc", "mtime_ns": 1793473422811292662, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 12224, "start": "1793473422.01", "nonce": {"redacted_nonce_sha256": "fc66bdf21f85d7722318cc834e7ac1ffdff969914ea5bbdb1520052a0c3a2625"}, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "socket": "/tmp/fw-cdp-ccztb2ma/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6988.515181413, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6988.636381982, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6988.63647482, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6988.63661019, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "4de6f9f2fee2d4106e322813eb1a1deb76ef906c91d67359f21d90bd3b7302c5", "bytes": 954, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:41277/", "title": "Durable fixture"}, "snapshot": {"id": "c76950cf54ab", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "c76950cf54ab:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "c76950cf54ab:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "55B82AC0FDAB80DDC603B8F810C3B3D1", "loader_id": "D553B3170DCBA438F66D53EC0ECE6FDA"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_c58b34493d2d402b83d0b6470849dc04\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:41277/\", \"title\": \"Durable fixture\"}, \"snapshot\": {\"id\": \"c76950cf54ab\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"c76950cf54ab:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}, {\"ref\": \"c76950cf54ab:2\", \"role\": \"button\", \"name\": \"Sentinel\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"55B82AC0FDAB80DDC603B8F810C3B3D1\", \"loader_id\": \"D553B3170DCBA438F66D53EC0ECE6FDA\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 6988.636681176, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12335, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 6988.636734114, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "look", "--session", "/tmp/fw-cdp-ccztb2ma/session"], "result": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:41277/", "title": "Durable fixture"}, "snapshot": {"id": "c76950cf54ab", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "c76950cf54ab:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "c76950cf54ab:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "55B82AC0FDAB80DDC603B8F810C3B3D1", "loader_id": "D553B3170DCBA438F66D53EC0ECE6FDA"}}}} +{"kind": "session_snapshot", "monotonic": 6988.636975232, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-ccztb2ma", "files": [{"path": "/tmp/fw-cdp-ccztb2ma/session/browser.json", "sha256": "c29721acca682687c47ebe143e8ca6df6581708b0619e5b0c32e3e7a672116af", "mtime_ns": 1793473422380173044, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:41277/", "authority": "/tmp/fw-cdp-ccztb2ma/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "/tmp/fw-cdp-ccztb2ma/guard.py"]}}, {"path": "/tmp/fw-cdp-ccztb2ma/session/holder.json", "sha256": "f620682e0b76e76cd7bcbbd245602b270f3cfaf8bf67e6099568bbab285053fc", "mtime_ns": 1793473422811292662, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 12224, "start": "1793473422.01", "nonce": {"redacted_nonce_sha256": "fc66bdf21f85d7722318cc834e7ac1ffdff969914ea5bbdb1520052a0c3a2625"}, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "socket": "/tmp/fw-cdp-ccztb2ma/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6988.637511887, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12336, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--ref", "c76950cf54ab:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6988.816116669, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12336, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--ref", "c76950cf54ab:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": -9, "signal": 9} +{"kind": "wait", "monotonic": 6988.816195677, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12336, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--ref", "c76950cf54ab:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": -9, "signal": 9} +{"kind": "communicate", "monotonic": 6988.816300772, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12336, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--ref", "c76950cf54ab:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": -9, "signal": 9, "stdout": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "session_snapshot", "monotonic": 6990.31695608, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-ccztb2ma", "files": [{"path": "/tmp/fw-cdp-ccztb2ma/session/browser.json", "sha256": "c29721acca682687c47ebe143e8ca6df6581708b0619e5b0c32e3e7a672116af", "mtime_ns": 1793473422380173044, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:41277/", "authority": "/tmp/fw-cdp-ccztb2ma/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/python", "/tmp/fw-cdp-ccztb2ma/guard.py"]}}, {"path": "/tmp/fw-cdp-ccztb2ma/session/holder.json", "sha256": "f620682e0b76e76cd7bcbbd245602b270f3cfaf8bf67e6099568bbab285053fc", "mtime_ns": 1793473422811292662, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 12224, "start": "1793473422.01", "nonce": {"redacted_nonce_sha256": "fc66bdf21f85d7722318cc834e7ac1ffdff969914ea5bbdb1520052a0c3a2625"}, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "socket": "/tmp/fw-cdp-ccztb2ma/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 6990.317665812, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12339, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests"} +{"kind": "wait", "monotonic": 6990.397823541, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12339, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 6990.397938481, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12339, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 6990.398170956, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 12339, "argv": ["/workspace/scratch/footwork-durable-cdp-3484b03/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-ccztb2ma/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-3484b03/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "1fb34bfc47bbed92ce3370378c68ec29e053c9686f7e82b03e8bd5c397755483", "bytes": 5153, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_c58b34493d2d402b83d0b6470849dc04", "operations": [{"id": "op_a35e23ee173b", "task": "cdp_c58b34493d2d402b83d0b6470849dc04", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"E760F86D3CBEF6F6128A42256046E860\",\"pid\":12226,\"start\":\"1793473422.09\",\"target\":\"55B82AC0FDAB80DDC603B8F810C3B3D1\"}", "observation": "c76950cf54ab:1", "target": "7", "move": "click", "args": {"ref": "c76950cf54ab:1", "route": "dom_event_native_button"}, "request_digest": "858b39a944326b0804db214a3898d7638752153082c3a1a965a43f0d9064b2d1", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "E760F86D3CBEF6F6128A42256046E860", "cdp_session": "A2B4CEBF7F0F06DA7E8C7792181EAD2C", "document_token": "e4729bdd6ccfe74499f03b1ecdc8429a", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'});let t=Date.now()+1200;while(Date.now() Date: Sat, 31 Oct 2026 19:10:14 +0000 Subject: [PATCH 15/18] docs: preregister final exact 201-case safety-classification candidate (cherry picked from commit 36aba249b8d424980b9a0f2477a44625092b62a3) --- jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md index d512d63..83ce67f 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md @@ -52,3 +52,11 @@ Established: exact installed startup-fixed3484b03/8042e0f9 passes all199 request Uncertain: finite tested configuration is not universal process-tree or browser reliability; non-atomic inventory/daemon escape/no-zombie product guarantees are not established. Acknowledgement does not prove business completion, generic completion reader and light metadata split remain unshipped. OBS coordination is read-only and separate from Footwork qualification. Decision: publish notebook/results only, report tested SHA/wheel/branch/range to the parent, and leave PR18/review/merge to that owner. No VM runtime implementation or merge occurred. Refs: results/durable-cdp-vm-20261031/report.md; results/durable-cdp-vm-20261031/3484b03/report.md; results/durable-cdp-vm-20261031/cad7508-first/report.md + +## DCVM3 · prediction · 2026-10-31 15:10 +Revises: DCVM2 +Hypothesis: final exact e4df2c6b04644c332c8a636c556ae2fee0822d28 preserves the already measured durable/startup boundaries while its narrow post-admission fallback avoids a false no-send envelope when both result retention and mark_unknown fail, including cancellation. +Test: build211-entry wheel/hashae780174a9f0dcfc0583dd9ed9c814f9f940fbfa54b6f64fdf50aad38233b059, fresh minimal consumer and same unchanged12 copied modules from this exact source, expected201 tests. Keep the same receipt collector3,600-second wrapper bound and actual4CPU16GiB/default sandbox policy. Preserve prior3484b03 199/199 and cad7508 187/3 as independent history. Inspect the two newly supplied injected sensitivity cases: one activation, started/dispatching row remains blocking, retention_unverified/dispatchedNone/retryableFalse for return path, cancellation propagates. These are injected JournalError boundaries, not a reproduced disk-full incident; do not invent further probes or rerun old artifacts. Retain all real CLI/0-0-1 ingress/replay/supervisor/discovery/native-separation receipts again for the new exact wheel. +Predicts: all201 tests pass without skips or collector errors; no second activation under the injected failure; all four real startup pre-cleanup live sets remain empty and readiness unpublished; runtime/product metadata and completion limitations stay explicit. +Against: any failed/skipped case, false no-send claim after activation, swallowed cancellation, new mutation through retained started custody, lost startup handle/live residue, wrong artifact/import source or completion/typing overclaim. +Refs: parent final-candidate handoff; e4df2c6b04644c332c8a636c556ae2fee0822d28; test_browser_holder.py retention sensitivity controls; results/durable-cdp-vm-20261031/e4df2c6/ From ea45b7c5167774e70e8b655c6d79a4e536a69a74 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 19:10:15 +0000 Subject: [PATCH 16/18] test: freeze final exact-source runner with unchanged CLI and supervisor observer (cherry picked from commit bb6851ad038d0dcf897911d2019ccb3c87049a70) --- .../harness/run_e4df2c6.py | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 jevdual/results/durable-cdp-vm-20261031/harness/run_e4df2c6.py diff --git a/jevdual/results/durable-cdp-vm-20261031/harness/run_e4df2c6.py b/jevdual/results/durable-cdp-vm-20261031/harness/run_e4df2c6.py new file mode 100644 index 0000000..bae1ec0 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/harness/run_e4df2c6.py @@ -0,0 +1,210 @@ +"""Run unchanged installed-wheel candidate tests; never import checkout product code.""" +import ctypes +import hashlib +import importlib.metadata +import importlib.util +import json +import os +import platform +import resource +import shutil +import signal +import subprocess +import sys +import time +import zipfile +from datetime import UTC, datetime +from pathlib import Path + +import psutil + +SOURCE = Path('/workspace/footwork-durable-cdp-e4df2c6') +ROOT = Path('/workspace/scratch/footwork-durable-cdp-e4df2c6') +BASE = 'e4df2c6b04644c332c8a636c556ae2fee0822d28' +CHROME = '/usr/lib/chromium/chromium' +TESTS = ['test_cdp_effector.py', 'test_cdp_transport_deadline.py', 'test_cdp_launch_custody.py', 'test_cdp_click.py', 'test_cdp_click_contract.py', 'test_browser_durable_authority.py', 'test_browser_holder.py', 'test_browser_guard.py', 'test_browser_cdp_cli.py', 'test_browser_restart_cli.py', 'test_browser_startup_cli.py', 'test_browser_startup_lifecycle.py'] + + +def sha(path): + return hashlib.file_digest(path.open('rb'), 'sha256').hexdigest() + + +def read(path): + try: + return Path(path).read_text().strip() + except OSError as error: + return {'unavailable': type(error).__name__} + + +def save(name, data): + (ROOT / name).write_text(json.dumps(data, indent=2) + '\n') + + +def identity(process): + return {'pid': process.pid, 'start': process.create_time(), 'parent': process.ppid(), + 'name': process.name(), 'status': process.status(), + 'session': os.getsid(process.pid), 'group': os.getpgid(process.pid)} + + +def descendants(): + rows = [] + for process in psutil.Process().children(recursive=True): + try: + rows.append(identity(process)) + except psutil.NoSuchProcess: + pass + return rows + + +def pinned_signal(row, sig): + fd = None + try: + process = psutil.Process(row['pid']) + if process.create_time() != row['start']: + return 'identity_changed' + fd = os.pidfd_open(process.pid) + if process.create_time() != row['start']: + return 'identity_changed' + signal.pidfd_send_signal(fd, sig) + return 'sent' + except (ProcessLookupError, psutil.NoSuchProcess): + return 'exited' + except (OSError, psutil.Error) as error: + return type(error).__name__ + finally: + if fd is not None: + os.close(fd) + + +def main(): + assert sys.prefix == str(ROOT / 'consumer') + assert not importlib.util.find_spec('cua_driver') + assert not importlib.util.find_spec('browser_use') + import jevdual + from jevdual.effectors.cdp import operations + + wheel = next((ROOT / 'wheel').glob('*.whl')) + package_root = Path(jevdual.__file__).parent.parent + assert package_root.is_relative_to(ROOT / 'consumer') + verified = [] + with zipfile.ZipFile(wheel) as archive: + for name in archive.namelist(): + if name.startswith('jevdual/'): + installed = package_root / name + assert installed.read_bytes() == archive.read(name), name + verified.append(name) + for helper in ('receipt_plugin.py', 'pytest_main.py'): + shutil.copyfile(Path(__file__).with_name('receipt_plugin_v3.py' if helper == 'receipt_plugin.py' else helper), ROOT / helper) + testdir = ROOT / 'tests' + testdir.mkdir(mode=0o700) + hashes = {} + for name in TESTS: + original = SOURCE / 'jevdual/tests' / name + copied = testdir / name + shutil.copyfile(original, copied) + assert copied.read_bytes() == original.read_bytes() + hashes[name] = sha(copied) + libc = ctypes.CDLL(None, use_errno=True) + assert libc.prctl(36, 1, 0, 0, 0) == 0, ctypes.get_errno() # task-only child subreaper + state = ctypes.c_int() + assert libc.prctl(37, ctypes.byref(state), 0, 0, 0) == 0 and state.value == 1 + metadata = { + 'utc_started': datetime.now(UTC).isoformat(), 'baseline_source': BASE, + 'measurement_commit': subprocess.check_output(['git', '-C', str(SOURCE), 'rev-parse', 'HEAD'], text=True).strip(), + 'evidence_commit': subprocess.check_output(['git', '-C', '/workspace/footwork-durable-cdp-vm-evidence', 'rev-parse', 'HEAD'], text=True).strip(), + 'receipt_helpers_sha256': {name: sha(ROOT / name) for name in ['receipt_plugin.py', 'pytest_main.py']}, + 'harness_sha256': sha(Path(__file__)), 'wheel': {'name': wheel.name, 'sha256': sha(wheel)}, + 'test_sha256': hashes, 'verified_installed_package_files': len(verified), + 'origins': {'jevdual': jevdual.__file__, 'operations': operations.__file__, + 'python': sys.executable, 'prefix': sys.prefix, 'sys_path': sys.path}, + 'packages': {d.metadata['Name']: d.version for d in importlib.metadata.distributions()}, + 'optional_backends': {'cua_driver': False, 'browser_use': False}, + 'python': sys.version, 'os_release': read('/etc/os-release'), + 'kernel': {'system': platform.system(), 'release': platform.release(), 'machine': platform.machine()}, + 'chrome': {'executable': CHROME, 'sha256': sha(Path(CHROME)), + 'version': subprocess.check_output([CHROME, '--version'], text=True).strip(), + 'sandbox_override': False}, + 'cgroup_membership': read('/proc/self/cgroup'), + 'cgroup': {n: read('/sys/fs/cgroup/' + n) for n in + ['cpu.max', 'cpuset.cpus.effective', 'memory.max', 'memory.swap.max', 'pids.max', + 'memory.events', 'pids.events']}, + 'affinity': sorted(os.sched_getaffinity(0)), 'uid': os.getuid(), + 'rlimits': {n: resource.getrlimit(getattr(resource, n)) for n in + ['RLIMIT_CORE', 'RLIMIT_NPROC', 'RLIMIT_NOFILE', 'RLIMIT_AS']}, + 'kernel_policy': {p: read(p) for p in ['/proc/sys/kernel/unprivileged_userns_clone', + '/proc/sys/user/max_user_namespaces', '/proc/sys/kernel/core_pattern']}, + 'pid1': psutil.Process(1).name(), 'test_wrapper_subreaper': True, + 'watchdog_seconds': 600, 'cleanup_grace_seconds': 3, + 'scope': 'explicit durable CDP CLI and holder; typing/completion oracle/light metadata split remain off', + } + save('environment.json', metadata) + env = dict(os.environ) + env.pop('PYTHONPATH', None) + env.pop('TYPESAFE_API_KEY', None) # fixture guards only; no provider-backed calls + env['FOOTWORK_EXECUTABLE'] = str(ROOT / 'consumer/bin/footwork') + env.update(FOOTWORK_CHROME_EXECUTABLE=CHROME, JEVDUAL_PURE_PY='1', PYTEST_DISABLE_PLUGIN_AUTOLOAD='1') + command = [sys.executable, '-I', str(ROOT / 'pytest_main.py'), '-q', '-rA', '-o', 'markers=browser: launches a real owned browser', '--confcutdir=' + str(testdir), + '--basetemp=' + str(ROOT / 'pytest-tmp'), '--junitxml=' + str(ROOT / 'junit.xml'), str(testdir)] + save('command.json', {'argv': command, 'cwd': str(testdir), 'PYTHONPATH': 'unset', + 'FOOTWORK_CHROME_EXECUTABLE': CHROME, 'JEVDUAL_PURE_PY': '1', + 'PYTEST_DISABLE_PLUGIN_AUTOLOAD': '1', 'FOOTWORK_EXECUTABLE': env['FOOTWORK_EXECUTABLE'], 'provider_key_forwarded': False}) + save('pre-owned-processes.json', descendants()) + with (ROOT / 'pytest.stdout.txt').open('w') as out, (ROOT / 'pytest.stderr.txt').open('w') as err: + process = subprocess.Popen(command, cwd=testdir, env=env, stdout=out, stderr=err, start_new_session=True) + observed = {} + deadline = time.monotonic() + 600 + while process.poll() is None and time.monotonic() < deadline: + for row in descendants(): + observed[(row['pid'], row['start'])] = row + time.sleep(.05) + timed_out = process.poll() is None + if timed_out: + process.terminate() # sole direct-child Popen identity; watchdog only + try: + process.wait(timeout=3) + except subprocess.TimeoutExpired: + process.kill() + code = process.wait(timeout=3) + pre_cleanup = descendants() + save('owned-process-history.json', list(observed.values())) + save('post-pytest-before-wrapper-reaping.json', pre_cleanup) + signals, waits = [], [] + + def reap(): + while True: + try: + pid, status = os.waitpid(-1, os.WNOHANG) + except ChildProcessError: + break + if pid == 0: + break + waits.append({'pid': pid, 'raw_wait_status': status, + 'returncode': os.waitstatus_to_exitcode(status)}) + + for sig in (signal.SIGTERM, signal.SIGKILL): + for row in descendants(): + if row['status'] != psutil.STATUS_ZOMBIE: + signals.append({**row, 'signal': sig.value, 'delivery': pinned_signal(row, sig)}) + deadline = time.monotonic() + 3 + while descendants() and time.monotonic() < deadline: + reap() + time.sleep(.02) + reap() + if not descendants(): + break + final = descendants() + save('cleanup.json', {'pytest_returncode': code, 'pytest_timeout': timed_out, + 'pre_wrapper_cleanup': pre_cleanup, 'signals': signals, + 'adopted_waits': waits, 'final_owned_descendants': final, + 'utc_finished': datetime.now(UTC).isoformat(), + 'limits': 'bounded known descendants; no atomic inventory/daemon-escape/global no-zombie claim'}) + observer_gap = (ROOT / 'observer-errors.jsonl').exists() and (ROOT / 'observer-errors.jsonl').stat().st_size > 0 + wrapper_code = 1 if timed_out or final or observer_gap else (code if code >= 0 else 128 - code) + receipt = json.loads((ROOT / 'cleanup.json').read_text()) + receipt.update(observer_gap=observer_gap, wrapper_returncode=wrapper_code) + save('cleanup.json', receipt) + return wrapper_code + + +if __name__ == '__main__': + raise SystemExit(main()) From b76ac32a09824086dce3589a0717f75c2b4cc286 Mon Sep 17 00:00:00 2001 From: Tom Main Date: Sat, 31 Oct 2026 19:14:19 +0000 Subject: [PATCH 17/18] test: publish final exact 201-case durable CDP qualification and retained histories (cherry picked from commit 7a874eb1d00d94767ab8b6fcc3907be1084b32ba) --- .../notebook/2026-10-31-durable-cdp-vm.md | 12 + .../e4df2c6/build.json | 1 + .../cells/client-lost-ack/events.jsonl | 79 + .../cells/client-lost-ack/receipt.json | 954 +++ .../e4df2c6/cells/missing-guard/events.jsonl | 43 + .../e4df2c6/cells/missing-guard/receipt.json | 236 + .../e4df2c6/cells/prepared/events.jsonl | 64 + .../e4df2c6/cells/prepared/receipt.json | 459 ++ .../e4df2c6/cells/retained/events.jsonl | 73 + .../e4df2c6/cells/retained/receipt.json | 936 +++ .../e4df2c6/cells/started/events.jsonl | 73 + .../e4df2c6/cells/started/receipt.json | 474 ++ .../cells/startup-connect-15/events.jsonl | 8 + .../cells/startup-connect-15/receipt.json | 94 + .../cells/startup-launch-15/events.jsonl | 8 + .../cells/startup-launch-15/receipt.json | 91 + .../cells/startup-launch-2/events.jsonl | 8 + .../cells/startup-launch-2/receipt.json | 92 + .../cells/startup-navigate-15/events.jsonl | 8 + .../cells/startup-navigate-15/receipt.json | 95 + .../e4df2c6/cleanup.json | 2884 +++++++++ .../e4df2c6/collector-provenance.json | 9 + .../e4df2c6/command.json | 22 + .../e4df2c6/discovery/doctor.json | 502 ++ .../e4df2c6/discovery/guide.json | 89 + .../e4df2c6/discovery/schema.json | 94 + .../e4df2c6/discovery/tools.json | 335 ++ .../e4df2c6/environment.json | 119 + .../e4df2c6/inspected-summary.json | 269 + .../durable-cdp-vm-20261031/e4df2c6/junit.xml | 1 + .../e4df2c6/observer.jsonl | 999 ++++ .../e4df2c6/owned-process-history.json | 5150 +++++++++++++++++ .../post-pytest-before-wrapper-reaping.json | 1847 ++++++ .../e4df2c6/post-run-check.json | 9 + .../e4df2c6/pre-owned-processes.json | 1 + .../e4df2c6/pytest.stderr.txt | 0 .../e4df2c6/pytest.stdout.txt | 217 + .../durable-cdp-vm-20261031/e4df2c6/report.md | 58 + .../e4df2c6/runner.stderr.txt | 0 .../e4df2c6/runner.stdout.txt | 0 .../notebook-check.txt | 4 +- .../results/durable-cdp-vm-20261031/report.md | 6 +- 42 files changed, 16418 insertions(+), 5 deletions(-) create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/build.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/client-lost-ack/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/client-lost-ack/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/missing-guard/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/missing-guard/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/prepared/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/prepared/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/retained/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/retained/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/started/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/started/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/startup-connect-15/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/startup-connect-15/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/startup-launch-15/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/startup-launch-15/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/startup-launch-2/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/startup-launch-2/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/startup-navigate-15/events.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/startup-navigate-15/receipt.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/cleanup.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/collector-provenance.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/command.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/doctor.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/guide.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/schema.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/tools.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/environment.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/inspected-summary.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/junit.xml create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/observer.jsonl create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/owned-process-history.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/post-pytest-before-wrapper-reaping.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/post-run-check.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/pre-owned-processes.json create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/pytest.stderr.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/pytest.stdout.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/report.md create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/runner.stderr.txt create mode 100644 jevdual/results/durable-cdp-vm-20261031/e4df2c6/runner.stdout.txt diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md index 83ce67f..bd92195 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-vm.md @@ -60,3 +60,15 @@ Test: build211-entry wheel/hashae780174a9f0dcfc0583dd9ed9c814f9f940fbfa54b6f64fd Predicts: all201 tests pass without skips or collector errors; no second activation under the injected failure; all four real startup pre-cleanup live sets remain empty and readiness unpublished; runtime/product metadata and completion limitations stay explicit. Against: any failed/skipped case, false no-send claim after activation, swallowed cancellation, new mutation through retained started custody, lost startup handle/live residue, wrong artifact/import source or completion/typing overclaim. Refs: parent final-candidate handoff; e4df2c6b04644c332c8a636c556ae2fee0822d28; test_browser_holder.py retention sensitivity controls; results/durable-cdp-vm-20261031/e4df2c6/ + +## DCVMU4 · update · 2026-10-31 15:13 +Resolves: DCVM3 = held +Observed: exact e4df2c6b04644c332c8a636c556ae2fee0822d28 built211-entry wheel ae780174a9f0dcfc0583dd9ed9c814f9f940fbfa54b6f64fdf50aad38233b059, matched206 installed files and all12 copied sources; no CUA/browser-use. One final batch passed201/201 in63.52seconds with no failures/errors/skips/warnings, pytest/wrapper exits0 and no collector error. The two injected post-admission controls pass, preserving nullable dispatch/retention-unverified or cancellation, one activation and blocked started custody. This is not a reproduced disk-full incident. Real restart ingress again0/0/1; retained independent count1 precedes exit86; same-token replays/new-token/guard/typing/native-separation controls pass. All four startup supervisors exit0/no readiness with no LIVE captured process before test cleanup; captured counts10/11/13/14, zombie/test-reap counts5/6/5/6. Outer snapshot205 zombies/no live children, no wrapper signals,205 adopted waits and empty final owned descendants. Actual installed discovery and complete raw cell receipts are retained. +Next: publish the final artifact evidence and full history to the parent; do not add exploratory probes, modify runtime/tests or merge PR18. Preserve earlier199/199 and187/3 separately. +Refs: results/durable-cdp-vm-20261031/e4df2c6/report.md; results/durable-cdp-vm-20261031/e4df2c6/inspected-summary.json; results/durable-cdp-vm-20261031/e4df2c6/cleanup.json + +## DCVMFS · summary · 2026-10-31 15:13 +Established: final exact sourcee4df2c6/wheelae780174 passes201 requested installed Linux cases under unchanged minimal consumer/default sandbox/current4CPU16GiB policy. All public CLI/holder restart/startup/ingress/discovery boundaries are witnessed with numeric receipts; two new narrow sensitivity controls retain correct uncertainty and cancellation without redispatch. First collector failures and the intervening clean199 run remain intact. No candidate/test source change, paid provider call, desktop capture, additional fault search or VM PR/merge occurred. +Uncertain: injected retention failure is not a real storage incident; business completion reader and light metadata split remain absent. Finite VM evidence and bounded non-atomic identity inventory/test-only subreaping do not establish universal reliability, daemon-escape coverage or product/global no-zombie guarantees. OBS remains a separate environment/candidate transfer and no OBS runtime work is part of this result. +Decision: publish notebook/results-only branch and exact range/report path, leaving final CI/review/PR18 merge with parent. No further qualification run is required for the frozen candidate unless new evidence changes scope. +Refs: results/durable-cdp-vm-20261031/report.md; results/durable-cdp-vm-20261031/e4df2c6/report.md diff --git a/jevdual/results/durable-cdp-vm-20261031/e4df2c6/build.json b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/build.json new file mode 100644 index 0000000..22e32d7 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/build.json @@ -0,0 +1 @@ +{"wheel": "/workspace/scratch/footwork-durable-cdp-e4df2c6/wheel/jevdual-0.0.1-py3-none-any.whl", "files": 211, "sha256": "ae780174a9f0dcfc0583dd9ed9c814f9f940fbfa54b6f64fdf50aad38233b059", "verified": true} diff --git a/jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/client-lost-ack/events.jsonl b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/client-lost-ack/events.jsonl new file mode 100644 index 0000000..647ceb7 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/cells/client-lost-ack/events.jsonl @@ -0,0 +1,79 @@ +{"kind": "pytest_report", "monotonic": 7382.023881039, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "phase": "setup", "outcome": "passed", "duration": 0.0015524310001637787, "longrepr": null} +{"kind": "spawn", "monotonic": 7382.024622248, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7382.584556383, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7382.584691654, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7382.584995614, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "b9a85c0bcb4caf1631be0ed5dd231db02257e17f80a9cb515efc6abb7b709001", "bytes": 1202, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "operations": []}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_64b5d233d98d4232bf8c019ad7710c56\", \"profile\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}, \"holder\": {\"ok\": true, \"session_id\": \"cdp_64b5d233d98d4232bf8c019ad7710c56\", \"operations\": []}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 7382.585067701, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 7382.585128942, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "result": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "operations": []}}} +{"kind": "session_snapshot", "monotonic": 7382.585414776, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-llrgke88", "files": [{"path": "/tmp/fw-cdp-llrgke88/session/browser.json", "sha256": "462f010eeb21531973e45577787778db70d64db0cb68f43cefa951983876ff81", "mtime_ns": 1793473816454318566, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:38749/", "authority": "/tmp/fw-cdp-llrgke88/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "/tmp/fw-cdp-llrgke88/guard.py"]}}, {"path": "/tmp/fw-cdp-llrgke88/session/holder.json", "sha256": "ebc4bd62754e398fb298a996fc8a389f4257b5f10ff9a693dc9e6eac38d57279", "mtime_ns": 1793473816874142938, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 17582, "start": "1793473816.09", "nonce": {"redacted_nonce_sha256": "3dc9d50cf0e141e2aeea3ebd9d722c17c615c2a45fdf800d52cdf536c704ffef"}, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "socket": "/tmp/fw-cdp-llrgke88/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 7382.585676203, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-llrgke88", "files": [{"path": "/tmp/fw-cdp-llrgke88/session/browser.json", "sha256": "462f010eeb21531973e45577787778db70d64db0cb68f43cefa951983876ff81", "mtime_ns": 1793473816454318566, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:38749/", "authority": "/tmp/fw-cdp-llrgke88/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "/tmp/fw-cdp-llrgke88/guard.py"]}}, {"path": "/tmp/fw-cdp-llrgke88/session/holder.json", "sha256": "ebc4bd62754e398fb298a996fc8a389f4257b5f10ff9a693dc9e6eac38d57279", "mtime_ns": 1793473816874142938, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 17582, "start": "1793473816.09", "nonce": {"redacted_nonce_sha256": "3dc9d50cf0e141e2aeea3ebd9d722c17c615c2a45fdf800d52cdf536c704ffef"}, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "socket": "/tmp/fw-cdp-llrgke88/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 7382.587167659, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7382.696785568, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7382.696986406, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7382.697126644, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "cfe4b84e6c36660c2458ec363f26269eaf53c7f688a764c36e41d1606d7cce37", "bytes": 954, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:38749/", "title": "Durable fixture"}, "snapshot": {"id": "042803456b15", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "042803456b15:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "042803456b15:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "2959BB6B8E71F45EB2AE4948D2A095AF", "loader_id": "E8EC90473CCA9A6F03BED893331FF877"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_64b5d233d98d4232bf8c019ad7710c56\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:38749/\", \"title\": \"Durable fixture\"}, \"snapshot\": {\"id\": \"042803456b15\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"042803456b15:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}, {\"ref\": \"042803456b15:2\", \"role\": \"button\", \"name\": \"Sentinel\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"2959BB6B8E71F45EB2AE4948D2A095AF\", \"loader_id\": \"E8EC90473CCA9A6F03BED893331FF877\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 7382.69725227, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 7382.697325919, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "result": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:38749/", "title": "Durable fixture"}, "snapshot": {"id": "042803456b15", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "042803456b15:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "042803456b15:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "2959BB6B8E71F45EB2AE4948D2A095AF", "loader_id": "E8EC90473CCA9A6F03BED893331FF877"}}}} +{"kind": "session_snapshot", "monotonic": 7382.697841594, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-llrgke88", "files": [{"path": "/tmp/fw-cdp-llrgke88/session/browser.json", "sha256": "462f010eeb21531973e45577787778db70d64db0cb68f43cefa951983876ff81", "mtime_ns": 1793473816454318566, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:38749/", "authority": "/tmp/fw-cdp-llrgke88/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "/tmp/fw-cdp-llrgke88/guard.py"]}}, {"path": "/tmp/fw-cdp-llrgke88/session/holder.json", "sha256": "ebc4bd62754e398fb298a996fc8a389f4257b5f10ff9a693dc9e6eac38d57279", "mtime_ns": 1793473816874142938, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 17582, "start": "1793473816.09", "nonce": {"redacted_nonce_sha256": "3dc9d50cf0e141e2aeea3ebd9d722c17c615c2a45fdf800d52cdf536c704ffef"}, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "socket": "/tmp/fw-cdp-llrgke88/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 7382.698551606, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17693, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-llrgke88/session", "--ref", "042803456b15:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7382.860179453, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17693, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-llrgke88/session", "--ref", "042803456b15:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": -9, "signal": 9} +{"kind": "wait", "monotonic": 7382.860289516, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17693, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-llrgke88/session", "--ref", "042803456b15:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": -9, "signal": 9} +{"kind": "communicate", "monotonic": 7382.86036008, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17693, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-llrgke88/session", "--ref", "042803456b15:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": -9, "signal": 9, "stdout": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "session_snapshot", "monotonic": 7384.360899112, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-llrgke88", "files": [{"path": "/tmp/fw-cdp-llrgke88/session/browser.json", "sha256": "462f010eeb21531973e45577787778db70d64db0cb68f43cefa951983876ff81", "mtime_ns": 1793473816454318566, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:38749/", "authority": "/tmp/fw-cdp-llrgke88/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "/tmp/fw-cdp-llrgke88/guard.py"]}}, {"path": "/tmp/fw-cdp-llrgke88/session/holder.json", "sha256": "ebc4bd62754e398fb298a996fc8a389f4257b5f10ff9a693dc9e6eac38d57279", "mtime_ns": 1793473816874142938, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 17582, "start": "1793473816.09", "nonce": {"redacted_nonce_sha256": "3dc9d50cf0e141e2aeea3ebd9d722c17c615c2a45fdf800d52cdf536c704ffef"}, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "socket": "/tmp/fw-cdp-llrgke88/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 7384.361442517, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17695, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-llrgke88/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7384.444899673, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17695, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-llrgke88/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7384.445004258, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17695, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-llrgke88/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7384.445272226, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17695, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-llrgke88/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "b864be5a62e569c15a7c67b92c6fdfafe58d32d174ad81017bd1cf5bb96060a3", "bytes": 5151, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "operations": [{"id": "op_531f41db08b8", "task": "cdp_64b5d233d98d4232bf8c019ad7710c56", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"CB2AF2ED623EC8F318CC482E9560CF65\",\"pid\":17584,\"start\":\"1793473816.16\",\"target\":\"2959BB6B8E71F45EB2AE4948D2A095AF\"}", "observation": "042803456b15:1", "target": "7", "move": "click", "args": {"ref": "042803456b15:1", "route": "dom_event_native_button"}, "request_digest": "66e48b569d0770440e67f70f93b4d3331dbbde5a02c4a5c07cf721a46dcb8fca", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "CB2AF2ED623EC8F318CC482E9560CF65", "cdp_session": "734DB2CFD85BB8E1AC597BF1530B9A35", "document_token": "c2c262e78c0a0b2400d4211320fc253b", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'});let t=Date.now()+1200;while(Date.now()=3.11,<4.0", + "python_compatible": true, + "interpreter": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", + "architecture": "x86_64", + "distribution": { + "version": "0.0.1", + "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages" + }, + "loaded_modules": { + "jevdual": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/__init__.py", + "jevdual.capability.setup": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py" + } + }, + "dependencies": { + "browser-use": { + "version": null, + "requirement": "==0.13.14", + "compatible": false, + "location": null + }, + "typesafe-sdk": { + "version": null, + "requirement": "<1,>=0.7", + "compatible": false, + "location": null + }, + "orjson": { + "version": null, + "requirement": ">=3.10", + "compatible": false, + "location": null + }, + "psutil": { + "version": "7.2.2", + "requirement": "==7.2.2", + "compatible": true, + "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages" + }, + "websockets": { + "version": "15.0.1", + "requirement": "==15.0.1", + "compatible": true, + "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages" + }, + "mcp": { + "version": null, + "requirement": "==2.1.1", + "compatible": false, + "location": null + }, + "packaging": { + "version": "26.3", + "requirement": "<27,>=25", + "compatible": true, + "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages" + }, + "cua-driver": { + "version": null, + "requirement": "==0.38.0+footwork.d5373879.cleanup2", + "compatible": false, + "location": null + }, + "jeepney": { + "version": null, + "requirement": "==0.9.0", + "compatible": false, + "location": null + } + }, + "dependency_status": "blocked", + "permissions": { + "accessibility": "not_checked", + "screen_recording": "not_checked", + "session": { + "x11_display_present": false, + "dbus_session_present": false, + "wayland_display_present": false, + "connection": "not_checked" + }, + "requirements": [ + "An accessible X11 display and D-Bus desktop session.", + "AT-SPI accessibility access to the explicitly bound process and window.", + "Live observation and exact text readback before input; environment presence grants no access." + ] + }, + "scope": "not_checked", + "journal": "not_checked", + "warnings": [ + "Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified." + ], + "dependency_metadata": "installed distribution", + "limitation": "Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.", + "runtime_qualification": "not_checked", + "provider_account_required": false, + "rust_toolchain_required": false, + "blockers": [ + "dependency_missing", + "accessibility_not_checked", + "x11_display_not_configured", + "session_bus_not_configured" + ], + "prerequisite_status": "blocked", + "qualification": "Prerequisites only. Window identity, current state, effects and job completion require separate checks.", + "acceleration": { + "component": "jevdual._core", + "available": false, + "status": "disabled", + "backend": "pure-python", + "scope": "Optional Jev Rust hot paths; independent of the CUA native driver" + }, + "host_prerequisites": { + "schema_version": 1, + "platform": "linux", + "architecture": "x86_64", + "kernel": "6.18.57", + "libc": "glibc 2.41", + "distribution": { + "PRETTY_NAME": "Debian GNU/Linux 13 (trixie)", + "VERSION_ID": "13", + "ID": "debian" + }, + "python": { + "version": "3.12.14", + "pip_module": false, + "venv_module": true, + "ensurepip_module": true + }, + "resources": { + "memory": { + "total_bytes": 18882662400, + "available_bytes": 17939697664 + }, + "cgroup": { + "versions": [ + 2 + ], + "membership_readable": true, + "memory_limit_bytes": 17179869184, + "memory_remaining_bytes": 15727390720, + "cpu_quota_cores": 4.0, + "scope": "visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified", + "null_limit_meaning": "no finite limit observed, not proof of unlimited resources", + "pids_limit": null, + "pids_remaining_upper_bound": null, + "swap_limit_bytes": null, + "memory_and_swap_limit_bytes": null, + "task_swap_event_snapshots": [ + { + "path": ".", + "pids_limit": null, + "pids_current": 60, + "pids_events": { + "max": 0 + }, + "swap_limit_bytes": null, + "swap_current_bytes": 0, + "swap_events": { + "high": 0, + "max": 0, + "fail": 0 + }, + "memory_events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + }, + "memory_failcnt": null, + "memory_and_swap_failcnt": null + } + ], + "counter_scope": "bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown" + }, + "available_memory_upper_bound_bytes": 15727390720, + "cpu_count": 5, + "cpu_affinity_count": 5 + }, + "process_supervision": { + "pid1_comm": "tail", + "self_parent_pid": 17574, + "pid1_is_self": false, + "orphan_reaping": "not_checked", + "wait_ownership": "not_checked" + }, + "executables_present": { + "uv": true, + "pip": true, + "pip3": true, + "rustc": false, + "cargo": false, + "rustup": false, + "cc": true, + "clang": false, + "pkg-config": true, + "google-chrome": false, + "google-chrome-stable": false, + "chromium": true, + "chromium-browser": false, + "dbus-run-session": true, + "dbus-send": true, + "gdbus": true, + "Xvfb": false, + "node": true, + "ffmpeg": true, + "tesseract": true + }, + "session_indicators_present": { + "DISPLAY": false, + "WAYLAND_DISPLAY": false, + "DBUS_SESSION_BUS_ADDRESS": false, + "XDG_RUNTIME_DIR": false + }, + "prerequisite_candidates": { + "browser_executable": true, + "graphical_session_indicator": false, + "session_bus_indicator": false + }, + "runtime_qualification": "unverified", + "effect_verification": "not_asserted", + "limitations": [ + "Executable and environment presence do not establish connection, permissions, or driver support.", + "No browser, desktop, accessibility service, native CUA library, or provider was started or queried.", + "Resource values are a transient upper bound, not a reservation or build-capacity guarantee.", + "Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control." + ] + }, + "tool_families": [ + { + "name": "camera", + "commands": [ + "doctor", + "capture", + "status" + ], + "status": "available", + "prerequisites": [ + "ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment" + }, + { + "name": "inbox", + "commands": [ + "prepare", + "accept", + "status" + ], + "status": "available", + "prerequisites": [ + "explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment" + }, + { + "name": "workbench", + "commands": [ + "link", + "status", + "list" + ], + "status": "available", + "prerequisites": [], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes" + }, + { + "name": "workcell", + "commands": [ + "agent-bench", + "app-handoff", + "bench", + "bench-operator", + "bench-runner", + "body", + "body-network", + "controller", + "episode", + "image-guided", + "measurement", + "network-bench-operator", + "order-app", + "qualify-bench", + "qualify-network-body", + "qualify-network-workbench", + "qualify-order-handoff", + "qualify-workbench-crashes", + "qualify-workbench-health", + "qualify-workbench-recovery", + "qualify-workbench-restarts", + "record-network-workbench", + "score-agent-bench", + "score-network-body", + "score-network-workbench", + "score-operator", + "score-workbench-crashes", + "score-workbench-health", + "score-workbench-recovery", + "score-workbench-restarts" + ], + "status": "optional_dependencies_missing", + "prerequisites": [ + "mujoco==3.15.0", + "numpy", + "headless rendering libraries for image operations", + "qualification commands require owned fixture inputs" + ], + "missing": [ + "mujoco", + "numpy" + ], + "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell", + "command_prerequisites": { + "record-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-order-handoff": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-agent-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-operator": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ] + } + }, + { + "name": "browser-inspection", + "commands": [ + "summarize", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-experiments", + "commands": [ + "compare", + "coverage", + "publication-gate", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-transport", + "commands": [ + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + } + ], + "browser_profiles": { + "cdp": { + "profile": "owned-headless-cdp", + "entrypoint": "footwork browser cdp", + "commands": [ + "start", + "look", + "click", + "status", + "recover", + "stop", + "guide" + ], + "requirements": [ + "Chrome", + "psutil", + "websockets", + "configured Jev or judgment adapter", + "absolute durable authority" + ], + "desktop_required": false, + "cua_required": false, + "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", + "prerequisite_presence": { + "chrome": true, + "psutil": true, + "websockets": true, + "jev_environment_configured": false, + "judgment_adapter": "explicit per-session configuration; not checked by offline doctor" + }, + "runtime_qualification": "not_checked" + }, + "legacy": { + "profile": "full-desktop", + "requires": [ + "CUA", + "X11/AT-SPI on Linux" + ] + } + }, + "profile_note": "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.", + "effect_verification": "not_asserted" + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"platform\": \"linux\", \"supported\": true, \"runtime\": {\"python_version\": \"3.12.14\", \"python_requirement\": \">=3.11,<4.0\", \"python_compatible\": true, \"interpreter\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python\", \"architecture\": \"x86_64\", \"distribution\": {\"version\": \"0.0.1\", \"location\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages\"}, \"loaded_modules\": {\"jevdual\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/__init__.py\", \"jevdual.capability.setup\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py\"}}, \"dependencies\": {\"browser-use\": {\"version\": null, \"requirement\": \"==0.13.14\", \"compatible\": false, \"location\": null}, \"typesafe-sdk\": {\"version\": null, \"requirement\": \"<1,>=0.7\", \"compatible\": false, \"location\": null}, \"orjson\": {\"version\": null, \"requirement\": \">=3.10\", \"compatible\": false, \"location\": null}, \"psutil\": {\"version\": \"7.2.2\", \"requirement\": \"==7.2.2\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages\"}, \"websockets\": {\"version\": \"15.0.1\", \"requirement\": \"==15.0.1\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages\"}, \"mcp\": {\"version\": null, \"requirement\": \"==2.1.1\", \"compatible\": false, \"location\": null}, \"packaging\": {\"version\": \"26.3\", \"requirement\": \"<27,>=25\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages\"}, \"cua-driver\": {\"version\": null, \"requirement\": \"==0.38.0+footwork.d5373879.cleanup2\", \"compatible\": false, \"location\": null}, \"jeepney\": {\"version\": null, \"requirement\": \"==0.9.0\", \"compatible\": false, \"location\": null}}, \"dependency_status\": \"blocked\", \"permissions\": {\"accessibility\": \"not_checked\", \"screen_recording\": \"not_checked\", \"session\": {\"x11_display_present\": false, \"dbus_session_present\": false, \"wayland_display_present\": false, \"connection\": \"not_checked\"}, \"requirements\": [\"An accessible X11 display and D-Bus desktop session.\", \"AT-SPI accessibility access to the explicitly bound process and window.\", \"Live observation and exact text readback before input; environment presence grants no access.\"]}, \"scope\": \"not_checked\", \"journal\": \"not_checked\", \"warnings\": [\"Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified.\"], \"dependency_metadata\": \"installed distribution\", \"limitation\": \"Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.\", \"runtime_qualification\": \"not_checked\", \"provider_account_required\": false, \"rust_toolchain_required\": false, \"blockers\": [\"dependency_missing\", \"accessibility_not_checked\", \"x11_display_not_configured\", \"session_bus_not_configured\"], \"prerequisite_status\": \"blocked\", \"qualification\": \"Prerequisites only. Window identity, current state, effects and job completion require separate checks.\", \"acceleration\": {\"component\": \"jevdual._core\", \"available\": false, \"status\": \"disabled\", \"backend\": \"pure-python\", \"scope\": \"Optional Jev Rust hot paths; independent of the CUA native driver\"}, \"host_prerequisites\": {\"schema_version\": 1, \"platform\": \"linux\", \"architecture\": \"x86_64\", \"kernel\": \"6.18.57\", \"libc\": \"glibc 2.41\", \"distribution\": {\"PRETTY_NAME\": \"Debian GNU/Linux 13 (trixie)\", \"VERSION_ID\": \"13\", \"ID\": \"debian\"}, \"python\": {\"version\": \"3.12.14\", \"pip_module\": false, \"venv_module\": true, \"ensurepip_module\": true}, \"resources\": {\"memory\": {\"total_bytes\": 18882662400, \"available_bytes\": 17939697664}, \"cgroup\": {\"versions\": [2], \"membership_readable\": true, \"memory_limit_bytes\": 17179869184, \"memory_remaining_bytes\": 15727390720, \"cpu_quota_cores\": 4.0, \"scope\": \"visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified\", \"null_limit_meaning\": \"no finite limit observed, not proof of unlimited resources\", \"pids_limit\": null, \"pids_remaining_upper_bound\": null, \"swap_limit_bytes\": null, \"memory_and_swap_limit_bytes\": null, \"task_swap_event_snapshots\": [{\"path\": \".\", \"pids_limit\": null, \"pids_current\": 60, \"pids_events\": {\"max\": 0}, \"swap_limit_bytes\": null, \"swap_current_bytes\": 0, \"swap_events\": {\"high\": 0, \"max\": 0, \"fail\": 0}, \"memory_events\": {\"low\": 0, \"high\": 0, \"max\": 0, \"oom\": 0, \"oom_kill\": 0, \"oom_group_kill\": 0}, \"memory_failcnt\": null, \"memory_and_swap_failcnt\": null}], \"counter_scope\": \"bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown\"}, \"available_memory_upper_bound_bytes\": 15727390720, \"cpu_count\": 5, \"cpu_affinity_count\": 5}, \"process_supervision\": {\"pid1_comm\": \"tail\", \"self_parent_pid\": 17574, \"pid1_is_self\": false, \"orphan_reaping\": \"not_checked\", \"wait_ownership\": \"not_checked\"}, \"executables_present\": {\"uv\": true, \"pip\": true, \"pip3\": true, \"rustc\": false, \"cargo\": false, \"rustup\": false, \"cc\": true, \"clang\": false, \"pkg-config\": true, \"google-chrome\": false, \"google-chrome-stable\": false, \"chromium\": true, \"chromium-browser\": false, \"dbus-run-session\": true, \"dbus-send\": true, \"gdbus\": true, \"Xvfb\": false, \"node\": true, \"ffmpeg\": true, \"tesseract\": true}, \"session_indicators_present\": {\"DISPLAY\": false, \"WAYLAND_DISPLAY\": false, \"DBUS_SESSION_BUS_ADDRESS\": false, \"XDG_RUNTIME_DIR\": false}, \"prerequisite_candidates\": {\"browser_executable\": true, \"graphical_session_indicator\": false, \"session_bus_indicator\": false}, \"runtime_qualification\": \"unverified\", \"effect_verification\": \"not_asserted\", \"limitations\": [\"Executable and environment presence do not establish connection, permissions, or driver support.\", \"No browser, desktop, accessibility service, native CUA library, or provider was started or queried.\", \"Resource values are a transient upper bound, not a reservation or build-capacity guarantee.\", \"Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control.\"]}, \"tool_families\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"browser_profiles\": {\"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"prerequisite_presence\": {\"chrome\": true, \"psutil\": true, \"websockets\": true, \"jev_environment_configured\": false, \"judgment_adapter\": \"explicit per-session configuration; not checked by offline doctor\"}, \"runtime_qualification\": \"not_checked\"}, \"legacy\": {\"profile\": \"full-desktop\", \"requires\": [\"CUA\", \"X11/AT-SPI on Linux\"]}}, \"profile_note\": \"Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.\", \"effect_verification\": \"not_asserted\"}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/guide.json b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/guide.json new file mode 100644 index 0000000..943c07f --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/guide.json @@ -0,0 +1,89 @@ +{ + "kind": "communicate", + "monotonic": 7381.957420134, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 4, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 17578, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", + "--json", + "browser", + "cdp", + "guide" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "80c96660aef007556c2ec3c0eb530adb54b7f3aa985c13592e59e8f0fcaa4cf6", + "bytes": 2717, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "package_version": "0.0.1", + "profile": "owned-headless-cdp", + "entrypoint": "footwork browser cdp", + "commands": [ + "start", + "look", + "click", + "status", + "recover", + "stop", + "guide" + ], + "requirements": [ + "Chrome", + "psutil", + "websockets", + "configured Jev or judgment adapter", + "absolute durable authority" + ], + "desktop_required": false, + "cua_required": false, + "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", + "loop": [ + "start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", + "look --session DIR; choose the exact opaque ref returned by this holder", + "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", + "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", + "recover --session DIR after holder loss: read-only recovery; no browser is launched", + "stop --session DIR; retain the authority database and all unresolved operations" + ], + "guard_adapter": { + "configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", + "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", + "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", + "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses" + }, + "limits": [ + "An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", + "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", + "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", + "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", + "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", + "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol." + ] + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"package_version\": \"0.0.1\", \"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"loop\": [\"start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL\", \"look --session DIR; choose the exact opaque ref returned by this holder\", \"click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence\", \"status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record\", \"recover --session DIR after holder loss: read-only recovery; no browser is launched\", \"stop --session DIR; retain the authority database and all unresolved operations\"], \"guard_adapter\": {\"configuration\": \"--guard-command FILE containing JSON argv, absolute executable first; trusted policy code\", \"stdin\": \"footwork.browser.guard.request v1: digest, task, targets, url, title, binding\", \"stdout\": \"{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}\", \"semantics\": \"same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses\"}, \"limits\": [\"An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.\", \"This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.\", \"A new token cannot clear an unresolved admission, even across sessions sharing this authority database.\", \"No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.\", \"The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.\", \"Initial URL loading can itself have website effects; it is setup outside the guarded click protocol.\"]}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/schema.json b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/schema.json new file mode 100644 index 0000000..3fa89a1 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/schema.json @@ -0,0 +1,94 @@ +{ + "kind": "communicate", + "monotonic": 7381.884279304, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 3, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 17577, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", + "--json", + "schema", + "browser", + "cdp", + "click" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "fdbc924797411335b521ae523b209cbb14ab8ff17b3d6415d69ea2e1f87eb6c2", + "bytes": 845, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "command": [ + "browser", + "cdp", + "click" + ], + "arguments": [ + { + "name": "help", + "flags": [ + "-h", + "--help" + ], + "required": false, + "nargs": 0, + "choices": null, + "help": "show this help message and exit", + "default": "==SUPPRESS==" + }, + { + "name": "session", + "flags": [ + "--session" + ], + "required": true, + "nargs": null, + "choices": null, + "help": null, + "default": null + }, + { + "name": "ref", + "flags": [ + "--ref" + ], + "required": true, + "nargs": null, + "choices": null, + "help": "opaque ref from the last look; never reselected by label", + "default": null + }, + { + "name": "token", + "flags": [ + "--token" + ], + "required": true, + "nargs": null, + "choices": null, + "help": "stable token for this intended activation", + "default": null + } + ], + "subcommands": [] + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"command\": [\"browser\", \"cdp\", \"click\"], \"arguments\": [{\"name\": \"help\", \"flags\": [\"-h\", \"--help\"], \"required\": false, \"nargs\": 0, \"choices\": null, \"help\": \"show this help message and exit\", \"default\": \"==SUPPRESS==\"}, {\"name\": \"session\", \"flags\": [\"--session\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": null, \"default\": null}, {\"name\": \"ref\", \"flags\": [\"--ref\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"opaque ref from the last look; never reselected by label\", \"default\": null}, {\"name\": \"token\", \"flags\": [\"--token\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"stable token for this intended activation\", \"default\": null}], \"subcommands\": []}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/tools.json b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/tools.json new file mode 100644 index 0000000..7760505 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/discovery/tools.json @@ -0,0 +1,335 @@ +{ + "kind": "communicate", + "monotonic": 7381.692789268, + "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "process_number": 1, + "process_kind": "public_cli", + "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", + "pid": 17575, + "argv": [ + "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", + "--json", + "tools" + ], + "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", + "returncode": 0, + "signal": null, + "stdout": { + "sha256": "e7fa3e742a542a1e8b11fc5606bf2e2cb2ec3c392c9c5e15a8b88d7191f69c97", + "bytes": 6642, + "json": { + "schema_version": "1", + "exit_code": 0, + "command_completed": true, + "effect_verification": "not_asserted", + "output": "", + "diagnostics": "", + "data": { + "schema_version": "1", + "entrypoint": "footwork", + "global_options": { + "--json": "Prefix before the command; preserves exit status and does not certify effects" + }, + "commands": [ + "run", + "menu", + "apps", + "start", + "look", + "inspect-target", + "visual-check", + "do", + "s1", + "done", + "read", + "check-file", + "check-artifact", + "grant", + "snapshot-file", + "status" + ], + "agent_commands": [ + "tools", + "catalog", + "schema", + "doctor", + "invoke", + "capability", + "mcp", + "tool" + ], + "surfaces": { + "browser": { + "commands": [ + "start", + "check-file", + "do", + "done", + "grant", + "inspect-target", + "look", + "read", + "s1", + "snapshot-file", + "status", + "visual-check", + "cdp" + ], + "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", + "cdp": { + "profile": "owned-headless-cdp", + "entrypoint": "footwork browser cdp", + "commands": [ + "start", + "look", + "click", + "status", + "recover", + "stop", + "guide" + ], + "requirements": [ + "Chrome", + "psutil", + "websockets", + "configured Jev or judgment adapter", + "absolute durable authority" + ], + "desktop_required": false, + "cua_required": false, + "typing": "disabled: unresolved focus race", + "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", + "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", + "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", + "install": "current package metadata still installs full dependencies; light metadata split is pending", + "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user" + } + }, + "desktop": { + "commands": [ + "run", + "menu", + "apps", + "start", + "look", + "inspect-target", + "visual-check", + "do", + "s1", + "done", + "read", + "check-file", + "check-artifact", + "grant", + "snapshot-file", + "status" + ], + "route": "native Linux X11/AT-SPI; live target binding required" + } + }, + "capability": { + "commands": [ + "doctor", + "config", + "server", + "report" + ], + "scope": "one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified" + }, + "tools": [ + { + "name": "camera", + "commands": [ + "doctor", + "capture", + "status" + ], + "status": "available", + "prerequisites": [ + "ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment" + }, + { + "name": "inbox", + "commands": [ + "prepare", + "accept", + "status" + ], + "status": "available", + "prerequisites": [ + "explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction" + ], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment" + }, + { + "name": "workbench", + "commands": [ + "link", + "status", + "list" + ], + "status": "available", + "prerequisites": [], + "missing": [], + "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes" + }, + { + "name": "workcell", + "commands": [ + "agent-bench", + "app-handoff", + "bench", + "bench-operator", + "bench-runner", + "body", + "body-network", + "controller", + "episode", + "image-guided", + "measurement", + "network-bench-operator", + "order-app", + "qualify-bench", + "qualify-network-body", + "qualify-network-workbench", + "qualify-order-handoff", + "qualify-workbench-crashes", + "qualify-workbench-health", + "qualify-workbench-recovery", + "qualify-workbench-restarts", + "record-network-workbench", + "score-agent-bench", + "score-network-body", + "score-network-workbench", + "score-operator", + "score-workbench-crashes", + "score-workbench-health", + "score-workbench-recovery", + "score-workbench-restarts" + ], + "status": "optional_dependencies_missing", + "prerequisites": [ + "mujoco==3.15.0", + "numpy", + "headless rendering libraries for image operations", + "qualification commands require owned fixture inputs" + ], + "missing": [ + "mujoco", + "numpy" + ], + "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell", + "command_prerequisites": { + "record-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-order-handoff": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "qualify-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-agent-bench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-body": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-network-workbench": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-operator": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-crashes": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-health": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-recovery": [ + "matching source checkout for Git-frozen research qualification" + ], + "score-workbench-restarts": [ + "matching source checkout for Git-frozen research qualification" + ] + } + }, + { + "name": "browser-inspection", + "commands": [ + "summarize", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-experiments", + "commands": [ + "compare", + "coverage", + "publication-gate", + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + }, + { + "name": "inspection-transport", + "commands": [ + "export" + ], + "status": "available", + "prerequisites": [ + "Node.js for executable analyses", + "caller-supplied permitted tab/CDP adapter for capture libraries" + ], + "missing": [], + "capture": "adapter_required" + } + ], + "effect_semantics": "Read action receipts and resource-bound readback; exit 0 alone is not completion proof" + } + }, + "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"schema_version\": \"1\", \"entrypoint\": \"footwork\", \"global_options\": {\"--json\": \"Prefix before the command; preserves exit status and does not certify effects\"}, \"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"agent_commands\": [\"tools\", \"catalog\", \"schema\", \"doctor\", \"invoke\", \"capability\", \"mcp\", \"tool\"], \"surfaces\": {\"browser\": {\"commands\": [\"start\", \"check-file\", \"do\", \"done\", \"grant\", \"inspect-target\", \"look\", \"read\", \"s1\", \"snapshot-file\", \"status\", \"visual-check\", \"cdp\"], \"route\": \"dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)\", \"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}}, \"desktop\": {\"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"route\": \"native Linux X11/AT-SPI; live target binding required\"}}, \"capability\": {\"commands\": [\"doctor\", \"config\", \"server\", \"report\"], \"scope\": \"one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified\"}, \"tools\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"effect_semantics\": \"Read action receipts and resource-bound readback; exit 0 alone is not completion proof\"}}" + }, + "stderr": { + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "bytes": 0, + "json": null, + "text": "" + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/e4df2c6/environment.json b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/environment.json new file mode 100644 index 0000000..2da2ab1 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/environment.json @@ -0,0 +1,119 @@ +{ + "utc_started": "2026-10-31T19:10:15.142698+00:00", + "baseline_source": "e4df2c6b04644c332c8a636c556ae2fee0822d28", + "measurement_commit": "e4df2c6b04644c332c8a636c556ae2fee0822d28", + "evidence_commit": "bb6851ad038d0dcf897911d2019ccb3c87049a70", + "receipt_helpers_sha256": { + "receipt_plugin.py": "beece1b7042b449af48b533c6a984fe2e899c7017825d830f2d84a445391e9df", + "pytest_main.py": "c23cefeb8fb2cf19f48946a23cd1cb66606953798057a99d3e5ba34d20ac5c27" + }, + "harness_sha256": "d39c117441f3b2a174606c2f716dffaad64291c064b1ad216937b35d38d0d492", + "wheel": { + "name": "jevdual-0.0.1-py3-none-any.whl", + "sha256": "ae780174a9f0dcfc0583dd9ed9c814f9f940fbfa54b6f64fdf50aad38233b059" + }, + "test_sha256": { + "test_cdp_effector.py": "d3d4a2f689c8f0dae42a8a74656b24457f45acd0305f2614868cdd2716ba39b2", + "test_cdp_transport_deadline.py": "c4d10e3605598345b9cdee54ecdd3b4b749c0aefdeb05f675c1bab2f40f68594", + "test_cdp_launch_custody.py": "266544670851452c2c034443bec4abd8fff5815f0b4a2da87342ae7eb3546777", + "test_cdp_click.py": "0c004967776609b3151bc7321f2c0ed96c6e437f12e5ea8311996298c454b7e7", + "test_cdp_click_contract.py": "34c07ad6dbd0eb5764b212d5ca072f81ebd3561bd5844569a3d1b98f02d0e0a1", + "test_browser_durable_authority.py": "9f2323333ecda0585431f16932afb331b42d3de827a396cceaf94a7a843e9b1a", + "test_browser_holder.py": "026370f851f6d6349f68dec3f8ffc47436dbd76b359bc71d4ce4defe33290254", + "test_browser_guard.py": "464a1180f1953495813fb7230a0849026d901125eb8054275c72f039191aff6d", + "test_browser_cdp_cli.py": "6818b7807c65ae64c067a94522558e2bbb4788b91b6c76e957725778a2d11b54", + "test_browser_restart_cli.py": "08368a52eadf7aa3645641a5bbf616eef53b4f71bfe5acd4da70bbb194ac1995", + "test_browser_startup_cli.py": "5010f823a9710ea69bc89e3c53fe61a9ea4ee1f28420c7551b948ac6768b7e84", + "test_browser_startup_lifecycle.py": "330232c60a1e56ae657744dc82ab3e7d2efadf6e3771981052c2018fcf4b97bf" + }, + "verified_installed_package_files": 206, + "origins": { + "jevdual": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/__init__.py", + "operations": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/effectors/cdp/operations.py", + "python": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", + "prefix": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer", + "sys_path": [ + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python312.zip", + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12", + "/opt/codex/runtimes/codex-primary-runtime/dependencies/python/lib/python3.12/lib-dynload", + "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages" + ] + }, + "packages": { + "Pygments": "2.21.0", + "jevdual": "0.0.1", + "psutil": "7.2.2", + "pytest": "8.4.2", + "pluggy": "1.7.0", + "websockets": "15.0.1", + "packaging": "26.3", + "iniconfig": "2.3.1" + }, + "optional_backends": { + "cua_driver": false, + "browser_use": false + }, + "python": "3.12.14 (main, Aug 25 2026, 14:00:49) [Clang 22.1.3 ]", + "os_release": "PRETTY_NAME=\"Debian GNU/Linux 13 (trixie)\"\nNAME=\"Debian GNU/Linux\"\nVERSION_ID=\"13\"\nVERSION=\"13 (trixie)\"\nVERSION_CODENAME=trixie\nDEBIAN_VERSION_FULL=13.6\nID=debian\nHOME_URL=\"https://www.debian.org/\"\nSUPPORT_URL=\"https://www.debian.org/support\"\nBUG_REPORT_URL=\"https://bugs.debian.org/\"", + "kernel": { + "system": "Linux", + "release": "6.18.57", + "machine": "x86_64" + }, + "chrome": { + "executable": "/usr/lib/chromium/chromium", + "sha256": "4dc9f9f9b20e9bd95bf201f43d2d643f48938f36a70ddcb6fce3dd611a178180", + "version": "Chromium 154.0.8037.57", + "sandbox_override": false + }, + "cgroup_membership": "0::/", + "cgroup": { + "cpu.max": "400000 100000", + "cpuset.cpus.effective": "0-4", + "memory.max": "17179869184", + "memory.swap.max": "max", + "pids.max": "max", + "memory.events": "low 0\nhigh 0\nmax 0\noom 0\noom_kill 0\noom_group_kill 0", + "pids.events": "max 0" + }, + "affinity": [ + 0, + 1, + 2, + 3, + 4 + ], + "uid": 1000, + "rlimits": { + "RLIMIT_CORE": [ + 0, + -1 + ], + "RLIMIT_NPROC": [ + 71955, + 71955 + ], + "RLIMIT_NOFILE": [ + 16384, + 16384 + ], + "RLIMIT_AS": [ + -1, + -1 + ] + }, + "kernel_policy": { + "/proc/sys/kernel/unprivileged_userns_clone": { + "unavailable": "FileNotFoundError" + }, + "/proc/sys/user/max_user_namespaces": "71955", + "/proc/sys/kernel/core_pattern": { + "unavailable": "FileNotFoundError" + } + }, + "pid1": "tail", + "test_wrapper_subreaper": true, + "watchdog_seconds": 600, + "cleanup_grace_seconds": 3, + "scope": "explicit durable CDP CLI and holder; typing/completion oracle/light metadata split remain off" +} diff --git a/jevdual/results/durable-cdp-vm-20261031/e4df2c6/inspected-summary.json b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/inspected-summary.json new file mode 100644 index 0000000..7cc3fd3 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/inspected-summary.json @@ -0,0 +1,269 @@ +{ + "source": "e4df2c6b04644c332c8a636c556ae2fee0822d28", + "wheel_sha256": "ae780174a9f0dcfc0583dd9ed9c814f9f940fbfa54b6f64fdf50aad38233b059", + "total": 201, + "passed": 201, + "failed": 0, + "skipped": 0, + "by_module": { + "test_browser_cdp_cli": 3, + "test_browser_durable_authority": 49, + "test_browser_guard": 6, + "test_browser_holder": 20, + "test_browser_restart_cli": 3, + "test_browser_startup_cli": 3, + "test_browser_startup_lifecycle": 6, + "test_cdp_click": 30, + "test_cdp_click_contract": 33, + "test_cdp_effector": 17, + "test_cdp_launch_custody": 10, + "test_cdp_transport_deadline": 21 + }, + "retention_sensitivity_cases": [ + { + "classname": "test_browser_holder", + "name": "test_post_admission_retention_failure_never_certifies_no_send[False]", + "time": "0.010" + }, + { + "classname": "test_browser_holder", + "name": "test_post_admission_retention_failure_never_certifies_no_send[True]", + "time": "0.010" + } + ], + "cells": { + "client-lost-ack": { + "fixture_records": [ + [ + "intended" + ] + ], + "markers": [], + "helper_receipts": 9, + "startup_reports": [] + }, + "missing-guard": { + "fixture_records": [ + [] + ], + "markers": [], + "helper_receipts": 5, + "startup_reports": [] + }, + "prepared": { + "fixture_records": [ + [] + ], + "markers": [ + { + "boundary": "prepared", + "operation_id": "op_ec51ec70ca99", + "ingress_before_exit": null, + "heavy_imports": [] + } + ], + "helper_receipts": 7, + "startup_reports": [] + }, + "started": { + "fixture_records": [ + [] + ], + "markers": [ + { + "boundary": "started", + "operation_id": "op_970398a7ad7a", + "ingress_before_exit": null, + "heavy_imports": [] + } + ], + "helper_receipts": 8, + "startup_reports": [] + }, + "retained": { + "fixture_records": [ + [ + "intended" + ] + ], + "markers": [ + { + "boundary": "retained", + "operation_id": "op_bcb57171c8b6", + "ingress_before_exit": 1, + "heavy_imports": [] + } + ], + "helper_receipts": 8, + "startup_reports": [] + }, + "startup-launch-15": { + "fixture_records": [], + "markers": [ + { + "phase": "launch", + "pid": 18255, + "start": 1793473844.36, + "captured": { + "18255": 1793473844.36, + "18262": 1793473844.4, + "18264": 1793473844.4, + "18294": 1793473844.45, + "18266": 1793473844.43, + "18302": 1793473844.49, + "18286": 1793473844.45 + } + } + ], + "helper_receipts": 0, + "startup_reports": [ + { + "phase": "launch", + "test_subreaper": true, + "holder_exit": 0, + "live_before_test_cleanup": [], + "holder_published": false, + "chrome_pid": 18255, + "captured_count": 10, + "zombies_before_test_reap": [ + 18257, + 18261, + 18262, + 18294, + 18286 + ], + "test_reaped": 5, + "live_after_test_cleanup": [] + } + ] + }, + "startup-launch-2": { + "fixture_records": [], + "markers": [ + { + "phase": "launch", + "pid": 18368, + "start": 1793473846.21, + "captured": { + "18368": 1793473846.21, + "18375": 1793473846.26, + "18377": 1793473846.26, + "18403": 1793473846.32, + "18379": 1793473846.3, + "18426": 1793473846.37, + "18401": 1793473846.32 + } + } + ], + "helper_receipts": 0, + "startup_reports": [ + { + "phase": "launch", + "test_subreaper": true, + "holder_exit": 0, + "live_before_test_cleanup": [], + "holder_published": false, + "chrome_pid": 18368, + "captured_count": 11, + "zombies_before_test_reap": [ + 18370, + 18374, + 18375, + 18377, + 18403, + 18401 + ], + "test_reaped": 6, + "live_after_test_cleanup": [] + } + ] + }, + "startup-connect-15": { + "fixture_records": [], + "markers": [ + { + "phase": "connect", + "pid": 18479, + "start": 1793473848.1, + "captured": { + "18479": 1793473848.1, + "18487": 1793473848.13, + "18488": 1793473848.14, + "18512": 1793473848.2, + "18490": 1793473848.18, + "18536": 1793473848.24, + "18549": 1793473848.3, + "18558": 1793473848.32, + "18559": 1793473848.32, + "18510": 1793473848.19 + } + } + ], + "helper_receipts": 0, + "startup_reports": [ + { + "phase": "connect", + "test_subreaper": true, + "holder_exit": 0, + "live_before_test_cleanup": [], + "holder_published": false, + "chrome_pid": 18479, + "captured_count": 13, + "zombies_before_test_reap": [ + 18481, + 18485, + 18487, + 18512, + 18510 + ], + "test_reaped": 5, + "live_after_test_cleanup": [] + } + ] + }, + "startup-navigate-15": { + "fixture_records": [], + "markers": [ + { + "phase": "navigate", + "pid": 18584, + "start": 1793473848.57, + "captured": { + "18584": 1793473848.57, + "18591": 1793473848.61, + "18592": 1793473848.61, + "18619": 1793473848.67, + "18595": 1793473848.64, + "18642": 1793473848.71, + "18660": 1793473848.76, + "18669": 1793473848.78, + "18670": 1793473848.78, + "18617": 1793473848.66 + } + } + ], + "helper_receipts": 0, + "startup_reports": [ + { + "phase": "navigate", + "test_subreaper": true, + "holder_exit": 0, + "live_before_test_cleanup": [], + "holder_published": false, + "chrome_pid": 18584, + "captured_count": 14, + "zombies_before_test_reap": [ + 18586, + 18590, + 18591, + 18592, + 18619, + 18617 + ], + "test_reaped": 6, + "live_after_test_cleanup": [] + } + ] + } + } +} diff --git a/jevdual/results/durable-cdp-vm-20261031/e4df2c6/junit.xml b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/junit.xml new file mode 100644 index 0000000..dcc8a78 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/junit.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/jevdual/results/durable-cdp-vm-20261031/e4df2c6/observer.jsonl b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/observer.jsonl new file mode 100644 index 0000000..1e49a06 --- /dev/null +++ b/jevdual/results/durable-cdp-vm-20261031/e4df2c6/observer.jsonl @@ -0,0 +1,999 @@ +{"kind": "pytest_report", "monotonic": 7381.627888976, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "phase": "setup", "outcome": "passed", "duration": 0.00012187999982415931, "longrepr": null} +{"kind": "spawn", "monotonic": 7381.628627941, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17575, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7381.692374102, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17575, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7381.692471787, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17575, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7381.692789268, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17575, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "e7fa3e742a542a1e8b11fc5606bf2e2cb2ec3c392c9c5e15a8b88d7191f69c97", "bytes": 6642, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"schema_version": "1", "entrypoint": "footwork", "global_options": {"--json": "Prefix before the command; preserves exit status and does not certify effects"}, "commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "agent_commands": ["tools", "catalog", "schema", "doctor", "invoke", "capability", "mcp", "tool"], "surfaces": {"browser": {"commands": ["start", "check-file", "do", "done", "grant", "inspect-target", "look", "read", "s1", "snapshot-file", "status", "visual-check", "cdp"], "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", "cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}}, "desktop": {"commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "route": "native Linux X11/AT-SPI; live target binding required"}}, "capability": {"commands": ["doctor", "config", "server", "report"], "scope": "one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified"}, "tools": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "effect_semantics": "Read action receipts and resource-bound readback; exit 0 alone is not completion proof"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"schema_version\": \"1\", \"entrypoint\": \"footwork\", \"global_options\": {\"--json\": \"Prefix before the command; preserves exit status and does not certify effects\"}, \"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"agent_commands\": [\"tools\", \"catalog\", \"schema\", \"doctor\", \"invoke\", \"capability\", \"mcp\", \"tool\"], \"surfaces\": {\"browser\": {\"commands\": [\"start\", \"check-file\", \"do\", \"done\", \"grant\", \"inspect-target\", \"look\", \"read\", \"s1\", \"snapshot-file\", \"status\", \"visual-check\", \"cdp\"], \"route\": \"dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)\", \"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}}, \"desktop\": {\"commands\": [\"run\", \"menu\", \"apps\", \"start\", \"look\", \"inspect-target\", \"visual-check\", \"do\", \"s1\", \"done\", \"read\", \"check-file\", \"check-artifact\", \"grant\", \"snapshot-file\", \"status\"], \"route\": \"native Linux X11/AT-SPI; live target binding required\"}}, \"capability\": {\"commands\": [\"doctor\", \"config\", \"server\", \"report\"], \"scope\": \"one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified\"}, \"tools\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"effect_semantics\": \"Read action receipts and resource-bound readback; exit 0 alone is not completion proof\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 7381.692949315, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 1, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17575, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "tools"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 7381.693030365, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["tools"], "result": {"schema_version": "1", "entrypoint": "footwork", "global_options": {"--json": "Prefix before the command; preserves exit status and does not certify effects"}, "commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "agent_commands": ["tools", "catalog", "schema", "doctor", "invoke", "capability", "mcp", "tool"], "surfaces": {"browser": {"commands": ["start", "check-file", "do", "done", "grant", "inspect-target", "look", "read", "s1", "snapshot-file", "status", "visual-check", "cdp"], "route": "dedicated Chrome / CUA DevTools (legacy); owned headless CDP (explicit cdp)", "cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}}, "desktop": {"commands": ["run", "menu", "apps", "start", "look", "inspect-target", "visual-check", "do", "s1", "done", "read", "check-file", "check-artifact", "grant", "snapshot-file", "status"], "route": "native Linux X11/AT-SPI; live target binding required"}}, "capability": {"commands": ["doctor", "config", "server", "report"], "scope": "one configured browser-to-Mousepad job on X11/AT-SPI; Wayland and shared foreground unqualified"}, "tools": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "effect_semantics": "Read action receipts and resource-bound readback; exit 0 alone is not completion proof"}} +{"kind": "spawn", "monotonic": 7381.693588141, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17576, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7381.822573832, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17576, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7381.822686018, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17576, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7381.824074246, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17576, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "eb9cf031005c95c68912ba7f746815e61bf51c827d398a802c3909cbf62e16dd", "bytes": 12093, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"platform": "linux", "supported": true, "runtime": {"python_version": "3.12.14", "python_requirement": ">=3.11,<4.0", "python_compatible": true, "interpreter": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "architecture": "x86_64", "distribution": {"version": "0.0.1", "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages"}, "loaded_modules": {"jevdual": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/__init__.py", "jevdual.capability.setup": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py"}}, "dependencies": {"browser-use": {"version": null, "requirement": "==0.13.14", "compatible": false, "location": null}, "typesafe-sdk": {"version": null, "requirement": "<1,>=0.7", "compatible": false, "location": null}, "orjson": {"version": null, "requirement": ">=3.10", "compatible": false, "location": null}, "psutil": {"version": "7.2.2", "requirement": "==7.2.2", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages"}, "websockets": {"version": "15.0.1", "requirement": "==15.0.1", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages"}, "mcp": {"version": null, "requirement": "==2.1.1", "compatible": false, "location": null}, "packaging": {"version": "26.3", "requirement": "<27,>=25", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages"}, "cua-driver": {"version": null, "requirement": "==0.38.0+footwork.d5373879.cleanup2", "compatible": false, "location": null}, "jeepney": {"version": null, "requirement": "==0.9.0", "compatible": false, "location": null}}, "dependency_status": "blocked", "permissions": {"accessibility": "not_checked", "screen_recording": "not_checked", "session": {"x11_display_present": false, "dbus_session_present": false, "wayland_display_present": false, "connection": "not_checked"}, "requirements": ["An accessible X11 display and D-Bus desktop session.", "AT-SPI accessibility access to the explicitly bound process and window.", "Live observation and exact text readback before input; environment presence grants no access."]}, "scope": "not_checked", "journal": "not_checked", "warnings": ["Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified."], "dependency_metadata": "installed distribution", "limitation": "Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.", "runtime_qualification": "not_checked", "provider_account_required": false, "rust_toolchain_required": false, "blockers": ["dependency_missing", "accessibility_not_checked", "x11_display_not_configured", "session_bus_not_configured"], "prerequisite_status": "blocked", "qualification": "Prerequisites only. Window identity, current state, effects and job completion require separate checks.", "acceleration": {"component": "jevdual._core", "available": false, "status": "disabled", "backend": "pure-python", "scope": "Optional Jev Rust hot paths; independent of the CUA native driver"}, "host_prerequisites": {"schema_version": 1, "platform": "linux", "architecture": "x86_64", "kernel": "6.18.57", "libc": "glibc 2.41", "distribution": {"PRETTY_NAME": "Debian GNU/Linux 13 (trixie)", "VERSION_ID": "13", "ID": "debian"}, "python": {"version": "3.12.14", "pip_module": false, "venv_module": true, "ensurepip_module": true}, "resources": {"memory": {"total_bytes": 18882662400, "available_bytes": 17939697664}, "cgroup": {"versions": [2], "membership_readable": true, "memory_limit_bytes": 17179869184, "memory_remaining_bytes": 15727390720, "cpu_quota_cores": 4.0, "scope": "visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified", "null_limit_meaning": "no finite limit observed, not proof of unlimited resources", "pids_limit": null, "pids_remaining_upper_bound": null, "swap_limit_bytes": null, "memory_and_swap_limit_bytes": null, "task_swap_event_snapshots": [{"path": ".", "pids_limit": null, "pids_current": 60, "pids_events": {"max": 0}, "swap_limit_bytes": null, "swap_current_bytes": 0, "swap_events": {"high": 0, "max": 0, "fail": 0}, "memory_events": {"low": 0, "high": 0, "max": 0, "oom": 0, "oom_kill": 0, "oom_group_kill": 0}, "memory_failcnt": null, "memory_and_swap_failcnt": null}], "counter_scope": "bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown"}, "available_memory_upper_bound_bytes": 15727390720, "cpu_count": 5, "cpu_affinity_count": 5}, "process_supervision": {"pid1_comm": "tail", "self_parent_pid": 17574, "pid1_is_self": false, "orphan_reaping": "not_checked", "wait_ownership": "not_checked"}, "executables_present": {"uv": true, "pip": true, "pip3": true, "rustc": false, "cargo": false, "rustup": false, "cc": true, "clang": false, "pkg-config": true, "google-chrome": false, "google-chrome-stable": false, "chromium": true, "chromium-browser": false, "dbus-run-session": true, "dbus-send": true, "gdbus": true, "Xvfb": false, "node": true, "ffmpeg": true, "tesseract": true}, "session_indicators_present": {"DISPLAY": false, "WAYLAND_DISPLAY": false, "DBUS_SESSION_BUS_ADDRESS": false, "XDG_RUNTIME_DIR": false}, "prerequisite_candidates": {"browser_executable": true, "graphical_session_indicator": false, "session_bus_indicator": false}, "runtime_qualification": "unverified", "effect_verification": "not_asserted", "limitations": ["Executable and environment presence do not establish connection, permissions, or driver support.", "No browser, desktop, accessibility service, native CUA library, or provider was started or queried.", "Resource values are a transient upper bound, not a reservation or build-capacity guarantee.", "Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control."]}, "tool_families": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "browser_profiles": {"cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "prerequisite_presence": {"chrome": true, "psutil": true, "websockets": true, "jev_environment_configured": false, "judgment_adapter": "explicit per-session configuration; not checked by offline doctor"}, "runtime_qualification": "not_checked"}, "legacy": {"profile": "full-desktop", "requires": ["CUA", "X11/AT-SPI on Linux"]}}, "profile_note": "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.", "effect_verification": "not_asserted"}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"platform\": \"linux\", \"supported\": true, \"runtime\": {\"python_version\": \"3.12.14\", \"python_requirement\": \">=3.11,<4.0\", \"python_compatible\": true, \"interpreter\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python\", \"architecture\": \"x86_64\", \"distribution\": {\"version\": \"0.0.1\", \"location\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages\"}, \"loaded_modules\": {\"jevdual\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/__init__.py\", \"jevdual.capability.setup\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py\"}}, \"dependencies\": {\"browser-use\": {\"version\": null, \"requirement\": \"==0.13.14\", \"compatible\": false, \"location\": null}, \"typesafe-sdk\": {\"version\": null, \"requirement\": \"<1,>=0.7\", \"compatible\": false, \"location\": null}, \"orjson\": {\"version\": null, \"requirement\": \">=3.10\", \"compatible\": false, \"location\": null}, \"psutil\": {\"version\": \"7.2.2\", \"requirement\": \"==7.2.2\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages\"}, \"websockets\": {\"version\": \"15.0.1\", \"requirement\": \"==15.0.1\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages\"}, \"mcp\": {\"version\": null, \"requirement\": \"==2.1.1\", \"compatible\": false, \"location\": null}, \"packaging\": {\"version\": \"26.3\", \"requirement\": \"<27,>=25\", \"compatible\": true, \"location\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages\"}, \"cua-driver\": {\"version\": null, \"requirement\": \"==0.38.0+footwork.d5373879.cleanup2\", \"compatible\": false, \"location\": null}, \"jeepney\": {\"version\": null, \"requirement\": \"==0.9.0\", \"compatible\": false, \"location\": null}}, \"dependency_status\": \"blocked\", \"permissions\": {\"accessibility\": \"not_checked\", \"screen_recording\": \"not_checked\", \"session\": {\"x11_display_present\": false, \"dbus_session_present\": false, \"wayland_display_present\": false, \"connection\": \"not_checked\"}, \"requirements\": [\"An accessible X11 display and D-Bus desktop session.\", \"AT-SPI accessibility access to the explicitly bound process and window.\", \"Live observation and exact text readback before input; environment presence grants no access.\"]}, \"scope\": \"not_checked\", \"journal\": \"not_checked\", \"warnings\": [\"Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified.\"], \"dependency_metadata\": \"installed distribution\", \"limitation\": \"Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.\", \"runtime_qualification\": \"not_checked\", \"provider_account_required\": false, \"rust_toolchain_required\": false, \"blockers\": [\"dependency_missing\", \"accessibility_not_checked\", \"x11_display_not_configured\", \"session_bus_not_configured\"], \"prerequisite_status\": \"blocked\", \"qualification\": \"Prerequisites only. Window identity, current state, effects and job completion require separate checks.\", \"acceleration\": {\"component\": \"jevdual._core\", \"available\": false, \"status\": \"disabled\", \"backend\": \"pure-python\", \"scope\": \"Optional Jev Rust hot paths; independent of the CUA native driver\"}, \"host_prerequisites\": {\"schema_version\": 1, \"platform\": \"linux\", \"architecture\": \"x86_64\", \"kernel\": \"6.18.57\", \"libc\": \"glibc 2.41\", \"distribution\": {\"PRETTY_NAME\": \"Debian GNU/Linux 13 (trixie)\", \"VERSION_ID\": \"13\", \"ID\": \"debian\"}, \"python\": {\"version\": \"3.12.14\", \"pip_module\": false, \"venv_module\": true, \"ensurepip_module\": true}, \"resources\": {\"memory\": {\"total_bytes\": 18882662400, \"available_bytes\": 17939697664}, \"cgroup\": {\"versions\": [2], \"membership_readable\": true, \"memory_limit_bytes\": 17179869184, \"memory_remaining_bytes\": 15727390720, \"cpu_quota_cores\": 4.0, \"scope\": \"visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified\", \"null_limit_meaning\": \"no finite limit observed, not proof of unlimited resources\", \"pids_limit\": null, \"pids_remaining_upper_bound\": null, \"swap_limit_bytes\": null, \"memory_and_swap_limit_bytes\": null, \"task_swap_event_snapshots\": [{\"path\": \".\", \"pids_limit\": null, \"pids_current\": 60, \"pids_events\": {\"max\": 0}, \"swap_limit_bytes\": null, \"swap_current_bytes\": 0, \"swap_events\": {\"high\": 0, \"max\": 0, \"fail\": 0}, \"memory_events\": {\"low\": 0, \"high\": 0, \"max\": 0, \"oom\": 0, \"oom_kill\": 0, \"oom_group_kill\": 0}, \"memory_failcnt\": null, \"memory_and_swap_failcnt\": null}], \"counter_scope\": \"bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown\"}, \"available_memory_upper_bound_bytes\": 15727390720, \"cpu_count\": 5, \"cpu_affinity_count\": 5}, \"process_supervision\": {\"pid1_comm\": \"tail\", \"self_parent_pid\": 17574, \"pid1_is_self\": false, \"orphan_reaping\": \"not_checked\", \"wait_ownership\": \"not_checked\"}, \"executables_present\": {\"uv\": true, \"pip\": true, \"pip3\": true, \"rustc\": false, \"cargo\": false, \"rustup\": false, \"cc\": true, \"clang\": false, \"pkg-config\": true, \"google-chrome\": false, \"google-chrome-stable\": false, \"chromium\": true, \"chromium-browser\": false, \"dbus-run-session\": true, \"dbus-send\": true, \"gdbus\": true, \"Xvfb\": false, \"node\": true, \"ffmpeg\": true, \"tesseract\": true}, \"session_indicators_present\": {\"DISPLAY\": false, \"WAYLAND_DISPLAY\": false, \"DBUS_SESSION_BUS_ADDRESS\": false, \"XDG_RUNTIME_DIR\": false}, \"prerequisite_candidates\": {\"browser_executable\": true, \"graphical_session_indicator\": false, \"session_bus_indicator\": false}, \"runtime_qualification\": \"unverified\", \"effect_verification\": \"not_asserted\", \"limitations\": [\"Executable and environment presence do not establish connection, permissions, or driver support.\", \"No browser, desktop, accessibility service, native CUA library, or provider was started or queried.\", \"Resource values are a transient upper bound, not a reservation or build-capacity guarantee.\", \"Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control.\"]}, \"tool_families\": [{\"name\": \"camera\", \"commands\": [\"doctor\", \"capture\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment\"}, {\"name\": \"inbox\", \"commands\": [\"prepare\", \"accept\", \"status\"], \"status\": \"available\", \"prerequisites\": [\"explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction\"], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment\"}, {\"name\": \"workbench\", \"commands\": [\"link\", \"status\", \"list\"], \"status\": \"available\", \"prerequisites\": [], \"missing\": [], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes\"}, {\"name\": \"workcell\", \"commands\": [\"agent-bench\", \"app-handoff\", \"bench\", \"bench-operator\", \"bench-runner\", \"body\", \"body-network\", \"controller\", \"episode\", \"image-guided\", \"measurement\", \"network-bench-operator\", \"order-app\", \"qualify-bench\", \"qualify-network-body\", \"qualify-network-workbench\", \"qualify-order-handoff\", \"qualify-workbench-crashes\", \"qualify-workbench-health\", \"qualify-workbench-recovery\", \"qualify-workbench-restarts\", \"record-network-workbench\", \"score-agent-bench\", \"score-network-body\", \"score-network-workbench\", \"score-operator\", \"score-workbench-crashes\", \"score-workbench-health\", \"score-workbench-recovery\", \"score-workbench-restarts\"], \"status\": \"optional_dependencies_missing\", \"prerequisites\": [\"mujoco==3.15.0\", \"numpy\", \"headless rendering libraries for image operations\", \"qualification commands require owned fixture inputs\"], \"missing\": [\"mujoco\", \"numpy\"], \"output_root\": \"/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell\", \"command_prerequisites\": {\"record-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-order-handoff\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"qualify-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"], \"score-agent-bench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-body\": [\"matching source checkout for Git-frozen research qualification\"], \"score-network-workbench\": [\"matching source checkout for Git-frozen research qualification\"], \"score-operator\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-crashes\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-health\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-recovery\": [\"matching source checkout for Git-frozen research qualification\"], \"score-workbench-restarts\": [\"matching source checkout for Git-frozen research qualification\"]}}, {\"name\": \"browser-inspection\", \"commands\": [\"summarize\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-experiments\", \"commands\": [\"compare\", \"coverage\", \"publication-gate\", \"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}, {\"name\": \"inspection-transport\", \"commands\": [\"export\"], \"status\": \"available\", \"prerequisites\": [\"Node.js for executable analyses\", \"caller-supplied permitted tab/CDP adapter for capture libraries\"], \"missing\": [], \"capture\": \"adapter_required\"}], \"browser_profiles\": {\"cdp\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"prerequisite_presence\": {\"chrome\": true, \"psutil\": true, \"websockets\": true, \"jev_environment_configured\": false, \"judgment_adapter\": \"explicit per-session configuration; not checked by offline doctor\"}, \"runtime_qualification\": \"not_checked\"}, \"legacy\": {\"profile\": \"full-desktop\", \"requires\": [\"CUA\", \"X11/AT-SPI on Linux\"]}}, \"profile_note\": \"Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.\", \"effect_verification\": \"not_asserted\"}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 7381.824492446, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 2, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17576, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "doctor"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 7381.824608778, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["doctor"], "result": {"platform": "linux", "supported": true, "runtime": {"python_version": "3.12.14", "python_requirement": ">=3.11,<4.0", "python_compatible": true, "interpreter": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "architecture": "x86_64", "distribution": {"version": "0.0.1", "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages"}, "loaded_modules": {"jevdual": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/__init__.py", "jevdual.capability.setup": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages/jevdual/capability/setup.py"}}, "dependencies": {"browser-use": {"version": null, "requirement": "==0.13.14", "compatible": false, "location": null}, "typesafe-sdk": {"version": null, "requirement": "<1,>=0.7", "compatible": false, "location": null}, "orjson": {"version": null, "requirement": ">=3.10", "compatible": false, "location": null}, "psutil": {"version": "7.2.2", "requirement": "==7.2.2", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages"}, "websockets": {"version": "15.0.1", "requirement": "==15.0.1", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages"}, "mcp": {"version": null, "requirement": "==2.1.1", "compatible": false, "location": null}, "packaging": {"version": "26.3", "requirement": "<27,>=25", "compatible": true, "location": "/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/lib/python3.12/site-packages"}, "cua-driver": {"version": null, "requirement": "==0.38.0+footwork.d5373879.cleanup2", "compatible": false, "location": null}, "jeepney": {"version": null, "requirement": "==0.9.0", "compatible": false, "location": null}}, "dependency_status": "blocked", "permissions": {"accessibility": "not_checked", "screen_recording": "not_checked", "session": {"x11_display_present": false, "dbus_session_present": false, "wayland_display_present": false, "connection": "not_checked"}, "requirements": ["An accessible X11 display and D-Bus desktop session.", "AT-SPI accessibility access to the explicitly bound process and window.", "Live observation and exact text readback before input; environment presence grants no access."]}, "scope": "not_checked", "journal": "not_checked", "warnings": ["Linux X11/AT-SPI access is checked by a live target bind, not this prerequisite report. Wayland and shared foreground input are not qualified."], "dependency_metadata": "installed distribution", "limitation": "Linux X11/AT-SPI only: one loopback HTTP browser fixture and one identified Mousepad document. Session access, window identity and exact text are checked when binding. Wayland and shared foreground input are not qualified.", "runtime_qualification": "not_checked", "provider_account_required": false, "rust_toolchain_required": false, "blockers": ["dependency_missing", "accessibility_not_checked", "x11_display_not_configured", "session_bus_not_configured"], "prerequisite_status": "blocked", "qualification": "Prerequisites only. Window identity, current state, effects and job completion require separate checks.", "acceleration": {"component": "jevdual._core", "available": false, "status": "disabled", "backend": "pure-python", "scope": "Optional Jev Rust hot paths; independent of the CUA native driver"}, "host_prerequisites": {"schema_version": 1, "platform": "linux", "architecture": "x86_64", "kernel": "6.18.57", "libc": "glibc 2.41", "distribution": {"PRETTY_NAME": "Debian GNU/Linux 13 (trixie)", "VERSION_ID": "13", "ID": "debian"}, "python": {"version": "3.12.14", "pip_module": false, "venv_module": true, "ensurepip_module": true}, "resources": {"memory": {"total_bytes": 18882662400, "available_bytes": 17939697664}, "cgroup": {"versions": [2], "membership_readable": true, "memory_limit_bytes": 17179869184, "memory_remaining_bytes": 15727390720, "cpu_quota_cores": 4.0, "scope": "visible standard cgroup mounts and ancestors; hidden or custom mounts are unverified", "null_limit_meaning": "no finite limit observed, not proof of unlimited resources", "pids_limit": null, "pids_remaining_upper_bound": null, "swap_limit_bytes": null, "memory_and_swap_limit_bytes": null, "task_swap_event_snapshots": [{"path": ".", "pids_limit": null, "pids_current": 60, "pids_events": {"max": 0}, "swap_limit_bytes": null, "swap_current_bytes": 0, "swap_events": {"high": 0, "max": 0, "fail": 0}, "memory_events": {"low": 0, "high": 0, "max": 0, "oom": 0, "oom_kill": 0, "oom_group_kill": 0}, "memory_failcnt": null, "memory_and_swap_failcnt": null}], "counter_scope": "bounded visible hierarchy snapshots; missing/delegated/hidden counters remain unknown"}, "available_memory_upper_bound_bytes": 15727390720, "cpu_count": 5, "cpu_affinity_count": 5}, "process_supervision": {"pid1_comm": "tail", "self_parent_pid": 17574, "pid1_is_self": false, "orphan_reaping": "not_checked", "wait_ownership": "not_checked"}, "executables_present": {"uv": true, "pip": true, "pip3": true, "rustc": false, "cargo": false, "rustup": false, "cc": true, "clang": false, "pkg-config": true, "google-chrome": false, "google-chrome-stable": false, "chromium": true, "chromium-browser": false, "dbus-run-session": true, "dbus-send": true, "gdbus": true, "Xvfb": false, "node": true, "ffmpeg": true, "tesseract": true}, "session_indicators_present": {"DISPLAY": false, "WAYLAND_DISPLAY": false, "DBUS_SESSION_BUS_ADDRESS": false, "XDG_RUNTIME_DIR": false}, "prerequisite_candidates": {"browser_executable": true, "graphical_session_indicator": false, "session_bus_indicator": false}, "runtime_qualification": "unverified", "effect_verification": "not_asserted", "limitations": ["Executable and environment presence do not establish connection, permissions, or driver support.", "No browser, desktop, accessibility service, native CUA library, or provider was started or queried.", "Resource values are a transient upper bound, not a reservation or build-capacity guarantee.", "Prebuilt installation avoids compilers; Python fallback does not replace native CUA desktop control."]}, "tool_families": [{"name": "camera", "commands": ["doctor", "capture", "status"], "status": "available", "prerequisites": ["ffmpeg; explicit Linux V4L2 device or macOS AVFoundation camera; live device qualification required"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/camera-capture-experiment"}, {"name": "inbox", "commands": ["prepare", "accept", "status"], "status": "available", "prerequisites": ["explicit reviewed input; Linux Tesseract with English data or macOS Swift/Vision; ffmpeg for Linux mirror correction"], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/desk-inbox-experiment"}, {"name": "workbench", "commands": ["link", "status", "list"], "status": "available", "prerequisites": [], "missing": [], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/workbench-notes"}, {"name": "workcell", "commands": ["agent-bench", "app-handoff", "bench", "bench-operator", "bench-runner", "body", "body-network", "controller", "episode", "image-guided", "measurement", "network-bench-operator", "order-app", "qualify-bench", "qualify-network-body", "qualify-network-workbench", "qualify-order-handoff", "qualify-workbench-crashes", "qualify-workbench-health", "qualify-workbench-recovery", "qualify-workbench-restarts", "record-network-workbench", "score-agent-bench", "score-network-body", "score-network-workbench", "score-operator", "score-workbench-crashes", "score-workbench-health", "score-workbench-recovery", "score-workbench-restarts"], "status": "optional_dependencies_missing", "prerequisites": ["mujoco==3.15.0", "numpy", "headless rendering libraries for image operations", "qualification commands require owned fixture inputs"], "missing": ["mujoco", "numpy"], "output_root": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests/.footwork/tools/physical-workcell", "command_prerequisites": {"record-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-bench": ["matching source checkout for Git-frozen research qualification"], "qualify-network-body": ["matching source checkout for Git-frozen research qualification"], "qualify-network-workbench": ["matching source checkout for Git-frozen research qualification"], "qualify-order-handoff": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-health": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "qualify-workbench-restarts": ["matching source checkout for Git-frozen research qualification"], "score-agent-bench": ["matching source checkout for Git-frozen research qualification"], "score-network-body": ["matching source checkout for Git-frozen research qualification"], "score-network-workbench": ["matching source checkout for Git-frozen research qualification"], "score-operator": ["matching source checkout for Git-frozen research qualification"], "score-workbench-crashes": ["matching source checkout for Git-frozen research qualification"], "score-workbench-health": ["matching source checkout for Git-frozen research qualification"], "score-workbench-recovery": ["matching source checkout for Git-frozen research qualification"], "score-workbench-restarts": ["matching source checkout for Git-frozen research qualification"]}}, {"name": "browser-inspection", "commands": ["summarize", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-experiments", "commands": ["compare", "coverage", "publication-gate", "export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}, {"name": "inspection-transport", "commands": ["export"], "status": "available", "prerequisites": ["Node.js for executable analyses", "caller-supplied permitted tab/CDP adapter for capture libraries"], "missing": [], "capture": "adapter_required"}], "browser_profiles": {"cdp": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "prerequisite_presence": {"chrome": true, "psutil": true, "websockets": true, "jev_environment_configured": false, "judgment_adapter": "explicit per-session configuration; not checked by offline doctor"}, "runtime_qualification": "not_checked"}, "legacy": {"profile": "full-desktop", "requires": ["CUA", "X11/AT-SPI on Linux"]}}, "profile_note": "Native desktop blockers do not apply to headless CDP; runtime qualification must be checked separately.", "effect_verification": "not_asserted"}} +{"kind": "spawn", "monotonic": 7381.825275196, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17577, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7381.883897909, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17577, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7381.884055232, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17577, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7381.884279304, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17577, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "fdbc924797411335b521ae523b209cbb14ab8ff17b3d6415d69ea2e1f87eb6c2", "bytes": 845, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"command": ["browser", "cdp", "click"], "arguments": [{"name": "help", "flags": ["-h", "--help"], "required": false, "nargs": 0, "choices": null, "help": "show this help message and exit", "default": "==SUPPRESS=="}, {"name": "session", "flags": ["--session"], "required": true, "nargs": null, "choices": null, "help": null, "default": null}, {"name": "ref", "flags": ["--ref"], "required": true, "nargs": null, "choices": null, "help": "opaque ref from the last look; never reselected by label", "default": null}, {"name": "token", "flags": ["--token"], "required": true, "nargs": null, "choices": null, "help": "stable token for this intended activation", "default": null}], "subcommands": []}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"command\": [\"browser\", \"cdp\", \"click\"], \"arguments\": [{\"name\": \"help\", \"flags\": [\"-h\", \"--help\"], \"required\": false, \"nargs\": 0, \"choices\": null, \"help\": \"show this help message and exit\", \"default\": \"==SUPPRESS==\"}, {\"name\": \"session\", \"flags\": [\"--session\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": null, \"default\": null}, {\"name\": \"ref\", \"flags\": [\"--ref\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"opaque ref from the last look; never reselected by label\", \"default\": null}, {\"name\": \"token\", \"flags\": [\"--token\"], \"required\": true, \"nargs\": null, \"choices\": null, \"help\": \"stable token for this intended activation\", \"default\": null}], \"subcommands\": []}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 7381.88436432, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 3, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17577, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "schema", "browser", "cdp", "click"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 7381.88441827, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["schema", "browser", "cdp", "click"], "result": {"command": ["browser", "cdp", "click"], "arguments": [{"name": "help", "flags": ["-h", "--help"], "required": false, "nargs": 0, "choices": null, "help": "show this help message and exit", "default": "==SUPPRESS=="}, {"name": "session", "flags": ["--session"], "required": true, "nargs": null, "choices": null, "help": null, "default": null}, {"name": "ref", "flags": ["--ref"], "required": true, "nargs": null, "choices": null, "help": "opaque ref from the last look; never reselected by label", "default": null}, {"name": "token", "flags": ["--token"], "required": true, "nargs": null, "choices": null, "help": "stable token for this intended activation", "default": null}], "subcommands": []}} +{"kind": "spawn", "monotonic": 7381.884987719, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17578, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7381.95716782, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17578, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7381.957277884, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17578, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7381.957420134, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17578, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "80c96660aef007556c2ec3c0eb530adb54b7f3aa985c13592e59e8f0fcaa4cf6", "bytes": 2717, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"package_version": "0.0.1", "profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "loop": ["start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", "look --session DIR; choose the exact opaque ref returned by this holder", "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", "recover --session DIR after holder loss: read-only recovery; no browser is launched", "stop --session DIR; retain the authority database and all unresolved operations"], "guard_adapter": {"configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses"}, "limits": ["An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol."]}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"package_version\": \"0.0.1\", \"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\", \"loop\": [\"start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL\", \"look --session DIR; choose the exact opaque ref returned by this holder\", \"click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence\", \"status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record\", \"recover --session DIR after holder loss: read-only recovery; no browser is launched\", \"stop --session DIR; retain the authority database and all unresolved operations\"], \"guard_adapter\": {\"configuration\": \"--guard-command FILE containing JSON argv, absolute executable first; trusted policy code\", \"stdin\": \"footwork.browser.guard.request v1: digest, task, targets, url, title, binding\", \"stdout\": \"{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}\", \"semantics\": \"same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses\"}, \"limits\": [\"An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.\", \"This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.\", \"A new token cannot clear an unresolved admission, even across sessions sharing this authority database.\", \"No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.\", \"The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.\", \"Initial URL loading can itself have website effects; it is setup outside the guarded click protocol.\"]}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 7381.957497149, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 4, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17578, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "guide"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 7381.957549857, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "helper": "cli", "arguments": ["browser", "cdp", "guide"], "result": {"package_version": "0.0.1", "profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user", "loop": ["start TASK --session /short/fresh/dir --authority /absolute/authority.db --url URL", "look --session DIR; choose the exact opaque ref returned by this holder", "click --session DIR --ref REF --token STABLE_INTENT_TOKEN; read operation state and evidence", "status --session DIR --token TOKEN; repeat the exact click request only to retrieve its retained record", "recover --session DIR after holder loss: read-only recovery; no browser is launched", "stop --session DIR; retain the authority database and all unresolved operations"], "guard_adapter": {"configuration": "--guard-command FILE containing JSON argv, absolute executable first; trusted policy code", "stdin": "footwork.browser.guard.request v1: digest, task, targets, url, title, binding", "stdout": "{producer:footwork.browser.guard,version:1,digest:,probabilities:[p]}", "semantics": "same Authorizer keyword checks and destructive threshold; absent, malformed or failed judgment refuses"}, "limits": ["An acknowledged activation remains unknown/unverified without a qualified operation-specific completion reader.", "This tranche has no browser completion reader: recover preserves uncertainty, it cannot mark an effect completed.", "A new token cannot clear an unresolved admission, even across sessions sharing this authority database.", "No typing, trusted input, arbitrary evaluation, navigation RPC, grant bypass or raw CDP endpoint is exposed by this CLI.", "The owned Chrome still uses loopback CDP; private transport is not exclusive custody against same-user code.", "Initial URL loading can itself have website effects; it is setup outside the guarded click protocol."]}} +{"kind": "spawn", "monotonic": 7381.95799733, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17579, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7382.017625808, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17579, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 2, "signal": null} +{"kind": "wait", "monotonic": 7382.017713919, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17579, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 2, "signal": null} +{"kind": "communicate", "monotonic": 7382.017804483, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17579, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 2, "signal": null, "stdout": {"sha256": "5e02584e3273c1b284ad62c3dbded09e37e153ba8a5cb7c704b3b84583f77cd2", "bytes": 400, "json": {"schema_version": "1", "exit_code": 2, "command_completed": false, "effect_verification": "not_asserted", "output": "", "diagnostics": "usage: footwork browser cdp [-h]\n {start,look,click,status,recover,stop,guide} ...\nfootwork browser cdp: error: argument command: invalid choice: 'type' (choose from start, look, click, status, recover, stop, guide)\n", "data": null}, "text": "{\"schema_version\": \"1\", \"exit_code\": 2, \"command_completed\": false, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"usage: footwork browser cdp [-h]\\n {start,look,click,status,recover,stop,guide} ...\\nfootwork browser cdp: error: argument command: invalid choice: 'type' (choose from start, look, click, status, recover, stop, guide)\\n\", \"data\": null}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 7382.017861427, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "process_number": 5, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "pid": 17579, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "type", "--help"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 2, "signal": null} +{"kind": "pytest_report", "monotonic": 7382.018148983, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "phase": "call", "outcome": "passed", "duration": 0.3900670409993836, "longrepr": null} +{"kind": "pytest_report", "monotonic": 7382.02199898, "nodeid": "test_browser_cdp_cli.py::test_cdp_discovery_and_disabled_typing", "phase": "teardown", "outcome": "passed", "duration": 0.00011295700005575782, "longrepr": null} +{"kind": "pytest_report", "monotonic": 7382.023881039, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "phase": "setup", "outcome": "passed", "duration": 0.0015524310001637787, "longrepr": null} +{"kind": "spawn", "monotonic": 7382.024622248, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7382.584556383, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7382.584691654, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7382.584995614, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "b9a85c0bcb4caf1631be0ed5dd231db02257e17f80a9cb515efc6abb7b709001", "bytes": 1202, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "operations": []}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_64b5d233d98d4232bf8c019ad7710c56\", \"profile\": {\"profile\": \"owned-headless-cdp\", \"entrypoint\": \"footwork browser cdp\", \"commands\": [\"start\", \"look\", \"click\", \"status\", \"recover\", \"stop\", \"guide\"], \"requirements\": [\"Chrome\", \"psutil\", \"websockets\", \"configured Jev or judgment adapter\", \"absolute durable authority\"], \"desktop_required\": false, \"cua_required\": false, \"typing\": \"disabled: unresolved focus race\", \"activation\": \"dom_event_native_button: directly named plain main-document button[type=button] only\", \"completion\": \"unverified; acknowledgement is not business completion; unknown blocks new mutations\", \"restart\": \"same live holder or retained journal only; no implicit relaunch/adoption/rebinding\", \"install\": \"current package metadata still installs full dependencies; light metadata split is pending\", \"trust\": \"private socket and configured guard; not isolation from arbitrary code running as the same user\"}, \"holder\": {\"ok\": true, \"session_id\": \"cdp_64b5d233d98d4232bf8c019ad7710c56\", \"operations\": []}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 7382.585067701, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 6, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17581, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 7382.585128942, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "start", "Commit the fixture once", "--session", "/tmp/fw-cdp-llrgke88/session", "--authority", "/tmp/fw-cdp-llrgke88/authority.db", "--url", "http://127.0.0.1:38749/", "--guard-command", "/tmp/fw-cdp-llrgke88/guard-argv.json"], "result": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "profile": {"profile": "owned-headless-cdp", "entrypoint": "footwork browser cdp", "commands": ["start", "look", "click", "status", "recover", "stop", "guide"], "requirements": ["Chrome", "psutil", "websockets", "configured Jev or judgment adapter", "absolute durable authority"], "desktop_required": false, "cua_required": false, "typing": "disabled: unresolved focus race", "activation": "dom_event_native_button: directly named plain main-document button[type=button] only", "completion": "unverified; acknowledgement is not business completion; unknown blocks new mutations", "restart": "same live holder or retained journal only; no implicit relaunch/adoption/rebinding", "install": "current package metadata still installs full dependencies; light metadata split is pending", "trust": "private socket and configured guard; not isolation from arbitrary code running as the same user"}, "holder": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "operations": []}}} +{"kind": "session_snapshot", "monotonic": 7382.585414776, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-llrgke88", "files": [{"path": "/tmp/fw-cdp-llrgke88/session/browser.json", "sha256": "462f010eeb21531973e45577787778db70d64db0cb68f43cefa951983876ff81", "mtime_ns": 1793473816454318566, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:38749/", "authority": "/tmp/fw-cdp-llrgke88/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "/tmp/fw-cdp-llrgke88/guard.py"]}}, {"path": "/tmp/fw-cdp-llrgke88/session/holder.json", "sha256": "ebc4bd62754e398fb298a996fc8a389f4257b5f10ff9a693dc9e6eac38d57279", "mtime_ns": 1793473816874142938, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 17582, "start": "1793473816.09", "nonce": {"redacted_nonce_sha256": "3dc9d50cf0e141e2aeea3ebd9d722c17c615c2a45fdf800d52cdf536c704ffef"}, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "socket": "/tmp/fw-cdp-llrgke88/session/holder.sock"}}]} +{"kind": "session_snapshot", "monotonic": 7382.585676203, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-llrgke88", "files": [{"path": "/tmp/fw-cdp-llrgke88/session/browser.json", "sha256": "462f010eeb21531973e45577787778db70d64db0cb68f43cefa951983876ff81", "mtime_ns": 1793473816454318566, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:38749/", "authority": "/tmp/fw-cdp-llrgke88/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "/tmp/fw-cdp-llrgke88/guard.py"]}}, {"path": "/tmp/fw-cdp-llrgke88/session/holder.json", "sha256": "ebc4bd62754e398fb298a996fc8a389f4257b5f10ff9a693dc9e6eac38d57279", "mtime_ns": 1793473816874142938, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 17582, "start": "1793473816.09", "nonce": {"redacted_nonce_sha256": "3dc9d50cf0e141e2aeea3ebd9d722c17c615c2a45fdf800d52cdf536c704ffef"}, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "socket": "/tmp/fw-cdp-llrgke88/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 7382.587167659, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7382.696785568, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7382.696986406, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7382.697126644, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "cfe4b84e6c36660c2458ec363f26269eaf53c7f688a764c36e41d1606d7cce37", "bytes": 954, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:38749/", "title": "Durable fixture"}, "snapshot": {"id": "042803456b15", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "042803456b15:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "042803456b15:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "2959BB6B8E71F45EB2AE4948D2A095AF", "loader_id": "E8EC90473CCA9A6F03BED893331FF877"}}}}, "text": "{\"schema_version\": \"1\", \"exit_code\": 0, \"command_completed\": true, \"effect_verification\": \"not_asserted\", \"output\": \"\", \"diagnostics\": \"\", \"data\": {\"ok\": true, \"session_id\": \"cdp_64b5d233d98d4232bf8c019ad7710c56\", \"snapshot\": {\"status\": \"ok\", \"page\": {\"url\": \"http://127.0.0.1:38749/\", \"title\": \"Durable fixture\"}, \"snapshot\": {\"id\": \"042803456b15\", \"complete\": false, \"omitted\": {\"css_hidden\": 0, \"offscreen\": 0, \"no_layout\": 0, \"unknown\": 0, \"budget\": 0, \"child_frames\": 0, \"custom_controls_unobserved\": 1}}, \"refs\": [{\"ref\": \"042803456b15:1\", \"role\": \"button\", \"name\": \"Commit fixture\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}, {\"ref\": \"042803456b15:2\", \"role\": \"button\", \"name\": \"Sentinel\", \"actions\": [\"click\"], \"states\": {\"focusable\": true}, \"visibility\": \"in_viewport\"}], \"content_refs\": [], \"document\": {\"frame_id\": \"2959BB6B8E71F45EB2AE4948D2A095AF\", \"loader_id\": \"E8EC90473CCA9A6F03BED893331FF877\"}}}}"}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "wait", "monotonic": 7382.69725227, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 7, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17692, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "helper_return", "monotonic": 7382.697325919, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "helper": "cli", "arguments": ["browser", "cdp", "look", "--session", "/tmp/fw-cdp-llrgke88/session"], "result": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "snapshot": {"status": "ok", "page": {"url": "http://127.0.0.1:38749/", "title": "Durable fixture"}, "snapshot": {"id": "042803456b15", "complete": false, "omitted": {"css_hidden": 0, "offscreen": 0, "no_layout": 0, "unknown": 0, "budget": 0, "child_frames": 0, "custom_controls_unobserved": 1}}, "refs": [{"ref": "042803456b15:1", "role": "button", "name": "Commit fixture", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}, {"ref": "042803456b15:2", "role": "button", "name": "Sentinel", "actions": ["click"], "states": {"focusable": true}, "visibility": "in_viewport"}], "content_refs": [], "document": {"frame_id": "2959BB6B8E71F45EB2AE4948D2A095AF", "loader_id": "E8EC90473CCA9A6F03BED893331FF877"}}}} +{"kind": "session_snapshot", "monotonic": 7382.697841594, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "after_cli", "root": "/tmp/fw-cdp-llrgke88", "files": [{"path": "/tmp/fw-cdp-llrgke88/session/browser.json", "sha256": "462f010eeb21531973e45577787778db70d64db0cb68f43cefa951983876ff81", "mtime_ns": 1793473816454318566, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:38749/", "authority": "/tmp/fw-cdp-llrgke88/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "/tmp/fw-cdp-llrgke88/guard.py"]}}, {"path": "/tmp/fw-cdp-llrgke88/session/holder.json", "sha256": "ebc4bd62754e398fb298a996fc8a389f4257b5f10ff9a693dc9e6eac38d57279", "mtime_ns": 1793473816874142938, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 17582, "start": "1793473816.09", "nonce": {"redacted_nonce_sha256": "3dc9d50cf0e141e2aeea3ebd9d722c17c615c2a45fdf800d52cdf536c704ffef"}, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "socket": "/tmp/fw-cdp-llrgke88/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 7382.698551606, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17693, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-llrgke88/session", "--ref", "042803456b15:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7382.860179453, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17693, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-llrgke88/session", "--ref", "042803456b15:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": -9, "signal": 9} +{"kind": "wait", "monotonic": 7382.860289516, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17693, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-llrgke88/session", "--ref", "042803456b15:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": -9, "signal": 9} +{"kind": "communicate", "monotonic": 7382.86036008, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 8, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17693, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "click", "--session", "/tmp/fw-cdp-llrgke88/session", "--ref", "042803456b15:1", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": -9, "signal": 9, "stdout": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}, "stderr": {"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "bytes": 0, "json": null, "text": ""}} +{"kind": "session_snapshot", "monotonic": 7384.360899112, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "stage": "before_cli", "root": "/tmp/fw-cdp-llrgke88", "files": [{"path": "/tmp/fw-cdp-llrgke88/session/browser.json", "sha256": "462f010eeb21531973e45577787778db70d64db0cb68f43cefa951983876ff81", "mtime_ns": 1793473816454318566, "mode": "0o600", "json": {"version": 1, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "task": "Commit the fixture once", "chrome": "/usr/lib/chromium/chromium", "initial_url": "http://127.0.0.1:38749/", "authority": "/tmp/fw-cdp-llrgke88/authority.db", "guard_command": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/python", "/tmp/fw-cdp-llrgke88/guard.py"]}}, {"path": "/tmp/fw-cdp-llrgke88/session/holder.json", "sha256": "ebc4bd62754e398fb298a996fc8a389f4257b5f10ff9a693dc9e6eac38d57279", "mtime_ns": 1793473816874142938, "mode": "0o600", "json": {"version": 1, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "pid": 17582, "start": "1793473816.09", "nonce": {"redacted_nonce_sha256": "3dc9d50cf0e141e2aeea3ebd9d722c17c615c2a45fdf800d52cdf536c704ffef"}, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "socket": "/tmp/fw-cdp-llrgke88/session/holder.sock"}}]} +{"kind": "spawn", "monotonic": 7384.361442517, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17695, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-llrgke88/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests"} +{"kind": "wait", "monotonic": 7384.444899673, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17695, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-llrgke88/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "wait", "monotonic": 7384.445004258, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17695, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-llrgke88/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null} +{"kind": "communicate", "monotonic": 7384.445272226, "nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "process_number": 9, "process_kind": "public_cli", "owner_nodeid": "test_browser_cdp_cli.py::test_installed_cli_lost_client_ack_replays_without_redispatch", "pid": 17695, "argv": ["/workspace/scratch/footwork-durable-cdp-e4df2c6/consumer/bin/footwork", "--json", "browser", "cdp", "status", "--session", "/tmp/fw-cdp-llrgke88/session", "--token", "intent-1"], "cwd": "/workspace/scratch/footwork-durable-cdp-e4df2c6/tests", "returncode": 0, "signal": null, "stdout": {"sha256": "b864be5a62e569c15a7c67b92c6fdfafe58d32d174ad81017bd1cf5bb96060a3", "bytes": 5151, "json": {"schema_version": "1", "exit_code": 0, "command_completed": true, "effect_verification": "not_asserted", "output": "", "diagnostics": "", "data": {"ok": true, "session_id": "cdp_64b5d233d98d4232bf8c019ad7710c56", "operations": [{"id": "op_531f41db08b8", "task": "cdp_64b5d233d98d4232bf8c019ad7710c56", "resource": "browser:{\"boot\":\"2ae8c489-cacb-4de9-872b-77459e8d3000\",\"browser_context\":\"CB2AF2ED623EC8F318CC482E9560CF65\",\"pid\":17584,\"start\":\"1793473816.16\",\"target\":\"2959BB6B8E71F45EB2AE4948D2A095AF\"}", "observation": "042803456b15:1", "target": "7", "move": "click", "args": {"ref": "042803456b15:1", "route": "dom_event_native_button"}, "request_digest": "66e48b569d0770440e67f70f93b4d3331dbbde5a02c4a5c07cf721a46dcb8fca", "client_token": "intent-1", "state": "unknown", "disposition": "unknown", "phase": "sent", "evidence": {"binding": {"backend_node": 7, "boot": "2ae8c489-cacb-4de9-872b-77459e8d3000", "browser_context": "CB2AF2ED623EC8F318CC482E9560CF65", "cdp_session": "734DB2CFD85BB8E1AC597BF1530B9A35", "document_token": "c2c262e78c0a0b2400d4211320fc253b", "execution_context": 3, "fingerprint": "{\"tag\":\"button\",\"attrs\":[[\"onclick\",\"fetch('/ingress',{method:'POST',body:'intended'});let t=Date.now()+1200;while(Date.now() Date: Sat, 31 Oct 2026 15:18:46 -0400 Subject: [PATCH 18/18] Document qualified browser recovery, retained failures and light-install boundaries --- .../2026-10-31-durable-cdp-authority.md | 12 ++ jevdual/docs/plans/light-profile-20261030.md | 18 +++ jevdual/docs/quickstart.md | 1 + jevdual/docs/unified-cli.md | 8 +- jevdual/docs/why-footwork.md | 3 +- .../grounding.json | 105 ++++++++++++++++++ .../installed-attestation.json | 7 ++ .../installed.txt | 5 + .../regression.txt | 40 +++++++ .../durable-cdp-authority-20261031/report.md | 32 ++++++ .../retention-before.txt | 37 ++++++ .../review.json | 33 ++++++ .../startup-before-shortpath.txt | 19 ++++ .../startup-signal-before.txt | 31 ++++++ .../verification.json | 98 ++++++++++++++++ 15 files changed, 445 insertions(+), 4 deletions(-) create mode 100644 jevdual/results/durable-cdp-authority-20261031/grounding.json create mode 100644 jevdual/results/durable-cdp-authority-20261031/installed-attestation.json create mode 100644 jevdual/results/durable-cdp-authority-20261031/installed.txt create mode 100644 jevdual/results/durable-cdp-authority-20261031/regression.txt create mode 100644 jevdual/results/durable-cdp-authority-20261031/report.md create mode 100644 jevdual/results/durable-cdp-authority-20261031/retention-before.txt create mode 100644 jevdual/results/durable-cdp-authority-20261031/review.json create mode 100644 jevdual/results/durable-cdp-authority-20261031/startup-before-shortpath.txt create mode 100644 jevdual/results/durable-cdp-authority-20261031/startup-signal-before.txt create mode 100644 jevdual/results/durable-cdp-authority-20261031/verification.json diff --git a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md index 181de57..33c21f4 100644 --- a/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md +++ b/jevdual/docs/notebook/2026-10-31-durable-cdp-authority.md @@ -51,3 +51,15 @@ Resolves: DCA5 = held Observed: both injected controls failed before the fix: post-activation retention failure returned dispatched=false, and a second retention failure replaced CancelledError with a false no-send reply. A narrow fallback now reports browser_retention_unverified with dispatched=null and retryable=false, preserves cancellation, leaves started custody blocked, and prevents a second activation. This is a sensitivity control, not a reproduced disk-full incident. Next: freeze the final runtime, repeat exact installed checks and VM qualification, then close the package without claiming a browser completion reader or light installer. Refs: tests/test_browser_holder.py::test_post_admission_retention_failure_never_certifies_no_send; results/durable-cdp-authority-20261031/retention-before.txt + +## DCAU5 · update · 2026-10-31 15:17 +Resolves: DCA1 = held; DCA2 = held +Observed: final runtime e4df2c6 and wheel ae780174 passed 201 installed checks locally and 201/201 in the VM, with no CUA/browser-use. All 206 installed package files and all 12 copied VM test files match the candidate. Real interruption cells retain independent ingress 0/0/1, client-loss replay retains one effect, unknown blocks new mutations, and installed tools/doctor/schema/guide expose actual requirements and disabled typing. The source regression gate passed 2685 tests (95 skipped, 60 browser/live deselected). VM evidence arrived as ten notebook/results-only commits from 7a874eb and was imported with -x provenance; no candidate source or tests changed during measurement. Earlier VM 187/3 collector failures and 199/199 run remain separate history. +Next: finish final-head hosted checks and merge PR18; keep L3c completion readers, pipe custody, L2 metadata and small-host measurement open. +Refs: results/durable-cdp-authority-20261031/report.md; results/durable-cdp-vm-20261031/e4df2c6/report.md + +## DCAS · summary · 2026-10-31 15:17 +Established: explicit guarded owned-CDP admission and read-only restart retention are checked on the source-matched installed artifact, including lost client reply, committed holder death boundaries, pre-readiness signals and injected double-retention failure. Independent review found no remaining actionable defect in the changed runtime after remediation. Native validators and legacy CUA behavior are preserved. +Uncertain: no qualified browser completion reader exists; acknowledgement remains unknown/unverified and blocks new mutation. Loopback CDP is not same-user isolation. Bounded inventories do not establish global process cleanliness; VM outer test wrapper reaped 205 zombies and nested startup supervisors separately reaped 5/6/5/6. This is a 4-CPU/16GiB VM, not the requested future small-host resource baseline. No live paid Jev quality trial or light package-metadata install was run. +Decision: accept this bounded authority/restart package for PR18 through the final hosted/merge gates, keep CDP typing disabled, and retain the remaining plan gates explicitly. +Refs: results/durable-cdp-authority-20261031/verification.json; results/durable-cdp-authority-20261031/review.json; docs/owned-cdp.md diff --git a/jevdual/docs/plans/light-profile-20261030.md b/jevdual/docs/plans/light-profile-20261030.md index b93ba34..598d175 100644 --- a/jevdual/docs/plans/light-profile-20261030.md +++ b/jevdual/docs/plans/light-profile-20261030.md @@ -465,3 +465,21 @@ The L1a implementation review traced `browser_driver.WebMenu/BrowserEffect`, `se browser contract and identified three prerequisites now explicit above: target-only headless readiness, exact text distinct from presentation clipping, and qualified cross-command reference continuity. Browser durable receipts need their own versioned producer; native receipt validation stays strict. + + +## Implementation checkpoint (2026-10-31) + +PR18 qualifies an explicit `footwork browser cdp` admission/restart subset on runtime source +`e4df2c6`: one owned holder, exact document refs, mandatory configured judgment, shared durable +admission, stable-token retrieval and read-only restart recovery. Browser execution has a distinct +versioned producer; native identity/evidence allowlists and the legacy durable-browser refusal stay +unchanged. The exact wheel passed 201 installed checks on both macOS and Linux; see +[the report](../../results/durable-cdp-authority-20261031/report.md) and +[VM receipts](../../results/durable-cdp-vm-20261031/e4df2c6/report.md). + +This is not closure of all L3c gates. An acknowledged activation remains unknown and completion +unverified; no generic or service-specific browser completion reader is implemented. L3b pipe +custody, L2 binary-only light package metadata and L0 small-host resource measurement remain open. +The deterministic discovery portion of L4 now exposes the explicit route, actual requirements and +limits through tools, doctor, schema and the installed `browser cdp guide`; the paid cold-agent trial +remains unrun. Typing stays disabled until its focus race is resolved and separately qualified. diff --git a/jevdual/docs/quickstart.md b/jevdual/docs/quickstart.md index 8ea54c3..9d19e31 100644 --- a/jevdual/docs/quickstart.md +++ b/jevdual/docs/quickstart.md @@ -99,6 +99,7 @@ alone is not proof that the wider task is complete. ## Choose your next route +- **Owned headless browser:** the [CDP preview](owned-cdp.md) adds guarded button activation and durable restart retention without a desktop at runtime. Typing and general browser completion remain unavailable; the light dependency-metadata split is still pending. - **Native apps:** try the [macOS operator example](../../README.md#drive-it), or the [Linux Mousepad path](linux-support.md#exact-text-and-document-scope). Linux repeated desktop sessions have known native teardown aborts and target-readiness timeouts; current qualification diff --git a/jevdual/docs/unified-cli.md b/jevdual/docs/unified-cli.md index aaa64fc..fbf8e6a 100644 --- a/jevdual/docs/unified-cli.md +++ b/jevdual/docs/unified-cli.md @@ -35,7 +35,9 @@ Installation includes the pinned MuJoCo tool extra by default; `--core-only` omi ## Browser and computer operations -`footwork browser` and `footwork desktop` route to the existing session commands. `start`, `look`, `do`, `read`, `done`, and `status` retain the existing admission checks, fresh target identities, receipts and completion verification. Browser start uses Footwork's dedicated Chrome; desktop start selects a running native app. Use separate explicit `--session` directories for independent tasks. Initial same-Space Chrome attachment may require bringing that owned Chrome window to the foreground. +The legacy `footwork browser start/look/do` verbs and `footwork desktop` route to the existing session commands. `start`, `look`, `do`, `read`, `done`, and `status` retain the existing admission checks, fresh target identities, receipts and completion verification. Browser start uses Footwork's dedicated Chrome; desktop start selects a running native app. Use separate explicit `--session` directories for independent tasks. Initial same-Space Chrome attachment may require bringing that owned Chrome window to the foreground. + +For owned headless browsing, use the explicit `footwork browser cdp` route. It keeps guarded admission and unresolved operations across CLI and holder restart without CUA or a desktop session at runtime. Only the bounded native-button route is enabled; typing stays disabled and acknowledgement is not completion. Run `footwork browser cdp guide` for the installed contract, or read the [owned CDP guide](owned-cdp.md). Package metadata still installs the full dependencies; the light installer remains pending. The original top-level verbs remain compatible. `footwork capability` exposes the existing scoped MCP configuration/server/report commands through the same executable. Its browser-to-TextEdit scope remains intentionally bounded; it does not grant generic input access to an MCP host. @@ -45,7 +47,7 @@ The original top-level verbs remain compatible. `footwork capability` exposes th `doctor` also includes `host_prerequisites`: OS, architecture, Python, available memory, visible Linux cgroup limits, executable presence and session indicators. The same probe runs before installation with `python3 python/jevdual/host_probe.py` from `jevdual/`, or after installation with `python -m jevdual.host_probe`. It does not launch programs, contact providers, or expose environment-variable values. A present executable or display variable does not qualify a working browser or desktop. Linux native workflows remain unqualified; see [Linux qualification](linux-support.md). -The dedicated browser launcher recognizes installed Linux Chrome/Chromium binaries. Set `FOOTWORK_CHROME_EXECUTABLE` to the actual browser executable for a nonstandard installation such as Chrome for Testing. The process must match that executable, the exact owned profile and debugging port, and the current user. A shell wrapper with a different process executable does not qualify. These launch checks do not supply missing desktop permissions or durable browser admission. +The dedicated browser launcher recognizes installed Linux Chrome/Chromium binaries. Set `FOOTWORK_CHROME_EXECUTABLE` to the actual browser executable for a nonstandard installation such as Chrome for Testing. The process must match that executable, the exact owned profile and debugging port, and the current user. A shell wrapper with a different process executable does not qualify. These legacy launch checks do not supply missing desktop permissions or durable browser admission; the explicit CDP route above uses its own holder and authority protocol. ## Auxiliary families @@ -71,4 +73,4 @@ printf '%s' '{"command":"schema","args":["browser","start"]}' | footwork invoke Discovery and observation do not contact a model provider. Commands that request Jev judgment or model-driven execution retain their existing credential and admission requirements. Doctor reports runtime prerequisites; it does not validate model credentials or certify a completed GUI effect. -The macOS CI artifacts include `ci-agent-bundle/install.py`, its manifest and both wheels. Download the artifact for the desired Python profile, then run its installer against a new environment as above. This path needs compatible Python and either uv or venv with pip/ensurepip; the consumer does not need a checkout or Rust compiler. Browser/desktop GUI control remains scoped to the qualified macOS drivers and permissions. +The macOS CI artifacts include `ci-agent-bundle/install.py`, its manifest and both wheels. Download the artifact for the desired Python profile, then run its installer against a new environment as above. This path needs compatible Python and either uv or venv with pip/ensurepip; the consumer does not need a checkout or Rust compiler. Native control remains scoped to its [macOS permissions](quickstart.md) and [Linux X11 preview](linux-support.md); the explicit owned CDP route has the separate headless qualification described above. diff --git a/jevdual/docs/why-footwork.md b/jevdual/docs/why-footwork.md index a2e0494..b329ff7 100644 --- a/jevdual/docs/why-footwork.md +++ b/jevdual/docs/why-footwork.md @@ -65,7 +65,8 @@ agent also needs the supported GUI execution and evidence boundaries described h | --- | --- | | Native CLI with `--authority` | Experimental durable admission, immutable request tokens, retained execution receipts and conservative recovery within one shared authority database | | Scoped MCP service | Its own journal for the qualified bind/observe/append/status/report workflow, including duplicate and restart handling | -| Dedicated browser CLI | Owned Chrome observation and supported actions; native durable authority is not available on this route | +| Legacy dedicated browser CLI | Owned Chrome observation and supported actions; native durable authority is not available on this route | +| Explicit headless CDP preview | Guarded native-button activation with durable admission and restart retention; acknowledgement remains unverified, typing disabled ([guide](owned-cdp.md)) | | Model-driven loop | Action gating and completion assessment; it does not inherit the durable native CLI protocol | | Saved-artifact checker | Exact bytes at an explicit path against the supplied expected file/digest; no judgment of whether the approved content itself is correct | diff --git a/jevdual/results/durable-cdp-authority-20261031/grounding.json b/jevdual/results/durable-cdp-authority-20261031/grounding.json new file mode 100644 index 0000000..35e0abf --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/grounding.json @@ -0,0 +1,105 @@ +{ + "anchors": [ + { + "id": "ev-cd1396cf9a543a0da0cb6fed", + "head": "5868f7c05020e047c00e68e4abf9253cce864f41", + "path": "cli/src/connection.rs", + "start_line": 1084, + "end_line": 1169, + "file_sha256": "e7fc52ddc052a54d672dc5bf70c4d8f7d03a2c8131dd5f5c672f373c687cf112", + "slice_sha256": "318de6abda8850260fc42d6fade2b9d44353afb1fa9b149a318bcde90d3437c5", + "dirty": false, + "claim_limit": "Source observation; does not prove runtime behavior or transfer.", + "repository": "agent-browser", + "transfer": "Separate known not-sent transport from any possible-send loss; never replay a mutation." + }, + { + "id": "ev-cd2d3b7de9e879914b7b949f", + "head": "5868f7c05020e047c00e68e4abf9253cce864f41", + "path": "cli/src/connection.rs", + "start_line": 1234, + "end_line": 1347, + "file_sha256": "e7fc52ddc052a54d672dc5bf70c4d8f7d03a2c8131dd5f5c672f373c687cf112", + "slice_sha256": "333e9209d1b56d62b91e6ed6ffd0439a6461f109440ad4f64b68e08f6014a2c2", + "dirty": false, + "claim_limit": "Source observation; does not prove runtime behavior or transfer.", + "repository": "agent-browser", + "transfer": "Lost-response fixture must establish one request independently." + }, + { + "id": "ev-0860862fcd5501a1b90e9be5", + "head": "5868f7c05020e047c00e68e4abf9253cce864f41", + "path": "cli/src/native/browser.rs", + "start_line": 1335, + "end_line": 1427, + "file_sha256": "b8e5bbf9f9305aa6e424aa4a140a76d88fac8ec9b4442ab77b5bccac67a515a6", + "slice_sha256": "6bcbb8113c5f98155dd43cbdd276539e06af6ec423d64f4e322f3a4c641cc0a0", + "dirty": false, + "claim_limit": "Source observation; does not prove runtime behavior or transfer.", + "repository": "agent-browser", + "transfer": "Strict pinned target disappearance refuses; no neighbor or URL rebinding." + }, + { + "id": "ev-b92b3e95bf09305b505fe79d", + "head": "5868f7c05020e047c00e68e4abf9253cce864f41", + "path": "cli/src/native/browser.rs", + "start_line": 4409, + "end_line": 4434, + "file_sha256": "b8e5bbf9f9305aa6e424aa4a140a76d88fac8ec9b4442ab77b5bccac67a515a6", + "slice_sha256": "e8a39b946d2f15e8148e4931fc93d5226f193614dac5bd8ec015f75a2b0baf46", + "dirty": false, + "claim_limit": "Source observation; does not prove runtime behavior or transfer.", + "repository": "agent-browser", + "transfer": "A missing pinned target does not authorize creating a blank replacement." + }, + { + "id": "ev-8add12cd6d9cc35bdf944399", + "head": "7862adfd3424d6f379af01f4276a87019b08c507", + "path": "allocate.go", + "start_line": 404, + "end_line": 445, + "file_sha256": "283773a715d9e1282a869d00368e5547083f9c982c706ebac3eee995712cfe98", + "slice_sha256": "e0eb431556e344e87f0b857cf735669f34471445b755fbdc2816980b609e634e", + "dirty": false, + "claim_limit": "Source observation; does not prove runtime behavior or transfer.", + "repository": "chromedp", + "transfer": "Keep the actual owned child handle and one wait lifecycle." + }, + { + "id": "ev-15d2df3506a0b868b3b39c3b", + "head": "5868f7c05020e047c00e68e4abf9253cce864f41", + "path": "cli/src/native/daemon.rs", + "start_line": 886, + "end_line": 945, + "file_sha256": "6f2ca91e22a27dfee2b24e229b750aea9edc6fc54c3078b62af03cdffc93f81e", + "slice_sha256": "f62669da53e7097926331b87ba99d3143088133c1c6bea3c905d5fd46ea71f23", + "dirty": false, + "claim_limit": "Source observation; does not prove runtime behavior or transfer.", + "repository": "agent-browser", + "transfer": "Do not copy process-global waitpid(-1) into a normal holder." + }, + { + "id": "ev-fc71b3ad345ca30e5cef188d", + "head": "369448a167e8b3da4ca5bca0b3307500c3371828", + "path": "src/tini.c", + "start_line": 423, + "end_line": 462, + "file_sha256": "edc7bcc873afc9a6770601e3b84d1b74528461d33a5f913ce1e8b5798f1cec75", + "slice_sha256": "162e4515bc4b82a0065ff561d657d713619bab6c7a5fda852e0d7da10f10e1d7", + "dirty": false, + "claim_limit": "Source observation; does not prove runtime behavior or transfer.", + "repository": "tini", + "transfer": "Orphan reaping belongs to a declared init/subreaper role, not business completion evidence." + } + ], + "rejected_transfers": [ + "automatic daemon respawn as operation recovery", + "PID or executable name as process incarnation", + "locator fallback as continuation of an observed ref", + "CDP command IDs as durable idempotency keys", + "global orphan reaping inside the holder", + "DOM agreement as proof of historical application" + ], + "target_contract": "docs/owned-cdp.md", + "target_native_validator": "python/jevdual/operator_evidence.py remains unchanged" +} diff --git a/jevdual/results/durable-cdp-authority-20261031/installed-attestation.json b/jevdual/results/durable-cdp-authority-20261031/installed-attestation.json new file mode 100644 index 0000000..133bab5 --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/installed-attestation.json @@ -0,0 +1,7 @@ +{ + "source": "e4df2c6b04644c332c8a636c556ae2fee0822d28", + "wheel_sha256": "ae780174a9f0dcfc0583dd9ed9c814f9f940fbfa54b6f64fdf50aad38233b059", + "installed_source_files_equal": 206, + "cua_driver": false, + "browser_use": false +} diff --git a/jevdual/results/durable-cdp-authority-20261031/installed.txt b/jevdual/results/durable-cdp-authority-20261031/installed.txt new file mode 100644 index 0000000..e81ce99 --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/installed.txt @@ -0,0 +1,5 @@ +........................................................................ [ 35%] +........................................................................ [ 71%] +......................................................... [100%] +- generated xml file: /Users/thomasmain/projects/footwork/.worktrees/durable-cdp-authority/output/durable-cdp/release-installed.xml - +201 passed in 43.28s diff --git a/jevdual/results/durable-cdp-authority-20261031/regression.txt b/jevdual/results/durable-cdp-authority-20261031/regression.txt new file mode 100644 index 0000000..ec445c6 --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/regression.txt @@ -0,0 +1,40 @@ +ssss.................................................................... [ 2%] +.............ssssssssssssssssssssssssss...........ssssssssssss.......... [ 5%] +.ssssssssssssss......................................................... [ 7%] +........................................................................ [ 10%] +........................................................................ [ 12%] +........................................................................ [ 15%] +........................................................................ [ 18%] +........................................................................ [ 20%] +........................................................................ [ 23%] +........................................................................ [ 25%] +........................................................................ [ 28%] +........................................................................ [ 31%] +........................................................................ [ 33%] +........................................................................ [ 36%] +........................................................................ [ 38%] +........................................................................ [ 41%] +........................................................................ [ 44%] +........................................................................ [ 46%] +..............................................................s......... [ 49%] +.................s...................................................... [ 51%] +........................................................................ [ 54%] +........................................................................ [ 56%] +........................................................................ [ 59%] +.......ssssssssssssssssssssssssssssss................................... [ 62%] +........................................................................ [ 64%] +........................................................................ [ 67%] +..ss.ss.s............................................................... [ 69%] +........................................................................ [ 72%] +........................................................................ [ 75%] +........................................................................ [ 77%] +........................................................................ [ 80%] +........................................................................ [ 82%] +........................................................................ [ 85%] +........................................................................ [ 88%] +........ss.............................................................. [ 90%] +........................................................................ [ 93%] +........................................................................ [ 95%] +........................................................................ [ 98%] +............................................ [100%] +2685 passed, 95 skipped, 60 deselected in 135.04s (0:02:15) diff --git a/jevdual/results/durable-cdp-authority-20261031/report.md b/jevdual/results/durable-cdp-authority-20261031/report.md new file mode 100644 index 0000000..3df2a9d --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/report.md @@ -0,0 +1,32 @@ +# Durable owned-browser authority + +The explicit `footwork browser cdp` route now retains guarded operations across CLI and holder restart. One holder owns the observed document refs and authority lock; it commits intent and start before activation. Repeating the original token retrieves its operation rather than clicking again. Browser evidence has its own versioned producer; native evidence allowlists remain unchanged. + +Runtime source: `e4df2c6b04644c332c8a636c556ae2fee0822d28`. +Wheel SHA256: `ae780174a9f0dcfc0583dd9ed9c814f9f940fbfa54b6f64fdf50aad38233b059`. +The deterministic wheel has 211 entries; all 206 installed package files were byte-equal locally. + +## What was checked + +- **2,685 source regression tests passed**, 95 skipped, 60 browser/live deselected. This used the matching development environment with pure Python forced, not a fresh full installer. +- **201 installed checks passed locally** outside the checkout, without CUA or browser-use. Dependencies were installed as binaries and the source-matched wheel installed with `--no-deps`; this qualifies the runtime, not the future light package metadata. +- **201/201 installed VM checks passed**, with no skips or failures, on the same wheel and 12 unchanged test files. The host was Debian 13.6 x86-64, Python 3.12.14 and Chromium 154, with a quota of 4 CPUs and 16 GiB; this is not the proposed 2-CPU/8GB measurement. The outer test wrapper separately reaped 205 zombies, sent no extra signals and ended with no owned descendants. +- An independent inherited-model agent context reviewed the changed authority, holder, guard and CLI paths. Startup and schema findings were fixed and rechecked; the final retention-failure sensitivity control also passed independently. No actionable findings remained in that scope. This was not a model-diversity review. + +The real CLI lost-client test observes independent fixture ingress before killing the client, then retrieves the same operation with ingress still one. Abrupt holder-exit tests interrupt real committed prepared, started and retained-execution boundaries: expected ingress is zero, zero and one. Prepared-only recovery is known not-sent; started and acknowledged execution remain unresolved. No DOM matching or acknowledgement becomes a completion claim. + +Four real Chrome startup-signal cells cover TERM during launch, connection and navigation, plus INT during launch. They assert absence of captured live processes before test cleanup. A dedicated Linux test supervisor reaps adopted zombies separately; neither this nor a bounded inventory proves that product cleanup alone prevents every orphan or escaped descendant. + +## Failures retained + +The first CLI recovery cell exposed an exception-class mismatch, corrected before qualification. Readiness exception cleanup and the CDP schema prefix failed before their fixes. The old installed wheel failed the pre-readiness TERM cell with holder exit -15 and required test cleanup. Finally, an injected double retention failure exposed an incorrect no-send reply and swallowed cancellation; the fixed path reports delivery and retention uncertainty while preserving blocked custody. This last control is not a reproduced disk-full incident. + +See the committed before-results, `review.json`, `verification.json`, the [engineering notebook](../../docs/notebook/2026-10-31-durable-cdp-authority.md), and the [final VM report and per-cell receipts](../durable-cdp-vm-20261031/e4df2c6/report.md). + +## Reference grounding and release boundary + +`grounding.json` records fresh file/range hashes from agent-browser, chromedp and tini. The transfers are no mutation replay after transport uncertainty, strict target pinning, actual child-handle ownership and separation of ordinary process cleanup from an init/subreaper role. Automatic daemon respawn, PID-name identity, locator fallback, raw CDP IDs as idempotency keys and DOM agreement as historical effect proof were rejected. + +Typing remains disabled. An activation acknowledgement remains completion-unverified and blocks new mutations until a qualified operation-specific completion reader exists. Such a reader, process-owned pipe transport, the binary-only light metadata split and a measured small-VM resource profile remain open. The legacy CUA routes and their durable-browser refusal remain unchanged. No general exactly-once website guarantee, live Jev judgment-quality result, full Linux desktop reliability fix, deployment or package-registry release is claimed. + +The installed `browser cdp guide`, `tools`, `doctor` and `schema` expose these boundaries. Start with the [owned CDP guide](../../docs/owned-cdp.md). diff --git a/jevdual/results/durable-cdp-authority-20261031/retention-before.txt b/jevdual/results/durable-cdp-authority-20261031/retention-before.txt new file mode 100644 index 0000000..9429d5e --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/retention-before.txt @@ -0,0 +1,37 @@ +FF [100%] +=================================== FAILURES =================================== +_____ test_post_admission_retention_failure_never_certifies_no_send[False] _____ +tests/test_browser_holder.py:220: in test_post_admission_retention_failure_never_certifies_no_send + asyncio.run(run()) +/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py:194: in run + return runner.run(main) + ^^^^^^^^^^^^^^^^ +/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py:118: in run + return self._loop.run_until_complete(task) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py:687: in run_until_complete + return future.result() + ^^^^^^^^^^^^^^^ +tests/test_browser_holder.py:212: in run + assert result["dispatched"] is None and result["retryable"] is False +E assert (False is None) +_____ test_post_admission_retention_failure_never_certifies_no_send[True] ______ +tests/test_browser_holder.py:220: in test_post_admission_retention_failure_never_certifies_no_send + asyncio.run(run()) +/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py:194: in run + return runner.run(main) + ^^^^^^^^^^^^^^^^ +/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py:118: in run + return self._loop.run_until_complete(task) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py:687: in run_until_complete + return future.result() + ^^^^^^^^^^^^^^^ +tests/test_browser_holder.py:208: in run + with pytest.raises(asyncio.CancelledError): + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +E Failed: DID NOT RAISE CancelledError +=========================== short test summary info ============================ +FAILED tests/test_browser_holder.py::test_post_admission_retention_failure_never_certifies_no_send[False] +FAILED tests/test_browser_holder.py::test_post_admission_retention_failure_never_certifies_no_send[True] +2 failed, 18 deselected in 0.21s diff --git a/jevdual/results/durable-cdp-authority-20261031/review.json b/jevdual/results/durable-cdp-authority-20261031/review.json new file mode 100644 index 0000000..f25672e --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/review.json @@ -0,0 +1,33 @@ +{ + "reviewed_source": "e4df2c6b04644c332c8a636c556ae2fee0822d28", + "scope": "Changed browser authority, guard, holder, CLI, startup, schema, discovery and tests against a6a5859", + "independence": "Separate inherited-model agent context; no model-family diversity claim", + "initial_focused_checks_passed": 73, + "remediation_checks_passed": 27, + "findings": [ + { + "issue": "Failed CLI readiness did not stop the newly created holder", + "resolution": "Owned direct-child cleanup wraps every unsuccessful startup exit; successful holder remains live" + }, + { + "issue": "Pre-readiness SIGTERM/SIGINT could lose the launch-thread Chrome handle", + "resolution": "Early stop latch, shielded launch result and owned cleanup before authority release" + }, + { + "issue": "CDP schema omitted browser command prefix", + "resolution": "Full browser/cdp command returned" + }, + { + "issue": "A second retention failure after activation could escape to the no-send handler", + "resolution": "Narrow uncertainty envelope does not claim persistence; cancellation and blocked custody preserved", + "evidence_limit": "Injected sensitivity control, not a reproduced disk-full incident" + } + ], + "final_verdict": "No actionable findings within reviewed scope", + "source_sha256": { + "browser_cli.py": "e83eec7e80821d521495db419c9fba7b9cab3d3d2f606a104640f62e9e84c0e9", + "browser_holder.py": "7e2c9dced504dfa52921c6cc3fcd4e2e9201da5cd2d17e223a99477b4baabfa7", + "agent_cli.py": "98da9a5301887659b5ac21fb5ab42659e5d04b709546fc52c21e0ecb9fddad33" + }, + "retention_sensitivity_controls_passed": 2 +} diff --git a/jevdual/results/durable-cdp-authority-20261031/startup-before-shortpath.txt b/jevdual/results/durable-cdp-authority-20261031/startup-before-shortpath.txt new file mode 100644 index 0000000..55519f0 --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/startup-before-shortpath.txt @@ -0,0 +1,19 @@ +FF [100%] +=================================== FAILURES =================================== +____________ test_start_closes_actual_child_on_readiness_exception _____________ +tests/test_browser_startup_cli.py:50: in test_start_closes_actual_child_on_readiness_exception + assert child.terminated and child.waited +E assert (False) +E + where False = .Child object at 0x107fdedb0>.terminated +__________________ test_cdp_schema_names_an_invocable_command __________________ +tests/test_browser_startup_cli.py:57: in test_cdp_schema_names_an_invocable_command + assert schema["command"] == ["browser", "cdp", "click"] +E AssertionError: assert ['cdp', 'click'] == ['browser', 'cdp', 'click'] +E +E At index 0 diff: 'cdp' != 'browser' +E Right contains one more item: 'click' +E Use -v to get more diff +=========================== short test summary info ============================ +FAILED tests/test_browser_startup_cli.py::test_start_closes_actual_child_on_readiness_exception +FAILED tests/test_browser_startup_cli.py::test_cdp_schema_names_an_invocable_command +2 failed in 0.12s diff --git a/jevdual/results/durable-cdp-authority-20261031/startup-signal-before.txt b/jevdual/results/durable-cdp-authority-20261031/startup-signal-before.txt new file mode 100644 index 0000000..8764def --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/startup-signal-before.txt @@ -0,0 +1,31 @@ +F [100%] +=================================== FAILURES =================================== +___ test_real_chrome_startup_signal_releases_owned_live_processes[launch-15] ___ + +phase = 'launch', selected_signal = + + @pytest.mark.browser + @pytest.mark.parametrize("phase,selected_signal", [ + ("launch", signal.SIGTERM), ("launch", signal.SIGINT), + ("connect", signal.SIGTERM), ("navigate", signal.SIGTERM), + ]) + def test_real_chrome_startup_signal_releases_owned_live_processes(phase, selected_signal): + with tempfile.TemporaryDirectory(prefix="fw-start-", dir="/tmp") as raw: + root = Path(raw) + _configuration(root) + (root / "child.py").write_text(_SHIM) + supervisor = subprocess.Popen([sys.executable, "-c", _SUPERVISOR, str(root), phase, str(int(selected_signal))], + cwd=root, env=_environment(), stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + try: + output, error = supervisor.communicate(timeout=65) +> assert supervisor.returncode == 0, (output, error) +E AssertionError: ('{"phase": "launch", "test_subreaper": false, "holder_exit": -15, "error": "(\'\', \'\')", "test_reaped": 0, "live_after_test_cleanup": []} +E ', '') +E assert 1 == 0 +E + where 1 = .returncode + +test_browser_startup_lifecycle.py:211: AssertionError +=========================== short test summary info ============================ +FAILED test_browser_startup_lifecycle.py::test_real_chrome_startup_signal_releases_owned_live_processes[launch-15] +1 failed, 5 deselected in 0.91s diff --git a/jevdual/results/durable-cdp-authority-20261031/verification.json b/jevdual/results/durable-cdp-authority-20261031/verification.json new file mode 100644 index 0000000..d358199 --- /dev/null +++ b/jevdual/results/durable-cdp-authority-20261031/verification.json @@ -0,0 +1,98 @@ +{ + "source": "e4df2c6b04644c332c8a636c556ae2fee0822d28", + "wheel_sha256": "ae780174a9f0dcfc0583dd9ed9c814f9f940fbfa54b6f64fdf50aad38233b059", + "wheel_entries": 211, + "installed_package_files_equal": 206, + "local_platform": "macOS-26.5.1-arm64-arm-64bit-Mach-O", + "local_regression": { + "passed": 2685, + "skipped": 95, + "deselected": 60, + "mode": "pure Python; borrowed matching-CUA development test environment" + }, + "installed": { + "passed": 201, + "cua_driver_present": false, + "browser_use_present": false, + "mode": "minimal binary-only dependency environment, source-matched wheel installed --no-deps; not the future light installer" + }, + "typing": "disabled in CDP CLI/RPC and effector", + "completion_reader": "not implemented; ack/loss remains unknown and completion unverified", + "vm": { + "report": "../durable-cdp-vm-20261031/e4df2c6/report.md", + "evidence_origin": "7a874eb1d00d94767ab8b6fcc3907be1084b32ba", + "passed": 201, + "failed": 0, + "skipped": 0, + "unchanged_test_files_verified": 12, + "installed_package_files_equal": 206, + "cpu_quota": 4, + "memory_gib": 16, + "outer_test_wrapper_zombies_reaped": 205, + "outer_extra_signals": 0, + "outer_final_owned_descendants": 0, + "nested_startup_supervisor_reaps": [ + 5, + 6, + 5, + 6 + ], + "limit": "test-only subreaping is not product cleanup; no 2CPU/8GB baseline" + }, + "requirements": [ + { + "criterion": "Admission is committed before possible activation", + "kind": "historical action", + "evidence": "test_browser_holder + test_browser_restart_cli", + "result": "local and exact installed VM passed" + }, + { + "criterion": "Stable token replay after client/holder loss never redispatches", + "kind": "historical action", + "evidence": "test_browser_cdp_cli + test_browser_restart_cli; independent ingress 0/0/1", + "result": "local and exact installed VM passed" + }, + { + "criterion": "Unknown blocks other mutations across sessions/shared native domain", + "kind": "historical action", + "evidence": "test_browser_durable_authority + test_browser_holder", + "result": "local and exact installed VM passed" + }, + { + "criterion": "Configured judgment required and failures refuse before admission", + "kind": "historical action", + "evidence": "test_browser_guard + test_missing_guard_refuses_before_admission", + "result": "local and exact installed VM passed; no paid/live Jev quality trial" + }, + { + "criterion": "Native evidence does not accept browser identity or producer", + "kind": "historical action", + "evidence": "test_browser_durable_authority + existing native evidence tests", + "result": "local and exact installed VM passed; native allowlists unchanged" + }, + { + "criterion": "Pre-readiness signals preserve actual owned Chrome handle", + "kind": "current state", + "evidence": "test_browser_startup_lifecycle; old wheel fails, fixed four real cells pass", + "result": "local and exact installed VM passed; absence only for captured live processes; test reaping separate" + }, + { + "criterion": "Installed discovery names CDP scope, prerequisites and unavailable features", + "kind": "answer", + "evidence": "test_browser_cdp_cli; tools/doctor/schema/guide", + "result": "local and exact installed VM passed" + }, + { + "criterion": "Typing stays disabled", + "kind": "historical action", + "evidence": "effector refusal contracts + CLI parser + RPC allowlist tests", + "result": "local and exact installed VM passed" + }, + { + "criterion": "Post-admission retention failure cannot certify no-send or swallow cancellation", + "kind": "historical action", + "evidence": "test_browser_holder::test_post_admission_retention_failure_never_certifies_no_send", + "result": "local and exact installed VM passed; injected sensitivity control, not actual storage incident" + } + ] +}