feat(869-c4): activation version-coupling assertion (Part of #869)
ci/woodpecker/push/publish Pipeline was successful
ci/woodpecker/push/ci Pipeline was successful

Part of #869

Mos (id-11) Gate-16 merge: independent APPROVE @90eb48fa (fail-closed identity locks byte-unchanged verified), author id2 != approver id11, clean mosaic-coder author, CI green wp1992. #869 Point-1 CODE COMPLETE (C1/C3/C5/C2/C4).

Co-authored-by: jason.woltje <[email protected]>
Co-committed-by: jason.woltje <[email protected]>
This commit was merged in pull request #881.
This commit is contained in:
2026-07-23 19:07:27 +00:00
committed by Mos
parent d351caad36
commit a32ce4c8f9
6 changed files with 543 additions and 1 deletions
@@ -39,6 +39,18 @@ LAUNCHER = load_tool("lease_runtime_launcher", "launch-runtime.py")
GATE = load_tool("lease_mutator_gate", "mutator-gate.py")
def matching_activation_probe(*_args: object, **_kwargs: object) -> dict[str, object]:
"""Fake activation-capability probe matching what enforcement expects
(C4, #869 Point-1). Injected into `LAUNCHER.main()` calls below that are
exercising OTHER branches (registration, exec, generation init, ...) so
the new version-coupling gate — which runs before those — never blocks
on host state (no real `mosaic` CLI on PATH in a test sandbox). The
version-coupling gate's OWN behavior (match/mismatch/absent) is covered
by its dedicated red-first tests in `version_coupling_unittest.py`."""
return dict(LAUNCHER.EXPECTED_ACTIVATION_CAPABILITY)
class FakeSocket:
def __init__(self, *chunks: bytes):
self.chunks = list(chunks)
@@ -95,6 +107,7 @@ class LaunchRuntimeTest(unittest.TestCase):
request=request,
execute=execute,
initialize_generation=initialize_generation,
probe_activation_capability=matching_activation_probe,
)
self.assertEqual(result, 0)
@@ -127,6 +140,7 @@ class LaunchRuntimeTest(unittest.TestCase):
request=lambda *_args: {"ok": True, "session_id": "e" * 64},
execute=lambda *args: executed.append(args),
initialize_generation=lambda *_args: None,
probe_activation_capability=matching_activation_probe,
)
self.assertEqual(result, 0)
self.assertEqual(
@@ -153,6 +167,7 @@ class LaunchRuntimeTest(unittest.TestCase):
request=lambda *_args: {"ok": True, "session_id": "f" * 64},
execute=lambda *args: executed.append(args),
initialize_generation=lambda *_args: None,
probe_activation_capability=matching_activation_probe,
)
self.assertEqual(result, 0)
self.assertEqual(executed[0][0:2], ("pi", ["pi", "--print", "hello"]))
@@ -188,6 +203,7 @@ class LaunchRuntimeTest(unittest.TestCase):
environ=environment,
request=lambda *_args, value=reply: value,
execute=lambda *args: executed.append(args),
probe_activation_capability=matching_activation_probe,
)
self.assertEqual(result, 1)
self.assertEqual(executed, [])
@@ -203,6 +219,7 @@ class LaunchRuntimeTest(unittest.TestCase):
initialize_generation=lambda *_args: (_ for _ in ()).throw(
OSError("unsafe state")
),
probe_activation_capability=matching_activation_probe,
),
1,
)
@@ -220,6 +237,7 @@ class LaunchRuntimeTest(unittest.TestCase):
environ={"MOSAIC_LEASE_BROKER_SOCKET": "/x"},
request=request,
execute=lambda *_args: self.fail("must not execute"),
probe_activation_capability=matching_activation_probe,
),
1,
)
@@ -233,6 +251,7 @@ class LaunchRuntimeTest(unittest.TestCase):
request=lambda *_args: {"ok": True, "session_id": "c" * 64},
execute=lambda *_args: (_ for _ in ()).throw(OSError("missing")),
initialize_generation=lambda *_args: None,
probe_activation_capability=matching_activation_probe,
),
1,
)