Classify heartbeat lease failures
Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a02b6f-7db1-7222-918b-e813a6bda38d
This commit is contained in:
parent
ad4074c20a
commit
84b4089f8a
6 changed files with 84 additions and 14 deletions
|
|
@ -110,7 +110,7 @@ def test_process_one_refuses_close_after_lease_loss() -> None:
|
|||
client = MagicMock(spec=ActivityCoreOpsClient)
|
||||
client.config = OpsRunConfig(worker_id="w", lease_seconds=90)
|
||||
client.claim.return_value = [_claimed_run()]
|
||||
client.heartbeat.side_effect = OpsRunError("lease rejected")
|
||||
client.heartbeat.side_effect = OpsRunError("lease rejected", status_code=409)
|
||||
ar = ApproachResult(
|
||||
ok=True,
|
||||
approach=APPROACH_FI_RESEARCH_BRIEF,
|
||||
|
|
@ -159,7 +159,7 @@ def test_profiled_exception_after_lease_loss_skips_close() -> None:
|
|||
run = _claimed_run()
|
||||
run.harness_profile_ref = "harness.agent-dev-local@1.0.0"
|
||||
client.claim.return_value = [run]
|
||||
client.heartbeat.side_effect = OpsRunError("lease rejected")
|
||||
client.heartbeat.side_effect = OpsRunError("lease rejected", status_code=409)
|
||||
|
||||
def slow_profile(*_args, **_kwargs):
|
||||
time.sleep(0.05)
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ def test_concurrent_loss_still_notifies_once() -> None:
|
|||
|
||||
def test_heartbeat_publishes_loss_without_raw_exception_text() -> None:
|
||||
client = MagicMock()
|
||||
client.heartbeat.side_effect = OpsRunError("secret provider response")
|
||||
client.heartbeat.side_effect = OpsRunError("secret provider response", status_code=409)
|
||||
heartbeat = _Heartbeat(client, "run-1", lease_seconds=90)
|
||||
|
||||
with patch("rein_aharness.claim_loop._heartbeat_interval", return_value=0.01):
|
||||
|
|
@ -63,3 +63,16 @@ def test_heartbeat_publishes_loss_without_raw_exception_text() -> None:
|
|||
assert heartbeat.monitor.lost is True
|
||||
assert heartbeat.monitor.evidence is not None
|
||||
assert "secret" not in heartbeat.monitor.evidence.error_type
|
||||
|
||||
|
||||
def test_heartbeat_transport_error_does_not_immediately_mark_loss() -> None:
|
||||
client = MagicMock()
|
||||
client.heartbeat.side_effect = OpsRunError("connection reset")
|
||||
heartbeat = _Heartbeat(client, "run-1", lease_seconds=90)
|
||||
|
||||
with patch("rein_aharness.claim_loop._heartbeat_interval", return_value=0.01):
|
||||
heartbeat.start()
|
||||
time.sleep(0.04)
|
||||
heartbeat.stop()
|
||||
|
||||
assert heartbeat.monitor.lost is False
|
||||
|
|
|
|||
|
|
@ -137,6 +137,16 @@ def test_claim_http_error() -> None:
|
|||
client.claim()
|
||||
|
||||
|
||||
def test_ops_run_error_classifies_lease_rejection_without_message_details() -> None:
|
||||
rejected = OpsRunError("provider response included credentials", status_code=409)
|
||||
transient = OpsRunError("connection reset")
|
||||
|
||||
assert rejected.lease_rejected is True
|
||||
assert rejected.status_code == 409
|
||||
assert transient.lease_rejected is False
|
||||
assert transient.status_code is None
|
||||
|
||||
|
||||
def test_ops_run_to_taskspec(tmp_path: Path) -> None:
|
||||
import subprocess
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue