Qualify route gain and observe native gate context through ordinary input
This commit is contained in:
@@ -134,4 +134,63 @@ class ApproachRunner(unittest.TestCase):
|
||||
result,proof=r.input_exercise_result('game-started',context,session,observation,{'verified':True})
|
||||
self.assertFalse(proof['verified']);self.assertEqual(result,'input-exercise-incomplete')
|
||||
|
||||
class AlignmentRunner(unittest.TestCase):
|
||||
def test_alignment_requires_explicit_approach_and_separate_hashes(self):
|
||||
with self.assertRaises(ValueError):r.validate_input_exercise(SimpleNamespace(exercise_prison_alignment=True))
|
||||
valid=dict(exercise_prison_alignment=True,exercise_prison_approach=True,exercise_relative_look=True,observe_prison_gate=True,exercise_player_input=True,observe_player_input=True,inspect_headless_display=True,project='chat',settle=50)
|
||||
r.validate_input_exercise(SimpleNamespace(**valid))
|
||||
with tempfile.TemporaryDirectory() as folder:
|
||||
root=Path(folder);(root/'tools').mkdir();profile=root/'profile';profile.mkdir()
|
||||
names=('headless_input_proof.py','headless_display_probe.py','prison_approach_proof.py','ordinary_gate_evidence.py','ordinary_look_evidence.py','prison_approach_evidence.py','prison_alignment_proof.py','prison_alignment_evidence.py')
|
||||
for name in names:(root/'tools'/name).write_text('# fake')
|
||||
native=['gamescope','--backend','headless','--','/proton','run','/game','-errOrdinaryInputObserve',NONCE,'-errOrdinaryLookObserve',NONCE,'-errOrdinaryGateObserve',NONCE]
|
||||
wrapped,display=r.display_probe_command(native,root,Path('/compat'),profile,Path('/game'),NONCE,':0')
|
||||
args=(wrapped,root,Path('/compat'),profile,Path('/game'),NONCE,':0',display)
|
||||
command,context=r.input_exercise_command(*args,True,True,True)
|
||||
self.assertIn('--enable-private-alignment-proof',command);self.assertTrue(context['alignment_requested'])
|
||||
self.assertEqual(set(context['alignment_module_sha256']),set(names[-2:]))
|
||||
for look,approach,alignment in ((True,False,True),(True,True,1)):
|
||||
with self.assertRaises(ValueError):r.input_exercise_command(*args,look,approach,alignment)
|
||||
|
||||
def test_final_alignment_is_independent_and_preserves_failures(self):
|
||||
for verified,prior in ((True,'game-started'),(False,'game-started'),(True,'cleanup-failed')):
|
||||
with tempfile.TemporaryDirectory() as folder:
|
||||
session,context,report,observation=fixtures.ExerciseTests.make_proof(self,Path(folder))
|
||||
context.update(look_requested=True,approach_requested=True,alignment_requested=True,approach_module_sha256=r.approach_module_hashes(r.ROOT),alignment_module_sha256=r.alignment_module_hashes(r.ROOT))
|
||||
report.update({k:context[k] for k in ('look_requested','approach_requested','alignment_requested','approach_module_sha256','alignment_module_sha256')})
|
||||
report.update(look_proof={'completed':True},alignment_proof={'completed':True})
|
||||
report['events']=report['events'][:2];report['observer']['events']=['READY'];report['approach_proof']={'events':copy.deepcopy(report['events'])}
|
||||
(session/'console.log').write_text('native');Path(context['report']).write_text(json.dumps(report))
|
||||
approach=ModuleType('prison_approach_evidence');approach.validate_approach_evidence=lambda *a:{'verified':True}
|
||||
alignment=ModuleType('prison_alignment_evidence');calls=[]
|
||||
def validate(*args):calls.append(args);return {'verified':verified}
|
||||
alignment.validate_alignment_evidence=validate
|
||||
with patch.dict(sys.modules,{'prison_approach_evidence':approach,'prison_alignment_evidence':alignment}):
|
||||
result,proof=r.input_exercise_result(prior,context,session,observation,{'verified':True})
|
||||
self.assertEqual(calls,[('native',NONCE,report['look_proof'],report['approach_proof'],report['alignment_proof'])])
|
||||
self.assertEqual(proof['verified'],verified)
|
||||
self.assertEqual(result,'input-exercise-incomplete' if not verified and prior=='game-started' else prior)
|
||||
|
||||
def test_unrequested_alignment_and_changed_hashes_refuse(self):
|
||||
for payload in ({'alignment_requested':True},{'alignment_requested':1},{'alignment_proof':{}}):
|
||||
with tempfile.TemporaryDirectory() as folder:
|
||||
session,context,report,observation=fixtures.ExerciseTests.make_proof(self,Path(folder));report.update(payload)
|
||||
Path(context['report']).write_text(json.dumps(report))
|
||||
result,proof=r.input_exercise_result('game-started',context,session,observation,{'verified':True})
|
||||
self.assertFalse(proof['verified'])
|
||||
|
||||
def test_alignment_hash_mismatch_and_current_module_mutation_refuse(self):
|
||||
for changed_current in (False,True):
|
||||
with tempfile.TemporaryDirectory() as folder:
|
||||
session,context,report,observation=fixtures.ExerciseTests.make_proof(self,Path(folder))
|
||||
context.update(look_requested=True,approach_requested=True,alignment_requested=True,alignment_module_sha256=r.alignment_module_hashes(r.ROOT))
|
||||
report.update(alignment_requested=True,alignment_module_sha256=dict(context['alignment_module_sha256']))
|
||||
altered=dict(context['alignment_module_sha256']);altered['prison_alignment_proof.py']='0'*64
|
||||
if not changed_current:report['alignment_module_sha256']=altered
|
||||
Path(context['report']).write_text(json.dumps(report))
|
||||
current=altered if changed_current else context['alignment_module_sha256']
|
||||
with patch.object(r,'alignment_module_hashes',return_value=current):
|
||||
result,proof=r.input_exercise_result('game-started',context,session,observation,{'verified':True})
|
||||
self.assertFalse(proof['verified']);self.assertIn('unchanged module sources',proof['error'])
|
||||
|
||||
if __name__=='__main__':unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user