fix: validate sandbox readiness before rein handoff
Some checks failed
ci / validate (push) Has been cancelled

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a0726e-5232-73f2-aaca-2c05ceb62efb
This commit is contained in:
tegwick 2026-09-06 14:53:50 +02:00
parent 31dd5aaca8
commit c38ee08720
6 changed files with 92 additions and 29 deletions

View file

@ -519,3 +519,37 @@ def test_old_result_records_have_unknown_outcomes():
assert restored.hub_report_status == 'unknown'
assert restored.evidence.session_cleanup == 'unknown'
assert restored.evidence.sandbox_destroy == 'unknown'
@pytest.mark.parametrize('state', [state for state in SandboxState if state != SandboxState.READY])
def test_nonready_owner_handoff_never_starts_rein(state):
manager = MagicMock()
manager.create.return_value = _fake_status().model_copy(update={'state': state})
rein = _FakeRein()
result = run_execution(_request(), catalog=_catalog_with_readiness(), rein=rein, manager=manager)
assert not result.ok
assert result.evidence.failure_stage == 'sandbox_create'
assert result.evidence.session_cleanup == 'not_attempted'
assert result.evidence.sandbox_destroy == 'succeeded'
assert rein.calls == []
manager.execute.assert_not_called()
manager.destroy.assert_called_once_with('sbx1')
def test_reachability_preparation_failure_is_reported_and_destroyed():
manager = MagicMock()
reachability = MagicMock()
reachability.model_dump.side_effect = RuntimeError('private owner detail')
manager.create.return_value = _fake_status().model_copy(update={'reachability': reachability})
rein = _FakeRein()
with patch('glas_harness.gateway.hub.post_progress_event', return_value=True) as post:
result = run_execution(_request(report_to_hub=True), catalog=_catalog_with_readiness(),
rein=rein, manager=manager)
assert not result.ok
assert result.evidence.failure_stage == 'session_start'
assert result.tool_error == 'private owner detail'
assert result.evidence.session_cleanup == 'not_attempted'
assert result.evidence.sandbox_destroy == 'succeeded'
assert 'private owner detail' not in str(post.call_args)
assert rein.calls == []
manager.destroy.assert_called_once_with('sbx1')