Skip to content

Commit cd8034c

Browse files
authored
test(sleep): assert scores and gate_action in verifier tests (closes #94) (#96)
Add explicit assertions for held-out scores and gate actions to the verifier discipline test suite to strengthen its guarantees. - Assert the concrete held-out baseline and candidate scores in test_gate_rejects_reward_hacking_edit. - Add test_gate_accepts_beneficial_edit using MockBeneficialBackend to provide a paired case where an edit genuinely improves the held-out slice, expecting accepted=True and gate_action='accept_new_best'.
1 parent 352cbc3 commit cd8034c

1 file changed

Lines changed: 44 additions & 0 deletions

File tree

‎tests/test_sleep_engine.py‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,6 +1147,32 @@ def reflect(self, failures, successes, skill, memory, **kwargs):
11471147
break
11481148
return edits
11491149

1150+
class MockBeneficialBackend(MockBackend):
1151+
def attempt(self, task: TaskRecord, skill: str, memory: str, sample_id: int = 0) -> str:
1152+
ctx = (skill or "") + "\n" + (memory or "")
1153+
# If the beneficial artifact is present:
1154+
if "Always think step-by-step" in ctx:
1155+
if "rule:__beneficial__" in task.tags:
1156+
return str(task.reference) # improves the train task
1157+
if "rule:real" in task.tags:
1158+
return str(task.reference) # improves the real held-out task
1159+
1160+
# Baseline behavior (without the rule)
1161+
if "rule:__beneficial__" in task.tags:
1162+
return "I am missing input" # baseline fails the train task
1163+
if "rule:real" in task.tags:
1164+
return "baseline fails too" # baseline fails the real task
1165+
1166+
return super().attempt(task, skill, memory, sample_id)
1167+
1168+
def reflect(self, failures, successes, skill, memory, **kwargs):
1169+
edits = []
1170+
for task, _ in failures:
1171+
if "rule:__beneficial__" in task.tags:
1172+
edits.append(EditRecord("skill", "add", "Always think step-by-step", rationale="beneficial"))
1173+
break
1174+
return edits
1175+
11501176
class TestVerifierDiscipline(unittest.TestCase):
11511177
def test_gate_rejects_reward_hacking_edit(self):
11521178
be = MockRewardHackingBackend()
@@ -1157,9 +1183,27 @@ def test_gate_rejects_reward_hacking_edit(self):
11571183
res = consolidate(be, tasks, "", "", edit_budget=4, gate_metric="hard", night=1)
11581184

11591185
self.assertFalse(res.accepted)
1186+
self.assertEqual(res.gate_action, "reject")
1187+
self.assertEqual(res.holdout_baseline, 1.0)
1188+
self.assertEqual(res.holdout_candidate, 1.0) # final state reverts to baseline
11601189
self.assertGreater(len(res.rejected_edits), 0)
11611190
self.assertIn("placeholder", res.rejected_edits[0].content)
11621191

1192+
def test_gate_accepts_beneficial_edit(self):
1193+
be = MockBeneficialBackend()
1194+
train_task = TaskRecord(id="t2", project="/p", intent="train", reference="ABCDEF", reference_kind="exact", tags=["rule:__beneficial__"], split="train")
1195+
val_task = TaskRecord(id="v2", project="/p", intent="val", reference="UVWXYZ", reference_kind="exact", tags=["rule:real"], split="val")
1196+
tasks = [train_task, val_task]
1197+
1198+
res = consolidate(be, tasks, "", "", edit_budget=4, gate_metric="hard", night=1)
1199+
1200+
self.assertTrue(res.accepted)
1201+
self.assertEqual(res.gate_action, "accept_new_best")
1202+
self.assertEqual(res.holdout_baseline, 0.0)
1203+
self.assertEqual(res.holdout_candidate, 1.0)
1204+
self.assertGreater(len(res.applied_edits), 0)
1205+
self.assertIn("step-by-step", res.applied_edits[0].content)
1206+
11631207
class TestDiagnosticsRedaction(unittest.TestCase):
11641208
"""diagnostics.json surfaces backend stderr / optimizer replies / task
11651209
responses for debugging — but those can carry credentials (e.g. a codex 401

0 commit comments

Comments
 (0)