--- "/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-activation-cutover-successor-30bcd6633875050aa4f56f49a8bb26cd616ffa2409fc04caef523a8a62d5d1cc/source-delta/after/tests/gateway/test_dualcoach_activation_cutover.py"	2026-08-16 09:39:04.054509281 +0900
+++ tests/gateway/test_dualcoach_activation_cutover.py	2026-08-16 10:30:31.414181887 +0900
@@ -4,11 +4,12 @@
 import sys
 from dataclasses import replace
 from pathlib import Path
+from types import ModuleType
 from typing import cast
 
 import pytest
 
-from gateway.platforms import dualcoach_admin
+from gateway.platforms import dualcoach_admin as _dualcoach_admin
 from gateway.platforms.telegram_customer_bootstrap import (
     BootstrapState,
     CustomerDraft,
@@ -77,12 +78,33 @@
 '''
 
 
+def _checkin_modules() -> dict[str, ModuleType]:
+    return {
+        name: module
+        for name, module in sys.modules.items()
+        if name == "checkin_cli" or name.startswith("checkin_cli.")
+    }
+
+
+def _run_cli(argv: list[str]) -> int:
+    modules_before = _checkin_modules()
+    path_before = tuple(sys.path)
+    for name in modules_before:
+        del sys.modules[name]
+    try:
+        return _dualcoach_admin.main(argv)
+    finally:
+        for name in tuple(_checkin_modules()):
+            del sys.modules[name]
+        sys.modules.update(modules_before)
+        sys.path[:] = path_before
+        assert _checkin_modules() == modules_before
+        assert tuple(sys.path) == path_before
+
+
 def _fixture(
     tmp_path: Path,
 ) -> tuple[Path, Path, RoomBootstrapStore, RoomBootstrapSession]:
-    for name in tuple(sys.modules):
-        if name == "checkin_cli" or name.startswith("checkin_cli."):
-            _ = sys.modules.pop(name, None)
     profile = tmp_path / "profile"
     (profile / "customers").mkdir(parents=True)
     (profile / "data").mkdir(mode=0o700)
@@ -166,9 +188,9 @@
 ) -> None:
     profile, package_root, store, awaiting = _fixture(tmp_path)
 
-    assert dualcoach_admin.main(_argv(profile, package_root, awaiting)) == 0
+    assert _run_cli(_argv(profile, package_root, awaiting)) == 0
     first = cast(dict[str, object], json.loads(capsys.readouterr().out))
-    assert dualcoach_admin.main(_argv(profile, package_root, awaiting)) == 0
+    assert _run_cli(_argv(profile, package_root, awaiting)) == 0
     second = cast(dict[str, object], json.loads(capsys.readouterr().out))
 
     registry = cast(
@@ -214,11 +236,11 @@
         crash_after_activation,
     )
     with pytest.raises(RuntimeError, match="crash"):
-        _ = dualcoach_admin.main(_argv(profile, package_root, awaiting))
+        _ = _run_cli(_argv(profile, package_root, awaiting))
     assert store.get(awaiting.session_id).state is BootstrapState.AWAITING_ACTIVATION
 
     monkeypatch.setattr(RoomBootstrapStore, "activate_bound_customer", real_activate)
-    assert dualcoach_admin.main(_argv(profile, package_root, awaiting)) == 0
+    assert _run_cli(_argv(profile, package_root, awaiting)) == 0
     _ = capsys.readouterr()
     assert store.get(awaiting.session_id).state is BootstrapState.ACTIVE
     assert len(_lines(profile / "data/customer-activation-audit.jsonl")) == 1
@@ -246,7 +268,7 @@
         argv[argv.index("--bootstrap-session") + 1] = "cb_0000000000000000000000"
 
     with pytest.raises(ValueError):
-        _ = dualcoach_admin.main(argv)
+        _ = _run_cli(argv)
 
     assert store.get(awaiting.session_id).state is BootstrapState.AWAITING_ACTIVATION
     assert json.loads((profile / "customers/registry.json").read_text())["customers"][0]["enabled"] is False
@@ -278,14 +300,8 @@
     )
 
     with pytest.raises(ValueError):
-        _ = dualcoach_admin.main(_argv(profile, package_root, second))
+        _ = _run_cli(_argv(profile, package_root, second))
 
     assert store.get(first.session_id).state is BootstrapState.ACTIVE
     assert store.get(second.session_id).state is BootstrapState.AWAITING_ACTIVATION
     assert not (profile / "data/customer-activation-audit.jsonl").exists()
-
-
-def teardown_module() -> None:
-    for name in tuple(sys.modules):
-        if name == "checkin_cli" or name.startswith("checkin_cli."):
-            _ = sys.modules.pop(name, None)
