Qualify route gain and observe native gate context through ordinary input

This commit is contained in:
2026-09-19 19:44:22 +02:00
parent ec1071595d
commit 53eaf3894d
72 changed files with 71413 additions and 36 deletions
+59
View File
@@ -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()