From a86c0f41b633cf18d67646c8826a8dcfcbb8c2a6 Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Thu, 12 Nov 2026 07:53:59 +0000 Subject: [PATCH] test(orchestrator): match the W6 e2e to the radio names and both browsers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The radio drops the session suffix, so the second sender is Skills, not Skills session; the 1366 stream view has no Skills face, so that bubble belongs in the bar; Firefox reports the font family unquoted; Firefox's own favicon request trips the CSP guard like in the other e2e tests. Replayed on the saved browser results of the unify gate, every W6 assertion passes in Chromium and Firefox. 🎯 Fix: 93 % 💥 Break: 1 % 💸 Cost: 100 % ⏱️ Time: 100 % 🛡️ Security: 100 % 🏆 Score: 92 🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 % Co-Authored-By: Claude Opus 5.5 --- tests/e2e/test_workbench_w6_e2e.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tests/e2e/test_workbench_w6_e2e.py b/tests/e2e/test_workbench_w6_e2e.py index bce2f0f..73ce4fd 100644 --- a/tests/e2e/test_workbench_w6_e2e.py +++ b/tests/e2e/test_workbench_w6_e2e.py @@ -21,7 +21,8 @@ CUE = "e2e-bubbles" FIRST = "Disk almost full on the build host, the gate waits for space now" SECOND = "Gate green for the merge" VIEWS = {1920: "agents/orbit", 1366: "stream/radio", 390: "agents/hierarchy"} -SECOND_FROM = {1920: "Skills session", 1366: "Skills session", 390: "Docs"} +SECOND_FROM = {1920: "Skills", 1366: "Skills", 390: "Docs"} +SECOND_ANCHORED = {1920: True, 1366: False, 390: False} CALM = [{"name": "prefers-reduced-motion", "value": "reduce"}] GUARD = """() => { window.e2eViolations = []; @@ -108,6 +109,11 @@ def probe(template: str, cue: str = CUE) -> str: return template.replace("@HELPERS@", base.HELPERS).replace("@READ@", READ).replace("@CUE@", cue) +def quiet(found: dict) -> dict: + violations = found["violations"] + return {**found, "violations": None if violations is None else [seen for seen in violations if not seen.endswith("/favicon.ico")]} + + @unittest.skipUnless(shutil.which(os.environ.get("CHROMIUM", "chromium")), "no Chromium") class TestWorkbenchBubbles(HubCase): drive = base.TestOrchestratorE2E.drive @@ -177,9 +183,9 @@ class TestWorkbenchBubbles(HubCase): self.assertEqual((first["who"], first["scale"], first["rendered"], first["state"], first["anchored"]), (first_key, 1, 1, "speaking", True), first) self.assertTrue(0 < first["words"] < len(FIRST.split()), first) self.assertEqual(first["text"], " ".join(FIRST.split()[: first["words"]])) - self.assertTrue(first["font"].startswith('"Comic Neue"'), first["font"]) + self.assertEqual(first["font"].replace('"', "").split(",")[0], "Comic Neue", first["font"]) self.assertEqual((second["who"], second["scale"], second["rendered"], second["state"], second["text"], second["words"]), (second_key, 0.8, 0.8, "waiting", "…", 0), second) - self.assertEqual(second["anchored"], SECOND_FROM[width] != "Docs", second) + self.assertEqual(second["anchored"], SECOND_ANCHORED[width], second) motion = "opacity" if calm and width == 390 else "transform, opacity" self.assertEqual((first["transition"], second["transition"]), (motion, motion)) self.assertEqual(grow["who"], first_key) @@ -190,8 +196,8 @@ class TestWorkbenchBubbles(HubCase): grown = grow["grown"] self.assertEqual((grown["who"], grown["scale"], grown["rendered"], grown["state"]), (second_key, 1, 1, "speaking"), grown) self.assertEqual(grown["text"], " ".join(SECOND.split()[: grown["words"]])) - self.assertEqual(done, {"cleared": True, "faces": ["loaded"], "hidden": False, "violations": []}) - self.assertEqual(kept, {"kept": ["true", False, "Speech bubbles", "Speech bubbles"], "off": True, "display": "none", "bubbles": 0, "violations": []}) + self.assertEqual(quiet(done), {"cleared": True, "faces": ["loaded"], "hidden": False, "violations": []}) + self.assertEqual(quiet(kept), {"kept": ["true", False, "Speech bubbles", "Speech bubbles"], "off": True, "display": "none", "bubbles": 0, "violations": []}) if solid is not None: with self.subTest(browser=browser, view="3d"): self.assertNotIn("error", solid, solid)