from albedo_eval_service.remote.dataset import EvalSample from albedo_eval_service.remote.generation import GenerationResult from albedo_eval_service.shared.observation_format import ( MAX_CONSECUTIVE_BAD_TURNS, truncation_notice, ) from local_eval.gates import evaluate_side from local_eval.live_protocol import generate_retrying_bad_turns, is_live_submit def test_marker_in_first_bash_is_a_submit(): clause = "echo ALBEDO_TASK_DONE_SUBMIT_NOW && git add -A && git diff --cached" text = ( "done\n\n```bash\necho ALBEDO_TASK_DONE_SUBMIT_NOW && cat patch.txt\n```" ) assert is_live_submit( text, command=clause, marker="ALBEDO_TASK_DONE_SUBMIT_NOW" ) def test_prose_mention_of_marker_is_not_a_submit(): text = "I will next run echo ALBEDO_TASK_DONE_SUBMIT_NOW" assert not is_live_submit( text, command="echo ALBEDO_TASK_DONE_SUBMIT_NOW", marker="ALBEDO_TASK_DONE_SUBMIT_NOW" ) def test_gate_accepts_marker_submit_without_exact_tail(): sample = EvalSample( sample_id="s1", prompt="p", submit_command="echo ALBEDO_TASK_DONE_SUBMIT_NOW && git add -A && git diff --cached", submit_marker="ALBEDO_TASK_DONE_SUBMIT_NOW", ) text = "x\n\n```bash\necho ALBEDO_TASK_DONE_SUBMIT_NOW\n```" report = evaluate_side(sample, text, [{"role": "assistant", "content": text, "score_target": True}], truncated=False) assert report.submitted assert "did not issue submit command" not in report.warnings def test_retrying_bad_turns_uses_the_usable_attempt(): good = "THOUGHT: look\n\n```bash\nls -la\n```" waves = [ [GenerationResult("s1", truncation_notice(4096), truncated=True)], [GenerationResult("s1", "")], [GenerationResult("s1", good)], ] class _Gen: def __init__(self): self.calls = [] def generate(self, samples): self.calls.append(samples[0].messages[-1]["content"] if samples[0].messages else "") return waves[len(self.calls) - 1] gen = _Gen() sample = EvalSample(sample_id="s1", prompt="p", messages=[{"role": "user", "content": "task"}]) out = generate_retrying_bad_turns(gen, [sample]) assert out[0].text == good assert len(gen.calls) == 3 assert "reached the output token limit" in gen.calls[1] assert "Format error" in gen.calls[2] def test_retrying_bad_turns_gives_up_after_three(): class _Gen: def __init__(self): self.calls = 0 def generate(self, samples): self.calls += 1 return [GenerationResult("s1", "")] gen = _Gen() sample = EvalSample(sample_id="s1", prompt="p", messages=[{"role": "user", "content": "t"}]) out = generate_retrying_bad_turns(gen, [sample]) assert gen.calls == MAX_CONSECUTIVE_BAD_TURNS assert out[0].text == ""