From 8a934c33744b8c56efefbfaad8b8297903ff1ec6 Mon Sep 17 00:00:00 2001 From: Auto Date: Wed, 11 Feb 2026 18:48:19 +0200 Subject: [PATCH] fix: isolate Playwright CLI browser sessions per agent in parallel mode Set unique PLAYWRIGHT_CLI_SESSION environment variable for each spawned agent subprocess to prevent concurrent agents from sharing a single browser instance and interfering with each other's navigation. - _spawn_coding_agent: session named "coding-{feature_id}" - _spawn_coding_agent_batch: session named "coding-{primary_id}" - _spawn_testing_agent: session named "testing-{counter}" using an incrementing counter (since multiple testing agents can test overlapping features, feature ID alone isn't sufficient) Previously, after migrating from Playwright MCP to CLI, all parallel agents shared the default browser session, causing them to navigate away from each other's pages. Co-Authored-By: Claude Opus 4.6 --- parallel_orchestrator.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/parallel_orchestrator.py b/parallel_orchestrator.py index fc7fe7a..419e093 100644 --- a/parallel_orchestrator.py +++ b/parallel_orchestrator.py @@ -194,6 +194,7 @@ class ParallelOrchestrator: # Legacy alias for backward compatibility self.running_agents = self.running_coding_agents self.abort_events: dict[int, threading.Event] = {} + self._testing_session_counter = 0 self.is_running = False # Track feature failures to prevent infinite retry loops @@ -846,7 +847,7 @@ class ParallelOrchestrator: "encoding": "utf-8", "errors": "replace", "cwd": str(self.project_dir), # Run from project dir so CLI creates .claude/ in project - "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": ""}, + "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": "", "PLAYWRIGHT_CLI_SESSION": f"coding-{feature_id}"}, } if sys.platform == "win32": popen_kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW @@ -909,7 +910,7 @@ class ParallelOrchestrator: "encoding": "utf-8", "errors": "replace", "cwd": str(self.project_dir), # Run from project dir so CLI creates .claude/ in project - "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": ""}, + "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": "", "PLAYWRIGHT_CLI_SESSION": f"coding-{primary_id}"}, } if sys.platform == "win32": popen_kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW @@ -1013,8 +1014,9 @@ class ParallelOrchestrator: "encoding": "utf-8", "errors": "replace", "cwd": str(self.project_dir), # Run from project dir so CLI creates .claude/ in project - "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": ""}, + "env": {**os.environ, "PYTHONUNBUFFERED": "1", "NODE_COMPILE_CACHE": "", "PLAYWRIGHT_CLI_SESSION": f"testing-{self._testing_session_counter}"}, } + self._testing_session_counter += 1 if sys.platform == "win32": popen_kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW